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

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

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

Сводка

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

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

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

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

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

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

  • Способ 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() для Windows WM_SETCURSOR и укажите тело функции следующим образом:

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() .