Какие сообщения обрабатываются DefWindowProc?
Вопрос
Существует ли какая -либо документация, какие сообщения обрабатываются DefWindowProc, и как?
Недавно я наткнулся на WM_SETFONT/WM_GETFONT, который не обрабатывался, я не уверен, есть ли ошибка в моем коде, или это ожидаемое поведение, поэтому я попробовал следующий Winmain:
WNDCLASSEX wcx =
{
sizeof(WNDCLASSEX),
CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS,
DefWindowProc,
0, 0, // class/wnd extra bytes
hInstance,
0,
LoadCursor(0, IDC_ARROW),
0,
0,
_T("some class"),
0
};
ATOM a = RegisterClassEx(&wcx);
_ASSERTE(a != 0);
HWND wnd = CreateWindowEx(0, wcx.lpszClassName, NULL,
WS_POPUP, 0,0,0,0, GetDesktopWindow(), 0, hInstance, 0);
_ASSERTE(wnd != 0);
HFONT font = (HFONT) GetStockObject(ANSI_VAR_FONT);
_ASSERTE(font != 0);
SendMessage(wnd, WM_SETFONT, (WPARAM) font, 0);
HFONT font2 = (HFONT) SendMessage(wnd, WM_GETFONT, 0, 0);
_ASSERTE(font2 == font); // **FAILS**, font2 is 0
Решение
Насколько мне известно - нет. Каждое оконное сообщение - редкая и уникальная вещь, которая может отличаться во многих отношениях. Ожидается, что некоторые сообщения будут опубликованы, другие отправлены.
Некоторые сообщения являются уведомлениями для окна пользователей, другие являются командами для обработчика (ы) defxxxwindowproc - defwindowproc, defdlgproc, defmdichildproc и т. Д.
Некоторые обрабатываются одинаково в диалоговом окне и оконных проведениях, некоторые должны обрабатывать по -разному.
WM_Settext и WM_SetredRaw на самом деле являются командами, которые DefWindowProc использует для изменения внутренних структур данных в wnd struct.
WM_SIZE - это просто уведомление - отправлено DefWindowProc в свое собственное окно - в ответ на WM_WINDOWPOSCHANGED.
Сообщения WM_MOUSEXXX должны быть опубликованы, никогда не отправляемые, так как Windows часто вводит модальные состояния, где сообщения читаются с GetMessage/PeekMessage и обрабатываются напрямую и не публикуются.
Много сообщений Смотреть Как уведомления, но всегда должны быть переданы DefWindowProc, потому что они «тайно» используются для реализации менеджера Window. (Wm_activate и друзья).
Большинство сообщений можно обрабатывать в диалоговом окне, возвращая false (или true), некоторые, с значимыми результатами, необходимо использовать SetDlgResult, другие обрабатываются автоматически (wm_ctlcolor*) в качестве диалога Proc знает что не нулевой результат от DialogProc соответствует LRESULT для возврата.
Некоторые (wm_syscommand) на самом деле не являются сообщениями в окно вообще, и только что обрабатываются Defwindowproc, чтобы сделать тип менеджера окна (Tile the Desktop и т. Д.)
В официальной документации нет реальной попытки классифицировать эти различия.
Специально решать WM_SET/GETFONT
проблема, WM_SETFONT
, в то время как определенное сообщение не обрабатывается DefWindowProc и, следовательно, не обрабатывается классами окон, которые явно не поддерживают его. Управление (редактирование, статика и т. Д.) И поддержка диалогов WM_SETFONT
а также WM_GETFONT
. Анкет Чтобы поддержать его в приложении, зарегистрированном классе, потребует поставки фактического пользовательского WindowProc и обработки сообщения там.