UI为何会保持闪烁?

时间:2009-09-25 00:22:03

标签: visual-c++ mfc

我有一个项目有三个对话框,让我们说A,B,C。 A包含B& C,B包含C. 它们都是从DialogBase类继承而来的 并有一个setBitmap函数来设置背景图像。

我添加了每次拖动C,B也会拖动的关系。 和B是一个透明的对话框!

当触发onLbuttonDown时,我会设置它 m_pParent-> ModifyStyleEx(0,WS_EX_TRANSPARENT);这使得B对话框变得透明。

问题是:如果我设置了这个,对话框B是透明的,但当我移动B时,它会保持闪烁。

但如果我发表评论 m_pParent-> ModifyStyleEx(0,WS_EX_TRANSPARENT); 然后对话框B不会透明,但不会闪烁。

有人可以给我一个解决方案吗?

1 个答案:

答案 0 :(得分:2)

WS_EX_TRANSPARENT是一种难以理解的风格。它可能不会做你认为它做的事情。

当你为一个窗口设置WS_EX_TRANSPARENT时,你并没有告诉Windows让它变得透明 - 你告诉Windows你不会在整个窗口上绘画,因此它必须在绘制你的窗口之前绘制窗口窗口。您所做的只是将WM_PAINT消息的顺序更改为各种窗口。

每次对话框A重新渲染时,您都会看到闪烁。

如果您确实需要通过对话框B的背景查看对话框A的部分,则可以在OnLButtonDown中进行一些特殊处理。首先将对话框B的可见性设置为关闭,然后创建一个位图,将其分配给DC,并将对话框绘制到该DC。现在,您可以再次将对话框B设置为可见,并且每次绘制它时,首先将保存的位图的相应部分复制到背景中。