очередь особщений, структура MSG
typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG, PMSG, LPMSG;
system, user, app, registered
- system 0x0000-0x03FF - определенные системой
- user 0x0400-0x07FF - для private window classes
- app 0x0800-0xBFFF - private messages для приложений версии 4.0
- registered 0xC000-0xFFFF - registered - регистрируются с помощью RegisterWindowMessage
- используется для сообщений которые должны слаться между разными процессами и между окон разных классов
- уникальны для всей системы
- если два приложения зарегистрируют сообщение с одинаковой строкой, то им вернется один и тот же идентификатор (в этом вся фишка)
UINT WINAPI RegisterWindowMessage(
In LPCTSTR lpString
);
цикл обработки сообщений
BOOL WINAPI GetMessage(
_Out_ LPMSG lpMsg, // куда записывать инфо
_In_opt_ HWND hWnd, // какому окну предназанчается сообщение (если NULL - текущий пооток)
_In_ UINT wMsgFilterMin, // минимальное допустимое значение сообщение
_In_ UINT wMsgFilterMax // максимально ...
);
TranslateMessage( MSG ) - транслирует соощение о virtual-key в сообщения онажатии конкретной клавиши (новые сообщения постятся в очередь текущего потока)
DispatchMessage( MSG ) - передает сообщение оконной процедуре
ввод с клавиатуры, мыши, команд меню и нотификации от контролов
- Клава (с шестого этажа)
- WM_KEYDOWN ( о системных клавишах )
- wParam - код клавиши
- lParam - побитовая кодировка контекста (количество повторов при зажатии клавиши, зажат ли Alt или Ctrl)
- WM_CHAR ( о символьных клавишах ) - они появляются только после TranslateMessage
- wParam - код клавиши
- lParam - тот же что и у WM_KEYDOWN
- Мышь
- WM_*BUTTONDOWN/UP/DBLCLK // последнее - если класс определен с нужным флагом
- lParam - координаты, вытаскиваются макросами GET_X_LPARAM GET_Y_LPARAM
- wParam - доп инфа (зажат ли Ctrl или Shift, или другие кнопки мыши)
- WM_NC*BUTTONDOWN
- сообщения о действиях мыши в неклиентской зоне
- обычно игнорятся приложением (система сама их обрабатывает)
очереди, приоритет и т д
subclass superclass
- subclassing
- возможность обрабатывать сообщения окна X, до того, как X начал их обрабатывать
- требование, оно должно быть в этом же процессе
- для одного окна
- вызываем SetWindowLong и подменяем оконную процедуру (и сохраняем адрес старой, чтобы могли посылать сообщения далее)
- пример - запретить EditControl'у принимать некоторый свойствы
- для всех
- вызываем SetWindowClass иподменяем оконную процедуру
- пометка: для функции нам надознать хэндл окна, потому обычно создается скрытое окно этого класса и его хэндл посылается в SetClassLong
- отличие, мы не создаем отдельный класс, а подменяем либо в окне, либо в существующем классе
- важно: УДАЛЯТЬ все созданные subclass притом в порядке обратном их созданию
- superclassing
- создаем класс, основанный на некотором baseклассе + некоторые фичи
- также, за счет этого, мы можем оброабатывать WM_CREATE и WM_NCCREATE
- проделываем так:
- GetClassInfo
- подменяем hInstance, wndProc и имя
- регистрируем новый класс