Delen via


De muis aanwijzer 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 onbeheerde Visual C++-code.

Oorspronkelijke productversie: Visual C++
Oorspronkelijk 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 die erop zijn gebaseerd, inclusief de standaard muis aanwijzer (cursor). In sommige gevallen kan een toepassing 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 wilt dat een MFC-toepassing verschillende aanwijzers op verschillende tijdstippen weergeeft:

  • Wanneer de standaardaanwijzer geen goed gebruikersinterfaceobject is voor een bepaalde toepassing. Een I-beam-aanwijzer is bijvoorbeeld geschikter dan de pijl voor een teksteditorvenster in Kladblok. Dit kan betrekking hebben op het wijzigen van de aanwijzer voor de volledige uitvoering van de toepassing.
  • Wanneer een toepassing een langdurige bewerking uitvoert, zoals schijf-I/O, is een zandloperaanwijzer meer geschikt dan de pijl. Door de aanwijzer te wijzigen in een zandloper, geeft u goede visuele feedback aan de gebruiker. Dit kan betrekking hebben op het wijzigen van de aanwijzer gedurende een beperkte periode.

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: de CWnd::OnSetCursor() functie overschrijven. Roep de Windows API-functie SetCursor() aan om de aanwijzer te wijzigen.
  • Methode 2: registreer uw eigen vensterklasse met de gewenste muis aanwijzer, 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(), die de zandloper weergeeft, aanroepen 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 gedaan, stuurt Windows een WM_SETCURSOR bericht naar het venster onder de aanwijzer. De standaardafhandeling van dit bericht stelt de aanwijzer opnieuw in op het standaardtype, het type dat is geregistreerd bij de klasse, dus moet u voor dat venster overschrijven CWnd::OnSetCursor() en de aanwijzer terugzetten naar de zandloper.

De volgende codevoorbeelden laten zien hoe u de muiswijzer van een CView afgeleid klassevenster kunt wijzigen met behulp van de drie methoden.

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

Code voor de methode 1

Wijzig de muis aanwijzer voor het CMyView object door de functie te overschrijven CWnd::OnSetCursor() . Gebruik de wizard Klasse om de functie CMyView::OnSetCursor() berichttoewijzing voor Windows-bericht WM_SETCURSOR vast te stellen 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 de methode 2

Registreer uw eigen vensterklasse met de gewenste muis aanwijzer met behulp van de AfxRegisterClass() of AfxRegisterWndClass() functie. Maak vervolgens het weergavevenster op basis van de klasse geregistreerd venster. Zie Windows Class Registration in MFC Tech Note 1 voor meer informatie over het registreren van vensterklasseklassen 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 de methode 3

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

Notitie

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

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

Als oproepen naar BeginWaitCursor() en EndWaitCursor() zich niet in dezelfde handler bevinden, moet u het volgende 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 in op m_ChangeCursor TRUE vlak voor de aanroep naar BeginWaitCursor(), en stelt u deze weer in op ONWAAR na de aanroep naar EndWaitCursor().