De muispointer voor een venster in MFC wijzigen met behulp van Visual C++

In dit artikel wordt uitgelegd hoe u de muis aanwijzer voor een venster in MFC wijzigt met behulp van Visual C++. De informatie in dit artikel is alleen van toepassing op niet-beheerde Visual C++-code.

Oorspronkelijke productversie: Visual C++
Origineel KB-nummer: 131991

Samenvatting

In een Windows-toepassing wordt altijd een venster gemaakt op basis van een vensterklasse. De vensterklasse identificeert verschillende kenmerken van de vensters op basis hiervan, waaronder de standaard muiswijzer (cursor). In sommige gevallen wil een toepassing mogelijk de aanwijzer wijzigen die is gekoppeld aan bepaalde vensters die worden gemaakt. In dit artikel worden drie methoden beschreven die een MFC-toepassing kan gebruiken om verschillende aanwijzers op verschillende tijdstippen weer te geven.

Situaties waarin MFC-toepassingen verschillende aanwijzers weergeven

Hier volgen enkele situaties waarin u mogelijk wilt dat een MFC-toepassing verschillende aanwijzers op verschillende tijdstippen weergeeft:

  • Wanneer de standaardaanwijzer geen goed gebruikersinterfaceobject is voor een bepaalde toepassing. Een I-balkenaanwijzer is bijvoorbeeld geschikter dan de pijl voor een teksteditorvenster in Kladblok. Dit kan betekenen dat de aanwijzer voor de hele uitvoering van de toepassing wordt gewijzigd.
  • Wanneer een toepassing een langdurige bewerking uitvoert, zoals schijf-I/O, is een zandloperaanwijzer geschikter dan de pijl. Door de aanwijzer te wijzigen in een zandloper, geeft u de gebruiker goede visuele feedback. Dit kan betekenen dat de aanwijzer gedurende een beperkte periode wordt gewijzigd.

Drie methoden om de muis aanwijzer in een venster te wijzigen

Hier volgen drie manieren waarop een toepassing de muisaanwijzer in een venster kan wijzigen:

  • Methode 1: overschrijf de CWnd::OnSetCursor() functie. Roep de Windows API-functie SetCursor() aan om de aanwijzer te wijzigen.
  • Methode 2: registreer uw eigen vensterklasse met de gewenste muis, overschrijf de CWnd::PreCreateWindow() functie en gebruik de zojuist geregistreerde vensterklasse om het venster te maken.
  • Methode 3: om de standaard zandloperaanwijzer weer te geven, kan een toepassing de CCmdTarget::BeginWaitCursor()aanroepen, waarmee de zandloper wordt weergegeven en aanroepen CmdTarget::EndWaitCursor() om terug te keren naar de standaardaanwijzer. Dit schema werkt alleen voor de duur van één bericht. Als de muis wordt verplaatst voordat een aanroep wordt EndWaitCursor uitgevoerd, verzendt Windows een WM_SETCURSOR bericht naar het venster onder de aanwijzer. Met de standaardafhandeling van dit bericht wordt de aanwijzer opnieuw ingesteld op het standaardtype, het type dat is geregistreerd bij de klasse. U moet dus voor dat venster overschrijven CWnd::OnSetCursor() en de aanwijzer terugzetten op de zandloper.

In de volgende codevoorbeelden ziet u in voorbeeld hoe u de muispointer van een CView afgeleid klassevenster wijzigt met behulp van de drie methoden.

m_ChangeCursor is een lidvariabele van CMyView klasse en is van het type BOOL. Hiermee wordt aangegeven of een ander type aanwijzer moet worden weergegeven.

Code voor methode 1

Wijzig de muispointer voor het object door de CMyView functie te CWnd::OnSetCursor() overschrijven. Gebruik de wizard Klasse om de functie CMyView::OnSetCursor() voor het toewijzen van berichten voor Windows-berichten WM_SETCURSOR tot stand te brengen en geef de hoofdtekst van de functie als volgt op:

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);
}

Code voor methode 2

Registreer uw eigen vensterklasse met de gewenste muispointer met behulp van de AfxRegisterClass() functie of AfxRegisterWndClass() . Maak vervolgens het weergavevenster op basis van de geregistreerde vensterklasse. Zie Vensterklasseregistratie in MFC Tech Note 1 voor meer informatie over het registreren van vensterklassen in 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)
}

Code voor methode 3

Roep de BeginWaitCursor() functies en EndWaitCursor() aan om de muis aan te wijzen.

Opmerking

CWinApp::DoWaitCursor(1) en CWinApp::DoWaitCursor(-1) werken op dezelfde manier als BeginWaitCursor() respectievelijk en EndWaitCursor().

void CMyView::PerformLengthyOperation()
{
    BeginWaitCursor(); // or AfxGetApp()->DoWaitCursor(1)
    //...
    EndWaitCursor(); // or AfxGetApp()->DoWaitCursor(-1)
}

Als aanroepen naar BeginWaitCursor() en EndWaitCursor() zich niet in dezelfde handler bevinden, moet u als volgt overschrijven OnSetCursor :

BOOL CMyView::OnSetCursor(CWnd *pWnd, UINT nHitTest, UINT message)
{
    if (m_ChangeCursor)
    {
        RestoreWaitCursor();
        return TRUE;
    }
    return CView::OnSetCursor(pWnd, nHitTest, message);
}

In dit voorbeeld stelt u m_ChangeCursor vlak voor de aanroep BeginWaitCursor()in op WAAR en stelt u deze na de aanroep weer in opEndWaitCursor()ONWAAR.