DOBON.NET DOBON.NETプログラミング掲示板過去ログ

フォームロード時にパネルコントロールへの文字列の描画ができない

環境/言語:[WindowsXP/VB.NET2003/.NET Framework1.0]
分類:[.NET]

フォームのロードイベントで、
フォーム内のパネルコントロール内への描画を行っているのですが、
何故か描画してくれません。

Private Sub frmMakeQg_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
|
|
|  中略(ActiveXコンポーネントの動的配置等)
|
|
putData(Me.HScrollBar1.Value)
End Sub

Private Sub putData(ByVal i As Integer)
Me.label1.Text = i.toString()  'ラベルにiを表示。

'Panel1のGraphicsオブジェクトを取得
Dim g As Graphics = Me.Panel1.CreateGraphics
    '黒で塗りつぶす
g.Clear(Color.Black)
'文字列を描画
g.DrawString([文字列], [フォント], Brushes.White, 4, 4)
g.Dispose() '描画用Graphicsオブジェクトを開放する。
|
|  中略
|
End Sub

上記のputDataプロシージャは、他の箇所からも呼ばれるのですが、
他の箇所から呼ばれた時はきちんと描画してくれるのです。
つまり、フォームロード時(初回)だけ描画してくれないのです。
[フォント]は、Declarationsで宣言してあります。
Private [フォント] As New Font("MS UI Gothic", 20)
[文字列]も空白ということはないようです。(デバッグしました)
フォームロード時には、ActiveXコンポーネントの動的配置を行っています。
これは、デザイナでActiveXコンポーネントを配置すると、
フォームロード時のputData処理で、文字列の描画だけでなく、ラベルにiを
表示する処理も行ってくれませんでした。

どなたか、この原因がわかる方いらっしゃいませんでしょうか

フォームを最小化してまた元に戻したのですが、
やはり何も変化ありません。Invalidateメソッドを使っても、全く
描画されないのです。たぶん、最初の描画処理自体、なされていないのでは
ないかと思います。
一応、ブレークポイントを入れて、デバッグしながら各変数値、ロジック等
思惑通りに動いているのですが

これが実行時のメモリ等に関係があることでしたら、
何がいけないのでしょうか。どなたかご教授お願い致します。
> 描画されないのです。たぶん、最初の描画処理自体、なされていないのでは
> ないかと思います。
描かれた後に消されただけです。
Paintイベントにて描くようにしましょう。
■No3013に返信(Sugi@ぱぱんぶぃびぃさんの記事)
>>描画されないのです。たぶん、最初の描画処理自体、なされていないのでは
>>ないかと思います。
> 描かれた後に消されただけです。
> Paintイベントにて描くようにしましょう。

お返事ありがとうございます。
まさに、その通りでした!
お陰様で、Paintイベントにて描画するようにして、書くことができました。
頻繁に描画処理があるので、Paint処理を毎回呼び出すと重くなって
しまい、そこで、初回の描画や、システム上必要な描画はPaintイベントに
任せて、その他は自作のプロシージャで描画するようにしました。
以下のコードにて解決することができました。参考までに。

・ロードイベント
Private Sub frmMakeQg_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
|
|
|  中略(ActiveXコンポーネントの動的配置等)
|
|
 putData(Me.HScrollBar1.Value)
End Sub

・putDataプロシージャ
Private Sub putData(ByVal i As Integer)
 Me.label1.Text = i.toString()  'ラベルにiを表示。
 subDraw() '描画処理
|
|  中略
|
End Sub

・subDrawプロシージャ
Private Sub subDraw()
 'Panel1のGraphicsオブジェクトを取得
 Dim g As Graphics = Me.Panel1.CreateGraphics
 '黒で塗りつぶす
 g.Clear(Color.Black)
 '文字列を描画
 g.DrawString([文字列], [フォント], Brushes.White, 4, 4)
 g.Dispose() '描画用Graphicsオブジェクトを開放する。
End Sub

・Panel1のPaintイベント
Private Sub Panel1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint
 subDraw()
End Sub

結局、Paintイベントでは、描画処理のコードを書かかずに
別プロシージャにまとめました。^^;
Paintイベントによって描画内容が消されてしまうことはなくなりました。

お教え下さり、感謝します。有難う御座いました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板