Развиваем проект дальше.
Изменения в 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;
}
Вот так будет вести себя программа.
Для того, чтобы мы имели возможность изменять курсор внутри вида, необходимо перегрузить функцию 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;
}