1

情報やコントロールなどを保持および表示するために1つのフォームで4つのパネルを使用するWinFormsアプリケーションがあります。これらのパネルは、フォームで押されたボタンに応じて非表示または表示されます。フォームは背景画像を保持します。

ここで問題になります-フォームの背景が画像である場合、表示される状態に変更するパネル上のコントロールは、レンダリングに時間がかかりすぎます-一種の点滅があり、コントロールが次々にレンダリングされる方法を確認できます。誰かがこれに遭遇したことがありますか?

追加情報

  • 背景を単色(画像ではありません!)で塗りつぶすと、問題は解消されます。
  • すでにさまざまな種類の画像(png、bmp、jpg、低解像度、小さなカラーパレットなど、効果なし)を使用してみました
  • 本当に背景画像が必要です
  • 時間があまりないという理由だけで、WPFへの変換は避けたいと思います。

どんな助けにも感謝します。

4

2 に答える 2

2

フォームにパネルを追加して中央にドッキングし、背景画像をこのパネルに使用します...そして次のコードも試してください

MainPanel.SuspendLayout();
panel1.Visible= true;
panel2.Visible= false;
MainPanel.ResumeLayout();
于 2012-11-30T11:54:52.163 に答える
0

win32 API でよろしければ、解決策 1)

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

ボタンクリック時:

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

解決策2)WM_SETREDRAWでSendMessage()を使用する(より良いもの)

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);
}
于 2012-11-30T13:07:19.173 に答える