Изменение указателя мыши для окна в MFC с помощью Visual C++

В этой статье описывается изменение указателя мыши для окна в MFC с помощью Visual C++. Сведения, приведенные в этой статье, относятся только к неуправляемого кода Visual C++.

Исходная версия продукта: Visual C++
Исходный номер базы знаний: 131991

Сводка

В windows-приложении окно всегда создается на основе класса окна. Класс window определяет несколько характеристик окон на его основе, включая указатель мыши по умолчанию (курсор). В некоторых случаях приложению может потребоваться изменить указатель, связанный с определенными окнами, которые оно создает. В этой статье описываются три метода, которые приложение MFC может использовать для отображения разных указателей в разное время.

Ситуации, когда приложения MFC отображают разные указатели

Ниже приведены некоторые ситуации, когда приложение MFC может отображать разные указатели в разное время:

  • Если указатель по умолчанию не является хорошим объектом пользовательского интерфейса для конкретного приложения. Например, указатель i-beam больше подходит, чем стрелка для окна текстового редактора в Блокноте. Это может включать изменение указателя для всего запуска приложения.
  • Когда приложение выполняет длительную операцию, например дисковый ввод-вывод, указатель на песочные часы более удобен, чем стрелка. Изменив указатель на песочные часы, вы предоставляете пользователю хороший визуальный отзыв. Это может включать изменение указателя в течение ограниченного периода времени.

Три метода изменения указателя мыши в окне

Ниже приведены три способа, с помощью которых приложение может изменить указатель мыши в окне:

  • Метод 1. Переопределение CWnd::OnSetCursor() функции. Вызовите функцию Windows API SetCursor() , чтобы изменить указатель.
  • Метод 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_ChangeCursorTRUE непосредственно перед вызовом BeginWaitCursor(), а затем задайте для него значение FALSE после вызова EndWaitCursor().