【问题标题】:WM_SETREDRAW and losing z-order/focusWM_SETREDRAW 和失去 z 顺序/焦点
【发布时间】:2012-02-12 11:54:07
【问题描述】:

我有一个带有皮肤库 (Devexpress) 和 MDI 父窗体的 .NET 应用程序。

当我添加子表单时,出于性能原因,我使用 WM_SETREDRAW 禁用绘画。

但是,在再次将 WM_SETREDRAW 设置为 1 并在 MDI 父级上调用 refresh 后,主窗体失去了 z 顺序并位于我桌面的背景上。

然后我必须调用 BringToFrontFocus,但仍有很短的时间(

有没有更好的方法来禁用重绘但保持表单可见?

【问题讨论】:

  • 奇怪。你确定你不是也在修补 Enabled 属性吗?这可以解释它。

标签: .net winapi


【解决方案1】:

我怀疑问题来自the documentation中的这句话:

如果应用程序将WM_SETREDRAW 消息发送到隐藏窗口,则该窗口变为可见(即操作系统将WS_VISIBLE 样式添加到窗口中)。

由于a hidden window is effectively disabled(虽然它仍然可以处理消息,但它不能接收用户输入),这会导致您运行与启用和禁用窗口的正确顺序发生冲突。当当前聚焦的窗口被禁用(并因此失去焦点)时,焦点必须转到某处,因为它不可能无处。

如果没有看到代码,很难准确地说你的情况发生了什么。从您的问题中,我也不能完全确定您是将WM_SETREDRAW 消息发送给 MDI 父级还是 MDI 子级。但我可以说,皮肤库因搞砸事情并导致噩梦般的错误而臭名昭著。首先问问自己你是否真的需要这样的东西,是否真的值得努力。

我也不得不质疑潜在的动机:

当我添加子表单时,出于性能原因,我使用WM_SETREDRAW 禁用绘画。

添加子表单时不应该有任何绘画或性能问题,假设您在表单的构造函数内完成所有初始化,而不是其他一些方法。这可确保在显示表单之前正确初始化所有内容,并且无需多次重绘。一切都只绘制一次,第一次显示表单时,这与WM_SETREDRAW 在理想情况下发生的情况完全相同:启用重绘后它只绘制一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    相关资源
    最近更新 更多