C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
TPageControl, заголовки
Alexandr
Отправлено: 14.01.2004, 12:54


Не зарегистрирован







Хелп!!!
Надо написать свой обработчик выделения закладки в PageControl'e после ее нажатия. В качестве выделения я использую изменение стиля шрифта с обычного на жирный, но после этого строка вылезает за закладку, как с этим бороться?
Guest
Отправлено: 14.01.2004, 13:07


Не зарегистрирован







Можна поподробнее описать проблему?
Что за строка и какой обработчик (код)?
Admin
Отправлено: 14.01.2004, 16:07


Владимир

Группа: Администратор
Сообщений: 1190



А сейчас код приблизительно такой ?

CODE

PageControl1->OwnerDraw = true;

void __fastcall TForm1::PageControl1DrawTab(TCustomTabControl *Control,
     int TabIndex, const TRect &Rect, bool Active)
{
   PageControl1->Canvas->TextOut(Rect.Left+3,Rect.Top+3,PageControl1->Pages[TabIndex]->Caption);
   if(Active){
     PageControl1->Canvas->Font->Style = PageControl1->Canvas->Font->Style<<fsBold;
     PageControl1->Canvas->TextOut(Rect.Left+3,Rect.Top+3,PageControl1->Pages[TabIndex]->Caption);
     }
}
//---------------------------------------------------------------------------
Alexandr
Отправлено: 14.01.2004, 16:52


Не зарегистрирован







текст примерно такой:(PageControl1->OwnerDraw = true;)

void __fastcall TForm1::PageControl1DrawTab(TCustomTabControl *Control,
int TabIndex, const TRect &Rect, bool Active)
{
if (Active){
AnsiString s = PageControl1->Pages[TabIndex]->Caption;
Control->Canvas->Brush->Color = ....;
Control->Canvas->FillRect(Rect);
Control->Canvas->Font->Style = TFontStyles() << fsBold;
Control->Canvas->TextRect(Rect,Rect.left,Rect.top,s);
}
}
если так делать, то заголовок, не поместится полностью в закладке. Можно ли как-нибудь изменять размер закладки динамически?
Doga
  Отправлено: 16.01.2004, 17:32


Мастер участка

Группа: Участник
Сообщений: 575



Ток что пытался предложить 2 способа решения этой проблемы, но тут на форуме что то не работает и мой ответ так никуда и не попал sad.gif
(Это шпилька местному админу)


Если проблема ещё актульна оставте здесь свое сообщениея повторю ответ, но не ранее. А сейчас уже надоело ...
Admin
Отправлено: 16.01.2004, 19:55


Владимир

Группа: Администратор
Сообщений: 1190



Странно, как же мы читаем Ваш ответ ?
(если хотели приложить что-то типа .rar — оно пока что-то
не работает, приложите это в .zip — это работает)
Doga
Отправлено: 17.01.2004, 21:56


Мастер участка

Группа: Участник
Сообщений: 575



Уважаемый Владимир!

Дело в том, что мой предидущий ответ был отправлен через час после не удачной попытки ответа по теме. Неудачных попыток было 3 штуки подряд. И это, кстати был не первый случай, кода мне не удалось отправить сообщение на этот форум (был еще 1(месяца 2 назад) и кто то не получил моего (может быть ненужного) ответа).

Раз уж я здесь, воспроизведу то что не удалось ранее.


В своё время я тоже сталкивался с такой проблемой, когда строка отрисованная жирным шрифтом в событии OnDrawTab вылезала за границы закладки. Вообще то надо было бы написать свой класс PageControl, где всё работало бы так как надо. Но у меня не было на это времени и я придумал 2 способа как этот TPageControl обмануть. Естественно через то самое место, на котором все имеют обыкновение сидеть smile.gif

1 Способ.

Очень простой. Установите в дизайнере либо в конструкторе формы:

PageControl1->Canvas->Font->Style = fsBold;

При этом ширина всех закладок будет расчитываться для жирного шрифта, и естественно с отрисовкой заголовка активной страницы жирным шрифтом проблем уже не будет — надпись влезет в закладку безусловно. А для остальных закладок выбирается обычный шрифт.

Код событя OnDrawTab уже был приведён ранее, повторять не буду.

Правда у этого способа есть один недостаток. Если выбран шрифт имеющий при жирном стиле бо'льшую ширину чем при обычном, неактивные закладки будут несколко шире чем хотелось бы.

2 способ. Отличается от предидущего лишь бо'льшими габаритами вышеупомянутого места и отсутствием недостатка первого способа.


[CODE]

//Обьявления
class TForm1 : public TForm
{
...

private:
bool NeedDraw;
int TempTabIndex;
AnsiString TempCaption;

...
};

//Конструктор
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
TempTabIndex = -1;
NeedDraw = false;
}

//Событие OnDrawTab
//---------------------------------------------------------------------------
void __fastcall TForm1::PageControl1DrawTab(TCustomTabControl *Control,
int TabIndex, const TRect &Rect, bool Active)
{
PageControl1->Canvas->Font->Color = PageControl1->Font->Color;

if(Active)
{
if (!NeedDraw)
{
int CaptionWidth,
TempTextWidth;

AnsiString TempText;

if (TempTabIndex != TabIndex)
{
TempCaption = PageControl1->Pages[TabIndex]->Caption;
TempTabIndex = TabIndex;
}
TempText = TempCaption;

PageControl1->Canvas->Font->Style = PageControl1->Canvas->Font->Style< CaptionWidth = PageControl1->Canvas->TextWidth(TempCaption);

PageControl1->Canvas->Font->Style = PageControl1->Canvas->Font->Style>>fsBold;

for (int i = 0; ; i++ )
{
if (i)
{
TempText = TempText + "X"; //Не обязательно добавлять именно "X"- другой символ может иметь дугую ширину
}

TempTextWidth = PageControl1->Canvas->TextWidth(TempText);

if (CaptionWidth <= TempTextWidth)
{
PageControl1->Pages[TabIndex]->Caption = TempText;

if (i)
{
PageControl1->TabWidth = 0;
NeedDraw = true;
}
else
{
PageControl1->Canvas->Font->Style = PageControl1->Canvas->Font->Style< PageControl1->Canvas->TextOut(Rect.Left + 5, Rect.Top + 3, PageControl1->Pages[TabIndex]->Caption);

PageControl1->Canvas->Pen->Color = clBtnFace;
PageControl1->Canvas->MoveTo(Rect.Left, Rect.Bottom +2);
PageControl1->Canvas->LineTo(Rect.Right, Rect.Bottom +2);
}

break;
}
}
}
else
{
PageControl1->Canvas->Font->Style = PageControl1->Canvas->Font->Style< PageControl1->Canvas->TextOut(Rect.Left + 5, Rect.Top + 3, TempCaption);

NeedDraw = false;
}
}
else
{
PageControl1->Canvas->TextOut(Rect.Left + 3, Rect.Top + 3, PageControl1->Pages[TabIndex]->Caption);
}
}
//Событие OnChanging
//---------------------------------------------------------------------------
void __fastcall TForm1::PageControl1Changing(TObject *Sender,
bool &AllowChange)
{
PageControl1->ActivePage->Caption = TempCaption;
}
//Событие OnExit
//---------------------------------------------------------------------------
void __fastcall TForm1::PageControl1Exit(TObject *Sender)
{
PageControl1->Repaint();
}
//Событие OnEnter
//---------------------------------------------------------------------------
void __fastcall TForm1::PageControl1Enter(TObject *Sender)
{
PageControl1->Repaint();
}
//---------------------------------------------------------------------------

Это всё biggrin.gif

Вернуться в Вопросы программирования в C++Builder