Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];

Вниз

Создание кнопки с вертикальным текстом   Найти похожие ветки 

 
Destroyer ©   (2005-07-19 18:04) [0]

Хочу переделать стандартный Button так, чтобы Caption был написан вертикально ( как бы повернут на 90 градусов налево). Для начала хочу создать своё свойство, такое чтобы просто выводился Caption как и в стандартном Button-е. Делаю так:

unit VertCaptBut;
interface
uses
 SysUtils, Classes, Controls, StdCtrls, Windows, Graphics, CommCtrl   ;
type
 TButtonState = (bsUp, bsDisabled, bsDown, bsExclusive);
 TVertCaptBut = class(TButton)
 private
   VertText : string;
   procedure DrawButtonText(Canvas: TCanvas; const VertText: string;
     TextBounds: TRect; State: TButtonState; BiDiFlags: Longint);
   { Private declarations }
 protected
   { Protected declarations }
 public
   { Public declarations }
 published
 constructor Create(aowner:Tcomponent); override;
 property VertCaption: string read VertText write VertText;
   { Published declarations }
 end;

procedure Register;
implementation

procedure Register;
begin
 RegisterComponents("MyComponents", [TVertCaptBut]);
end;

constructor TVertCaptBut.Create(aowner:Tcomponent);
begin
inherited create(Aowner);
end;

procedure TVertCaptBut.DrawButtonText(Canvas: TCanvas; const VertText: string;
 TextBounds: TRect; State: TButtonState; BiDiFlags: LongInt);
begin
 with Canvas do
 begin
   Brush.Style := bsClear;
   if State = bsDisabled then
   begin
     OffsetRect(TextBounds, 1, 1);
     Font.Color := clBtnHighlight;
     DrawText(Handle, PChar(VertText), Length(VertText), TextBounds,
       DT_CENTER or DT_VCENTER or BiDiFlags);
     OffsetRect(TextBounds, -1, -1);
     Font.Color := clBtnShadow;
     DrawText(Handle, PChar(VertText), Length(VertText), TextBounds,
       DT_CENTER or DT_VCENTER or BiDiFlags);
   end else
DrawText(Handle, PChar(VertText), Length(VertText), TextBounds,
       DT_CENTER or DT_VCENTER or BiDiFlags);
 end;
end;
end.


Но ничего не получается. Процедуру DrawButtonText брал из Buttons.pas. Видимо еще что-то надо добавить. Помогите плз.


 
Джо ©   (2005-07-20 04:35) [1]


> Но ничего не получается

А с какого такого бодуна метод DrawButtonText (скопированный из другого компонента, но это даже не важно) должен вызываться?


 
Destroyer ©   (2005-07-20 12:23) [2]

Точно, он нигде не вызывается. В Buttons.pas он вызывается только в function TButtonGlyph.Draw. Никак не могу понять где же тот вызов этой функции, который отвечает за рисование caption на кнопке. Draw вызывается много где, и походу все события где он вызывается происходят в run time (типа назначения картинки на speedbutton и т.д.). Но где надо вызвать этот метод, чтобы VertText рисовался в Design Time и в Run time?


 
Destroyer ©   (2005-07-20 21:09) [3]

Разобрался с вызовом.
Теперь проблема с вертикальным текстом. Всё хорошо рисуется, но текст на кнопке располгается не в центре. Делаю так:

procedure TVertTextBut.Paint;
...
TextWidth := Canvas.TextWidth(Cap);
TextHeight := Canvas.TextHeight(Cap);
...
Canvas.TextOut(Width div 2 - TextHeight div 2,Height div 2+TextWidth div 2,Cap);
...
end;

procedure TVertTextBut.Click;
begin
 inherited Click;
 Paint;
 ...
end;

procedure TVertTextBut.MouseDown(Button: TMouseButton; Shift: TShiftState;
 X, Y: Integer);
var TextWidth, TextHeight : Longint;
begin
inherited MouseDown(Button, Shift, X, Y);
TextWidth := Canvas.TextWidth(Cap);
TextHeight := Canvas.TextHeight(Cap);
...
Canvas.TextOut(Width div 2 -TextHeight  div 2+2,Height div 2+TextWidth div 2+2,Cap);
end;

procedure TVertTextBut.MouseUp(Button: TMouseButton; Shift: TShiftState;
 X, Y: Integer);
begin
 inherited MouseUp(Button, Shift, X, Y);
 if (Button = mbLeft) and Enab then
  begin
     if Assigned (MUp) then
      MUp(Self, Button, Shift, X, Y);    
     if (X>0) and (Y>0) and (X<=Width) and (Y<=Height) then
      Paint;
  end;
end;

procedure TVertTextBut.MouseLeave(var Message: TMessage);
begin
 Paint;
end;

В когда кладу кнопку на форму текст чуть ниже чем должен быть. В Run Time после клика по кнопке текст встаёт в середину, но после того, как мышь уходит с кнопки (MouseLeave) текст опять сдвигается вниз и чуть влево. Как его удержать в середине?


 
Destroyer ©   (2005-07-21 00:16) [4]

Ещё параллельный вопрос:
Как уменьшить прямоугольник вокруг текста, который появляется при использовании TextOut(x,t,text). Его надо свести к минимуму, а то он выходит за текст пиксела на три, это мешает при создании маленьких кнопок.


 
Destroyer ©   (2005-07-22 12:40) [5]

Со всем разобрался. Но остаётся две проблемы:
1)Пытаюсь создать такие кнопки динамически, но при присвоении свойств (в данном случае caption) получаю ошибку:
Control "" has no parent window.
Если сначала задать parent, а потом caption, то всё нормально. Но когда создаю динамически обычные кнопки и задаю сначала все свойства, а потом parent, то всё нормально. Как это исправить?
2)Если объявление массива с типа VertTextBut есть в одном юните, а обращаться к этому массиву из другого, то этот массив не видится (из другого юнита), хотя также объявлено много других массивов и они видятся (из другог юнита). Что надо дописать, чтобы он массив типа VertTextBut виделся из другого юнита?


 
Чапаев ©   (2005-07-22 14:17) [6]

> Если сначала задать parent, а потом caption, то всё нормально.
Ещё бы. У тебя наверняка смена Caption"а вызывает перерисовку. А если Parent"а нету, то и рисоваться негде...


 
Destroyer ©   (2005-07-25 01:28) [7]

Точно, спасибо.



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

Форум: "Компоненты";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.047 c
2-1136664055
Zikmu
2006-01-07 23:00
2006.01.22
Папки с иконками пользователя в поиске файлов


1-1134992828
Scorpio
2005-12-19 14:47
2006.01.22
Закрыитие документа WORD без сохранения


3-1132831336
Prohodil Mimo
2005-11-24 14:22
2006.01.22
Как подключиться к базу на FB1.5 установленной на Linuxe?


2-1135805005
з. танька
2005-12-29 00:23
2006.01.22
выдрать строку адреса из окна IE


2-1136475809
mozgan
2006-01-05 18:43
2006.01.22
Работа с таймером





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский