Как изменить курсор мышки для окна в MFCВ приложениях Windows, окно всегда создаётся на основе оконного класса. Оконный класс содержит несколько характеристик, на которых основывается создаваемое окно, вклучая и курсор мышки поумолчанию. В некоторых случаях, приложению необходимо изменить курсор, связанный с окном, которое оно создаёт. Данная статья описывает три метода, при помощи которых MFC приложение может отображать различные курсоры в различное время. Ниже приведены некоторые ситуации, в которых MFC
приложению необходимо менять курсор мышки:
Три методаДавайте кратко рассмотрим три метода замены
стандартного курсора мышки в окне:
Пример кода, илюстрирующий все три методаСледующий код, показывает три способа, как изменить курсор мышки оконного класса, наследованного от CView. m_ChangeCursor это переменна член класса CMyView, ей присвоен тип BOOL. Она показывает, надо ли показать другой тип курсора. Первый методИзменяем курсор мышки для объекта CMyView путём переопределения функции CWnd::OnSetCursor(). Используем ClassWizard, чтобы в карте сообщений для сообщения WM_SETCURSOR добавить функцию CMyView::OnSetCursor(). В тело функции добавляем следующий код: 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);
}
Второй методПри помощи функции AfxRegisterClass() или AfxRegisterWndClass() регистрируем собственный оконный класс, содержащий желаемый курсор мышки. Затем создаём окно вида, основанное на зарегистрированном оконном классе. Более подробнее о регистрации оконного класса в MFC, см. MFC Tech Note 1, "Window Class Registration." BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
cs.lpszClass = AfxRegisterWndClass(
CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW, // используем желаемые
// стили окна
AfxGetApp()->LoadStandardCursor(IDC_WAIT),
(HBRUSH) (COLOR_WINDOW + 1)); // кисть фона
return CView::PreCreateWindow(cs)
}
Третий методДля изменения курсора мышки вызываем функции
BeginWaitCursor() и EndWaitCursor(). void CMyView::PerformLengthyOperation()
{
BeginWaitCursor(); // или AfxGetApp()->DoWaitCursor(1)
//...
EndWaitCursor(); // или AfxGetApp()->DoWaitCursor(-1)
}
ЗАМЕЧАНИЕ: Если вызовы BeginWaitCursor() и EndWaitCursor() делаются не в том же самом обработчике, то необходимо переопределить OnSetCursor как показано ниже: BOOL CMyView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if (m_ChangeCursor)
{
RestoreWaitCursor();
return TRUE;
}
return CView::OnSetCursor(pWnd, nHitTest, message);
}
В этом примере, m_ChangeCursor устанавливается в TRUE перед вызовом BeginWaitCursor(), и обратно в FALSE после вызова EndWaitCursor().
|