tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル描画できない理由は何でしょうか
記事No11334
投稿日: 2014/10/22(Wed) 14:05
投稿者祖父プログラマ
いつも(勝手に)お世話になっております。

貴サイトのサンプルソースで下記のように MsgBoxを入れると、
A,Cは問題ありませんが Bを入れると描画されません。

理由が分からず不思議です。



Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        MsgBox("A")

        Dim g As Graphics
        With PictureBox1
            .Image = New Bitmap(100, 100)
            g = Graphics.FromImage(.Image)
        End With

        MsgBox("B")

        Dim f As New Font("MS Pゴシック", 14)
        g.DrawString("花ちゃん", f, Brushes.Blue, 10, 10)
        g.DrawLine(Pens.Black, 0, 40, 100, 40)

        MsgBox("C")

        f.Dispose()
        g.Dispose()

    End Sub

[ツリー表示へ]
タイトルRe: 描画できない理由は何でしょうか
記事No11335
投稿日: 2014/10/22(Wed) 17:24
投稿者Hongliang
PictureBoxは、Imageプロパティがセットされると、「次の描画タイミングでウィンドウに描画するぞ」という状態になります。
MsgBox("B")が無い状態であれば、以降のコードも隙間無く実行されて、End Sub後に描画タイミングと言うことになるのですが、
MsgBoxを表示するとこの描画タイミングが発生してしまい、DrawStringなどが呼び出される前の何も描かれていないBitmapをウィンドウに描画することになってしまいます。

明示的に「次の描画タイミングでウィンドウに描画するぞ」という状態にするには、該当コントロールのInvalidateメソッドを呼び出します。
あるいは、そもそもPictureBox1.Imageにいきなり代入するのでは無く、まずDim bmp As New Bitmap(100, 100)などとしてBitmapをローカル変数に取り、Graphics.FromImageでGraphicsを取得、でDrawなどを一通り済ませた後、最後にPictureBox1.Imageにこのbmpを代入するようにするとか。

[ツリー表示へ]
タイトルRe^2: 描画できない理由は何でしょうか
記事No11336
投稿日: 2014/10/22(Wed) 18:40
投稿者祖父プログラマ
> PictureBoxは、Imageプロパティがセットされると、「次の描画タイミングでウィンドウに描画するぞ」という状態になります。

ありがとうございます。
今更ながら目から鱗と涙が…。

「計算機はプログラムに記述した通りの順番に実行する」というインタプリンタ的概念では、
およそ理解できない仕組みですね。 プログラマ歴35年、やはり潮時。

[ツリー表示へ]