Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Cursore custom

E' possibile impostare un cursore caricandolo da un file .ico e fare in modo
che il cursore customizzato (...perdonate la parola italianizzata ) rimanga
tale anche fuori dalle form del mio programma ??
Ciao a tutti
Stefano

 tale anche fuori dalle form del mio programma ??
Per caricare il cursore usa LoadCursorFromFile(), che ti ritorna
l'handle del cursore caricato. Imposti il nuovo cursore di sistema
con SetSystemCursor(), specificando l'handle ottenuto e indicando
quale cursore va a sostituire (normal cursor, hourglass ecc.) tramite
l'ID cursore.
Non puoi usare un file .ico - devi per forza usare un file
.cur o .ani

Grazie dell'aiuto.   Ho risolto.
.....allora un'altra domandina .... ;))
come faccio a conoscere l'handle del cursore corrente per ripristinarlo dopo
averlo forzato con SetSystemCursor ??
Speravo di trovare una bella funzioncina chiamata "GetSystemCursor", pero'
...non c'e' !!
Esiste la funzione GetCursor ma ritorna l'handle del cursore nell'ambito
dell'applicazione.
Ciao
Stefano

 ...non c'e' !!
Perché non serve.
Usa la funzione LoadCursor, specificando 0 come Handle del cursore,
e indicando l'ID del cursore da sostiruire. Ad esempio:
    hCursor = LoadCursor(0, IDC_ARROW)
    lngRet = SetSystemCursor(hCursor, OCR_NORMAL)

 ha scritto nel messaggio
news:89orsc$916$1...@nslave2.tin.it...

....non mi funziona.
Il valore di ritorno dalla chiamata LoadCursor e' sempre 0.
Nell'help API ho trovato questa brutta cosa .....
Return Value of LoadCursor
Long—A handle to the loaded cursor on success, zero on error. This function
will only load standard size icons under Windows 95 and Win16.
Io lavoro con WinNT 4.0 .
Mi arrendo ??
Ciao e grazie
Stefano

 will only load standard size icons under Windows 95 and Win16.
Se guardi le note di Quick Info, vedi che è previsto l'uso della
funzione anche in NT (e in genere funziona).
Il parametro hInstance, per indicare "System", in effetti in C è
NULL e non 0. Non in VB. Se hai indicato vbNull come valore
del parametro, la funzione ritorna 0 (errore).
Domanda scema: IDC_ARROW e OCR_NORMAL o
quant'altro, sono costanti che hai inizializzato, vero ?
Verifica che, ad esempio, siano:
Public Const IDC_ARROW = 32512&
Public Const OCR_NORMAL = 32512
Nota l'uso dell'ampersand (&) dopo il valore
di IDC_ARROW. Deve essere presente.
Altra questione. La definizione della funzione LoadCursor,
se tratta dell'API Text Viewer, riporta il parametro
lpCursorName come stringa. In questo caso è preferibile
sostituire "As String" con "As Long".
Potresti, come usa, dichiarare così la funzione nelle due
modalità distinte. Ad esempio LoadCursorByName e
LoadCursorByID.

 sostituire "As String" con "As Long".
....il problema era proprio qui !!!
Non avevo notato questa cosa.
Ho fatto come hai detto ed ha funzionato.
La LoadCursor ha ritornato un valore diverso da 0.
Ultimo (spero) problemino ....
Il valore che ho avuto in ritorno dalla LoadCursor l'ho immesso nella
SetSystemCursor per ripristinare il cursore iniziale.    Non ha funzionato.
Forse la costante IDC_ARROW (nella LoadCursor) e OCR_NORMAL (nella
SetSystemCursor) non puntano allo stesso tipo di cursore ??
Ti riporto la parte di codice che ho scritto (....anzi che hai scritto tu ;)
.....)
----------------------------------------------------------------------------
-----
'
'Carica handle vecchio e nuovo cursore
'
H_OldCursor = LoadCursor(0, IDC_ARROW)
H_NewCursor = LoadCursorFromFile(App.Path & "/MyCursor.cur")
'
'Imposta nuovo cursore, attende e ripristina il vecchio cursore
'
H_RetVal = SetSystemCursor(H_NewCursor, OCR_NORMAL)
Sleep 100
H_RetVal = SetSystemCursor(H_OldCursor, OCR_NORMAL)
----------------------------------------------------------------------------
------
L'istruzione finale di ripristino del vecchio cursore, ritorna il valore "1"
(quindi andata a buon fine) ma non ripristina il cursore.
In Debug ho notato che l'Handle del nuovo cursore e' un numero a 7 cifre
(4064212) diverso per ogni esecuzione del programma, mentre l'Handle del
vecchio cursore e' a 5 cifre (65544) e rimane sempre lo stesso per tutte le
esecuzioni del programma (...e questo a occhio e croce potrebbe voler dire
che stiamo puntando giustamente un cursore di sistema e non di applicazione)
Secondo te dov'e' lo sbaglio ??
Ciao e grazie
Stefano