【问题标题】:Disabling redraw in WinForms app在 WinForms 应用程序中禁用重绘
【发布时间】:2008-12-08 21:23:18
【问题描述】:

我正在开发一个 C#.Net 应用程序,其中有一个令人讨厌的错误。主窗口有许多选项卡,每个选项卡上都有一个网格。当从一个选项卡切换到另一个选项卡时,或在网格中选择不同的行时,它会进行一些后台处理,并且在此期间菜单会在重绘时闪烁(文件、帮助等菜单项以及窗口图标和标题)。

我首先尝试在切换选项卡/行(WM_SETREDRAW 消息)时禁用窗口上的重绘。在一种情况下,它可以完美运行。另一方面,它解决了直接的错误(标题/菜单闪烁),但在禁用重绘和再次启用它之间,窗口对于鼠标点击是“透明的” - 有一个小窗口(

这是我添加的代码。

m = new Message();
m.HWnd = System.Windows.Forms.Application.OpenForms[0].Handle; //top level
m.WParam = (IntPtr)0; //disable redraw
m.LParam = (IntPtr)0; //unused
m.Msg = 11; //wm_setredraw
WndProc(ref m);

- 应用程序在此部分中忽略点击(在一种情况下)

m = new Message();
m.HWnd = System.Windows.Forms.Application.OpenForms[0].Handle; //top level
m.WParam = (IntPtr)1; //enable
m.LParam = (IntPtr)0; //unused
m.Msg = 11; //wm_setredraw
WndProc(ref m);

System.Windows.Forms.Application.OpenForms[0].Refresh();

有谁知道 a) 是否有办法解决此处的透明应用程序问题,或者 b) 如果我一开始就做错了,这应该以其他方式解决吗?

【问题讨论】:

    标签: c# .net user-interface winapi


    【解决方案1】:

    为此目的,对派生自Control 的类进行了调用。它们是SuspendLayoutPerformLayout。因为它们在ControlForm 上派生自Control,所以你的Form 也有它们。

    这些调用足以满足大多数更新,但在其他情况下,只需使用 Visible = false 隐藏控件就足够了。为了在控件隐藏然后重新显示期间停止闪烁,我通常将控件绘制到一个位图中,在更新期间我在PictureBox 中显示该位图。这在更新树、选项卡控件或列表时很有用(在最后一个示例中可以在更新期间关闭排序)。

    【讨论】:

      【解决方案2】:

      您所描述的行为对于 .NET winforms 应用程序来说是不正常的。您在示例中使用 WndProc 并发送消息这一事实表明,此表单还有许多其他不寻常的事情(我猜涉及的线程不止一个)。选项卡式界面中常见的另一种可能性是您的表单只是简单地被控件重载。有时这会导致奇怪的行为。

      我从未亲眼目睹或听说过像你描述的那样遥远的事情。

      【讨论】:

        【解决方案3】:

        您可以尝试覆盖您不想渲染的控件上的 Paint 方法,并通过一些全局布尔值来控制它(=当一些布尔值为真时忽略所有绘制。) 如果您的控件是第 3 方,请将其子类化并在那里覆盖它。

        然后当您满意时,将 bool 设置为 false 并让控件再次绘制(当您再次使用 .Refresh 将其打开时可能必须强制绘制?)

        【讨论】:

          【解决方案4】:

          如果这是一个自定义控件,您可以尝试一些 control style 标志:我认为 DoubleBuffered 或 AllPaintingInWmPaint 可能会有所帮助。您可以使用 Control.SetStyle 更改样式位(这是受保护的,这就是您需要在自己的自定义 Control 类中执行此操作的原因)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-12-17
            • 2015-06-08
            • 2011-03-03
            • 2013-10-02
            • 1970-01-01
            • 2012-01-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多