gpt4 book ai didi

c# - 在 WinForms 应用程序中禁用重绘

转载 作者:行者123 更新时间:2023-11-30 21:26:01 25 4
gpt4 key购买 nike

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

我首先尝试在切换选项卡/行(WM_SETREDRAW 消息)时禁用窗口重绘。在一种情况下,它工作得很好。另一方面,它解决了即时错误(标题/菜单闪烁),但在禁用重绘和再次启用重绘之间,窗口对鼠标点击是“透明的”——有一个小窗口(<1 秒)我可以在其中点击比如说,它会在我的桌面上突出显示一个图标,就好像该应用程序根本不存在一样。如果我在后台运行其他东西(比如 Firefox),它实际上会在单击时获得焦点(并绘制浏览器的一部分,比如地址栏。)

这是我添加的代码。

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) 如果我一开始就做错了,应该通过其他方式解决这个问题吗?

最佳答案

出于此目的,调用了从 Control 派生的类。它们是 SuspendLayoutPerformLayout。由于它们在 Control 上,而 Form 派生自 Control,因此您的 Form 也有它们。

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

关于c# - 在 WinForms 应用程序中禁用重绘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/350956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com