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 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()
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 poleceniaEndWaitCursor
, system Windows wysyłaWM_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()