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

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

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

Re[5]: Graphicsオブジェクトの違い


(過去ログ 102 を表示中)

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

■60918 / inTopicNo.1)  Graphicsオブジェクトの違い
  
□投稿者/ まかろに (1回)-(2011/07/25(Mon) 23:17:19)

分類:[C#] 

・開発環境
WindowsXP VisualStudio2005


PictureBoxのGraphicsオブジェクトを用いて
DrawImageで画像を表示しようとしています。

その際に、PictureBoxのOnPaintイベントの引数(PaintEventArgs)からGraphicsを取得した場合と
同じタイミングでCreateGraphics()からGraphicsを作成した場合では
DrawImageを呼んだ時に画像の見え方が違います。

具体的には、後者では問題なく表示されてるのですが
前者は最初は何も表示されず、リサイズや最小化→最大化等を行えばちゃんと表示されるようになります。

この2つには何か違いがあるんでしょうか?
よろしくお願い致します。

引用返信 編集キー/
■60936 / inTopicNo.2)  Re[1]: Graphicsオブジェクトの違い
□投稿者/ まかろに (2回)-(2011/07/26(Tue) 21:40:02)
PictureBoxのRefreshをかけてから再描画したらちゃんと描画されました。
失礼致しました。

解決済み
引用返信 編集キー/
■60938 / inTopicNo.3)  Re[2]: Graphicsオブジェクトの違い
□投稿者/ Azulean (796回)-(2011/07/26(Tue) 22:26:36)
No60936 (まかろに さん) に返信
> PictureBoxのRefreshをかけてから再描画したらちゃんと描画されました。

よくわかりません。
どこの部分をどのようにしたのでしょうか?


No60918 (まかろに さん) に返信
> その際に、PictureBoxのOnPaintイベントの引数(PaintEventArgs)からGraphicsを取得した場合と
> 同じタイミングでCreateGraphics()からGraphicsを作成した場合では
> DrawImageを呼んだ時に画像の見え方が違います。

OnPaint では渡された Graphics を使用するべきであり、そのタイミングで CreateGraphics を使うのはもってのほかです。
整合性がとれなくなるのでしてはいけません。


> 具体的には、後者では問題なく表示されてるのですが
> 前者は最初は何も表示されず、リサイズや最小化→最大化等を行えばちゃんと表示されるようになります。

たぶんこの部分が「肝」で、何らかのデータの更新などがあったときに、Invalidate/Refresh を呼んでいなかったから、OnPaint が発生しなかったと言うことなのかな。
引用返信 編集キー/
■60971 / inTopicNo.4)  Re[3]: Graphicsオブジェクトの違い
□投稿者/ まかろに (3回)-(2011/07/27(Wed) 21:32:45)
説明が雑でした、すいません。

まず、CreateGraphicsは使っていません。引数の方のGraphicsを使っています。
データ更新時にInvalidateは呼んでいたんですが、そこをRefreshに変えたら問題なく描画されました。
更新後すぐに反映されてほしかったので呼ぶメソッドが間違っていたということですかね。
引用返信 編集キー/
■60973 / inTopicNo.5)  Re[4]: Graphicsオブジェクトの違い
□投稿者/ Azulean (798回)-(2011/07/27(Wed) 22:34:03)
No60971 (まかろに さん) に返信
> データ更新時にInvalidateは呼んでいたんですが、そこをRefreshに変えたら問題なく描画されました。
> 更新後すぐに反映されてほしかったので呼ぶメソッドが間違っていたということですかね。

Invalidate は再描画の必要がある(無効になった)ということを通知するだけで、すぐに再描画しません。
そのうち再描画されることを期待できるようなメソッドです。
頻繁に更新処理が呼び出されるが、落ち着いたいつかのタイミングでよいという場合に使うところでしょうか。

Refresh は呼んだその場で再描画の処理に至るものです。
その場での描画を期待できますが、頻繁に呼ぶのは重くなる要因になる可能性があります。

Invalidate がだめで、Refresh だとうまくいくケースの場合、ビジーループを書いているか、何かまずいことになっている可能性もあります。
ただ、断定できる材料はないので杞憂かもしれません。
引用返信 編集キー/
■61006 / inTopicNo.6)  Re[5]: Graphicsオブジェクトの違い
□投稿者/ まかろに (4回)-(2011/07/28(Thu) 21:55:55)
> Invalidate がだめで、Refresh だとうまくいくケースの場合、ビジーループを書いているか、何かまずいことになっている可能性もあります。
> ただ、断定できる材料はないので杞憂かもしれません。

なるほど。
その可能性覚えておきます。
ありがとうございます
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -