Freigeben über


Ä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.

Originalproduktversion: 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 mehrere Merkmale der Fenster, einschließlich des Standardzeigers (Cursor). In einigen Fällen möchte eine Anwendung möglicherweise den Zeiger ändern, der bestimmten Fenstern zugeordnet ist, die er erstellt. In diesem Artikel werden drei Methoden beschrieben, mit denen eine MFC-Anwendung unterschiedliche Zeiger zu unterschiedlichen Zeiten anzeigen kann.

Situationen, in denen MFC-Anwendungen unterschiedliche Zeiger anzeigen

Hier sind einige Situationen, in denen Sie möchten, dass eine MFC-Anwendung unterschiedliche Zeiger zu unterschiedlichen Zeiten anzeigt:

  • Wenn der Standardzeiger kein gutes Benutzeroberflächenobjekt für eine bestimmte Anwendung ist. Ein I-Balkenzeiger eignet sich beispielsweise besser als der Pfeil für ein Text-Editor-Fenster im Editor. Dies kann dazu führen, dass der Zeiger für die gesamte Ausführung der Anwendung geändert wird.
  • Wenn eine Anwendung einen langwierigen Vorgang ausführt, z. B. Datenträger-E/A, ist ein Sanduhrzeiger besser geeignet als der Pfeil. Indem Sie den Zeiger auf 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 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 Standardmäßigen Sanduhrzeiger anzuzeigen, kann eine Anwendung die CCmdTarget::BeginWaitCursor(), die Sanduhr anzeigt, aufrufen und aufrufen CmdTarget::EndWaitCursor() , um zum Standardzeiger zurückzukehren. Dieses Schema funktioniert nur für die Dauer einer einzelnen Nachricht. Wenn die Maus vor dem Tätigen eines Anrufs EndWaitCursor verschoben wird, sendet Windows eine WM_SETCURSOR Nachricht 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 außer Kraft CWnd::OnSetCursor() setzen und den Zeiger wieder auf die Sanduhr zurücksetzen müssen.

Die folgenden Codebeispiele zeigen, wie Sie den Mauszeiger eines CView abgeleiteten Klassenfensters mithilfe der drei Methoden ändern.

m_ChangeCursor ist eine Membervariable der CMyView Klasse und ist 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 CMyView Objekt durch Außerkraftsetzungsfunktion CWnd::OnSetCursor() . Verwenden Sie den Klassen-Assistenten, um die Nachrichtenzuordnungsfunktion CMyView::OnSetCursor() für Windows-Nachricht WM_SETCURSOR einzurichten und den Textkörper der Funktion wie folgt einzugeben:

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 Funktion oder AfxRegisterWndClass() der AfxRegisterClass() Funktion. 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() Funktionen auf EndWaitCursor() , um den Mauszeiger zu ändern.

Notiz

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

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

Wenn aufruft BeginWaitCursor() und EndWaitCursor() sich nicht im selben Handler befindet, müssen Sie folgendes ü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 m_ChangeCursor in diesem Beispiel unmittelbar vor dem Aufruf BeginWaitCursor()auf TRUE fest, und legen Sie ihn nach dem Aufruf EndWaitCursor()auf FALSE zurück.