- - PR -
タブコントロールの色を変えたあと、色が元に戻る
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-08-07 01:08
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=7737&forum=7
を参考にタブコントロールのタブ部の色を変更しております。 上記サイトとD部(最終タブの右側)の色を親コンテナと同じ色にしているのですが その部分にメッセージボックスなど別ウィンドウが表示されたあと、 色が Control色に戻ってしまいます。 DrawItemイベントで塗りつぶしているためタブを変更するまで 別ウィンドウが重なった部分のみ色が元に戻ります。 何かよい解決策はないでしょうか? | ||||
|
投稿日時: 2008-08-07 10:32
理由は明白。DrawItemイベントハンドラでタブ以外の部分を描画するからです。
DrawItemはあくまでもタブヘッダのキャプションなどを独自描画する為に用意されています。 で、この余白部分(D領域)の描画を捕らえるには 直接ウィンドウメッセージを捕らえ、描画するしか無いと思います。 つまり、TabControlを継承したカスタムコントロールを作成し WndProc関数をオーバーライドして、WM_PAINTを捕らえ 余白部分を描画すれば解決すると思います。 [追記] 時間空いていたので、ざっと作ってみたところ、実現できました。 ヒント:WM_PAINT = C#:0xF, VB.NET:&HF コーディングしていく上で、何かわからないことがあれば 再度質問してください。 [ メッセージ編集済み 編集者: くまっち 編集日時 2008-08-07 10:42 ] | ||||
|
投稿日時: 2008-08-07 11:59
くまっち さん
回答ありがとうございます。 WndProcで処理したとき余白部分(D領域)の座標はどのように取得するのでしょうか? | ||||
|
投稿日時: 2008-08-07 12:12
先の提示スレッドでは、どのように求めているか理解出来ていますか?
左端:最後のタブの右端座標 上端:最後のタブの上端座標 幅:タブコントロール幅 - 最後のタブの右端座標 高:最後のタブの高さ つまり、最後のタブを領域を取得すれば、あとは計算で求まりますね。 this.GetTabRect(this.TabCount - 1); これでタブコントロールの最後のタブの領域が取得できると思います。 | ||||
|
投稿日時: 2008-08-07 12:17
はい。DrawItemイベントでは実装しております。 ・・・あ、DrawItemイベントで実装している内容をそのまま WndProcのWM_PAINTメッセージのときにも処理すればいいだけですね。 すみません。 ありがとうございました。 | ||||
|
投稿日時: 2008-08-07 12:18
FormのPaintあたりで描画してはいかがでしょう?
何度も呼ばれることにはなりますが。。 | ||||
|
投稿日時: 2008-08-07 12:24
厳密には、余白部分の描画処理はWM_PAINTで処理するように移すのが良いです。 そうすれば、同じ領域を2回描画するという無駄が無くなります。 DrawItem:タブヘッダのカスタム描画 WM_PAINT:余白部分のカスタム描画 |
1