Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 klepsydrę, zapewniasz użytkownikowi dobrą informację zwrotną 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 APISetCursor()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(), który wyświetla klepsydrę, i wywołaćCmdTarget::EndWaitCursor()funkcję, 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 poleceniaEndWaitCursor, system Windows wysyłaWM_SETCURSORkomunikat do okna pod wskaźnikiem. Domyślna obsługa tego komunikatu powoduje zresetowanie wskaźnika do domyślnego typu zarejestrowanego w klasie, dlatego musisz zastąpić odpowiednie ustawienia wCWnd::OnSetCursor()dla tego okna i zmienić wskaźnik z powrotem na klepsydrę.
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, używając funkcji AfxRegisterClass() 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 funkcje BeginWaitCursor() i EndWaitCursor(), aby zmienić wskaźnik myszy.
Uwaga / Notatka
CWinApp::DoWaitCursor(1) i CWinApp::DoWaitCursor(-1) działają podobnie jak BeginWaitCursor() i 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 na TRUE tuż przed wywołaniem BeginWaitCursor(), a następnie ustaw ponownie na FALSE po wywołaniu EndWaitCursor().