Ändern des Mauszeigers für ein Fenster in MFC mithilfe von Visual C++

In diesem Artikel wird beschrieben, 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.

Ursprüngliche Produktversion: Visual C++
Ursprüngliche KB-Nummer: 131991

Zusammenfassung

In einer Windows-basierten Anwendung wird ein Fenster immer basierend auf einer Fensterklasse erstellt. Die Fensterklasse identifiziert basierend darauf mehrere Merkmale der Fenster, einschließlich des Standardmauszeigers (Cursor). In einigen Fällen möchte eine Anwendung möglicherweise den Zeiger ändern, der bestimmten Fenstern zugeordnet ist, die sie erstellt. 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 finden Sie einige Situationen, in denen eine MFC-Anwendung verschiedene Zeiger zu unterschiedlichen Zeiten anzeigen soll:

  • Wenn der Standardzeiger kein gutes Benutzeroberflächenobjekt für eine bestimmte Anwendung ist. Beispielsweise ist ein I-Beam-Zeiger besser geeignet als der Pfeil für ein Text-Editor-Fenster in Editor. 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. Indem 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

Im Folgenden finden Sie drei Möglichkeiten, wie eine Anwendung den Mauszeiger in einem Fenster ändern kann:

  • Methode 1: Überschreiben sie die CWnd::OnSetCursor() Funktion. Rufen Sie die Windows-API-Funktion SetCursor() 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 die CCmdTarget::BeginWaitCursor()aufrufen, die die Sanduhr anzeigt, und rückgängig machen zurück zum Standardzeiger aufrufenCmdTarget::EndWaitCursor(). Dieses Schema funktioniert nur für die Dauer einer einzelnen Nachricht. Wenn die Maus bewegt wird, bevor ein Aufruf von EndWaitCursor erfolgt, sendet Windows eine WM_SETCURSOR Nachricht an das Fenster unterhalb des Mauszeigers. Bei der Standardbehandlung dieser Nachricht wird der Zeiger auf den Standardtyp zurückgesetzt, den bei der -Klasse registrierten Typ. Daher müssen Sie für dieses Fenster außer Kraft setzen CWnd::OnSetCursor() und den Zeiger auf die Sanduhr zurücksetzen.

Die folgenden Codebeispiele zeigen anhand von Beispielen, wie der Mauszeiger eines CView abgeleiteten Klassenfensters mithilfe der drei Methoden geändert wird.

m_ChangeCursor ist eine Membervariable der CMyView -Klasse und ist vom Typ BOOL. 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 CMyViewCWnd::OnSetCursor() Funktion überschreiben. Verwenden Sie den Klassen-Assistenten, um die Nachrichtenzuordnungsfunktion CMyView::OnSetCursor() für Windows-Nachrichten WM_SETCURSOR einzurichten und den Text der Funktion wie folgt anzugeben:

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, indem Sie entweder die AfxRegisterClass() Funktion oder verwenden AfxRegisterWndClass() . Erstellen Sie dann das Ansichtsfenster basierend auf der registrierten Fensterklasse. Weitere Informationen zum Registrieren von Fensterklassen in MFC finden Sie unter Windows 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() Funktionen und EndWaitCursor() auf, um den Mauszeiger zu ändern.

Hinweis

CWinApp::DoWaitCursor(1) und CWinApp::DoWaitCursor(-1) funktionieren ähnlich wie BeginWaitCursor() und EndWaitCursor().

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

Wenn Aufrufe von BeginWaitCursor() und EndWaitCursor() nicht im selben Handler enthalten sind, müssen Sie wie folgt überschreiben 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 direkt vor dem Aufruf von BeginWaitCursor()auf TRUE festm_ChangeCursor, und legen Sie ihn nach dem Aufruf von wieder auf FALSE festEndWaitCursor().