【发布时间】:2012-04-18 02:03:22
【问题描述】:
我在使用 VCL 样式时遇到了一个非常奇怪的问题。有时,当使用预定义的样式启动程序或稍后设置一种时,一个或一些程序窗口会消失。
这种情况非常随机,可能每 10 到 20 次发生一次,而不是在任何特定窗口中。我在运行时打开了 2 个表单,有时是一个,有时是另一个。
发生这种情况时,我会在窗口不可见时检查一些属性,Visible 属性为 true,窗口边界正确;如果我尝试通过 Aero DWM 实时缩略图显示窗口.. 它也是空的;但是,如果我捕获窗口 DC,我会得到一个带有窗口的位图,就好像它正常显示一样(并且已应用样式)。
它没有显示任何错误,没有警告,没有异常......似乎没有任何问题,只是窗口不存在。如果我将鼠标悬停在任务栏按钮上以查看预览,它会显示该框,但它是空的。
有什么要检查的想法吗?
编辑:调用 RecreateWnd 可以暂时解决此问题,但它可能会再次失败。
【问题讨论】:
-
大胆猜测,它需要一个 RecreatWnd。如果单击任务栏中显示的预览会发生什么?
-
没什么。程序变为活动状态,但没有显示任何内容。如果我切换到另一种样式(通过托盘图标菜单),它会再次出现。请参阅此处,两种不同的情况,每个表单都没有通过任务栏预览显示:i.imgur.com/WT7KK.pngi.imgur.com/gjClr.png 另外,如果我在 DC 上执行 bitblt,它会捕获正确应用样式的窗口。
-
调用 RecreateWnd 解决了这个问题,我会在启动时调用它,并在更改样式作为临时解决方法之后调用它。
-
另一个观察:当窗体实际显示正确时调用 RecreateWnd,有时会以同样的故障结束:窗口噗;所以它也不能作为一种解决方法(除非我有办法检测到故障何时发生)。
-
你能提供一个基本的代码来复制这个问题吗?
标签: delphi styles vcl skinning