none
Formの描画速度について RRS feed

  • 質問

  • お世話になります。
    現在、Visual Studio2008 Framework3.5でフォームアプリを作成しています。

    画面はForm1、Form2の2つがあり、Form1にはPictureBox、Form2にはTextboxとButtonが1つずつ存在します。

    Form1からForm2を表示させる方法が以下の2種類あり、①の方法で問題が発生しています。

    ①Form1のKeyDownイベントでEnterキーを取得→Form2を表示
    ②Form1上のPictureBoxダブルクリックイベント発生→KeyDownイベントを強制的に実行→Fomr2を表示

    Form1のPictureBoxが1000個程度存在する場合、①の方法ではForm2の枠が表示された後、
    コントロールの描画が完了しておらず、ちらつきが発生しています。

    推測される原因、対策がありましたら、教えて頂けないでしょうか?

    以下、①②部分のソースコード抜粋です。

    public void frmMain_KeyDown(object sender, KeyEventArgs e)
    {
       if (e.KeyCode == Keys.Enter)
       {
        Form2 frm2 = new Form2();
        frm2.ShowDialog();
       }
    }

    void Function_DoubleClick(object sender, EventArgs e)
    {
      this.frmMain_KeyDown(sender, new KeyEventArgs(Keys.Enter));
    }

    2012年9月3日 8:41

回答

  • >764様
    返信ありがとうございます。

    ご回答頂きました内容を試してみた結果、症状はかわりませんでした・・・。
    OnPaintBackgroundイベントは全く知らなかったので、勉強になりました。

    >Azulean様
    返信ありがとうございます。
    KeyDownイベントの場合、内部的になにか処理があるのかもしれませんね。

    --------------------------------------------------------------------------------

    色々と試した結果、方法として良いのかは解らないのですが、
    下記の様にBeginInvogeとデリゲートを使用する事で改善されました。

            Action DelegateForm2;

            private void Form1_Load(object sender, EventArgs e)
            {
                DelegateForm2 = new Action(Show_Form2);
            }

            private void Form1_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Enter)
                {
                    this.BeginInvoke(DelegateForm2);
                }
            }

            public void Show_Form2()
            {
                Form2 frm2 = new Form2();
                frm2.ShowDialog();
            }


    以上、皆様ありがとうございました。
    • 編集済み don747 2012年9月6日 11:32
    • 回答としてマーク don747 2012年9月6日 11:33
    2012年9月6日 11:29

すべての返信

  • Form2にControlクラスのOnPaintBackgroundをオーバーライドさせたらどうなりますか?

    protected override void OnPaintBackground(PaintEventArgs pevent)
    {

    //処理は未記述

    }



    • 編集済み 764 2012年9月5日 0:06
    2012年9月4日 3:28
  • 1000 個もおいたことはないので、現象について確実なことは言えませんが…。

    KeyDown イベントを呼び出すフォームの実装と、ダブルクリックイベントを呼び出す実装とで差があるのでしょう。
    見えないところにはなりますが、KeyDown を呼び出す処理は Form クラスや Control クラスで実装されています。そこで描画に関わるメソッドが呼び出されているのであれば、ちらつくかもしれませんね。
    DoubleClick 側にはそれがないのかもしれませんし、それ以外の原因かもしれません。

    2012年9月4日 13:43
    モデレータ
  • >764様
    返信ありがとうございます。

    ご回答頂きました内容を試してみた結果、症状はかわりませんでした・・・。
    OnPaintBackgroundイベントは全く知らなかったので、勉強になりました。

    >Azulean様
    返信ありがとうございます。
    KeyDownイベントの場合、内部的になにか処理があるのかもしれませんね。

    --------------------------------------------------------------------------------

    色々と試した結果、方法として良いのかは解らないのですが、
    下記の様にBeginInvogeとデリゲートを使用する事で改善されました。

            Action DelegateForm2;

            private void Form1_Load(object sender, EventArgs e)
            {
                DelegateForm2 = new Action(Show_Form2);
            }

            private void Form1_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Enter)
                {
                    this.BeginInvoke(DelegateForm2);
                }
            }

            public void Show_Form2()
            {
                Form2 frm2 = new Form2();
                frm2.ShowDialog();
            }


    以上、皆様ありがとうございました。
    • 編集済み don747 2012年9月6日 11:32
    • 回答としてマーク don747 2012年9月6日 11:33
    2012年9月6日 11:29