如何解决我有使用 win Forms 的无闪烁界面,但是当调整表单大小时,TabControl 内的控件开始闪烁
当涉及到某些预定义事件(例如最大化、最小化和调整大小)以及它们与 WndProc 的关系时,我并不完全了解发生的所有事情。
我的软件旨在成为某种 GUI 生成界面,我有一堆自定义控件,客户可以从库中获取这些控件并将它们放置在面板中,主选项卡控件的选项卡内。 tab控件也可以添加更多的Tab,但是所有的控件基本上都在Main TabControl里面。 客户可以根据需要添加任意数量的控件,并且可以动态修改变量和数据并保存配置以便以后加载。
经过大量工作,我设法获得了一个非常可靠的界面,几乎没有闪烁,有时当控件数量太多时,从一个选项卡切换到另一个选项卡会很慢,但是,界面处理得非常好好吧,它根本不显示闪烁。
我的问题是:
当我的主窗体被调整大小、最小化或最大化时,整个界面开始闪烁,但闪烁并不是控件每个部分的超级烦人的闪烁,自定义控件似乎画得很好,但我可以看到每个一一控制绘画。
不知何故,在我看来好像有一个配置在第一次加载表单时被正确应用,但是当表单被调整大小时它会丢失。
我的代码很长,我不知道放在这里有什么意义,但是这段代码基本上是我用来避免界面启动时闪烁的代码
#region FLICKER CONTROL
private const int WM_SETREDRAW = 0x0B;
private const int WM_ERASEBKGND = 20;
class DrawingControl
{
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd,Int32 wMsg,bool wParam,Int32 lParam);
public static void SuspendDrawing(Control parent)
{
SendMessage(parent.Handle,WM_SETREDRAW,false,0);
}
public static void ResumeDrawing(Control parent)
{
SendMessage(parent.Handle,true,0);
parent.Refresh();
}
}
static void SetDoubleBuffer(Control ctl,bool DoubleBuffered)
{
typeof(Control).InvokeMember("DoubleBuffered",BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty,null,ctl,new object[] { DoubleBuffered });
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000;
return cp;
}
}
private void ToggleFormlevelDoubleBuffering(bool EN)
{
enableFormlevelDoubleBuffering = EN;
this.MaximizeBox = true;
}
private void Form1_Shown(object sender,EventArgs e)
{
ToggleFormlevelDoubleBuffering(true);
}
#endregion
使用上面的代码,界面不会闪烁,直到表格被调整大小/最大化。
我一直在尝试覆盖 WncProc 以捕获 MAximize 、 Minimize 和 restore 事件,并覆盖 OnResizeBegin
和 OnResizeEnd
事件,但我还没有找到一段代码来纠正闪烁在调整表单大小后发生。
我还尝试在我的表单构造函数上添加和删除 SetDoubleBuffer
函数,以便为包含自定义控件的所有面板启用双缓冲区功能。并没有什么区别,它起初工作正常,但后来停止了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。