Newsgroup: it.comp.programmare.win32
Titolo: Cambiare il cursore

Salve,
sto facendo in MFC un'applicazione basata su una dialog box.
Nella mia classe CMydialog che deriva da CDialog ho il costruttore nel quale
carico il cursore che voglio usare:
ad esempio
m_hCursor = ::LoadCursor(NULL, IDC_WAIT); // la clessiderina di windows
Dove m_hCursor e' di tipo HCURSOR ed e' membro della classe CMyDialog.
Ho gia' verificato nel debug che m_hCursor ha un valore diverso da NULL dopo
la load.
A questo punto nella CMyDialog::OnInitDialog() voglio settare il cursore
caricato:
::SetCursor(m_hCursor);
Ma quando vado ad eseguire trovo sempre la freccia canonica di Windows
invece della clessidera.
Ci deve essere qualcosa che mi sfugge o bisogna verificare qualcos'altro?
Maurus



Se qualcuno (come me) sta ancora aspettando la soluzione ... Maurus
deve aver risolto il problema.
Guardate il post piu' giu' ... "Un gioco in MFC".
(Potevi anche dircelo, come si faceva ;-) )
Fulvio

 Fulvio
Azz!
Hai ragione Fulvio, ho dimenticato di aggiornarvi qua.
Se poi vi scaricate il codice del giochino ve la guardate in diretta:-)
E poi tutta quella storia del cambio di cursore per fare un disegnino brutto
che non sono portato per la grafica!
La soluzione era nel gestire l'evento ON_WM_SETCURSOR e associarlo col
Wizard nella MessageMap al metodo OnSetCursor che sara' di questo tipo:
BOOL CCardGameDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
 // shape hourglass and shape 7&half
   if (m_bStopCard == true && (m_resultPic == gpPicCard))
      SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
   else
      SetCursor(AfxGetApp()->LoadCursor(IDC_CARDCURSOR));
   return 0;
}
Dove CCardGameDlg e' la classe della Dialog Box dove volete che il cursore
cambi quando vi passa e la SetCursor e' la funzione che vi fa cambiare il
cursore, passandogli il ritorno di LoadStandardCursor nel caso di cursore
canonico (in questo caso IDC_WAIT e' la clessidra) oppure passandogli
LoadCursor nel caso di cursore che vi disegnate voi nelle risorse (ed in
questo caso ho disegnato un cursore chiamando la risorsa IDC_CARDCURSOR).
Questa OnSetCursor essendo associata da wizard all'evento ON_WM_SETCURSOR,
sara' chiamata automaticamente dall'omonimo metodo della classe padre
CDialog dalla quale ho fatto ereditare la mia dialog principale
CCardGameDlg.
Spero sia chiaro.
Nel caso poi vi scarichiate il giochino e vedeste se vi sono baconi o
svarioni nel codice, accetto i vostri suggerimenti, non essendo pratico per
le MFC.
Grazie
Maurus


<cut>
Grazie, Maurus.
Lo segnalavo solo per chi, come me, non avesse una soluzione da dare
ma fosse comunque interessato a conoscerla.
Quando leggo quesiti come il tuo mi rendo conto di essere un po'
troppo "Borland-dipendente": "Cambiare il cursore? Ma basta impostare
la proprieta' Cursor = crHourGlass" ... ooppss ... non funziona :-)
Sulla documentazione delle MFC 4.1 leggo "To display a wait cursor,
just define a CWaitCursor variable before the code that perform the
lenghty operation. The object's constructor automatically causes the
wait cursor to be displayed. When the object goes out of scope (at the
end of the block in which the CWaitCursor is declared), its destructor
sets the cursor to the previous cursor."
Ma non ho potuto provare ... su questa macchina ho solo il g++.
Ciao.
Fulvio

 [...]

Maurus, perdonami se sfrutto il tuo thread, ma, per riallacciarmi a un
thread di qualche giorno fa sulle differenze tra MFC e Win32 C, questo mi
sembra un (raro?) caso in cui il C sia piu' immediato e semplice delle MFC.
La cosa si fa in maniera quantomai ovvia, basta aggiungere nella message
procedure:
case WM_SETCURSOR:
    if(g_bBusy)
      SetCursor(LoadCursor(NULL, IDC_WAIT));
    else
      SetCursor(LoadCursor(NULL, IDC_ARROW));
    return TRUE;
Per farmi perdonare questa intrusione vado a scaricare il giochino e lo
provo :).
Luca


Ciao Luca,
in effetti in questo caso viene piu' semplice e naturale l'implementazione
sfruttando direttamente le win32 AP.
Comunque anche con le MFC, una volta saputo che andava gestito l'evento
WM_SETCURSOR e che andava gestita nella propria classe di dialog il metodo
OnSetCursor, allora si risolveva.
Il fatto e' che ci sono troppe cose da sapere, che anche leggendole sui
libri non restano in testa e solo facendo applicazioni pratiche se ne scopre
l'utilita' e si e' costretti ad andare alla ricerca delle soluzioni.
E' anche per questo che ho fatto quel giochino e continuero' a farne altri,
a forza di teoria , si perdono le problematiche che arrivano poi solo con la
pratica.
Se dai un'occhiata al codice del programmino, poi dimmi cosa ne pensi e dove
secondo te andrebbero fatte delle modifiche.
Nelle MFC non sono un esperto come avrai capito.
Maurus