Сообщения WM_PAINT никогда не доставляются в ваше окно, если кто-то не наберет UpdateWindow
или в вашей очереди ввода нет сообщений клавиатуры или мыши.
Как только вы начинаете обрабатывать WM_PAINT, если приходит сообщение клавиатуры или мыши, оно просто остается в вашей очереди, пока вы не закончите с WM_PAINT. То, что вы описываете, невозможно.
Если выполнение вашего кода WM_PAINT занимает много времени, это может привести к рывкам, но вы говорите, что это не проблема, так что, возможно, это ваша обработка WM_ERASEBKGND? Я не вижу этот код, но я вижу, что когда вы InvalidateRect
, вы передаете TRUE в качестве последнего параметра, что означает, что вы хотите стереть фон.
Если вы не обрабатываете WM_ERASEBKGND, то DefWindowProc сделает это за вас, стирая все окно с помощью кисти из вашего класса окна. Это может привести к тому, что окна будут думать, что ни одна часть вашего окна не прозрачна.
Если вы хотите, чтобы сообщения мыши проходили через ваше окно, более надежным способом является обработка сообщения WM_NCHITTEST и возврат HTTRANSPARENT, через который вы хотите, чтобы мышь проходила.
Это в основном то, как работает стиль WS_EX_TRANSPARENT. как это
case WM_NCHITTEST:
{
lRet = DefWindowProc(hwnd, uMsg, wParam, lParam);
if (HTCLIENT == lRet)
lRet = HTTRANSPARENT;
}
Если в вашем окне нет не клиентской области, вы можете пропустить вызов DefWindowProc.