Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Den här artikeln beskriver hur du ändrar muspekaren för ett fönster i MFC med hjälp av Visual C++. Informationen i den här artikeln gäller endast ohanterad Visual C++-kod.
Ursprunglig produktversion: Visual C++
Ursprungligt KB-nummer: 131991
Sammanfattning
I ett Windows-baserat program skapas alltid ett fönster baserat på en fönsterklass. Fönsterklassen identifierar flera egenskaper för fönstren baserat på den, inklusive standardpekaren (markören). I vissa fall kanske ett program vill ändra pekaren som är associerad med vissa fönster som skapas. I den här artikeln beskrivs tre metoder som ett MFC-program kan använda för att visa olika pekare vid olika tidpunkter.
Situationer där MFC-program visar olika pekare
Här är några situationer när du kanske vill att ett MFC-program ska visa olika pekare vid olika tidpunkter:
- När standardpekaren inte är ett bra användargränssnittsobjekt för ett visst program. Till exempel är en I-beam-pekare lämpligare än pilen för ett textredigerarefönster i Anteckningar. Detta kan innebära att du ändrar pekaren för hela körningen av programmet.
- När ett program utför en lång åtgärd, till exempel disk-I/O, är en timglaspekare lämpligare än pilen. Genom att ändra pekaren till ett timglas ger du bra visuell feedback till användaren. Detta kan innebära att du ändrar pekaren under en begränsad tidsperiod.
Tre metoder för att ändra muspekaren i ett fönster
Här är tre sätt som ett program kan ändra muspekaren i ett fönster:
- Metod 1: åsidosätt
CWnd::OnSetCursor()funktionen. Anropa Funktionen Windows APISetCursor()för att ändra pekaren. - Metod 2: Registrera din egen fönsterklass med önskad muspekare, åsidosätt
CWnd::PreCreateWindow()funktionen och använd den nyligen registrerade fönsterklassen för att skapa fönstret. - Metod 3: För att visa standard timglaspekaren kan ett program anropa
CCmdTarget::BeginWaitCursor(), som visar timglaset och anropaCmdTarget::EndWaitCursor()för att återgå till standardpekaren. Det här schemat fungerar bara under en enda meddelandetid. Om musen flyttas innan ett anrop tillEndWaitCursorgörs skickar Windows ettWM_SETCURSORmeddelande till fönstret under pekaren. Standardhanteringen av det här meddelandet återställer pekaren till standardtypen, den som registrerats med klassen, så du måste åsidosättaCWnd::OnSetCursor()för det fönstret och återställa pekaren tillbaka till timglaset.
Följande kodexempel visar i ett exempel hur du ändrar muspekaren för ett CView härlett klassfönster med hjälp av de tre metoderna.
m_ChangeCursor är en medlemsvariabel för CMyView klassen och är av typen BOOL. Den anger om en annan pekartyp måste visas.
Kod för metoden 1
Ändra muspekaren CMyView för objektet genom att CWnd::OnSetCursor() åsidosätta funktionen. Använd klassguiden för att upprätta funktionen för meddelandekarta CMyView::OnSetCursor() för Windows-meddelande WM_SETCURSOR och ange funktionens brödtext enligt följande:
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);
}
Kod för metoden 2
Registrera din egen fönsterklass som innehåller önskad muspekare med hjälp av antingen AfxRegisterClass() funktionen eller AfxRegisterWndClass() . Skapa sedan vyfönstret baserat på den registrerade fönsterklassen. Mer information om hur du registrerar fönsterklasser i MFC finns i Windows-klassregistrering i 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)
}
Kod för metoden 3
BeginWaitCursor() Anropa funktionerna och EndWaitCursor() för att ändra muspekaren.
Kommentar
CWinApp::DoWaitCursor(1) och CWinApp::DoWaitCursor(-1) fungerar på samma sätt som BeginWaitCursor() och EndWaitCursor(), respektive.
void CMyView::PerformLengthyOperation()
{
BeginWaitCursor(); // or AfxGetApp()->DoWaitCursor(1)
//...
EndWaitCursor(); // or AfxGetApp()->DoWaitCursor(-1)
}
Om anrop till BeginWaitCursor() och EndWaitCursor() inte finns i samma hanterare måste du åsidosätta OnSetCursor följande:
BOOL CMyView::OnSetCursor(CWnd *pWnd, UINT nHitTest, UINT message)
{
if (m_ChangeCursor)
{
RestoreWaitCursor();
return TRUE;
}
return CView::OnSetCursor(pWnd, nHitTest, message);
}
I det här exemplet anger du m_ChangeCursor TRUE precis före anropet till BeginWaitCursor()och ställer in det på FALSE efter anropet till EndWaitCursor().