Спасибо за пример кода.
Поведение, которое вы видите, заключается в том, что при изменении размера окна с помощью мыши ОС вводит модальный цикл обработки сообщений для обработки ввода с помощью мыши. Во время этого цикла ваш цикл сообщений не запускается - это означает, что ваш PeekMessage()
и специальная обработка сообщений также не запускаются. Вместо этого сообщения просто отправляются как обычно для вашей оконной процедуры.
Есть два решения, которые приходят на ум сразу, но то, как вы справляетесь с этим, действительно зависит от дизайна вашей программы и того, почему вы хотите обрабатывать события размератаким образом.
Первая идея, которая у меня возникла, заключается в том, чтобы отслеживать, находитесь ли вы в модальном цикле определения размера или нет, и отложить публикацию уведомления до завершения цикла. Пример того, как сделать это, используя предоставленную вами оконную процедуру, приведен ниже.
Второе решение - просто вызывать обработчик событий изменения размера напрямую, когда вы получаете WM_SIZE
(или, если вам нужно пройти через систему событийпоместите обработчик для него в оконную процедуру вместо использования PostMessage
).
Пример кода для первого предложения:
LRESULT CALLBACK obgpf_DefaultWindowCallback(HWND window, UINT message, WPARAM wParam, LPARAM lParam)
{
LRESULT result = 0;
static bool fResized = false;
static bool fInSizeLoop = false;
switch(message)
{
case WM_CLOSE:
{
PostMessageA(window, WM_QUIT, 0, 0);
} break;
//this should be handled by OBGGetEvent
case OBG_WM_RESIZE:
{
printf("MESSAGE WENT THROUGH. DON'T WANT THIS\n");
} break;
case WM_SIZE:
{
if (fInSizeLoop) // in modal size loop, defer notification
fResized = true;
else
PostMessageA(window, OBG_WM_RESIZE, wParam, lParam);
} break;
case WM_ENTERSIZEMOVE:
fInSizeLoop = true; // begin modal size loop
break;
case WM_EXITSIZEMOVE:
fInSizeLoop = false; // left modal size loop
// post resize notification now
if (fResized) {
RECT rc;
GetClientRect(window, &rc);
PostMessageA(window, OBG_WM_RESIZE, 0, MAKELPARAM(rc.right - rc.left, rc.bottom - rc.top));
fResized = false;
}
break;
default:
{
result = DefWindowProc(window, message, wParam, lParam);
} break;
}
return result;
}
(извините, это код C ++, и я простозаметил, что вы пометили как C - но принцип тот же).