| 
| 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();
 }
 //---------------------------------------------------------------------------
 
 Это всё
   |  
|  |  |