Изменение указателя мыши для окна в MFC с помощью Visual C++
В этой статье описывается изменение указателя мыши на окно в MFC с помощью Visual C++. Сведения, приведенные в этой статье, относятся только к неуправляемой коду Visual C++.
Исходная версия продукта: Visual C++
Исходный номер базы знаний: 131991
Итоги
В приложении под управлением Windows всегда создается окно на основе класса окна. Класс окна определяет несколько характеристик окон, основанных на нем, включая указатель мыши по умолчанию (курсор). В некоторых случаях приложению может потребоваться изменить указатель, связанный с определенными окнами, которые он создает. В этой статье описывается три метода, которые приложение MFC может использовать для отображения разных указателей.
Ситуации, когда приложения MFC отображают разные указатели
Ниже приведены некоторые ситуации, когда может потребоваться, чтобы приложение MFC отображалось различными указателями в разное время:
- Если указатель по умолчанию не является хорошим объектом пользовательского интерфейса для определенного приложения. Например, указатель I-луча более подходит, чем стрелка для окна текстового редактора в Блокноте. Это может включать изменение указателя для всего запуска приложения.
- Когда приложение выполняет длинную операцию, например операцию ввода-вывода диска, указатель часовой очки более подходящий, чем стрелка. Изменив указатель на часовые часы, вы предоставляете хороший визуальный отзыв пользователю. Это может включать изменение указателя в течение ограниченного периода времени.
Три метода изменения указателя мыши в окне
Ниже приведено три способа изменения указателя мыши в окне:
- Метод 1. Переопределите функцию
CWnd::OnSetCursor()
. Вызовите функцию APISetCursor()
Windows, чтобы изменить указатель. - Метод 2. Зарегистрируйте собственный класс окна с нужным указателем мыши, переопределите
CWnd::PreCreateWindow()
функцию и используйте только что зарегистрированный класс окна для создания окна. - Метод 3. Для отображения стандартного указателя часовой очки приложение может вызвать
CCmdTarget::BeginWaitCursor()
приложение, которое отображает часовые очки и вызовCmdTarget::EndWaitCursor()
, чтобы вернуться к указателю по умолчанию. Эта схема работает только в течение одного сообщения. Если мышь перемещается перед вызовомEndWaitCursor
, Windows отправляетWM_SETCURSOR
сообщение в окно под указателем. Обработка этого сообщения по умолчанию сбрасывает указатель на тип по умолчанию, зарегистрированный в классе, поэтому необходимо переопределитьCWnd::OnSetCursor()
для этого окна и сбросить указатель обратно в часовые очки.
В следующих примерах кода показано, как изменить указатель CView
мыши окна производного класса с помощью трех методов.
m_ChangeCursor
является переменной CMyView
члена класса и имеет тип BOOL
. Указывает, должен ли отображаться другой тип указателя.
Код метода 1
Измените указатель мыши для CMyView
объекта, переопределив CWnd::OnSetCursor()
функцию. Используйте мастер классов, чтобы установить функцию CMyView::OnSetCursor()
сопоставления сообщений для сообщения WM_SETCURSOR
Windows и указать текст функции следующим образом:
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);
}
Код для метода 2
Зарегистрируйте собственный класс окна, содержащий нужный указатель мыши с помощью или AfxRegisterClass()
AfxRegisterWndClass()
функции. Затем создайте окно представления на основе зарегистрированного класса окна. Дополнительные сведения о регистрации классов окон в MFC см. в разделе "Регистрация классов окон" в техническом примечание 1 MFC.
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)
}
Код для метода 3
BeginWaitCursor()
Вызовите и EndWaitCursor()
функции, чтобы изменить указатель мыши.
Примечание.
CWinApp::DoWaitCursor(1)
и CWinApp::DoWaitCursor(-1)
работают аналогично BeginWaitCursor()
и EndWaitCursor()
соответственно.
void CMyView::PerformLengthyOperation()
{
BeginWaitCursor(); // or AfxGetApp()->DoWaitCursor(1)
//...
EndWaitCursor(); // or 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);
}
В этом примере задайте значение TRUE непосредственно перед вызовом BeginWaitCursor()
и присвойте ему значение FALSE после вызоваEndWaitCursor()
. m_ChangeCursor