2 .net c# user-interface winapi
我正在开发一个 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);
Run Code Online (Sandbox Code Playgroud)
<snip> - 应用程序忽略此部分中的点击(在一种情况下)
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();
Run Code Online (Sandbox Code Playgroud)
有谁知道是否a)有办法解决这里的透明应用程序问题,或者b)如果我一开始就做错了并且应该以其他方式解决?
Control为此目的而调用派生类。他们是SuspendLayout和PerformLayout。由于它们位于Control且Form源自Control,因此您Form也拥有它们。
这些调用足以满足大多数更新,但在其他情况下,只需使用隐藏控件Visible = false就足够了。为了在隐藏和重新显示控件期间停止闪烁,我通常将控件绘制到PictureBox更新期间显示的位图上。这在更新树、选项卡控件或列表时非常有用(因为可以在上一个示例中的更新过程中关闭排序)。
| 归档时间: |
|
| 查看次数: |
10104 次 |
| 最近记录: |