簡體   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