プロが教える店舗&オフィスのセキュリティ対策術

C#でウィンドウズアプリケーションを作っています。
ある処理範囲内でRefreshやInvalidateが大量にあり、画面がちらついてしまいます。
このRefreshやInvalidateの処理を一時的に無効にすることはどのようにすれば良いのでしょうか?
アドバイスよろしくお願いします。

private void button1_Click(object sender, System.EventArgs e)
{
  Console.WriteLine("何かの処理実行中・・・");

  //ここから
  for(int i=1; i<=1000; i++)
  {
    System.Threading.Thread.Sleep(1);
    label1.Text=i.ToString();
    this.Refresh();
    this.Invalidate(true);
  }
  //ここまで のちらつきを防止したい
  //(実際の処理は単純なループではない)

  label1.Text="end";
  Console.WriteLine("引き続き何かの処理実行中・・・");
}

A 回答 (3件)

VS2005なら、フォームにダブルバッファリングするプロパティがありますよ。

    • good
    • 0

前に回答したものです。


処理中に描画されないから前のような質問があったのだと思います。
当方C#はほとんど知りませんが
this.Refresh();
this.Invalidate(true);
ではなく
Application.DoEvents();ではどうでしょう?

あるいは別の方法としてbutton1_Click内の処理を別スレッドでたちあげてはどうでしょう?

private void button1_Click(object sender, System.EventArgs e)
{
  button1.Enabled = false;
  System.Threading.Thread MyThread = new System.Threading.Thread( new System.Threading.ThreadStart(fnc));
  MyThread.Start() ;
}

private void fnc()
{
  for(int i=1; i<=1000; i++)
  {
    System.Threading.Thread.Sleep(1);
    label1.Text=i.ToString();
  }
  button1.Enabled = true;
}

※ちなみに私の環境で
this.Refresh();
this.Invalidate(true);
としたところ特に気がつくほどのちらつきは発生しませんでした。
WinAPIのInvalidateRectでは第3引数をFALSEとすることで
消去をしなくなるのでちらつきがなくなります。
    • good
    • 0

「一時的に無効にする」というか、そもそも最初から Refresh しなきゃ良いんじゃないの?



(というか、Refresh() は Invalidate(true) を含んでいるから Refresh() した後に Invalidate(true) するのは全く無駄だと思うんだけど。)

参考URL:http://dobon.net/vb/dotnet/control/refreshupdate …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A