Здравствуйте, SergeySV2, Вы писали:
SSV>Насколько я понял, при изменение размера окна/положение окна с флагом — SWP_FRAMECHANGED, окну посылается сообщение — WM_NCCALCSIZE — которое говорит ему, что необходимо пересчитать размеры клиентской области относ. размеров окна.
Точно. Но это сообщение посылается окну только с целью _выяснить_ каких бы размеров ему хотелось иметь свою клиентскую область, оно обрабатывается либо окнной процедурой конкретного класса окон (или конкретного окна, если имел место subclassing), либо обрабатывается ::DefWindowProc(), которая расчитывает размер согласно системным метрикам и стилям окна, но в любом случае обработчик этого сообщения только расчитывает размеры, но ни применяет, ни сохраняет их.
Применением размеров занимает ТотКтоПослал сообщение WM_NCCALCSIZE (с точки зрения прикладника ::SetWindowPos()), а вот как он это делает может сильно зависеть от версии, поэтому вы сделать это впринципе сможете (благо доступен исходник Win2000 :) и книжка вроде есть, где внутренности такого рода рассматриваются), но только я бы вам не советовал терять на это время :). Резюмируя, можно посоветовать понимать WM_NCCALCSIZE как WM_{Get}NCCALCSIZE, а не как WM_{Set}NCCALCSIZE.
SSV>Вопервых непонятно, почему написано, что 0 RECT отвечает за размеры окна, тогда как опытным путем я выяснил [...]. Во всех примерах инета меняют обычно именно 0 RECT.
Что именно передается в lParam сильно зависит от значения wParam, так вот как раз когда (!wParam), то в lParam передается (LPRECT) на новый размер окна, в который надо записать новые координаты клиентской области. Но так как все программисты — ленивы, то все подумали и решили, что раз NCCALCSIZE_PARAMS — POD, а первым членом там RECT (первый из трех), то можно считать, что в lParam _всегда_ передается (LPNCCALCSIZE_PARAMS), но в случае (!wParam) использовать только rgrc[0], а остальные не трогать.