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 способа решения этой проблемы, но тут на форуме что то не работает и мой ответ так никуда и не попал
(Это шпилька местному админу)
Если проблема ещё актульна оставте здесь свое сообщениея повторю ответ, но не ранее. А сейчас уже надоело ...
|
|
Admin |
Отправлено: 16.01.2004, 19:55 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
Странно, как же мы читаем Ваш ответ ?
(если хотели приложить что-то типа .rar — оно пока что-то
не работает, приложите это в .zip — это работает)
|
|
Doga |
Отправлено: 17.01.2004, 21:56 |
|
Мастер участка
Группа: Участник
Сообщений: 575
|
Уважаемый Владимир!
Дело в том, что мой предидущий ответ был отправлен через час после не удачной попытки ответа по теме. Неудачных попыток было 3 штуки подряд. И это, кстати был не первый случай, кода мне не удалось отправить сообщение на этот форум (был еще 1(месяца 2 назад) и кто то не получил моего (может быть ненужного) ответа).
Раз уж я здесь, воспроизведу то что не удалось ранее.
В своё время я тоже сталкивался с такой проблемой, когда строка отрисованная жирным шрифтом в событии OnDrawTab вылезала за границы закладки. Вообще то надо было бы написать свой класс PageControl, где всё работало бы так как надо. Но у меня не было на это времени и я придумал 2 способа как этот TPageControl обмануть. Естественно через то самое место, на котором все имеют обыкновение сидеть
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();
}
//---------------------------------------------------------------------------
Это всё
|
|
|