在Windows上,当我显示一个对话框(自定义对话框或标准打开/保存文件对话框),并在父窗口上移动对话框时,父窗口不会重绘,留下拖动后面的对话框。 (父窗口使用OpenGL进行绘制,但不确定这是否相关。)如何在对话框移到它前面时重新绘制主窗口?
每当对话框的回调被发送消息时,我都尝试添加一个重绘主窗口的调用,但这只会导致在按下按钮或输入编辑字段时重绘。当对话框的时候不会重绘窗口被移动了。我怎样才能发现这种运动?
答案 0 :(得分:1)
我怀疑你的opengl应用程序只是使用一个窗口用于通过opengl渲染到它的显式目的,然后进入一个紧密循环检查鼠标/ kb输入,然后重写opengl表面。我猜你在绘制框架后没有抽取信息。更重要的是,您为窗口设置的小Stnd WndProc可能没有WM_PAINT处理程序。
要考虑两件事。您的主窗口的WndProc需要捕获WM_PAINT,重绘并验证曲面。那是......
LRESULT __stdcall YourMainWndProcHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
...
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint(hwnd, &ps);
EndPaint(hwnd, &ps);
// redraw your stuff here
return 0;
}
...
}
}
不是调用BeginPaint / EndPaint来处理上面的WM_APINT,而是可能只调用ValidateRect。
最好在绘制循环中捕捉其他窗口消息。这样,如果窗口被应用程序外部的其他东西遮挡(例如调整大小操作,最小化/恢复,其他Windows应用程序占用前景等等),那么您也可以处理重绘通知。
一个典型的游戏尝试每个绘图框抽一条消息。
void MainLoop()
{
MSG msg;
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
// your code to simulate and render below
DrawScreen();
}