gpt4 book ai didi

c# - 如何暂停控件及其子项的绘制?

转载 作者:IT王子 更新时间:2023-10-29 03:30:15 26 4
gpt4 key购买 nike

我有一个控件,我必须对其进行大量修改。我想在执行此操作时完全防止它重绘 - SuspendLayout 和 ResumeLayout 是不够的。如何暂停控件及其子项的绘制?

最佳答案

在我之前的工作中,我们努力让我们的丰富的 UI 应用程序能够即时流畅地绘制。我们使用标准的 .Net 控件、自定义控件和 devexpress 控件。

经过大量谷歌搜索和反射器使用后,我发现了 WM_SETREDRAW win32 消息。这确实会在您更新控件时停止绘制控件,并且可以将 IIRC 应用于父/包含面板。

这是一个非常非常简单的类,演示了如何使用此消息:

class DrawingControl
{
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParam);

private const int WM_SETREDRAW = 11;

public static void SuspendDrawing( Control parent )
{
SendMessage(parent.Handle, WM_SETREDRAW, false, 0);
}

public static void ResumeDrawing( Control parent )
{
SendMessage(parent.Handle, WM_SETREDRAW, true, 0);
parent.Refresh();
}
}

对此有更全面的讨论 - google for C# and WM_SETREDRAW, e.g.

C# Jitter

Suspending Layouts

对于可能关心的人,这是 VB 中的一个类似示例:

Public Module Extensions
<DllImport("user32.dll")>
Private Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As Boolean, ByVal lParam As IntPtr) As Integer
End Function

Private Const WM_SETREDRAW As Integer = 11

' Extension methods for Control
<Extension()>
Public Sub ResumeDrawing(ByVal Target As Control, ByVal Redraw As Boolean)
SendMessage(Target.Handle, WM_SETREDRAW, True, IntPtr.Zero)
If Redraw Then
Target.Refresh()
End If
End Sub

<Extension()>
Public Sub SuspendDrawing(ByVal Target As Control)
SendMessage(Target.Handle, WM_SETREDRAW, False, IntPtr.Zero)
End Sub

<Extension()>
Public Sub ResumeDrawing(ByVal Target As Control)
ResumeDrawing(Target, True)
End Sub
End Module

关于c# - 如何暂停控件及其子项的绘制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/487661/

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