Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo illustra come modificare il puntatore del mouse per una finestra in MFC usando Visual C++. Le informazioni contenute in questo articolo si applicano solo al codice Visual C++ non gestito.
Versione originale del prodotto: Visual C++
Numero KB originale: 131991
Riepilogo
In un'applicazione basata su Windows, viene sempre creata una finestra basata su una classe finestra. La classe window identifica diverse caratteristiche delle finestre basate su di essa, incluso il puntatore del mouse predefinito (cursore). In alcuni casi, un'applicazione può voler modificare il puntatore associato a determinate finestre create. Questo articolo descrive tre metodi che un'applicazione MFC può usare per visualizzare puntatori diversi in momenti diversi.
Situazioni in cui le applicazioni MFC visualizzano puntatori diversi
Ecco alcune situazioni in cui potrebbe essere necessario che un'applicazione MFC visualizzi puntatori diversi in momenti diversi:
- Quando il puntatore predefinito non è un oggetto interfaccia utente valido per una determinata applicazione. Ad esempio, un puntatore a fascio I è più adatto rispetto alla freccia per una finestra dell'editor di testo in Blocco note. Ciò potrebbe comportare la modifica del puntatore per l'intera esecuzione dell'applicazione.
- Quando un'applicazione esegue un'operazione lunga, ad esempio I/O su disco, un puntatore di clessidra è più appropriato rispetto alla freccia. Modificando il puntatore a una clessidra, si fornisce un buon feedback visivo all'utente. Ciò potrebbe comportare la modifica del puntatore per un periodo di tempo limitato.
Tre metodi per modificare il puntatore del mouse in una finestra
Ecco tre modi in cui un'applicazione può modificare il puntatore del mouse in una finestra:
- Metodo 1: eseguire l'override della
CWnd::OnSetCursor()funzione. Chiamare la funzione APISetCursor()Di Windows per modificare il puntatore. - Metodo 2: registrare la propria classe finestra con il puntatore del mouse desiderato, eseguire l'override della
CWnd::PreCreateWindow()funzione e usare la classe finestra appena registrata per creare la finestra. - Metodo 3: per visualizzare il puntatore standard della clessidra, un'applicazione può chiamare
CCmdTarget::BeginWaitCursor(), che visualizza la clessidra e chiamareCmdTarget::EndWaitCursor()per ripristinare il puntatore predefinito. Questo schema funziona solo per la durata di un singolo messaggio. Se il mouse viene spostato prima che venga effettuata una chiamata aEndWaitCursor, Windows invia unWM_SETCURSORmessaggio alla finestra sotto il puntatore. La gestione predefinita di questo messaggio reimposta il puntatore sul tipo predefinito, quello registrato con la classe , quindi è necessario eseguire l'override per tale finestra e reimpostare il puntatoreCWnd::OnSetCursor()alla clessidra.
Gli esempi di codice seguenti illustrano come modificare il puntatore del mouse di una CView finestra di classe derivata usando i tre metodi .
m_ChangeCursor è una variabile membro della CMyView classe ed è di tipo BOOL. Indica se deve essere visualizzato un tipo di puntatore diverso.
Codice per il metodo 1
Modificare il puntatore del mouse per l'oggetto eseguendo l'override CMyView della CWnd::OnSetCursor() funzione. Utilizzare la Creazione guidata classi per stabilire la funzione CMyView::OnSetCursor() mappa messaggi per il messaggio WM_SETCURSOR di Windows e fornire il corpo della funzione come indicato di seguito:
BOOL CMyView::OnSetCursor(CWnd *pWnd, UINT nHitTest, UINT message)
{
if (m_ChangeCursor)
{
::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
return TRUE;
}
return CView::OnSetCursor(pWnd, nHitTest, message);
}
Codice per il metodo 2
Registrare la classe finestra personalizzata contenente il puntatore del mouse desiderato usando la AfxRegisterClass() funzione o AfxRegisterWndClass() . Creare quindi la finestra di visualizzazione in base alla classe finestra registrata. Per altre informazioni sulla registrazione delle classi delle finestre in MFC, vedere Registrazione della classe window in MFC Tech Note 1.
BOOL CMyView::PreCreateWindow(CREATESTRUCT &cs)
{
cs.lpszClass = AfxRegisterWndClass(
CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW, // use any window styles
AfxGetApp()->LoadStandardCursor(IDC_WAIT),
(HBRUSH)(COLOR_WINDOW + 1)); // background brush
return CView::PreCreateWindow(cs)
}
Codice per il metodo 3
Chiamare le BeginWaitCursor() funzioni e EndWaitCursor() per modificare il puntatore del mouse.
Note
CWinApp::DoWaitCursor(1) e CWinApp::DoWaitCursor(-1) funzionano in modo analogo rispettivamente a BeginWaitCursor() e EndWaitCursor().
void CMyView::PerformLengthyOperation()
{
BeginWaitCursor(); // or AfxGetApp()->DoWaitCursor(1)
//...
EndWaitCursor(); // or AfxGetApp()->DoWaitCursor(-1)
}
Se le chiamate a BeginWaitCursor() e EndWaitCursor() non si trovano nello stesso gestore, è necessario eseguire l'override OnSetCursor come segue:
BOOL CMyView::OnSetCursor(CWnd *pWnd, UINT nHitTest, UINT message)
{
if (m_ChangeCursor)
{
RestoreWaitCursor();
return TRUE;
}
return CView::OnSetCursor(pWnd, nHitTest, message);
}
In questo esempio impostare su m_ChangeCursor TRUE subito prima della chiamata a BeginWaitCursor()e impostarlo su FALSE dopo la chiamata a EndWaitCursor().