Delphi/C++ Builder の PageControl で TabPosition を tpBottom にする

今更だけど PageControl (TPageControl) で TabPosition を tpBottom にする
(おかしくなるのは知っていたけど、タブを下へ付けることがこれまで無かったので)


TabPositiontpTop の場合

TabPositiontpBottom にしてみる
上用のタブがそのまま下へ移動する...これじゃない感

対策1
uses に UxTheme を追加して、フォームのOnShowイベント辺りで SetWindowTheme を使って、PageControl のテーマを解除する
※ OnShowイベントへ記述したのは、フォームのドッキングなどで、テーマが戻ってしまうため
  1. procedure TForm1.FormShow(Sender: TObject);  
  2. begin  
  3.     SetWindowTheme(PageControl1.Handle, '''');  
  4. end;  
その結果が、こんな感じ
シンプルだし、これでいいのかも...

対策2
PageControl の OwnerDraw プロパティを True にして、自前でタブを描画(OnDrawTabイベント)する
  1. procedure TForm1.PageControl1DrawTab(Control: TCustomTabControl; TabIndex: Integer; const Rect: TRect; Active: Boolean);  
  2. var TabRect: TRect;  
  3.     PageControl: TPageControl;  
  4. begin  
  5.     // OwnerDraw = True の場合  
  6.     PageControl := TPageControl(Control);  
  7.     TabRect := Rect;  
  8.   
  9.     // 背景を塗りつぶす  
  10.     if Active then begin  
  11.         PageControl.Canvas.Brush.Color := clWindow; // アクティブ色  
  12.     end  
  13.     else begin  
  14.         PageControl.Canvas.Brush.Color := clBtnFace; // 非アクティブ色  
  15.     end;  
  16.     PageControl.Canvas.FillRect(Rect);  
  17.   
  18.     // 文字を書き込む  
  19.     PageControl.Canvas.Font.Color := clWindowText; // 文字色  
  20.     DrawText(PageControl.Canvas.Handle, pChar(PageControl.Pages[TabIndex].Caption), -1, TabRect, DT_WORDBREAK or DT_NOCLIP or DT_CENTER or DT_SINGLELINE or DT_VCENTER);  
  21. end;  
上記のコードで描画したものがコレ

まぁ、サードパーティのコンポーネントを使えば済む話だけど、基本は標準コントロールでという方は多いハズ

コメント