По поводу вопроса смены курсора в MFC-приложении (выпуск No.3) пришло несколько дополнений и замечаний (некоторые несущественные моменты я опустил, вместо них поставил знак "[…]", свои комментарии в теле письма я также привожу в квадратных скобках):
Подобно третьему случаю, но не только в PreCreateWindow.
В тот момент, когда хотим поменять курсор (для всего приложения) проделываем следующие действия:
::SetClassLong(theApp.m_pMainWnd->m_hWnd, GCL_HCURSOR, ::LoadCursor(theApp.m_hInstance, MAKEINTRESOURCE(IDC_MY_CURSOR)));
Немного длинная строчка кода :)) […]
Как обычно встречается такая проблема: theApp, хоть и объявлена глобально (объявляется если проект создается стандартным Wizard-ом), не видна в других файлах проекта. Чтобы обойти это просто в файле объявления класса вашего приложения (производного от CWinApp) сразу после объявления класса добавьте следующую строчку:
extern CMyApp theApp;
где CMyApp – имя класса вашего приложения.
Замечу, что theApp так объявлять необязательно, так как многие, и я в том числе, пользуются вместо этого стандартными функциями MFC AfxGetApp и AfxGetMainWnd, которые возвращают указатель на объект-приложение и главное окно соответственно.
Вот еще одно письмо на эту тему:
Проблема смены курсора меня настигла еще на раннем этапе моего программистского становления. Поэтому хочу предложить тот вариант, который является по-моему наиболее адекватно подходящим с точки зрения скорости и идеологии Win32 API. Способ три конечно хорош и его можно расширить на все время существования окна. Вот как происходит вызов в классе окна:
::SetClassLong(m_hWnd,GCL_HCURSOR, (long)AfxGetApp->LoadCursor(IDC_MY_CURSOR));
При этом курсор меняется перманентно, т.е. например при вызове SetCursor вид курсора меняется при начале движения мыши. А так меняется просто класс окна. Работает быстро и надежно. […]
Спасибо Андрею и Алексу за это дополнение, теперь мы с вами знаем четыре способа изменить курсор;). Должен признаться, в предыдущем выпуске я допустил оплошность , ляпнув что первый параметр у AfxRegisterWndClass можно заменить на cs.style, причем, как назло, понял свою ошибку как раз в тот момент, когда отправлял рассылку "в эфир". Мне не преминули на эту ошибку указать, и я очень рад этому. Пожалуйста, будьте бдительны!!! Я тоже человек! Подробности читайте ниже…