【问题标题】:Delphi XE2 VCL styles, weird glitch, window invisibleDelphi XE2 VCL 样式,奇怪的故障,窗口不可见
【发布时间】: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


【解决方案1】:

找到问题的原因:“Alphablend”。如果启用此功能,即使在 255 时也会出现问题。

重现步骤:

  • 打开新的 VCL 表单项目
  • 项目选项,外观,设置风格主题。我使用 Cobalt XE 进行测试
  • 将 Alphablend 设置为 true
  • 运行

可能需要运行 10-20 次才能出现故障。

我注意到当它发生时,窗口实际上就在那里。你可以将鼠标悬停在上面并注意到那里有东西。如果您猜到它们的位置,您甚至可以单击控件。如果您设法在窗口不可见时拖动它,它将显示出来。如果你最小化/恢复它也会显示出来。

如果您在窗口处于活动状态时执行 alt+PrtScr 并粘贴到 Paint 等中,您将获得它后面的内容以及窗口边界,就好像 alphablendvalue 设置为 0。

【讨论】:

    猜你喜欢
    • 2012-08-25
    • 1970-01-01
    • 2013-10-26
    • 2013-05-18
    • 2012-02-26
    • 2012-06-29
    • 2012-05-02
    • 2012-06-07
    • 2012-04-17
    相关资源
    最近更新 更多