繁体   English   中英

C#WinForms控件呈现

[英]C# WinForms Controls Rendering

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

现在要解决的问题-如果表单的背景是图像,则将其状态更改为显示的面板上的控件也需要太多时间来渲染-眨眼之间,您就可以看到控件如何依次渲染。 有人遇到过吗?

附加信息

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

我将不胜感激。

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

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

如果您可以使用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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM