- PR -

TabControl のページタイトル部の BackColor を変更したい。

投稿者投稿内容
蒋 いつ峰
会議室デビュー日: 2005/10/08
投稿数: 11
投稿日時: 2007-10-31 23:59
Jitta さんのご指摘有難うございます。
リソース解放について、補足します。システムBrushを使った場合には解放が要らないですが。私はタブの背景色、前景色をデザイナから設定できるように、システムBrushでなく、カスタマイズBrushを使っています。ですので、解放が要ると思います。説明不足すみませんが、サンプルコードを参考してください。
コード:

Protected Overridable Sub handleDrawItem(ByVal sender As Object, ByVal e As DrawItemEventArgs)
'対象のTabControlを取得
Dim tab As TabControl = CType(sender, TabControl)
'タブページのテキストを取得
Dim txt As String = tab.TabPages(e.Index).Text

'タブのテキストと背景を描画するためのブラシを決定する
Dim foreBrush, backBrush As Brush
If e.State = DrawItemState.Selected Then
'選択されているタブのテキストを赤、背景を青とする
foreBrush = New SolidBrush(_selectedForeColor)
backBrush = New SolidBrush(_selectedBgColor)
Else
'選択されていないタブのテキストは灰色、背景を白とする
foreBrush = New SolidBrush(_headerForeColor)
backBrush = New SolidBrush(_headerBgColor)
End If

'StringFormatを作成
Dim sf As New StringFormat
'中央に表示する
sf.Alignment = StringAlignment.Center
sf.LineAlignment = StringAlignment.Center

'背景の描画
e.Graphics.FillRectangle(backBrush, e.Bounds)

'Textの描画
Dim rectf As New RectangleF(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)
e.Graphics.DrawString(txt, _headerFont, foreBrush, rectf, sf)

'リソース開放
foreBrush.Dispose()
backBrush.Dispose()
e.Graphics.Dispose()
End Sub



selectedBgColorなどをプロパティにして、タブの背景色、前景色、フォントなどをデザイナから見やすくようにカスタマイズできます。

_________________
使いやすいOnline Editorでオンライン作品(写真、小説、エッセイなど)を気軽に掲載し、コメントします -- Uprush
http://uprush.net

[ メッセージ編集済み 編集者: uprush 編集日時 2007-11-01 00:00 ]

[ メッセージ編集済み 編集者: uprush 編集日時 2007-11-01 00:09 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-11-01 07:01
uprushさんを責めるつもりは毛頭ないので、そのように受け取られたなら、ごめんなさい。
私が言いたいのは、
* サンプルを鵜呑みにするな
* 理由を考えろ
ということです。結論は、そのケースでしか有効ではないが、結論にいたる理由はあらゆるケースに応用可能だからです。

uprushさんのように、ブラシを作っているなら、Dirposeの必要があります。
ただ、e.Graphics は不要だと思います。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-11-01 08:18
Jitta さんフォローありがとうございます。
System.Brushes だからというよりは(これはこれで正しいけど)自分が作ったブラシじゃないから解放しない(してはいけない)ということですね。逆に自分が作ったブラシであれば責任を持って解放する必要があるよと。
そう考えると、e.Graphics を解放してはいけないというのがわかりますね(自分が作ったものじゃないから)。

引用:

uprushさんの書き込み (2007-10-31 23:59) より:

Jitta さんのご指摘有難うございます。
リソース解放について、補足します。システムBrushを使った場合には解放が要らないですが。私はタブの背景色、前景色をデザイナから設定できるように、システムBrushでなく、カスタマイズBrushを使っています。ですので、解放が要ると思います。説明不足すみませんが、サンプルコードを参考してください。


ちょっと待ってくださいな。
元々の話は DOBON.NET さんのところにあったサンプルについての話であったと思います。
uprush さんの出してくださったコードでは確かに自分でブラシを作っているわけで、その点では解放が必要です。この点で uprush さんの指摘は正しいです。
ですが、少なくとも最初の私の発言はこのコードを元にした発言ではありません
DOBON.NET さんのサンプルでは System.Drawing.Brushes を使っているわけで、それは解放してはいけないという話です。
少し話が混乱しているようです。

このあたりは Jitta さんも指摘されているように、解放する理由を考えれば解放して良いか悪いかは判断できると思います。何でもかんでも解放していいわけではありません。特に uprush さんのコードでも e.Graphics は解放すべきではありません。
解放する理由について考えてみてください。

--
System.Brushes → System.Drawing.Brushes に修正 orz
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。

[ メッセージ編集済み 編集者: ぽぴ王子 編集日時 2007-11-01 12:57 ]
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2007-11-01 09:13
今の話題では重要なポイントではなくて、細かい話ですみませんが、

>System.Brushes

System.Drawing.Brushesですよね。
#ちょっと気になったので^^;
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-11-01 09:19
引用:

System.Brushes だからというよりは(これはこれで正しいけど)自分が作ったブラシじゃないから解放しない(してはいけない)ということですね。



多くの場合それで正しいですが、あてはまらない場合もあり得ます。

引用:

逆に自分が作ったブラシであれば責任を持って解放する必要があるよと。



も同様です。

「他に誰も解放するはずがないもの」は自分で解放しなければなりません。
逆に、「誰かが解放するはずのもの」を自分で解放してはいけません。

「どうあるべきか」は扱っているオブジェクトの出生や文脈などによって変わります。

この掲示板やほかの掲示板、自分のブログなどでも何度か書いていますが、「誰がそのオブジェクト(インスタンス)を作ったか」に注目するのではなく、「そのオブジェクト(インスタンス)を解放する責任は誰にあるのか」に注目するべきです。

「オブジェクト(インスタンス)の「所有権」が誰にあるのか」と考えると、分かりやすくなると思います。

[ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2007-11-01 09:20 ]

[ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2007-11-01 10:10 ]
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-11-01 12:58
引用:

よねKENさんの書き込み (2007-11-01 09:13) より:

今の話題では重要なポイントではなくて、細かい話ですみませんが、

>System.Brushes

System.Drawing.Brushesですよね。
#ちょっと気になったので^^;


ぐはっ!(吐血)
…そうでした。指摘ありがとうございます。
直しておきました。トホホ。

引用:

渋木宏明(ひどり)さんの書き込み (2007-11-01 09:19) より:

「他に誰も解放するはずがないもの」は自分で解放しなければなりません。
逆に、「誰かが解放するはずのもの」を自分で解放してはいけません。

「どうあるべきか」は扱っているオブジェクトの出生や文脈などによって変わります。

この掲示板やほかの掲示板、自分のブログなどでも何度か書いていますが、「誰がそのオブジェクト(インスタンス)を作ったか」に注目するのではなく、「そのオブジェクト(インスタンス)を解放する責任は誰にあるのか」に注目するべきです。

「オブジェクト(インスタンス)の「所有権」が誰にあるのか」と考えると、分かりやすくなると思います。


フォローありがとうございます。
なるほど。自分が作ったからといって、誰が解放すべきなのかは一概には言えないということですね。
たまたま自分が new したインスタンスは自分で Dispose するべきということが多いけれども、もしかしたら誰か違う人(…人?)が Dispose する役割を担っている場合もあるですよと。そうした場合は自分が作ったからと言って勝手に解放しては(・A・)イクナイ! ということですね。
# 例えばインスタンスを作って誰かに渡す(そして渡された方が管理する)とか、そんな場合かな
結局のところ、その都度確認せよってことになりそうですね。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-11-01 16:29
引用:

なるほど。自分が作ったからといって、誰が解放すべきなのかは一概には言えないということですね。
たまたま自分が new したインスタンスは自分で Dispose するべきということが多いけれども、もしかしたら誰か違う人(…人?)が Dispose する役割を担っている場合もあるですよと。そうした場合は自分が作ったからと言って勝手に解放しては(・A・)イクナイ! ということですね。
# 例えばインスタンスを作って誰かに渡す(そして渡された方が管理する)とか、そんな場合かな
結局のところ、その都度確認せよってことになりそうですね。



全面的にその通りです。
蒋 いつ峰
会議室デビュー日: 2005/10/08
投稿数: 11
投稿日時: 2007-11-01 17:53
引用:

Jittaさんの書き込み (2007-11-01 07:01) より:
uprushさんを責めるつもりは毛頭ないので、そのように受け取られたなら、ごめんなさい。
私が言いたいのは、
* サンプルを鵜呑みにするな
* 理由を考えろ
ということです。結論は、そのケースでしか有効ではないが、結論にいたる理由はあらゆるケースに応用可能だからです。

uprushさんのように、ブラシを作っているなら、Dirposeの必要があります。
ただ、e.Graphics は不要だと思います。



議論をしているわけだから、気にしないでください。
Jittaさんの指摘通り、私が書いたコードにも、e.Graphicsの解放は要らないことが分かった。有難うございました。
_________________
ブログ
http://uprushworld.blogspot.com/

助君 -- あなた専用のカスタマイズ ウェブナビ
http://www.sukekun.com/

A website and community for programmer
http://uprush.net

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