【发布时间】:2015-02-09 09:52:21
【问题描述】:
我已按照本教程进行操作,一切正常:http://www.braynzarsoft.net/index.php?p=InitDX11
结果是一个背景颜色不断变化的窗口。问题是在拖动窗口时颜色停止变化。我尝试将以下 case 语句(以各种组合)添加到 WndProc 回调,但无济于事:
case WM_ENTERSIZEMOVE:
SetTimer(hwnd, 1, USER_TIMER_MINIMUM, NULL);
return 0;
case WM_EXITSIZEMOVE:
KillTimer(hwnd, 1);
return 0;
case WM_TIMER:
RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE | RDW_INTERNALPAINT);
return 0;
case WM_PAINT:
UpdateScene();
DrawScene();
return 0;
以上导致d3d11DevCon->ClearRenderTargetView(renderTargetView, bgColor) 出现异常,但我也尝试将WM_PAINT 案例合并到WM_TIMER 案例中,我得到的只是在自然窗口背景颜色和当前颜色之间闪烁DX 场景(闪烁的 DX 部分的颜色从未发生变化,无论我拖动窗口多久,它都保持不变)。
有什么建议吗?
【问题讨论】:
-
@Alex:不是这样的。问题不在于消息循环仅在消息队列为空时更新。问题是,在移动/调整窗口大小时,消息循环根本不运行。当移动/调整窗口大小时,代码进入一个模态(嵌套)循环,类似于模态对话框。在操作完成之前,外部消息循环不会运行。尽管
RedrawWindow调用中的RDW_UPDATENOW标志更类似于消息循环行为,但代码应该可以正常工作。 -
@Alex:移动/调整大小期间的模态循环将很好地发送消息。它是在模态循环中不会运行的自定义循环实现。
-
但是等等,定时器消息的优先级不是比绘制消息低吗?如果计时器正在触发但没有发送绘画消息,那么发生了什么?调整大小期间的内部模态循环是否与整个系统中的所有其他消息循环完全不同?
-
@andlabs:你从哪里得到的想法,没有生成绘画消息?
-
@IInspectable 我认为来自 Alex 的 cmets,但它们现在已被删除,因此我无法引用它们:/ 鉴于它如何描述背景,原始帖子中描述的行为似乎也暗示了这一点不变。
标签: winapi directx directx-11