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

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

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

Re[7]: PictureBoxの動的配置について。


(過去ログ 91 を表示中)

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

■54413 / inTopicNo.1)  PictureBoxの動的配置について。
  
□投稿者/ rs (1回)-(2010/10/19(Tue) 11:26:53)

分類:[VB.NET/VB2005 以降] 

お世話になります。

Visual Studio 2005のVBにて、開発を進めています。

「'img = BitMapオブジェクト g = imgのGraphicsオブジェクト
Dim pg As Graphics = PictureBox1.CreateGraphics()    」
pg.DrawImage(img, g.VisibleClipBounds)

上記のように、静的に配置したPictureBox(PictureBox1)にグラフィックを描画するときれいに表示されるのですが、

「Dim pb As New System.Windows.Forms.PictureBox()
With pb
.BorderStyle = BorderStyle.Fixed3D
.Left = 0
.Top = 0
.Width = 300
.Height = 100
End With
Me.Controls.Add(pb)
Dim pg As Graphics = pb.CreateGraphics()
pg.DrawImage(img, g.VisibleClipBounds)      」

このようにコード内で動的に作成したPictureBox(pb)には描画されません。
一瞬だけ表示されて消えるか、全く表示されないかのどちらかです。

この2つのコードにおいて、このような違いが出る理由を教えていただけないでしょうか?
何卒よろしくお願い致します。
引用返信 編集キー/
■54418 / inTopicNo.2)  Re[1]: PictureBoxの動的配置について。
□投稿者/ shu (113回)-(2010/10/19(Tue) 12:57:36)
No54413 (rs さん) に返信
Visible = Trueになっていないとか?
デザインで配置したときのDesigner.vbの記述との違いを見るといいです。


引用返信 編集キー/
■54420 / inTopicNo.3)  Re[1]: PictureBoxの動的配置について。
□投稿者/ 魔界の仮面弁士 (1875回)-(2010/10/19(Tue) 13:10:24)
No54413 (rs さん) に返信
> このようにコード内で動的に作成したPictureBox(pb)には描画されません。
> 一瞬だけ表示されて消えるか、全く表示されないかのどちらかです。

質問内容からは外れますが、そもそも CreateGraphics を使わず、
Paint イベントの e.Graphics で処理した方が良いと思います。
書き換え頻度が高い場合は、再描画要求を発行すればOK。(Refresh, Update, Invalidate メソッド)

一方、描き換え頻度が低い場合には Paint イベントを使うのではなく、
Bitmap クラスに描画してから、それを PictureBox に割り当てると
描画処理を繰り返さずに済みます。
引用返信 編集キー/
■54437 / inTopicNo.4)  Re[2]: PictureBoxの動的配置について。
□投稿者/ rs (2回)-(2010/10/20(Wed) 09:03:30)
>shuさん
visible=trueを記述しても変化はありませんでした。
動的にコントロールを作成する時はデザイナを参考にすればよいのですね。
ありがとうございました。

>魔界の仮面弁士さん
お恥ずかしいのですがPaintイベントそのものを知りませんでした。
今から勉強して最適なやり方を見つけたいと思います。
ありがとうございました。
引用返信 編集キー/
■54439 / inTopicNo.5)  Re[2]: PictureBoxの動的配置について。
□投稿者/ 横は入りですみません (1回)-(2010/10/20(Wed) 09:40:23)
No54420 (魔界の仮面弁士 さん) に返信
> 質問内容からは外れますが、そもそも CreateGraphics を使わず、
> Paint イベントの e.Graphics で処理した方が良いと思います。
横は入り失礼します。
CreateGraphicsを使うことはあまり推奨されていないようですが、入門書にはよく使われています。
何故、推奨されないものが基礎の部分で使われているのですか?

引用返信 編集キー/
■54443 / inTopicNo.6)  Re[3]: PictureBoxの動的配置について。
□投稿者/ 魔界の仮面弁士 (1879回)-(2010/10/20(Wed) 10:16:12)
No54439 (横は入りですみません さん) に返信
> CreateGraphicsを使うことはあまり推奨されていないようですが、入門書にはよく使われています。
推奨されないということではなく、CreateGraphics は使いどころが非常に限定的だという事です。

# どの「入門書」の事を指しているのかという点については言及せずにおきますが、
# Paint イベントや Graphics.FromImage を紹介している文献もありますよね。


> 何故、推奨されないものが基礎の部分で使われているのですか?
実際のところは、それぞれの執筆者本人に聞くしか無いと思いますが、
勝手に想像すると、要点を端的に伝えるために意図的にそうしている可能性と、
他の文献で使われていたコードが流用され、それが量産された可能性を思いつきます。
もちろん、他の理由もあるかも知れませんが。


本来、CreateGraphics を利用すべきパターンは非常に限定されると思いますが、
イベント ハンドラの記述無しで実装できるため、DrawLine 等の使い方を
短く伝えるためのサンプルコードでは、しばしば用いられることがあるようです。

とはいえ、そうしたサンプルコードでは、自分で生成した描画オブジェクト
(Graphics や Pen など)の Dispose 処理も省略されていることがありますので
注意が必要だったりします。

まぁ、Paint イベントの e.Graphics は、逆に Dispose すべきでは無かったりするので、
「入門書」だと、どこまで説明するべきか悩ましいところではあるのでしょうけれども。



ちなみに、

http://msdn.microsoft.com/ja-jp/library/5y289054%28VS.80%29.aspx

上記の公式資料では、Graphics クラスを得る手段として、
3 つの方法が紹介されています(ほかにも方法はあります)が、
一般的な描画処理には Paint イベントが使われると書かれていますね。

以下抜粋:

・(略) の Paint イベントの PaintEventArgs の一部として受け取ります。
 これは、コントロールの描画コードを作成するときに
 Graphics オブジェクトへの参照を取得するための一般的な方法です。

・(略) の CreateGraphics メソッドを呼び出して、(略) を表す
 Graphics オブジェクトへの参照を取得します。このメソッドは、
 既に存在するフォームまたはコントロール上に描画する場合に使用します。

・Image を継承する任意のオブジェクトから Graphics オブジェクトを作成します。
 この方法は、既存のイメージを変更する場合に便利です。


rs さんが No54413 で使っていた方法は、上記の 2 つ目の手法で、
私が No54420 で紹介したのは、上記の 1 つ目と 3 つ目の手法ですね。
引用返信 編集キー/
■54444 / inTopicNo.7)  Re[4]: PictureBoxの動的配置について。
□投稿者/ PATIO (31回)-(2010/10/20(Wed) 10:41:36)
2010/10/20(Wed) 10:42:07 編集(投稿者)

No54439 (横は入りですみません さん) に返信
>CreateGraphicsを使うことはあまり推奨されていないようですが、入門書にはよく使われています。

Windowsの仕組みから入っていっていないとそういう話になっちゃうかもしれません。
Windowsの基本はイベントドリブンで画面の更新に関しては通常はPaintイベントを受けた
タイミングでそのウインドウ内の全ての描画を再現できる必要があります。
イベントはOSが発行しますから、色んなタイミングで飛んできます。
そのいろいろなタイミングで飛んできたイベントに対してその時のウインドウの状態を
常に再現できる必要があるのです。この時、Paintイベントにはその時の描画に使う為の
Graphicsクラスのインスタンスが渡されます。一般的な描画ルートではこちらを使用して
描画する事が多いので魔界の仮面弁士さんの説明になると思います。

魔界の仮面弁士さんが書かれている通り、手っ取り早くPaintイベント以外の所で
描画系のコードを書いて説明したい場合は、Graphicsクラスのインスタンスが
渡されていない状況である事が多いと思います。
その為、CreateGraphicsを使ってGraphicsクラスのインスタンスを得るしかない為に
そういうコードになっているのだと思います。
但し、Paintイベント内に書かれていない描画コードは、画面の再描画(他のウインドウが
重なっていた部分が見えるようになった時等)に呼び出されないので描画内容が
消えてしまいます。Windowsでの描画処理の実装は基本的にPaintイベントの処理内で
行なうべき物なので、結局CreateGraphicsを使うケースと言うのはほとんどないのです。

引用返信 編集キー/
■54486 / inTopicNo.8)  Re[5]: PictureBoxの動的配置について。
□投稿者/ 横は入りですみません (2回)-(2010/10/22(Fri) 10:17:16)
No54444 (PATIO さん) に返信
>
> Windowsの仕組みから入っていっていないとそういう話になっちゃうかもしれません。

やはり基礎を勉強してないからなのですね
Windowsの仕組みについてわかりやすくかかれた本をご存じでしたらおしえてください
引用返信 編集キー/
■54493 / inTopicNo.9)  Re[6]: PictureBoxの動的配置について。
□投稿者/ 魔界の仮面弁士 (1886回)-(2010/10/22(Fri) 11:21:36)
No54486 (横は入りですみません さん) に返信
> やはり基礎を勉強してないからなのですね
> Windowsの仕組みについてわかりやすくかかれた本をご存じでしたらおしえてください

私にとって読みやすかったのは、
 「API 散歩道 <上>」 ISBN4-89052-586-6
 「API 散歩道 <下>」 ISBN4-89052-652-8
 「Win32 API散歩道」 ISBN4-79730-598-3
のシリーズでした。
――が、絶版なので図書館等を回ってみないと読めないかも知れません。
引用返信 編集キー/
■54519 / inTopicNo.10)  Re[6]: PictureBoxの動的配置について。
□投稿者/ PATIO (33回)-(2010/10/23(Sat) 07:51:02)
2010/10/23(Sat) 07:51:36 編集(投稿者)

No54486 (横は入りですみません さん) に返信
> ■No54444 (PATIO さん) に返信
>>
>>Windowsの仕組みから入っていっていないとそういう話になっちゃうかもしれません。
>
> やはり基礎を勉強してないからなのですね
> Windowsの仕組みについてわかりやすくかかれた本をご存じでしたらおしえてください

比較的やさしく書かれていると思うのは

猫でもわかるWindowsプログラミング

かなぁ。

ひろく書かれているので細かい部分に関してはデフォルメされているかもしれませんけれど。
ただ、仕組み的なものを知るには悪くない本だと思います。
具体的にWin32APIではどういうコードになるのかを書いてあるので
自分で動かしてみることもできますし。

ほんとに詳しい内容ならインサイド系の本になると思います。
内容的には重くなりますけれど、かなり突っ込んだ内容が書かれています。

インサイド Microsoft Windows (上・下)

書籍の内容がその人の思考回路にあっているかという部分もあるので
図書館などで借りて読めるようなら一度読んでみてから購入を検討するのも
手だと思いますよ。

引用返信 編集キー/
■54523 / inTopicNo.11)  Re[7]: PictureBoxの動的配置について。
□投稿者/ プトン (1回)-(2010/10/23(Sat) 21:50:55)
ピクチャーボックスをデザイナに貼り付けて、プロパティはコードで書く必要ないんじゃないの?

わざわざコードを書くのは、アレですか?

Dim pb As New System.Windows.Forms.PictureBox()
With pb
.BorderStyle = BorderStyle.Fixed3D
.Left = 0
.Top = 0
.Width = 300
.Height = 100
End With

これ。必要ないでしょ?

プロパティウィンドウに直接書けばいいのに。

以上。



引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -