- PR -

TabControl の指定したTabPageを実行時編集したい

投稿者投稿内容
One.net
大ベテラン
会議室デビュー日: 2008/03/01
投稿数: 202
投稿日時: 2008-03-14 16:54
WindowsXP VB2005EEでWindowsアプリケーションを開発います。
あるフォームにTabControlを配置しています。そしてTabPage2に四角の箱を描くために
PictureBox1を配置し、FormsのLoadイベントハンドラに次のようなコードを記述しま
したが、四角の箱を描くことは出来ません。現在TabPage2にButton1を配置し、
Button1イベントハンドラに下のコードを記述して箱を描写を確認しています。

質問は、TabControlの指定したTabPageにコードで何かを記載する場合は
どんなイベントを使えばよいのでしょうか

コード:
Dim g As Graphics = PictureBox1.CreateGraphics() 
Dim p As New Pen(Color.MidnightBlue, 1)
Dim recst As Rectangle() = {New Rectangle(0, 0, 540, 30), _
       New Rectangle(0, 30, 540, 20), _
       New Rectangle(0, 50, 540, 20), _
       New Rectangle(0, 70, 540, 20), _
       New Rectangle(0, 90, 540, 20), _
       New Rectangle(0, 110, 540, 20), _
       New Rectangle(0, 130, 540, 20)} 
g.DrawRectangles(p, recst) 
p.Dispose() 'リソースを開放する
g.Dispose()



_________________
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2008-03-14 17:19
・描画は描画対象のコントロールの Paint イベントで行う
・描画に使用する Graphics はイベント引数 PaintEventArgs の Graphics プロパティに格納されているのを使用する
です。

// 以前どこかの掲示板で書いたのをコピペ。
One.net
大ベテラン
会議室デビュー日: 2008/03/01
投稿数: 202
投稿日時: 2008-03-14 18:13
Hongliangさん、ご解答ありがとうございます。
四角の箱を描くために事はTabPage2にButton1を配してそのイベントハンドラに
前記したコードを記載して、TabPage2を開いてButton1を押すことによって
正常に箱を描く事は確認できています。

質問の内容は、TabPage2を開くと自動的に四角の箱が描写される方法
(Button1を手動で押すのではなく)教えていただきたいのですが、
よろしくお願いいたします。

_________________
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2008-03-14 19:47
既に的確な回答が出ていると思うのですが・・・。
Hongliangさんのレスを理解していますか?

> TabPage2を開くと自動的に四角の箱が描写される方法
TabPage2が開くと、内在コントロールが描画されます。
この時PictureBox.Paintも当然呼び出されます。

ですので、PictureBox.Paintイベントにハンドラを追加して描画を行います。

つまりHongliangさんの発言どおり
描画は描画対象のコントロールの Paint イベントで行う
ってことですよ。
One.net
大ベテラン
会議室デビュー日: 2008/03/01
投稿数: 202
投稿日時: 2008-03-14 20:01
くまっちさん、ありがとうございました。またHongliangさん、大変失礼しました。
ご解答いただいた内容が理解できづ、四角の箱が描写方法をご指導いただいたものと
解釈いたしました。いまだに意味を理科いせておりませんが何度も読みかせして
収得いたします。
Hongliangさん、くまっちさん、本当にありがとうございました。
_________________
One.net
大ベテラン
会議室デビュー日: 2008/03/01
投稿数: 202
投稿日時: 2008-03-14 20:15
くまっちさん、早速PictureBox.Paintイベントハンドラに次のように記述ましたが、
四角の箱が描写されません。何かの間違いでしょうか。よろしくご指導下さい。

コード:
Private Sub PictureBox1_Paint(ByVal sender As System.Object, ByVal e As _ System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
      Dim g As Graphics = PictureBox1.CreateGraphics()         
      Dim p As New    Pen(Color.MidnightBlue, 1) 
      Dim recst As Rectangle() = {New Rectangle(0, 0, 540, 30), _
      New Rectangle(0, 30, 540, 20), _
      New Rectangle(0, 50, 540, 20), _
      New Rectangle(0, 70, 540, 20), _
      New Rectangle(0, 90, 540, 20), _
      New Rectangle(0, 110, 540, 20), _
      New Rectangle(0, 130, 540, 20)} 
      g.DrawRectangles(p, recst) 
      p.Dispose() 'リソースを開放する
      g.Dispose()
End Sub




_________________
One.net
大ベテラン
会議室デビュー日: 2008/03/01
投稿数: 202
投稿日時: 2008-03-14 20:36
くまっちさん、Hongliangさん、ありがとうございました。
もしやと思ってTabPage2.Paintイベントハンドラに記述しましたら正常に描写できました。
ただ、マウスカーソルがPictureBox1の上に来ないと四角の箱が描写されません。
これはどういうことなのでしょうか。やもうえないのなら納得いたします。
_________________
みつまん
会議室デビュー日: 2008/03/14
投稿数: 2
投稿日時: 2008-03-14 21:20
熟年プログラマーの「みつまん」です。いつもはROMを決め込んでいるのですが、たまには良いかなと仲間いりさせてもらいます。
先人(Hongliang)の回答
・描画は描画対象のコントロールの Paint イベントで行う
・描画に使用する Graphics はイベント引数 PaintEventArgs の Graphics プロパティに格納されているのを使用するです。
ですべてです。
One.netさんは2番目の事項に対応していませんね。
私は、VB.netは苦手なのですが、C#でテストすると、先人(Hongliang)の回答でうまくできましたよ。
Dim g As Graphics = PictureBox1.CreateGraphics() とせずに
「イベント引数 PaintEventArgs の Graphics プロパティに格納されているのを使用する」ということです。VBで記述できなくてすみません。
ところで、その時には、
g.Dispose() 
はエラーになりました。まだ使うのだから「勝手に消すなよ」ということなのでしょう。

スキルアップ/キャリアアップ(JOB@IT)