【问题标题】:C# WinForms Controls RenderingC# WinForms 控件渲染
【发布时间】:2012-11-30 11:20:25
【问题描述】:

我有一个 WinForms 应用程序,它在一个表单中使用四个面板来保存和显示信息、控件等。这些面板是隐藏还是显示取决于表单上按下的按钮 - 我希望你明白 :) 面板是透明的,表单包含背景图像。

现在的问题 - 如果表单的背景是图像,则面板上的控件将其状态更改为显示需要太多时间来渲染 - 有一种闪烁,您可以看到控件如何渲染一个接一个。有没有人遇到过这种情况?

附加信息

  • 当我用纯色(不是图像!)填充背景时,问题消失了
  • 我已经尝试过使用不同类型的图像(png、bmp、jpg、低分辨率、小调色板等,但没有效果)
  • 我真的需要背景图片
  • 我真的很想避免转换为 WPF - 只是因为我没有太多时间。

如果有任何帮助,我将不胜感激。

【问题讨论】:

  • 您是否尝试在表单(或相应的控件)上启用“DoubleBuffered”属性?
  • 是的,我已经用过了 :(

标签: c# winforms controls rendering


【解决方案1】:

在您的表单上添加一个面板并将其停靠在中间,使用您的背景图片到此面板...并尝试以下代码

MainPanel.SuspendLayout();
panel1.Visible= true;
panel2.Visible= false;
MainPanel.ResumeLayout();

【讨论】:

  • 不幸的是,使用此代码问题似乎更加严重......该死,我真的认为这会起作用:(
  • @SzymonSajdak 在您的表单上添加一个面板并将其停靠在中间,使用您的背景图片到此面板...
  • 好的,这样效果更好 :) 虽然还是有点滞后,但我正在努力做到这一点 :)
  • @SzymonSajdak 在您使用这些场景时总是会出现一点点闪烁.. :(
【解决方案2】:

如果你对 win32 API 没问题, 解决方案1)

[DllImport("user32.dll")]
public static extern bool LockWindowUpdate(IntPtr hWndLock);

点击按钮:

try
{
      LockWindowUpdate(this.Handle);
      //code here
}
finally
{
      LockWindowUpdate(IntPtr.Zero);
}

解决方案 2) 将 SendMessage() 与 WM_SETREDRAW 一起使用(更好的一个)

private const int WM_SETREDRAW      = 0x000B;
private const int WM_USER           = 0x400;
private const int EM_GETEVENTMASK   = (WM_USER + 59);
private const int EM_SETEVENTMASK   = (WM_USER + 69);

[DllImport("user32", CharSet = CharSet.Auto)]
private extern static IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, IntPtr lParam);

IntPtr eventMask = IntPtr.Zero;

点击按钮:

try
{
      // Stop redrawing:
      SendMessage(panel1.Handle, WM_SETREDRAW, 0, IntPtr.Zero);
      // Stop sending of events:
      eventMask = SendMessage(panel1.Handle, EM_GETEVENTMASK, 0, IntPtr.Zero);

      // code here
}
finally
{
      // turn on events
      SendMessage(panel1.Handle, EM_SETEVENTMASK, 0, eventMask);
      // turn on redrawing
      SendMessage(panel1.Handle, WM_SETREDRAW, 1, IntPtr.Zero);
}

【讨论】:

    猜你喜欢
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    相关资源
    最近更新 更多