- PR -

タブコントロールの色を変えたあと、色が元に戻る

1
投稿者投稿内容
Ts-Factory
常連さん
会議室デビュー日: 2006/08/08
投稿数: 42
投稿日時: 2008-08-07 01:08
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=7737&forum=7

を参考にタブコントロールのタブ部の色を変更しております。
上記サイトとD部(最終タブの右側)の色を親コンテナと同じ色にしているのですが
その部分にメッセージボックスなど別ウィンドウが表示されたあと、
色が Control色に戻ってしまいます。

DrawItemイベントで塗りつぶしているためタブを変更するまで
別ウィンドウが重なった部分のみ色が元に戻ります。

何かよい解決策はないでしょうか?
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2008-08-07 10:32
理由は明白。DrawItemイベントハンドラでタブ以外の部分を描画するからです。
DrawItemはあくまでもタブヘッダのキャプションなどを独自描画する為に用意されています。

で、この余白部分(D領域)の描画を捕らえるには
直接ウィンドウメッセージを捕らえ、描画するしか無いと思います。

つまり、TabControlを継承したカスタムコントロールを作成し
WndProc関数をオーバーライドして、WM_PAINTを捕らえ
余白部分を描画すれば解決すると思います。

[追記]
時間空いていたので、ざっと作ってみたところ、実現できました。
ヒント:WM_PAINT = C#:0xF, VB.NET:&HF
コーディングしていく上で、何かわからないことがあれば
再度質問してください。

[ メッセージ編集済み 編集者: くまっち 編集日時 2008-08-07 10:42 ]
Ts-Factory
常連さん
会議室デビュー日: 2006/08/08
投稿数: 42
投稿日時: 2008-08-07 11:59
くまっち さん

回答ありがとうございます。

WndProcで処理したとき余白部分(D領域)の座標はどのように取得するのでしょうか?
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2008-08-07 12:12
先の提示スレッドでは、どのように求めているか理解出来ていますか?

左端:最後のタブの右端座標
上端:最後のタブの上端座標
幅:タブコントロール幅 - 最後のタブの右端座標
高:最後のタブの高さ

つまり、最後のタブを領域を取得すれば、あとは計算で求まりますね。

this.GetTabRect(this.TabCount - 1);
これでタブコントロールの最後のタブの領域が取得できると思います。
Ts-Factory
常連さん
会議室デビュー日: 2006/08/08
投稿数: 42
投稿日時: 2008-08-07 12:17
引用:

先の提示スレッドでは、どのように求めているか理解出来ていますか?


はい。DrawItemイベントでは実装しております。

・・・あ、DrawItemイベントで実装している内容をそのまま
WndProcのWM_PAINTメッセージのときにも処理すればいいだけですね。
すみません。

ありがとうございました。
とーちゃん
会議室デビュー日: 2008/07/08
投稿数: 11
投稿日時: 2008-08-07 12:18
FormのPaintあたりで描画してはいかがでしょう?
何度も呼ばれることにはなりますが。。
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2008-08-07 12:24
引用:

Ts-Factoryさんの書き込み (2008-08-07 12:17) より:
WndProcのWM_PAINTメッセージのときに処理すればいいだけですね。



厳密には、余白部分の描画処理はWM_PAINTで処理するように移すのが良いです。

そうすれば、同じ領域を2回描画するという無駄が無くなります。

DrawItem:タブヘッダのカスタム描画
WM_PAINT:余白部分のカスタム描画
1

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