gpt4 book ai didi

c# - 防止在调整 Windows 窗体大小时重绘控件

转载 作者:太空宇宙 更新时间:2023-11-03 22:04:31 25 4
gpt4 key购买 nike

我有一个 TableLayoutPanel,它在 SplitterPanel 中包含动态数量的控件。用户可能希望调整面板大小以适应这些控件以避免使用滚动条。这会在容器大小调整以及容器内的控件上产生抖动。有时父容器在调整大小期间明显滞后于鼠标的移动(最多滞后 3 秒)。

有什么方法可以防止在父容器调整大小时重绘控件,例如在调整大小时隐藏所有元素或停止在鼠标拖动期间发生的调整大小事件,仅在 onMouseUp 事件上触发?

最佳答案

正如 Hans 评论的那样,SuspendLayoutResumeLayout 以及暂停容器控件的绘制在这种情况下工作得很好:

public static class Win32 {

public const int WM_SETREDRAW = 0x0b;

[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

public static void SuspendPainting(IntPtr hWnd) {
SendMessage(hWnd, WM_SETREDRAW, (IntPtr)0, IntPtr.Zero);
}

public static void ResumePainting(IntPtr hWnd) {
SendMessage(hWnd, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero);
}
}

然后从你调整事件的大小:

private void Form1_ResizeBegin(object sender, EventArgs e) {
tableLayoutPanel1.SuspendLayout();
}

private void Form1_ResizeEnd(object sender, EventArgs e) {
Win32.SuspendPainting(tableLayoutPanel1.Handle);
tableLayoutPanel1.ResumeLayout();
Win32.ResumePainting(tableLayoutPanel1.Handle);
this.Refresh();
}

关于c# - 防止在调整 Windows 窗体大小时重绘控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8929923/

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