Я пытаюсь нарисовать свою собственную не-клиентскую область в окне, обрабатывая WM_NCPAINT
и WM_NCACTIVATE
.Проблема в том, что когда я изменяю размер окна, нижний и правый края занимают слишком много времени, чтобы «наверстать упущенное» и адаптироваться к новому размеру окна.Это не результат медленного или неэффективного рендеринга кода, потому что это происходит даже с полностью пустым обработчиком WM_NCPAINT
.
Если я либо вызываю DefWindowProc
в своем обработчике, либо не обрабатываю NCPAINT вообще,это странное поведение перестает происходить, и хотя я изменяю размер окна, нижний правый угол вообще не двигается.
Я пытался принудительно обновить окно в обработчике NCPAINT, но проблема не исчезлане уходи.
Здесь вы можете видеть, о чем я говорю.Просто игнорируйте уродливый вид окна из-за отсутствия оконной рамы.На демонстрации отсутствует код рисования в обработчике WM_NCPAINT
, он просто возвращает 0 к обратному вызову WndProc.
Мой вопрос заключается в том, что я должен делать после рисования собственной оконной рамы, чтобы держать нижнюю и правуюкрая исправлены при изменении размера как любое обычное окно?
РЕДАКТИРОВАТЬ
Это код, который обрабатывает сообщения Windows.Пока нет кода рендеринга, потому что сначала я хочу избавиться от странного поведения при изменении размера.
LRESULT CALLBACK wndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_NCACTIVATE:
case WM_NCPAINT:
{
// DefWindowProc(hWnd, uMsg, wParam, lParam);
// Custom frame rendering will be done here
return 0;
}
}
return CallWindowProc(prevWmdProc, hWnd, uMsg, wParam, lParam);;
}
Обратите внимание, что если я откомментирую вызов DefWindowProc
, окна начнут вести себя нормально во времяизменение размера.Очевидно, этот метод делает что-то, чтобы постоянно обновлять клиентскую область окна, пока изменяется размер.У меня нет доступа к исходному коду этого метода, поэтому я не знаю, как он работает.