Я пытаюсь сделать элемент, который бы вел себя похоже на строку меню или панель инструментов. После их создания остальные окна размещаются ниже. У меня есть вот такая конструкция: Код (Text): case WM_NCCALCSIZE: RECT *prc; DefWindowProc ( hwnd, message, wParam, lParam ); prc = (RECT *)lParam; prc->bottom-=20; break; После этого в WM_SIZE приходит уменьшенный на двадцать HIWORD(lParam), и с его помощью все элементы могут "подтянуться" к новой высоте клиентской области. Но, в данном случае, внизу остается дырка. Ее нужно либо закрасить через WM_PAINT/WM_ERASEBKGND, либо через размещение поверх нее еще одного окна. Хотя желательно разобраться с обоими вариантами. Делать +20 к нужному окну не получается, клиентская область уменьшилась и дочернее окно просто не отображается. Прибавлять +20 внутри WM_PAINT или WM_ERASEBKGND к FillRect, например, тоже нельзя, не будет нужного эффекта. И, в принципе, понятно почему.
provocateur Ну либо после стандартной обработки дорисовать что тебе требуется, либо вместо стандартной обработки отрисовать всю неклиентскую область.
KIV, тогда сверху отступ получается Сделал так: Код (Text): case WM_NCPAINT: RECT rt; hDC = GetWindowDC( hwnd ); GetClientRect ( hwnd, &rt ); DefWindowProc ( hwnd, message, wParam, lParam ); rt.left += GetSystemMetrics (SM_CXSIZEFRAME); rt.right += GetSystemMetrics (SM_CXSIZEFRAME); rt.top = rt.bottom + 20 + GetSystemMetrics (SM_CYSIZEFRAME) ; rt.bottom = rt.top + 20; FillRect(hDC, &rt, GetSysColorBrush( COLOR_WINDOWFRAME ) ); ReleaseDC ( hwnd, hDC ); break; Вроде бы рисует (дорисовывает после системной ф-ции), но точно рассчитать область не могу. Не понимаю как оно действует. Вроде бы GetClientRect должно дать правильные данные, надо только сдвинуть влева на ширину рамки окна SM_CXSIZEFRAME (?). Но по высоте какой-то бардак. Вроде бы все понятно, что rt.top получится, если к получемнному через GetClientRect rt.bottom добавить высоту рамки SM_CYSIZEFRAME, а rt.bottom можно получить добавив в только что полученому tr.top 20 точек. Но при таком раскладе рисуется не то. В примере сначала к rt.bottom добавляю 20 и это становится топом, но ведь так не должно быть.
Кажется понял, забыл добавить высоту заголовка: Код (Text): rt.top = rt.bottom + GetSystemMetrics (SM_CYSIZEFRAME) + GetSystemMetrics (SM_CYCAPTION);