Измен. НЕклиентской части окна
От: SergeySV2  
Дата: 16.02.04 12:33
Оценка:
Занимаюсь написанием удобного класса по созданию и управлению popup окном. В частности интересует вопрос по изменению неклиентской части окна.
В этом вопросе есть у меня некоторое недопонимание и хотелось чтобы его развели знающие люди и подсказали что-нибудь интересное.

Насколько я понял, при изменение размера окна/положение окна с флагом — SWP_FRAMECHANGED, например написав так:
SetWindowPos hWnd, _
0&, 0&, 0&, 0&, 0&, _
SWP_NOSIZE Or SWP_NOMOVE Or SWP_NOZORDER Or _
SWP_NOACTIVATE Or SWP_NOOWNERZORDER Or SWP_FRAMECHANGED

окну посылается сообщение — WM_NCCALCSIZE — которое говорит ему, что необходимо пересчитать размеры клиентской области относ. размеров окна. В параметре lParam это сообщения передаются размеры окна в виде:
Private Type NCCALCSIZE_PARAMS
rgrc(0 To 2) As RECT
lppos As Long 'WINDOWPOS
End Type
как написано в MSDN: 0 RECT — новые размеры окна, 1 RECT — старые размеры окна, 3 RECT — размеры КЛИЕНТ. части окна до изм.; lppos — указатель на структуру WINDOWPOS где опять же заданы размеры окна.

Вопервых непонятно, почему написано, что 0 RECT отвечает за размеры окна, тогда как опытным путем я выяснил, что именно его изменения влияют на размер КЛИЕНТской области, скроей его надо было назвать новый размер КЛИЕНТСКОЙ области. Во всех примерах инета меняют обычно именно 0 RECT.

Второе: я пытался изменить размеры клиентской части окна послав ему сообщение WM_NCCALCSIZE через SendMessage, и через Spy++ я видел что сообщение доходит до окна, но почему-то не принимается к действию. Вызвав после этого SetWindowPos.... который тоже порождает WM_NCCALCSIZE событие, я уже вижу что в нем опять передается старые значения окна. Т.е. он просто не принимает и не запоминает размеры окна (клиент. части), когда я ему посылаю их через SendMessage.
Я подумал что может он их просто не ждет и его сначала как-то подготовить к тому, что будет изменены внутр. размеры клиент. части. Тогда перед SendMessage ..WM_NCCALCSIZE.. я стал посылать SendMessage ..WM_WINDOWPOSCANGING.. на манер как это делает функ. SetWindowPos (с нулевыми размерами и флагами WP_NOSIZE Or SWP_NOMOVE Or WP_FRAMECHANGED Or...) — тоже облом.

Единственный способ который подошел, это когда я через SetWindowPos инициирую событие WM_NCCALCSIZE, которое перехватываю в обработчике WindowProc и уже меняю его LParam. Тогда все хорошо и я сразу вижу как клиентская часть окна изменилась.

Вопрос: почему? почему токо изменив посланное системой сообщение можно заставить его поменять размеры, а сообщение посланное напрямую через SendMessage игнорируется, что ему может не хватать? есть у кого-нибудь идеи? Буду благодарен за любую подсказку, хочется расширить свой горизон горизонт, а не оставаться с таким непонятками

P.S. прошу Вас не пугаться за представленный код, это VB, но на суть вопроса язык я думаю не должен влиять.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.