TTabControlのタブを全て自前で描画するには?

解決


zebra  2006-08-14 19:52:29  No: 22890

はじめまして、宜しくお願いします。
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はホットトラックでマウスオーバーされている時に返されると思っているのですがあってますでしょうか?

どちらかでもいいのでお答え頂けたら幸いです。


deldel  2006-08-16 20:48:50  No: 22891

よくは分からないのですが、以下は参考になりませんか?
http://leed.issp.u-tokyo.ac.jp/~takeuchi/delphi/browse.cgi?index=060103


zebra  2006-08-18 01:37:58  No: 22892

>deldelさん
ありがとうございます。説明がわかり難かった様ですみません。
オーナードローで描画する方法については分かるのですが、知りたいのはカスタムドローということになるんでしょうか。

前回の説明が少々わかりにくかったので、補足しておきます。
タブコントロールでタブのスタイルをボタンにすると、ツールバーとほぼ同様の外見になります。
そして、タブを選択すると、凹んだようなに描画されます。
これは、ツールバーのボタンでも同様ですが、
ツールバーのOnCustomDrawButtonイベントで
DefaultDraw := False;
とすると、ツールバーのボタンが表示されなくなります。
故に、ボタンの描画を全て自前で行うことができます。
これと同じ事をタブコントロールのボタンでもやりたいのです。

ちなみに、VCLで作っていますが、VCLのTDrawTabEventにはDefaultDrawはないのですが、CLXにはあります。ですが、CLXのTTabControlのOnDrawTabイベントはprotectedになっていて、外からは使えません、ここがちょっと謎です。


えーと  2006-08-18 06:12:48  No: 22893

TabControl はウィンドウズのコモンコントロールのラッパーです。CLX とは違います。

CustomDraw に相当する物はありません。


zebra  2006-08-18 07:45:33  No: 22894

>>えーとさん
ありがとうございます。なるほど、そういうことですか。
VCLはラッパーだけど、CLXは自前で描画してるって事なんでしょうかね?
コモンコントロールというとツールバー等もそうかと思ってたんですけど、違うんですかね。
今度、時間あるときにVCLのコードを読んでみます。

あと、VCLとCLXの違いというか使いどころがいまいち分からなかったりします。VCLはWindows専用でCLXはクロスプラットフォーム?って事ぐらいで、共存は可能なのか?とか、Windows専用でCLX使うのもあり?とか、CLXはJAVAのSwing(AWT)みたいな感じなんだろうか。。。
すみません、全然分からない事だらけでこの辺は自分で調べてみようと思います。
というわけで、とりあえず解決にしときます。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加