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

Original Version 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 Window-Klasse identifiziert verschiedene Eigenschaften der darauf basierenden Fenster, einschließlich des Standardmaus Zeigers (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, die eine MFC-Anwendung zum Anzeigen verschiedener Zeiger zu unterschiedlichen Zeiten verwenden kann.

Situationen, in denen MFC-Anwendungen unterschiedliche Zeiger anzeigen

Im folgenden finden Sie einige Situationen, in denen eine MFC-Anwendung unterschiedliche Zeiger zu unterschiedlichen Zeitpunkten anzeigen sollte:

  • 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 im Editor. Dies kann eine Änderung des Zeigers für die gesamte Ausführung der Anwendung bedeuten.
  • Wenn eine Anwendung eine langwierige Operation ausführt (beispielsweise Datenträger-e/a), ist ein Sanduhr Zeiger besser geeignet als der Pfeil. Wenn Sie den Zeiger auf eine Sanduhr ändern, können Sie dem Benutzer ein gutes visuelles Feedback geben. Dies kann eine Änderung des Mauszeigers für einen begrenzten Zeitraum beinhalten.

Drei Methoden zum Ändern des Mauszeigers in einem Fenster

Es folgen drei Möglichkeiten, mit denen eine Anwendung den Mauszeiger in einem Fenster ändern kann:

  • Methode 1: außer Kraft setzen der CWnd::OnSetCursor() Funktion. Rufen Sie die Windows-API- SetCursor() Funktion 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 Window-Klasse, um das Fenster zu erstellen.
  • Methode 3: um den standardmäßigen Sanduhr Zeiger anzuzeigen, kann eine Anwendung den Aufrufen CCmdTarget::BeginWaitCursor() , der die Sanduhr anzeigt, und aufrufen, um den CmdTarget::EndWaitCursor() Standardzeiger wiederherzustellen. Dieses Schema funktioniert nur für die Dauer einer einzelnen Nachricht. Wenn die Maus verschoben wird, bevor ein Aufruf von erfolgt EndWaitCursor , sendet Windows eine WM_SETCURSOR Nachricht an das Fenster unterhalb des Mauszeigers. Die Standardbehandlung dieser Nachricht setzt den Zeiger auf den Standardtyp zurück, der mit der Klasse registriert ist, sodass Sie für dieses Fenster außer Kraft setzen müssen CWnd::OnSetCursor() , und setzen Sie den Zeiger zurück auf die Sanduhr.

In den folgenden Codebeispielen wird anhand eines Beispiels gezeigt, wie der Mauszeiger eines CView Fensters der abgeleiteten Klasse mithilfe der drei Methoden geändert wird.

m_ChangeCursorist eine Membervariable von CMyView Class 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 überschreiben CWnd::OnSetCursor() . Verwenden Sie den Klassen-Assistenten, um die Nachrichten Zuordnungsfunktion CMyView::OnSetCursor() für die Windows-Meldung einzurichten WM_SETCURSOR und den Hauptteil der Funktion wie folgt bereitzustellen:

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 eine eigene Fensterklasse, die den gewünschten Mauszeiger mit der AfxRegisterClass() oder- AfxRegisterWndClass() Funktion enthält. 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

Aufrufen der BeginWaitCursor() und- EndWaitCursor() Funktionen, um den Mauszeiger zu ändern.

Hinweis

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

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

Wenn Aufrufe von BeginWaitCursor() und EndWaitCursor() sich nicht in demselben 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 in diesem Beispiel m_ChangeCursor vor dem Aufruf von den Wert true fest, BeginWaitCursor() und legen Sie ihn nach dem Aufruf von wieder auf false fest EndWaitCursor() .