2012-04-13 4 views
2

Когда я докажу TForm до TTabSheet, форма имеет серый цвет фона. С другой стороны, вкладка имеет белый цвет фона.Как установить цвет прикрепленной формы на листе вкладки на правильный цвет?

Сложнее, когда тема отключена (например, классическая тема Windows).

С текущим кодом серая форма имеет белую границу, которая довольно уродливая.

Как установить цвет фона формы на цвет фона вкладки? Если это не работает: как установить цвет фона вкладки на цвет фона форм?

Он должен работать с включенными темами среды выполнения и временем выполнения.

program Project1; 

uses 
    Graphics, 
    Controls, 
    Forms, 
    ComCtrls; 

{$R *.res} 

var 
    Main  : TForm; 
    Sub   : TForm; 
    PageControl : TPageControl; 
    TabSheet : TTabSheet; 
begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    Application.CreateForm(TForm, Main); 
    Application.CreateForm(TForm, Sub); 
    PageControl  := TPageControl.Create(Main); 
    PageControl.Parent := Main; 
    PageControl.Align := alClient; 
    TabSheet    := TTabSheet.Create(Main); 
    TabSheet.PageControl := PageControl; 
    Sub.Dock(TabSheet, TabSheet.ClientRect); 
    Sub.Align := alClient; 
    Sub.Show; 
    // Sub.Color := clWhite; // TabSheet.Color; 
    Application.Run; 
end. 
+1

Я предлагаю вам использовать JvDocking в JVCL вместо потому что она обрабатывает это гораздо лучше, чем нативный CommonControls TTabSheet + 'Form.Dock/ManualDock' будет когда-либо обрабатывать его. Если вы не хотите, чтобы пользователь перетаскивал док-станцию ​​и все это во время выполнения, я все же предлагаю вам отказаться от TPageControl и, по крайней мере, использовать элемент управления Tab/page, не поддерживающий MS-common-controls. Это намного хуже, чем вы думаете. Вы получаете разные типы поведения на Win7/64bit, чем на Win7/32bit, благодаря ошибкам в DLL MSCOMMONCONTROLS на Win7/64 тоже. –

ответ

2

Я нашел обходной путь

type 
    TWinControlAccess = class(TWinControl) 
    end; 

procedure TMainForm.CreateEmbedded(FormClass: TFormClass; Parent: TWinControl); 
var 
    form: TForm; 
begin 
    form := FormClass.Create(Self); 
    form.Align := alClient; 
    form.BorderIcons := []; 
    form.BorderStyle := bsNone; 
    form.Parent := Parent; 
    TWinControlAccess(form).ParentBackground := True; // <<<- 
    form.Show; 
end; 
1

Голова к этому Блог пост под названием Theming Owner-Drawn Tabs по Крис Rolliston.


Цитаты:

Проблема: говорят, что вы хотите настроить цвет шрифта вкладки на вкладке или странице управления. В тот же день это было просто: установите OwnerDraw в True и предоставьте обработчик для OnDrawTab, который просто устанавливает шрифт и рисует текст. Однако с темами Windows все не так просто, так как установка OwnerDraw в True отключает их для управления . Не ограничение VCL как таковое, это просто отражает поведение базового API-интерфейса , и если вы думаете об этом, то он имеет смысл с точки зрения обратной совместимости. Тем не менее, это все еще проблема, если вы знаете, чего хотите, что - это просто настройка заголовка вкладки. Введите, затем TTabControlEx и TPageControlEx, которые используют API-интерфейс для предоставления правильного 'look', даже если для OwnerDraw установлено значение True.


По крайней мере, он мог бы частично решить свои проблемы с его TTabControlEx и/или TPageControlEx компонентов.