はじめまして、宜しくお願いします。
TTabControlのOnDrawTabイベントを使ってタブの描画を全て自前で描画したいと考えていますが、デフォルトで描画されるタブ選択時の枠などが消せないで困っています。
TDrawTabEvent型は以下のようになっていて、DefaultDrawが無いためにどのようにすればいいのかわかりません。
type TDrawTabEvent = procedure(Control: TCustomTabControl; TabIndex: Integer; const Rect: TRect; Active: Boolean) of object;
ツールバー等ではDefaultDrawをFalseにすることで上記の事が実現可能なのですが、タブコントロールにデフォルトドローさせない方法はあるのでしょうか?
それともう一つCustomDrawStateも無いので描画すべき状態がわかりませんので、下記のようなコードで状態を取得しようとしていますが、こちらもうまくいきません。
procedure(Control: TCustomTabControl; TabIndex: Integer; const Rect: TRect; Active: Boolean) var
tcItem: TC_ITEM;
begin
with Control.Canvas do
begin
tcItem.mask := TCIF_STATE;
SendMessage(Control.Handle, TCM_GETITEM, TabIndex, Integer(@tcItem));
Result := tcItem.dwState;
if (Result and TCIS_BUTTONPRESSED) <> 0 then
DoSomething
else if (Result and TCIS_HIGHLIGHTED) <> 0 then
DoSomething;
TCIS_BUTTONPRESSEDの方はうまくいくのですが、TCIS_HIGHLIGHTEDの方がうまくいきません。HIGHLIGHTEDはホットトラックでマウスオーバーされている時に返されると思っているのですがあってますでしょうか?
どちらかでもいいのでお答え頂けたら幸いです。
よくは分からないのですが、以下は参考になりませんか?
http://leed.issp.u-tokyo.ac.jp/~takeuchi/delphi/browse.cgi?index=060103
>deldelさん
ありがとうございます。説明がわかり難かった様ですみません。
オーナードローで描画する方法については分かるのですが、知りたいのはカスタムドローということになるんでしょうか。
前回の説明が少々わかりにくかったので、補足しておきます。
タブコントロールでタブのスタイルをボタンにすると、ツールバーとほぼ同様の外見になります。
そして、タブを選択すると、凹んだようなに描画されます。
これは、ツールバーのボタンでも同様ですが、
ツールバーのOnCustomDrawButtonイベントで
DefaultDraw := False;
とすると、ツールバーのボタンが表示されなくなります。
故に、ボタンの描画を全て自前で行うことができます。
これと同じ事をタブコントロールのボタンでもやりたいのです。
ちなみに、VCLで作っていますが、VCLのTDrawTabEventにはDefaultDrawはないのですが、CLXにはあります。ですが、CLXのTTabControlのOnDrawTabイベントはprotectedになっていて、外からは使えません、ここがちょっと謎です。
TabControl はウィンドウズのコモンコントロールのラッパーです。CLX とは違います。
CustomDraw に相当する物はありません。
>>えーとさん
ありがとうございます。なるほど、そういうことですか。
VCLはラッパーだけど、CLXは自前で描画してるって事なんでしょうかね?
コモンコントロールというとツールバー等もそうかと思ってたんですけど、違うんですかね。
今度、時間あるときにVCLのコードを読んでみます。
あと、VCLとCLXの違いというか使いどころがいまいち分からなかったりします。VCLはWindows専用でCLXはクロスプラットフォーム?って事ぐらいで、共存は可能なのか?とか、Windows専用でCLX使うのもあり?とか、CLXはJAVAのSwing(AWT)みたいな感じなんだろうか。。。
すみません、全然分からない事だらけでこの辺は自分で調べてみようと思います。
というわけで、とりあえず解決にしときます。
ありがとうございました。
ツイート | ![]() |