Modificare il puntatore del mouse per una finestra in MFC usando Visual C++

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 in base a una classe di finestra. La classe finestra identifica diverse caratteristiche delle finestre basate su di essa, tra cui il puntatore predefinito del mouse (cursore). In alcuni casi, un'applicazione potrebbe 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

Di seguito sono riportate alcune situazioni in cui è possibile che un'applicazione MFC visualizzi puntatori diversi in momenti diversi:

  • Quando il puntatore predefinito non è un oggetto interfaccia utente valido per una particolare applicazione. Ad esempio, un puntatore a I-beam è più adatto rispetto alla freccia per una finestra dell'editor di testo nel Blocco note. Ciò potrebbe comportare la modifica del puntatore per l'intera esecuzione dell'applicazione.
  • Quando un'applicazione esegue un'operazione prolungata, ad esempio L/O su disco, un puntatore a clessidra è più appropriato della freccia. Modificando il puntatore a una clessidra, è possibile fornire 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

Di seguito sono riportati 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 dell'API SetCursor() 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 a clessidra standard, un'applicazione può chiamare CCmdTarget::BeginWaitCursor(), che visualizza la clessidra, e chiamare CmdTarget::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 eseguita una chiamata a EndWaitCursor , Windows invia un WM_SETCURSOR messaggio alla finestra sotto il puntatore. La gestione predefinita di questo messaggio reimposta il puntatore al tipo predefinito, quello registrato con la classe , quindi è necessario eseguire l'override CWnd::OnSetCursor() per tale finestra e reimpostare il puntatore sulla clessidra.

Gli esempi di codice seguenti illustrano nell'esempio come modificare il puntatore del mouse di una CView finestra della 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. Usare la Creazione guidata classe per stabilire la funzione CMyView::OnSetCursor() mappa messaggi per il messaggio WM_SETCURSOR di Windows e specificare 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 propria classe finestra contenente il puntatore del mouse desiderato usando la AfxRegisterClass() funzione o AfxRegisterWndClass() . Creare quindi la finestra di visualizzazione in base alla classe della finestra registrata. Per altre informazioni sulla registrazione delle classi finestra in MFC, vedere Registrazione delle classi di finestra nella nota tecnica 1 di MFC.

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.

Nota

CWinApp::DoWaitCursor(1) e CWinApp::DoWaitCursor(-1) funzionano in modo analogo a BeginWaitCursor() e EndWaitCursor(), rispettivamente.

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 indicato di seguito:

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_ChangeCursorTRUE poco prima della chiamata a BeginWaitCursor()e impostarlo nuovamente su FALSE dopo la chiamata a EndWaitCursor().