На самом деле он не отправляется сразу после создания, но может быть получен в любое время после создания, если в окне определена область, не относящаяся к клиенту. В Windows есть два основных региона: клиентский и не клиентский. Область, не относящаяся к клиенту, является внешней границей / полем окна, а клиентскую область можно считать «телом» окна. Это та область, где вы будете проявлять наибольшую активность, и обычно это предполагаемая область окна, в которой пользователь должен взаимодействовать. Конечно, иногда другие стороны создают элементы управления, которые не имеют областей, не относящихся к клиенту, и все же отображают свои собственные границы и другие детали.
Почти для всех элементов управления запасами (что-либо из библиотеки общих элементов управления и других элементов управления на основе окон, опубликованных Microsoft) следующие области рассматриваются как области, не относящиеся к клиенту.
- Титры подписи
- Системное меню / Свернуть / Развернуть / Закрыть
- Граница
Сообщения с префиксом NC представляют события, которые произошли в не-клиентских областях окна. Сообщения без префикса находятся в клиентской области.
Во всяком случае, я предполагаю, что у вас есть функция, которая отслеживает события мыши в определенном окне. Если есть необходимость отследить какое-либо движение над не-клиентскими областями окна (скажем, для операций перетаскивания или наведения), вам необходимо добавить следующие сообщения в отслеживание мыши.
(положение мыши изменилось в не клиентской области)
- WM_NCLBUTTONDBLCLK
- WM_NCLBUTTONDOWN
- WM_NCLBUTTONUP
(действия левой кнопки в не клиентской области)
- WM_NCMBUTTONDBLCLK
- WM_NCMBUTTONDOWN
- WM_NCMBUTTONUP
(действия средней кнопки в не клиентской области)
- WM_NCRBUTTONDBLCLK
- WM_NCRBUTTONDOWN
- WM_NCRBUTTONUP
(правая кнопка в не клиентской области)
Кроме того, в зависимости от вашего приложения могут представлять интерес следующие сообщения.
(активация окна изменилась в результате действий пользователя, и необходимо обновить область, не относящуюся к клиенту)
(оконный менеджер хочет знать, отслеживает ли не-клиентская область активность мыши)
(область, не относящуюся к клиенту, должна быть перекрашена)
Полезным приемом для определения визуального экстента области, не являющейся клиентом, является перехват сообщения WM_NCPAINT и просто закрашивание области, не являющейся клиентом, в цвет по вашему выбору (красный / розовый или какой-либо другой выделенный цвет). Это полезно для отладки ситуаций, когда у вас есть несколько окон, смежных друг с другом с не-клиентскими областями, которые должны выглядеть незаметно.
Наконец, вот ссылка с демонстрационным исходным кодом, который, возможно, стоит изучить, чтобы увидеть, как работают области, не относящиеся к клиенту.
Настройка области без клиента из CodeProject (VB)