4

Lazarus0.9.30.2を実行しています。TPageControlがあるTFormがあります。TPageControl内には、一連のTTabSheets(そのうちの約30個)があります。私がやりたいのはタブを色分けすることです。最初の10個は赤、次の10個は青、最後の10個は緑です。イントラネット上で、クリックして移動すると(アクティブなタブを強調表示するために)タブシートの色(タブ自体を含む)を変更するコードスニペットを見たことがありますが、私がやりたいのは、上記のように色を付けることです。タブシートが最初にロードされます。

これを行う方法はありますか?

ここに画像の説明を入力してください

4

1 に答える 1

4

テーマが無効になっている Windows でのみ動作する少しトリッキーなソリューションを取得するだけで十分な場合は、次のことを試してください。

Use manifest file to enable themes (Windows only)プロジェクト設定ダイアログからオプションのチェックを外し、Project / Project Options ...次のコードをページ コントロールを使用してユニットに貼り付けます。介在クラスを使用しているため、このコードを貼り付けたユニットでのみ動作します。

uses
  ComCtrls, Windows, LCLType;

type
  TPageControl = class(ComCtrls.TPageControl)
  private
    procedure CNDrawItem(var Message: TWMDrawItem); message WM_DRAWITEM;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end; 

implementation

procedure TPageControl.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do
  begin
    if not (csDesigning in ComponentState) then
      Style := Style or TCS_OWNERDRAWFIXED;
  end;
end;

procedure TPageControl.CNDrawItem(var Message: TWMDrawItem);
var
  BrushHandle: HBRUSH;
  BrushColor: COLORREF;
begin
  with Message.DrawItemStruct^ do
  begin
    case itemID of
      0: BrushColor := RGB(235, 24, 33);
      1: BrushColor := RGB(247, 200, 34);
      2: BrushColor := RGB(178, 229, 26);
    else
      BrushColor := ColorToRGB(clBtnFace);
    end;
    BrushHandle := CreateSolidBrush(BrushColor);
    FillRect(hDC, rcItem, BrushHandle);
    SetBkMode(hDC, TRANSPARENT);
    DrawTextEx(hDC, PChar(Page[itemID].Caption), -1, rcItem, DT_CENTER or 
      DT_VCENTER or DT_SINGLELINE, nil);
  end;
  Message.Result := 1;
end;

これがどのように見えるかです(醜い:)

ここに画像の説明を入力

于 2012-02-21T14:14:33.797 に答える