C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: ボタンクリック描画されるがFormLoadで描画されない


(過去ログ 49 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■26612 / inTopicNo.1)  ボタンクリック描画されるがFormLoadで描画されない
  
□投稿者/ ありあり (12回)-(2008/10/15(Wed) 17:16:49)

分類:[C#] 

        private void Form1_Load(object sender, EventArgs e) {
            init();
        }
        
        private void init() {
            draw(this, pictureBox1);
        }
windowsXP, visualstudio2005(C#)で開発しています。

画面に線を描くことをしたいのですが、
現在ピクチャーボックスに線を描画しています。

1.ボタンクリックだと線が描画されるのですが、Form_Load時にメソッドを呼び出すと描画されません。
2.また、ピクチャーボックスではなくpanelに描こうとするとボタンクリックでも描画出来ません。
  (picturebox.CreateGraphicsをpanel.CreateGraphicsにする)

どなたかご教授お願いいたします。


        private void Form1_Load(object sender, EventArgs e) {
            init();
        }
        
        private void init() {
            draw(this, pictureBox1);
        }
        
        private void draw(Form form, PictureBox picturebox) {
            System.Drawing.Pen myPen;
            myPen = new System.Drawing.Pen(System.Drawing.Color.Black);

            //
            System.Drawing.Graphics formGraphics = picturebox.CreateGraphics();

            int x1 = 1;
            int x2 = 2000;
            int y1 = 10;
            int y2 = 10;


            formGraphics.DrawLine(myPen, x1, y1, x2, y2);
        }

引用返信 編集キー/
■26614 / inTopicNo.2)  Re[1]: ボタンクリック描画されるがFormLoadで描画されない
□投稿者/ 魔界の仮面弁士 (871回)-(2008/10/15(Wed) 17:31:01)
No26612 (ありあり さん) に返信
> 画面に線を描くことをしたいのですが、
> 現在ピクチャーボックスに線を描画しています。

CreateGraphics して描くのでは無く、Paint イベントの e.Graphics を使ってください。
再描画が必要になるタイミングで、Paint イベント(あるいは OnPaint メソッド)が呼び出されるので、
そこで描画処理を行うようにします。

あるいは、空の Bitmap に 描画するようにして、それを PictureBox に割り当てるという手もあります。
引用返信 編集キー/
■26618 / inTopicNo.3)  Re[2]: ボタンクリック描画されるがFormLoadで描画されない
□投稿者/ ありあり (13回)-(2008/10/15(Wed) 17:45:57)
No26614 (魔界の仮面弁士 さん) に返信
> ■No26612 (ありあり さん) に返信
>>画面に線を描くことをしたいのですが、
>>現在ピクチャーボックスに線を描画しています。
>
> CreateGraphics して描くのでは無く、Paint イベントの e.Graphics を使ってください。
> 再描画が必要になるタイミングで、Paint イベント(あるいは OnPaint メソッド)が呼び出されるので、
> そこで描画処理を行うようにします。
>
> あるいは、空の Bitmap に 描画するようにして、それを PictureBox に割り当てるという手もあります。

paintイベントでメソッドを呼び出すようにしたら、
描画されかかった後、この画面を呼び出しているところで

form1.ShowDialog(this);の時、ArgumentExceptionがおきました。

何度実行しても上記エラーで画面表示がされないのですが。
引用返信 編集キー/
■26620 / inTopicNo.4)  Re[3]: ボタンクリック描画されるがFormLoadで描画されない
□投稿者/ 魔界の仮面弁士 (872回)-(2008/10/15(Wed) 18:39:44)
No26618 (ありあり さん) に返信
> paintイベントでメソッドを呼び出すようにしたら、
> 描画されかかった後、この画面を呼び出しているところで
そのメソッド内で、CreateGraphics していたりはしませんか?

描画先となるキャンパスすなわち Grapchis クラスは、Paint(≠paint)イベントの引数にて
渡されますので、Paint イベントから描画用メソッドを呼ぶのであれば、そのメソッドに
e.Grapchis を渡してやり、そこに描画させる必要があります。


> form1.ShowDialog(this);の時、ArgumentExceptionがおきました。
この場合の this とは、何を表していますか?
引用返信 編集キー/
■26622 / inTopicNo.5)  Re[4]: ボタンクリック描画されるがFormLoadで描画されない
□投稿者/ ありあり (14回)-(2008/10/15(Wed) 19:01:59)
No26620 (魔界の仮面弁士 さん) に返信
> ■No26618 (ありあり さん) に返信
>>paintイベントでメソッドを呼び出すようにしたら、
>>描画されかかった後、この画面を呼び出しているところで
> そのメソッド内で、CreateGraphics していたりはしませんか?
>
していません。

> 描画先となるキャンパスすなわち Grapchis クラスは、Paint(≠paint)イベントの引数にて
> 渡されますので、Paint イベントから描画用メソッドを呼ぶのであれば、そのメソッドに
> e.Grapchis を渡してやり、そこに描画させる必要があります。
>
おっしゃる通り、パラメータeを引数にしてメソッド内部でe.Graphicsをしています。
>
>>form1.ShowDialog(this);の時、ArgumentExceptionがおきました。
> この場合の this とは、何を表していますか?

form1がこのPaintイベントをしている画面、thisが呼び出し元の画面です。

何も画面に部品が無いtestForm画面ではFormのPaintイベントで
メソッド呼び出しがうまく行ったのに、
今造っている画面を呼び出すとエラーになります。

引用返信 編集キー/
■26623 / inTopicNo.6)  Re[3]: ボタンクリック描画されるが
□投稿者/ Jitta on the way (193回)-(2008/10/15(Wed) 19:06:51)
2008/10/15(Wed) 22:02:50 編集(投稿者)
2008/10/15(Wed) 22:02:40 編集(投稿者)
2008/10/15(Wed) 22:02:37 編集(投稿者)

魔界の仮面弁士さんには通じるのか(^_^;)



No26618 (ありあり さん) に返信

> paintイベントでメソッドを呼び出すようにしたら、

なんのメソッドを?


> 描画されかかった後、この画面を呼び出しているところで

「この画面」って?単一フォームではないの?
「描画されかかった」というのも、わからない。具体的に、どんな状態?


>
> form1.ShowDialog(this);の時、ArgumentExceptionがおきました。

thisがおかしいのでしょうが、なんなのかわからない。form1も、わからない。もしかして、同じ画面を2つ開くために、自分で自分をShowDialogしているとか?

>
> 何度実行しても上記エラーで画面表示がされないのですが。


↑↑↑↑↑
と、書いている最中に返信があったらしい。
引用返信 編集キー/
■26636 / inTopicNo.7)  Re[5]: ボタンクリック描画されるがFormLoadで描画されない
□投稿者/ 魔界の仮面弁士 (873回)-(2008/10/16(Thu) 11:39:20)
No26622 (ありあり さん) に返信
> おっしゃる通り、パラメータeを引数にしてメソッド内部でe.Graphicsをしています。

となると後は……描画領域として、e.ClipRectangle に出力していたりはしませんか?

ClipRectangle は再描画が必要な領域のみを示すため、コントロールの ClientRectangle とは
異なる領域を返す可能性があるため、予想とは異なるエリアに描画されてしまっていた、とか。


>>>form1.ShowDialog(this);の時、ArgumentExceptionがおきました。
>>この場合の this とは、何を表していますか?
> form1がこのPaintイベントをしている画面、thisが呼び出し元の画面です。

という事は、form1 を呼び出すための画面(仮に、form2 とします)があって、
そこから form1 を呼び出しているのですね。

たとえば、form2 上のボタンクリック、あるいは Load イベント等から

 private void button1_Click(object sender, EventArgs e)
 // private void Form2_Load(object sender, EventArgs e)
 {
  using (Form1 form1 = new Form1())
  {
   form1.ShowDialog(this);
  }
 }

などとして呼び出し、呼び出された form1 側では、(Panel等の)Paint イベントで
何らかのメソッドを「引数e」を渡す形で呼び出し、e.Graphics に対して描画する、と。

 private void panel1_Paint(object sender, PaintEventArgs e)
 {
  SampleMethod(e);
 }

 private void SampleMethod(PaintEventArgs e)
 {
  //ControlPaint.DrawBorder3D(e.Graphics, e.ClipRectangle);
  ControlPaint.DrawBorder3D(e.Graphics, panel1.ClientRectangle, Border3DStyle.Bump);
 }


>>>>> 1.ボタンクリックだと線が描画されるのですが、Form_Load時にメソッドを呼び出すと描画されません。
>>>>> 2.また、ピクチャーボックスではなくpanelに描こうとするとボタンクリックでも描画出来ません。

今のところ、当方では上記コードで特に問題無く描画されています。


> 何も画面に部品が無いtestForm画面ではFormのPaintイベントで
> メソッド呼び出しがうまく行ったのに、
> 今造っている画面を呼び出すとエラーになります。

そうすると、「今造っている画面」とやらに、何かしらの問題があるのかも知れませんね。
その画面には、どのようなコントロールが貼ってあり、どのようなコードが記述されていますか?
引用返信 編集キー/
■26646 / inTopicNo.8)  Re[6]: ボタンクリック描画されるがFormLoadで描画されない
□投稿者/ ありあり (15回)-(2008/10/16(Thu) 14:58:46)
No26636 (魔界の仮面弁士 さん) に返信
> ■No26622 (ありあり さん) に返信
>>おっしゃる通り、パラメータeを引数にしてメソッド内部でe.Graphicsをしています。
>
> となると後は……描画領域として、e.ClipRectangle に出力していたりはしませんか?
>
> ClipRectangle は再描画が必要な領域のみを示すため、コントロールの ClientRectangle とは
> 異なる領域を返す可能性があるため、予想とは異なるエリアに描画されてしまっていた、とか。
>
>
> >>>form1.ShowDialog(this);の時、ArgumentExceptionがおきました。
> >>この場合の this とは、何を表していますか?
>>form1がこのPaintイベントをしている画面、thisが呼び出し元の画面です。
>
> という事は、form1 を呼び出すための画面(仮に、form2 とします)があって、
> そこから form1 を呼び出しているのですね。
>
> たとえば、form2 上のボタンクリック、あるいは Load イベント等から
>
>  private void button1_Click(object sender, EventArgs e)
>  // private void Form2_Load(object sender, EventArgs e)
>  {
>   using (Form1 form1 = new Form1())
>   {
>    form1.ShowDialog(this);
>   }
>  }
>
> などとして呼び出し、呼び出された form1 側では、(Panel等の)Paint イベントで
> 何らかのメソッドを「引数e」を渡す形で呼び出し、e.Graphics に対して描画する、と。
>
>  private void panel1_Paint(object sender, PaintEventArgs e)
>  {
>   SampleMethod(e);
>  }
>
>  private void SampleMethod(PaintEventArgs e)
>  {
>   //ControlPaint.DrawBorder3D(e.Graphics, e.ClipRectangle);
>   ControlPaint.DrawBorder3D(e.Graphics, panel1.ClientRectangle, Border3DStyle.Bump);
>  }
>
>
> >>>>> 1.ボタンクリックだと線が描画されるのですが、Form_Load時にメソッドを呼び出すと描画されません。
> >>>>> 2.また、ピクチャーボックスではなくpanelに描こうとするとボタンクリックでも描画出来ません。
>
> 今のところ、当方では上記コードで特に問題無く描画されています。
>
>
>>何も画面に部品が無いtestForm画面ではFormのPaintイベントで
>>メソッド呼び出しがうまく行ったのに、
>>今造っている画面を呼び出すとエラーになります。
>
> そうすると、「今造っている画面」とやらに、何かしらの問題があるのかも知れませんね。
> その画面には、どのようなコントロールが貼ってあり、どのようなコードが記述されていますか?


テキストボックスとラベルとコンボボックス、ピクチャーボックスがあります。
そのほかに、パネルとラベルを動的に生成して画面に配置しています(将来的にはDBより取得した
データ分パネルとラベルを自動生成する予定となっています)。
pictureBoxのPaintイベントで線を描画するメソッドを呼び出さない場合は、そのパネルとラベルの自動生成
処理自体は問題なく行えているのです。

引用返信 編集キー/
■26649 / inTopicNo.9)  Re[7]: ボタンクリック描画されるがFormLoadで描画されない
□投稿者/ ありあり (16回)-(2008/10/16(Thu) 15:58:16)
原因がわかりました。
form1:作成画面です
呼び出し元で起動時 form1.showDialog(this) ※thisは呼び出し元
ArgumentExceptinが起こる。

Form1の描画メソッド(drawTime)の方で、formGraphics.Dispose();をやると、
呼び出し元で form1.showDialog(this)  の部分で ArgumentExceptinが起こります。
ここをコメントアウトすると実行時エラーが起こらなくなりました。



        private void pictureBox1_Paint(object sender, PaintEventArgs e) {
            drawTime(sender, e);
        }

        private void drawTime(object sender, PaintEventArgs e) {
            System.Drawing.Pen myPen;
            myPen = new System.Drawing.Pen(System.Drawing.Color.Black);

            System.Drawing.Graphics formGraphics = e.Graphics;

            int x1 = 5;
            int x2 = 2000;
            int y1 = 20;
            int y2 = 20;


            formGraphics.DrawLine(myPen, x1, y1, x2, y2);

            //MessageBox.Show("test");




            int startx = x1;
            int startHour = 8;

            int count = 0;
            while (startx <= x2) {
                int amari = count % 6;
                if (count == 0 || amari == 0) {
                    formGraphics.DrawLine(myPen, startx, y1 - 5, startx, y2 + 5);

                    string drawString = startHour.ToString();
                    System.Drawing.Font drawFont = new System.Drawing.Font("MS UI Gothic", 9);
                    System.Drawing.SolidBrush drawBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Black);
                    float x = startx - 5;
                    //float y = y1 - 20;
                    float y = y1 - 15;
                    formGraphics.DrawString(drawString, drawFont, drawBrush, x, y);
                    startHour++;

                } else {
                    formGraphics.DrawLine(myPen, startx, y1 - 2, startx, y2 + 2);
                }
                count++;
                startx += 10;
            }


            myPen.Dispose();
            //formGraphics.Dispose();
        }


引用返信 編集キー/
■26651 / inTopicNo.10)  Re[8]: ボタンクリック描画されるがFormLoadで描画されない
□投稿者/ 魔界の仮面弁士 (875回)-(2008/10/16(Thu) 16:36:57)
No26649 (ありあり さん) に返信
> 原因がわかりました。

おぉ、良かったですね。
では「解決済み」のチェックをお願いします。m(_ _)m


> Form1の描画メソッド(drawTime)の方で、formGraphics.Dispose();をやると、
> 呼び出し元で form1.showDialog(this)  の部分で ArgumentExceptinが起こります。
> ここをコメントアウトすると実行時エラーが起こらなくなりました。

作成したオブジェクトは、作成者によって Dispose されるべきです。

自分で .CreateGrapchis() した Graphics であれば、それは当然 Dispose が必要なのですが、
イベント引数で渡された e.Graphics は自分で作成した物では無いため、Dispose してはいけません。
(.NET 自身が他の場所でも使う可能性があるので、破棄処理は .NET 自身によって行われる)


> private void drawTime(object sender, PaintEventArgs e) {
これをもっと早く提示していただけたら、解決も早かったかも。(^^;
引用返信 編集キー/
■26655 / inTopicNo.11)  Re[9]: ボタンクリック描画されるがFormLoadで描画されない
□投稿者/ ありあり (18回)-(2008/10/16(Thu) 17:17:10)
No26651 (魔界の仮面弁士 さん) に返信
> ■No26649 (ありあり さん) に返信
>>原因がわかりました。
>
> おぉ、良かったですね。
> では「解決済み」のチェックをお願いします。m(_ _)m
>
>
>>Form1の描画メソッド(drawTime)の方で、formGraphics.Dispose();をやると、
>>呼び出し元で form1.showDialog(this)  の部分で ArgumentExceptinが起こります。
>>ここをコメントアウトすると実行時エラーが起こらなくなりました。
>
> 作成したオブジェクトは、作成者によって Dispose されるべきです。
>
> 自分で .CreateGrapchis() した Graphics であれば、それは当然 Dispose が必要なのですが、
> イベント引数で渡された e.Graphics は自分で作成した物では無いため、Dispose してはいけません。
> (.NET 自身が他の場所でも使う可能性があるので、破棄処理は .NET 自身によって行われる)
>
>
>>private void drawTime(object sender, PaintEventArgs e) {
> これをもっと早く提示していただけたら、解決も早かったかも。(^^;

そうですね。もっと全体を提示すべきでした。

皆様どうもありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -