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.

Ursprüngliche Produktversion: 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 verschoben wird, bevor ein Aufruf von EndWaitCursor erfolgt, sendet Windows eine WM_SETCURSOR-Nachricht an das Fenster unter dem Zeiger. Die Standardbehandlung dieser Nachricht setzt den Zeiger auf den bei der Klasse registrierten Standardtyp zurück. Daher müssen Sie für dieses Fenster CWnd::OnSetCursor() überschreiben und den Zeiger wieder auf die Sanduhr zurücksetzen.

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, indem Sie die Funktion CWnd::OnSetCursor() überschreiben. 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 mit dem gewünschten Mauszeiger, indem Sie entweder die AfxRegisterClass()- oder die AfxRegisterWndClass()-Funktion verwenden. 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 Funktionen BeginWaitCursor() und EndWaitCursor() auf, um den Mauszeiger zu ändern.

Hinweis

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

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

Wenn sich Anrufe an BeginWaitCursor() und EndWaitCursor() nicht im selben Handler befinden, müssen Sie OnSetCursor wie folgt überschreiben:

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 auf BeginWaitCursor() fest, und legen Sie ihn nach dem Aufruf auf EndWaitCursor() zurück.