Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.09;
Скачать: CL | DM;

Вниз

Не понимаю, почему Tabs у PageControl неправильно отрисовываются!   Найти похожие ветки 

 
Aleksandr.   (2004-12-20 16:56) [0]

Ставлю на форму PageControl, создаю у него несколько страниц,
ставлю ему свойство OwnerDraw:=true, назначаю ему на OnDrawTab обработчик:

procedure TPropForm.PageControlDrawTab(Control: TCustomTabControl;
 TabIndex: Integer; const Rect: TRect; Active: Boolean);
var
 x, y : integer;
 Col  : TColor;
begin
 PageControl.Canvas.FillRect(Rect);
 if NOT PageControl.Pages[TabIndex].Enabled then
   PageControl.Canvas.Font.Color:=clSilver
 else if Active then begin
   PageControl.Canvas.Brush.Color:=clWhite;
   PageControl.Canvas.Font.Color:=clBlue
 end;
 x:=Rect.Left+((Rect.Right-Rect.Left-PageControl.Canvas.TextWidth(PageControl.Pages[TabIndex].Caption)) div 2);
 y:=Rect.Top+((Rect.Bottom-Rect.Top-PageControl.Canvas.TextHeight("A")) div 2);
 Col:=PageControl.Canvas.Pen.Color;
 PageControl.Canvas.Pen.Color:=Canvas.Brush.Color;
 PageControl.Canvas.RoundRect(Rect.Left+1,Rect.Top+1,Rect.Right-1,Rect.Bottom-1,3,3);
 PageControl.Canvas.Pen.Color:=Col;
 PageControl.Canvas.TextOut(x,y,PageControl.Pages[TabIndex].Caption)

Все более/менее в норме, не считая того, что ширины у табов не соответствуют ширине их Caption. Ладно, в FormCreate добавляю калькуляцию TabWidth:

 for i:=0 to PageControl.PageCount-1 do
   if (PageControl.TabWidth<PageControl.Canvas.TextWidth(PageControl.Pages[i].Caption)+6) then
     PageControl.TabWidth:=PageControl.Canvas.TextWidth(PageControl.Pages[i].Caption)+6;

Теперь ширины хоть и одинаковые, но зато все влезает.
А теперь в форме, создающей эту форму, я делаю так:

 Application.CreateForm(TPropForm, PropForm);
 with PropForm do try
   PageControl.Pages[0].TabVisible:=false;
   PageControl.Pages[0].Enabled:=false;
   PageControl.ActivePageIndex:=1;
   if ShowModal=mrOK then begin

И выглядит все полной ерундой - Закладки видны все, в том числе и закладка страницы 0, но отсутствует последняя, ни одна закладка не выделена, при клике на закладку с нулевым индексом (она рисуется серым текстом, как и указывалось) показывается содержимое первой страницы и т.д.
Что это за муть зеленая? Проверил PageIndex"ы у всех страниц - все в порядке, запрещаемая имеет PageIndex=0.


 
Babay ©   (2004-12-21 06:28) [1]

Дело в том что в PageControlDrawTab передается параметр TabIndex а это не совсем то что PageIndex в итоге у Вас происходит просто неверная отрисовка.
ИМХО надо сделать так:
procedure TForm1.PageControlDrawTab(Control: TCustomTabControl;
 TabIndex: Integer; const Rect: TRect; Active: Boolean);
var
x, y : integer;
Col  : TColor;
PageIndx:Integer;
begin
PageIndx:=0;
// находим номер страницы соответствующую данному TabIndex
while PageControl.Pages[PageIndx].TabIndex<>TabIndex do inc(PageIndx);

PageControl.Canvas.FillRect(Rect);
if NOT PageControl.Pages[PageIndx].Enabled then
  PageControl.Canvas.Font.Color:=clSilver
else if Active then begin
  PageControl.Canvas.Brush.Color:=clWhite;
  PageControl.Canvas.Font.Color:=clBlue
end;
x:=Rect.Left+((Rect.Right-Rect.Left-PageControl.Canvas.TextWidth(PageControl.Pages[PageIndx].Caption)) div 2);
y:=Rect.Top+((Rect.Bottom-Rect.Top-PageControl.Canvas.TextHeight("A")) div 2);
Col:=PageControl.Canvas.Pen.Color;
PageControl.Canvas.Pen.Color:=Canvas.Brush.Color;
PageControl.Canvas.RoundRect(Rect.Left+1,Rect.Top+1,Rect.Right-1,Rect.Bottom-1,3,3);
PageControl.Canvas.Pen.Color:=Col;

PageControl.Canvas.TextOut(x,y,PageControl.Pages[PageIndx].Caption)

end;



Страницы: 1 вся ветка

Текущий архив: 2005.01.09;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.044 c
1-1103710929
Andriano
2004-12-22 13:22
2005.01.09
Delphi 2005 Architect


1-1103651670
Redlord
2004-12-21 20:54
2005.01.09
как перевести ( s:= 01FA0 ) в интегер


14-1103287708
ocean
2004-12-17 15:48
2005.01.09
Свобода вообще - хорошо ли это?


1-1103438626
Алексей Петухов
2004-12-19 09:43
2005.01.09
LoadFromClipboardFormat


14-1103715054
Vaitek
2004-12-22 14:30
2005.01.09
Анимация трехмерной модели.