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

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

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

Re[2]: 最小化後の再描画について


(過去ログ 12 を表示中)

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

■3541 / inTopicNo.1)  最小化後の再描画について
  
□投稿者/ たっつぁん (1回)-(2007/05/14(Mon) 17:54:11)

分類:[C# (Windows)] 

はじめまして。
Visual C# 2005 でプログラミングを行っております。

再描画について教えていただきたいのですが、
以下の手順で表示させると変な風に表示されました。
(オセロゲームの碁盤を表示するプログラムです
オセロの碁盤は、フォームのClientSizeを利用して
フォームのサイズが大きくなれば碁盤も大きくなり
フォームのサイズが小さくなれば碁盤も小さくなるようにしています)

(1)プログラムを起動して、オセロの碁盤を表示する。
(碁盤を表示する前にコンストラクタで
FormのWidthとHeightを600に変更。
その後この値を利用して碁盤が表示される。)

(2)最小化ボタンを押下。

(3)タスクバーのところをクリックして、再度オセロの碁盤を表示。

こうすると変な風に表示されます。
最初のコンストラクタでFormのWidthとHeightを変更しなければ
最小化させても変な風に表示されることはないのですが。。。

碁盤を表示する部分は、オーバーライドしたOnPaintメソッド内に
記述してあります。
protected override void OnPaint(PaintEventArgs pea){
//ClientSizeを利用して碁盤表示
}

フォームの大きさを変更して、最小化ボタンを押下しても
綺麗に表示されられる方法はないのでしょうか??

以上宜しくお願い致します。
引用返信 編集キー/
■3546 / inTopicNo.2)  Re[1]: 最小化後の再描画について
□投稿者/ ダッチ (131回)-(2007/05/14(Mon) 22:05:38)
フォームの ClientSize ではなくClientRectangle を使用して OnPaint メソッドで楕円を描画してみました。

public Form1()
{
    InitializeComponent();
    this.Width = 600;
    this.Height = 600;
}

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    e.Graphics.DrawEllipse(Pens.Blue, this.ClientRectangle);
}

最小化後にタスクバーのウィンドウをクリックして再表示しても 600/600 の大きさで楕円が描画されました。

まずはどの部分で描画がおかしくなっているのかを見極める必要があると思います。
次のようなことをしてどの部分に原因があるのかを調べてください。
・OnPaint メソッドの描画処理をやめる
・フォームのサイズに合わせて碁盤の大きさを変更するのをやめる

そして、おおよその原因がわかったら今度はその中で少しずつ処理を潰していって、どの部分に原因があるか特定してください。
処理を潰しているうちにどの部分で描画がおかしくなっているかがわかると思います。

引用返信 編集キー/
■3547 / inTopicNo.3)  Re[1]: 最小化後の再描画について
□投稿者/ よねKEN (37回)-(2007/05/15(Tue) 09:43:11)
よねKEN さんの Web サイト
> こうすると変な風に表示されます。

どんな風に変なのでしょうか?

> 碁盤を表示する部分は、オーバーライドしたOnPaintメソッド内に
> 記述してあります。
> protected override void OnPaint(PaintEventArgs pea){
> //ClientSizeを利用して碁盤表示
> }

どんなソースコードを書いたのでしょうか?

この2点がないとこちらには詳細がわからないのですが・・・

> フォームの大きさを変更して、最小化ボタンを押下しても
> 綺麗に表示されられる方法はないのでしょうか??

とりあえずどこかのロジックがたぶんおかしいので
デバッグしてください。
#という当たり障りのない回答になってしまいます(; ;)


> 以上宜しくお願い致します。
引用返信 編集キー/
■3565 / inTopicNo.4)  Re[2]: 最小化後の再描画について
□投稿者/ 七曜 (1回)-(2007/05/15(Tue) 16:19:57)
まぁ、ざっくり検証なので冗長なコードかもしれません。
ダッチさん同様、OnPaintで処理を記述。
ClientSize、ClientRectangleでも(見た目は)同じような動き。
で、このままだとFormサイズ変更時に意図通りの動作(サイズに合わせて拡大縮小)にならないので
OnResizeで、Client領域を無効化して再描画処理を実行させてみました。
こんなで、如何でしょうか。
---ここから--------------------------------------------------------------
public Form1()
{
InitializeComponent();
this.Width = 600;
this.Height = 600;
}

protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Size client = this.ClientSize;
Int32 width = client.Width / 8;
Int32 height = client.Height / 8;
// ClientRectangleを使用する場合
//Rectangle client = this.ClientRectangle;
//Int32 width = client.Width / 8;
//Int32 height = client.Height / 8;
// 縦線の描画処理
for (Int32 x = 0; x< 8; x++)
{
Point ax = new Point(x * width, 0);
Point bx = new Point(x * width, client.Height);
e.Graphics.DrawLine(new Pen(Brushes.Black), ax, bx);
}
// 横線の描画処理
for (Int32 y = 0; y < 8; y++)
{
Point ay = new Point(0, y * height);
Point by = new Point(client.Width, y * height);
e.Graphics.DrawLine(new Pen(Brushes.Black), ay, by);
}
}

protected override void OnResize(EventArgs e)
{
base.OnResize(e);
this.Invalidate();
}
---ここまで--------------------------------------------------------------

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -