Шаг 25 - Меняем курсор в виде

Создание проекта

Развиваем проект дальше.

Создаем код

Изменения в CMyView. Создаем функцию и таблицу откликов.

class CMyView : public CView	// класс просмотр
{
.................
CMyDoc* GetDocument(); // получить документ
afx_msg BOOL OnSetCursor( CWnd* pWnd, UINT nHitTest, UINT message ); // реакция на сообщение о смене курсора.
DECLARE_DYNCREATE(CMyView) // Эта функция вызывается для прорисовки вида
........
private:
DECLARE_MESSAGE_MAP() // будет таблица откликов
};

Дополнение в таблицу откликов для реакции на сообщение.

BEGIN_MESSAGE_MAP(CMyView, CView)
ON_WM_SETCURSOR() // смена курсора
END_MESSAGE_MAP()

Реализация функции.

BOOL CMyView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_CROSS)); // установить курсор, который взять из системы
return TRUE;
}

Вот так будет вести себя программа.

25_1.gif (12778 b)

Описание

Для того, чтобы мы имели возможность изменять курсор внутри вида, необходимо перегрузить функцию OnSetCursor, она отвечает за вид курсора. А для того, чтобы она вызвалась нам надо описать реакцию на событие ON_WM_SETCURSOR() в таблице откликов.

При перегрузке функции вызывается функция Win32 API - SetCursor. Две точки впереди говорят о том, что функцию нужно взять из Windows, а не из MFC. В эту функцию мы передаем идентификатор курсора, который получаем с помощью функции LoadStandardCursor (прочитать стандартный курсор). В параметрах ставим, что курсор крест.

AfxGetApp() использована для получения доступа к классу, в котором есть функция чтения стандартного курсора - CWinApp. Используя её можно получить доступ к этому классу из любого места программы. Запускайте программу, в левом окне курсор будет крест. Если Вы хотите, чтобы курсор изменялся по условию, то Вы можете написать примерно так:

BOOL CMyView::OnSetCursor( CWnd* pWnd, UINT nHitTest, UINT message )
{
if (blTestMove)
{
::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_CROSS));
return TRUE;
}
return CView::OnSetCursor(pWnd,nHitTest,message);
}

Шпаргалка

Перегрузите функцию установки курсора.

class CMyView : public CView	// класс просмотр
{
.........
afx_msg BOOL OnSetCursor( CWnd* pWnd, UINT nHitTest, UINT message ); // реакция на сообщение о смене курсора.
.........
};

Отклик в таблице сообщений.

BEGIN_MESSAGE_MAP(CMyView, CView)	
ON_WM_SETCURSOR() // смена курсора
END_MESSAGE_MAP()

Реализация.

BOOL CMyView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_CROSS)); // установить курсор, который взять из системы
return TRUE;
}

Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.