Изменение указателя мыши для окна в MFC с помощью Visual C++
В этой статье описывается изменение указателя мыши для окна в MFC с помощью Visual C++. Сведения, приведенные в этой статье, относятся только к неуправляемого кода Visual C++.
Исходная версия продукта: Visual C++
Исходный номер базы знаний: 131991
Сводка
В windows-приложении окно всегда создается на основе класса окна. Класс window определяет несколько характеристик окон на его основе, включая указатель мыши по умолчанию (курсор). В некоторых случаях приложению может потребоваться изменить указатель, связанный с определенными окнами, которые оно создает. В этой статье описываются три метода, которые приложение MFC может использовать для отображения разных указателей в разное время.
Ситуации, когда приложения MFC отображают разные указатели
Ниже приведены некоторые ситуации, когда приложение MFC может отображать разные указатели в разное время:
- Если указатель по умолчанию не является хорошим объектом пользовательского интерфейса для конкретного приложения. Например, указатель i-beam больше подходит, чем стрелка для окна текстового редактора в Блокноте. Это может включать изменение указателя для всего запуска приложения.
- Когда приложение выполняет длительную операцию, например дисковый ввод-вывод, указатель на песочные часы более удобен, чем стрелка. Изменив указатель на песочные часы, вы предоставляете пользователю хороший визуальный отзыв. Это может включать изменение указателя в течение ограниченного периода времени.
Три метода изменения указателя мыши в окне
Ниже приведены три способа, с помощью которых приложение может изменить указатель мыши в окне:
-
Метод 1. Переопределение
CWnd::OnSetCursor()
функции. Вызовите функцию Windows APISetCursor()
, чтобы изменить указатель. -
Метод 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 см. в разделе Регистрация оконных классов в 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)
}
Код метода 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);
}
В этом примере задайте значение m_ChangeCursor
TRUE непосредственно перед вызовом BeginWaitCursor()
, а затем задайте для него значение FALSE после вызова EndWaitCursor()
.