プロが教える店舗&オフィスのセキュリティ対策術

以前も同じ質問をしましたが、カテゴリーが不適当だったようですので、再度質問します。
よろしくお願いします。

VB2010のある参考書に下記のようなプログラムがありました。

Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim g As Graphics = Me.PictureBox1.CreateGraphics()
g.DrawEllipse(Pens.Black, 0, 0, 100, 100)
End Sub

ボタンをクリックすると円が描けます。これをプログラムの起動時に実行させようと思い

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim g As Graphics = Me.PictureBox1.CreateGraphics()
g.DrawEllipse(Pens.Black, 0, 0, 100, 100)
End Sub

と、しましたが実行されません。
どうすれば良いのでしょうか?

A 回答 (4件)

タイミングが悪いです。



Loadイベントに書き加えると

1.Form1のロード時、DrawEllipseで円を描画(内部的に描画はされるけど、画面には反映されない)

2.Form1の生成・アクティブ可で、Form1の背景、コントロール等を描画。描いた円は上書きされて消える

3.Form1の状態が画面に反映される(円は背景描画で上書きされているので出ない)

と言う処理をされるので、画面に円は出ません。

従って、2.が行われた後(例えば、Form1_ActivateやForm1_Paint等)で行わないといけません。
    • good
    • 0
この回答へのお礼

早速、回答頂きありがとうございました。
期待していた動作と少し異なりますが、もう少し勉強します。

お礼日時:2011/10/24 19:29

> VB6では出来たと思っていたので、


AutoRedraw = True の話では?
仕組み・原理は同じでしょう。
VB or PictureBox が裏で勝手にやってることが多々あるわけです。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。もう少し勉強します。

お礼日時:2011/11/08 08:14

>期待していた動作と少し異なりますが、もう少し勉強します。



Windowsには「さまざまなお約束」と「信じられない、ありえない仕様」が沢山あります。

なので「自分が期待している動作をさせる事は出来ない」のが普通です。

みんな「期待した動作と違うけど、こうするしかない」って言うのを我慢してプログラミングしているのです。

それが我慢できないのであれば、Windowsでプログラミングするのは不可能です。

因みに「起動時に一回描画して、それで済ます」のは、Windowsの仕様では不可能です。
    • good
    • 0
この回答へのお礼

重ねてご指導頂きありがとうございます。
VB6では出来たと思っていたので、質問させて頂きました。
今、確認したところVB6でも同じでした。勘違いしていました。
VB6からVB2010に乗り換えたばかりで、参考書も気に入ったものが無く
ネットの入門講座などを見ながら手探りでやっています。なるべく早く
参考書を買いたいと思います。
ありがとうございました。また、お世話になると思います。よろしく
お願いします。

お礼日時:2011/10/25 11:13

> ボタンをクリックすると円が描けます。


この後、画面を最小化してから元に戻すとか、
他の Window を重ねてから取り除いても、
円は消えるはずです。
ユーザが意識しないだけで、Window は頻繁に
再描画されています。

つまり実行されていないのではなく、再描画され
消えているだけです。

描画の仕組みの根幹に関わる話なので、参考書にも
ちゃんと説明してあるような内容だと思いますが。
参考書をもう一回読み直すべきではないかと思います。

対策は、
【案1】描画のイベント(Paint)で再描画の必要ができたら
書き直す。
【案2】PictureBox の Image に描画すべき情報を
記録し、再描画の必要ができたら PictureBox に再描画
させる。
http://dobon.net/vb/dotnet/graphics/pictureboxim …
    • good
    • 0
この回答へのお礼

早速、回答頂きありがとうございました。
期待していた動作と少し異なりますが、もう少し勉強します。

お礼日時:2011/10/24 19:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています