Udostępnij za pośrednictwem


Zmienianie wskaźnika myszy dla okna w MFC przy użyciu języka Visual C++

W tym artykule przedstawiono sposób zmieniania wskaźnika myszy dla okna w MFC przy użyciu języka Visual C++. Informacje zawarte w tym artykule dotyczą tylko niezarządzanych kodu Visual C++.

Oryginalna wersja produktu: Visual C++
Oryginalny numer KB: 131991

Podsumowanie

W aplikacji opartej na systemie Windows okno jest zawsze tworzone na podstawie klasy okna. Klasa okna identyfikuje kilka cech okien na jego podstawie, w tym domyślny wskaźnik myszy (kursor). W niektórych przypadkach aplikacja może chcieć zmienić wskaźnik skojarzony z określonymi oknami, które tworzy. W tym artykule opisano trzy metody, których aplikacja MFC może używać do wyświetlania różnych wskaźników w różnych momentach.

Sytuacje, w których aplikacje MFC wyświetlają różne wskaźniki

Poniżej przedstawiono niektóre sytuacje, w których aplikacja MFC może wyświetlać różne wskaźniki w różnych momentach:

  • Gdy domyślny wskaźnik nie jest dobrym obiektem interfejsu użytkownika dla określonej aplikacji. Na przykład wskaźnik I-beam jest bardziej odpowiedni niż strzałka w oknie edytora tekstu w Notatniku. Może to obejmować zmianę wskaźnika dla całego uruchomienia aplikacji.
  • Gdy aplikacja wykonuje długotrwałą operację, taką jak we/wy dysku, wskaźnik klepsydry jest bardziej odpowiedni niż strzałka. Zmieniając wskaźnik na klepsydry, należy przekazać użytkownikowi dobrą opinię wizualną. Może to obejmować zmianę wskaźnika przez ograniczony czas.

Trzy metody zmiany wskaźnika myszy w oknie

Oto trzy sposoby, w jaki aplikacja może zmienić wskaźnik myszy w oknie:

  • Metoda 1. Przesłanianie CWnd::OnSetCursor() funkcji. Wywołaj funkcję interfejsu API SetCursor() systemu Windows, aby zmienić wskaźnik.
  • Metoda 2: zarejestruj własną klasę okien za pomocą odpowiedniego wskaźnika myszy, przesłoń CWnd::PreCreateWindow() funkcję i użyj nowo zarejestrowanej klasy okna, aby utworzyć okno.
  • Metoda 3: aby pokazać standardowy wskaźnik klepsydry, aplikacja może wywołać CCmdTarget::BeginWaitCursor()element , który wyświetla klepsydry i wywołać CmdTarget::EndWaitCursor() polecenie, aby przywrócić domyślny wskaźnik. Ten schemat działa tylko przez czas trwania pojedynczego komunikatu. Jeśli mysz zostanie przeniesiona przed wywołaniem polecenia EndWaitCursor , system Windows wysyła WM_SETCURSOR komunikat do okna pod wskaźnikiem. Domyślna obsługa tego komunikatu resetuje wskaźnik do domyślnego typu, ten zarejestrowany w klasie, więc musisz zastąpić CWnd::OnSetCursor() to okno i zresetować wskaźnik z powrotem do klepsydry.

Poniższe przykłady kodu pokazują przykład, jak zmienić wskaźnik myszy w oknie klasy pochodnej CView przy użyciu trzech metod.

m_ChangeCursor jest zmienną CMyView składową klasy i jest typu BOOL. Wskazuje, czy musi być wyświetlany inny typ wskaźnika.

Kod metody 1

Zmień wskaźnik myszy dla CMyView obiektu, przesłaniając CWnd::OnSetCursor() funkcję. Użyj Kreatora klas, aby ustanowić funkcję CMyView::OnSetCursor() mapy komunikatów dla komunikatu WM_SETCURSOR systemu Windows i podać treść funkcji w następujący sposób:

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);
}

Kod metody 2

Zarejestruj własną klasę okien zawierającą żądany wskaźnik myszy przy użyciu AfxRegisterClass() funkcji lub AfxRegisterWndClass() . Następnie utwórz okno widoku na podstawie zarejestrowanej klasy okna. Aby uzyskać więcej informacji na temat rejestrowania klas okien w MFC, zobacz Rejestracja klas okien w 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)
}

Kod metody 3

Wywołaj BeginWaitCursor() funkcje i EndWaitCursor() , aby zmienić wskaźnik myszy.

Uwaga 16.

CWinApp::DoWaitCursor(1)i działają podobnie jak BeginWaitCursor() i CWinApp::DoWaitCursor(-1) EndWaitCursor(), odpowiednio.

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

Jeśli wywołania metody BeginWaitCursor() i EndWaitCursor() nie znajdują się w tej samej procedurze obsługi, należy przesłonić OnSetCursor w następujący sposób:

BOOL CMyView::OnSetCursor(CWnd *pWnd, UINT nHitTest, UINT message)
{
    if (m_ChangeCursor)
    {
        RestoreWaitCursor();
        return TRUE;
    }
    return CView::OnSetCursor(pWnd, nHitTest, message);
}

W tym przykładzie ustaw m_ChangeCursor wartość TRUE tuż przed wywołaniem BeginWaitCursor()metody i ustaw ją z powrotem na FALSE po wywołaniu metody .EndWaitCursor()