Ändern des Mauszeigers für ein Fenster in MFC mithilfe von Visual C++
In diesem Artikel wird erläutert, wie Sie den Mauszeiger für ein Fenster in MFC mithilfe von Visual C++ ändern. Die Informationen in diesem Artikel gelten nur für nicht verwalteten Visual C++-Code.
Originalversion des Produkts: Visual C++
Ursprüngliche KB-Nummer: 131991
Zusammenfassung
In einer Windows-basierten Anwendung wird immer ein Fenster basierend auf einer Fensterklasse erstellt. Die Fensterklasse identifiziert verschiedene Merkmale der Fenster basierend darauf, einschließlich des Standardmäßigen Mauszeigers (Cursor). In einigen Fällen möchte eine Anwendung möglicherweise den Zeiger ändern, der bestimmten von ihr erstellten Fenstern zugeordnet ist. In diesem Artikel werden drei Methoden beschrieben, mit denen eine MFC-Anwendung verschiedene Zeiger zu unterschiedlichen Zeiten anzeigen kann.
Situationen, in denen MFC-Anwendungen unterschiedliche Zeiger anzeigen
Im Folgenden sind einige Situationen aufgeführt, in denen eine MFC-Anwendung unterschiedliche Zeiger zu unterschiedlichen Zeiten anzeigen soll:
- Wenn der Standardzeiger kein gutes Benutzeroberflächenobjekt für eine bestimmte Anwendung ist. Beispielsweise eignet sich ein I-Balkenzeiger besser als der Pfeil für ein Text-Editor-Fenster in NotePad. Dies kann das Ändern des Zeigers für die gesamte Ausführung der Anwendung umfassen.
- Wenn eine Anwendung einen längeren Vorgang ausführt, z. B. Datenträger-E/A, ist ein Sanduhrzeiger besser geeignet als der Pfeil. Wenn Sie den Zeiger in eine Sanduhr ändern, geben Sie dem Benutzer ein gutes visuelles Feedback. Dies kann dazu führen, dass der Zeiger für einen begrenzten Zeitraum geändert wird.
Drei Methoden zum Ändern des Mauszeigers in einem Fenster
Hier sind drei Möglichkeiten, wie eine Anwendung den Mauszeiger in einem Fenster ändern kann:
- Methode 1: Überschreiben der
CWnd::OnSetCursor()Funktion. Rufen Sie Windows API-FunktionSetCursor()auf, um den Zeiger zu ändern. - Methode 2: Registrieren Sie Ihre eigene Fensterklasse mit dem gewünschten Mauszeiger, überschreiben Sie die
CWnd::PreCreateWindow()Funktion, und verwenden Sie die neu registrierte Fensterklasse, um das Fenster zu erstellen. - Methode 3: Um den Standard-Sanduhrzeiger anzuzeigen, kann eine Anwendung den
CCmdTarget::BeginWaitCursor()Sanduhrzeiger aufrufen, der die Sanduhr anzeigt, und aufrufenCmdTarget::EndWaitCursor(), um zum Standardzeiger zurück zu gelangen. Dieses Schema funktioniert nur für die Dauer einer einzelnen Nachricht. Wenn die Maus vor einem AufrufEndWaitCursorverschoben wird, sendet Windows eineWM_SETCURSORNachricht an das Fenster unterhalb des Zeigers. Die Standardbehandlung dieser Nachricht setzt den Zeiger auf den Standardtyp zurück, den bei der Klasse registrierten, sodass Sie für dieses Fenster überschreibenCWnd::OnSetCursor()und den Zeiger wieder auf die Sanduhr zurücksetzen müssen.
Die folgenden Codebeispiele zeigen anhand eines Beispiels, wie der Mauszeiger eines CView abgeleiteten Klassenfensters mithilfe der drei Methoden geändert wird.
m_ChangeCursor ist eine Membervariable der CMyView Klasse und vom Typ BOOL. Es gibt an, ob ein anderer Zeigertyp angezeigt werden muss.
Code für die Methode 1
Ändern Sie den Mauszeiger für das Objekt, indem Sie die CMyView Funktion überschreiben CWnd::OnSetCursor() . Verwenden Sie den Klassen-Assistenten, um die Nachrichtenzuordnungsfunktion CMyView::OnSetCursor() für Windows Nachricht WM_SETCURSOR einzurichten und den Text der Funktion wie folgt anzuzeigen:
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 für die Methode 2
Registrieren Sie Ihre eigene Fensterklasse, die den gewünschten Mauszeiger enthält, entweder mithilfe der AfxRegisterClass() Oder-Funktion AfxRegisterWndClass() . Erstellen Sie dann das Ansichtsfenster basierend auf der registrierten Fensterklasse. Weitere Informationen zum Registrieren von Fensterklassen in MFC finden Sie unter Window Class Registration in 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)
}
Code für die Methode 3
Rufen Sie die BeginWaitCursor() Und-Funktionen EndWaitCursor() auf, um den Mauszeiger zu ändern.
Hinweis
CWinApp::DoWaitCursor(1) und CWinApp::DoWaitCursor(-1) funktionieren ähnlich BeginWaitCursor() wie bzw EndWaitCursor(). .
void CMyView::PerformLengthyOperation()
{
BeginWaitCursor(); // or AfxGetApp()->DoWaitCursor(1)
//...
EndWaitCursor(); // or AfxGetApp()->DoWaitCursor(-1)
}
Wenn Aufrufe von BeginWaitCursor() und EndWaitCursor() nicht im selben Handler ausgeführt werden, müssen Sie folgendes außer Kraft setzen OnSetCursor :
BOOL CMyView::OnSetCursor(CWnd *pWnd, UINT nHitTest, UINT message)
{
if (m_ChangeCursor)
{
RestoreWaitCursor();
return TRUE;
}
return CView::OnSetCursor(pWnd, nHitTest, message);
}
Legen Sie in diesem Beispiel kurz vor dem Aufruf von BeginWaitCursor()auf "TRUE" festm_ChangeCursor, und legen Sie ihn nach dem Aufruf von EndWaitCursor()" auf "FALSE" fest.