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-functieSetCursor()
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 aanroepenCmdTarget::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 wordtEndWaitCursor
uitgevoerd, verzendt Windows eenWM_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 overschrijvenCWnd::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.
Feedback
https://aka.ms/ContentUserFeedback.
Binnenkort beschikbaar: In de loop van 2024 zullen we GitHub-problemen geleidelijk uitfaseren als het feedbackmechanisme voor inhoud en deze vervangen door een nieuw feedbacksysteem. Zie voor meer informatie:Feedback verzenden en weergeven voor