Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2009, 00:11   #1
Pirit
 
Регистрация: 09.04.2009
Сообщений: 9
По умолчанию Кнопка с вертикальной надписью

Здраствуйте!
Подскажите пожалуйста как создать компонент кнопку с вертикальной надписью!
Надо ли использовать Canvas и как получить Hadle у TButton!? Или надо наследовать у TBitBut?!
Надо ли делать это через редактор свойств и как это сделать?!)
Код процедур или примерный код проги очень бы помог, спасибо!
Pirit вне форума Ответить с цитированием
Старый 10.04.2009, 08:39   #2
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Вывод вертикальной надписи на кнопке (пример отображает надпись в левой части кнопки снизу-вверх, поворот против часовой стрелки на 90 гр.)
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
  S : string;
  LogFont: TLogFont;
begin
  with BitBtn1 do begin
    Glyph.Width := Width - 4;
    Glyph.Height := Height - 4;
    GetObject(Glyph.Canvas.Font.Handle, SizeOf(TLogFont), @LogFont);
    LogFont.lfFaceName := 'Arial';   //должен быть TrueType шрифт
//    LogFont.lfWeight := 800;       //полужирный
//    LogFont.lfWidth := 5;          //средняя ширина символов (не то же самое что Size шрифта), значение надо подбирать или оставить 0
    LogFont.lfEscapement := 90 * 10; //наклон устанавливается в десятых градуса
    Glyph.Canvas.Font.Handle := CreateFontIndirect(LogFont);

    S := Caption;
    Caption := '';
    Glyph.Canvas.TextOut(2, Glyph.Height-2, S);
  end;
end;
Использовать Canvas надо, только Canvas изображения кнопки (Gliph). Добраться до Canvas самой кнопки не представляется возможным. Отсюда решение: в простейшем случае можно использовать только TBitBtn (не TButton).
Высоту кнопки надо устанавливать такой, чтобы надпись поместилась.

Код выполнен и проверен на D7.

Последний раз редактировалось Скандербег; 10.04.2009 в 09:08. Причина: Уточнение среды
Скандербег вне форума Ответить с цитированием
Старый 11.04.2009, 00:41   #3
Pirit
 
Регистрация: 09.04.2009
Сообщений: 9
По умолчанию

Оуо! Спасибо!
А если создавать Компонент, то надо писать в конструкторе класса, от наследуемого TBitBut?! Или отдельную процедуру?!

Попробовал запустить просто так, без создания компонента, просто на форме, пишет системную виндусовую ошибку
Project Project1.exe raised exeption class EReadError with message "Error reading Form1.OnCreate: Invalid Property value" ?!
Что за инвалидное значение?!
Pirit вне форума Ответить с цитированием
Старый 11.04.2009, 09:54   #4
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

А событию OnCreate формы присвоена процедура FormCreate?
Может быть форма (Form1) у вас называется не так как в приведенной процедуре.

Компонент лучше создавать наследником от класс TBitBtn, т.к. он имеет все свойства кнопки, что, собственно, и требуется и имеет свойство Glyph, на котором можно нарисовать что-то свое.

Если интерес к такой кнопке не академический, а прикладной, есть смысл поискать уже готовый компонент, а такие есть. Хотя бы на torry.net, т.к. чтобы сделать такую кнопку нужно хорошо знать множество деталей Delphi. Все не так просто. А мой пример - это лишь демонстрация возможностей.
----------
Несколько переработанный код отображающий вертикальную надпись на кнопке, который можно вставить в событие OnClick кнопки на форме (не той с которой экспериментируем).
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  S : string;
  LogFont: TLogFont;
  BM : TBitMap;
begin
  BM := TBitMap.Create;
  try
    BitBtn1.Glyph.Width := BitBtn1.Width - 6;
    BitBtn1.Glyph.Height := BitBtn1.Height - 6;
    BM.Width := BitBtn1.Glyph.Width;
    BM.Height := BitBtn1.Glyph.Height;
    GetObject(BM.Canvas.Font.Handle, SizeOf(TLogFont), @LogFont);
    LogFont.lfFaceName := 'Arial';
    LogFont.lfEscapement := 90 * 10;
    BM.Canvas.Font.Handle := CreateFontIndirect(LogFont);
    S := BitBtn1.Caption;
    BM.Canvas.TextOut(6, BM.Height-6, S);
    BitBtn1.Caption := '';
    BitBtn1.Glyph.Canvas.CopyRect(Rect(0, 0, BM.Width, BM.Height), BM.Canvas,
                                  Rect(0, 0, BM.Width, BM.Height));
  finally
    BM.Free;
  end;
end;
Этот код точно работает в любом месте, не только в FormCreate.

Последний раз редактировалось Скандербег; 11.04.2009 в 12:09. Причина: Добавлена отредактированная процедура
Скандербег вне форума Ответить с цитированием
Старый 11.04.2009, 23:27   #5
Pirit
 
Регистрация: 09.04.2009
Сообщений: 9
По умолчанию

Класс! Заработало)))
А как сделать оцентровку надписи по ширине и длине кнопки?! И что бы выводилась в середине, такое возможно?!
Pirit вне форума Ответить с цитированием
Старый 11.04.2009, 23:48   #6
Pirit
 
Регистрация: 09.04.2009
Сообщений: 9
По умолчанию

и если не на 90 градусов а на 270?!
меняя LogFont.lfEscapement := 90 * 10;
на LogFont.lfEscapement := 270 * 10;
он мне белую кнопку рисует!
и после 2 нажатия на кнопку она белая становиться, можно что бы она надпись сохраняла?!
Pirit вне форума Ответить с цитированием
Старый 12.04.2009, 23:25   #7
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Центрирование надписи на кнопке. Выравнивание надписи действительно только для угла 270 гр., для надписи повернутой на другой угол необходимо делать и другой расчет.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  S : string;
  LogFont: TLogFont;
  BM : TBitMap;
  R : TRect;
  X, Y : Integer;
begin
  BM := TBitMap.Create;
  try
    BitBtn1.Glyph.Width := BitBtn1.Width-3;
    BitBtn1.Glyph.Height := BitBtn1.Height-3;
    BM.Width := BitBtn1.Glyph.Width;
    BM.Height := BitBtn1.Glyph.Height;
    GetObject(BM.Canvas.Font.Handle, SizeOf(TLogFont), @LogFont);
    LogFont.lfFaceName := 'Arial';
    LogFont.lfEscapement := 270 * 10;
    BM.Canvas.Font.Handle := CreateFontIndirect(LogFont);

    S := BitBtn1.Caption;
    R := Rect(0, 0, BM.Width, BM.Height);
    DrawText(BM.Canvas.Handle, PChar(S), -1, R, DT_CALCRECT);

    X := BM.Width div 2 + R.Bottom div 2;
    Y := BM.Height div 2 - R.Right div 2;
    BM.Canvas.TextOut(X, Y, S);
    BitBtn1.Caption := '';
    BitBtn1.Glyph.Canvas.CopyRect(Rect(0, 0, BM.Width, BM.Height), BM.Canvas,
                                  Rect(0, 0, BM.Width, BM.Height));
  finally
    BM.Free;
  end;
end;
Надпись при повороте на 270 гр. в предыдущем примере не исчезает, а выводится вне прямоугольника кнопки, поэтому ее не видно. Надо корректировать вывод надписи координатами в процедуре TextOut.
"Белый прямоугольник": для эксперимента можно кинуть на форму XPManifest (закладка Win32 в палитре компонентов). У меня кнопка белой не становиться сколько бы не нажимать на нее.

Класс TBitBtn только дельфийская обертка стандартной кнопки Windows. Например, у нее нет даже свойства Color. Цвет фона кнопки и надписи устанавливает Windows и управлять этим сложно. Может проще сделать свою кнопку, где все под контролем. Или поискать в Сети, где туча библиотек с какими угодно кнопками.
Скандербег вне форума Ответить с цитированием
Старый 12.04.2009, 23:47   #8
Pirit
 
Регистрация: 09.04.2009
Сообщений: 9
По умолчанию

С TextOut-ом понял!
XPManifest на форму бросил, св-в у него маловато,то есть вообще нет, ничего не менял в нем, но все также и остается, при 2-ом нажатии кнопка становится белой полностью(
Pirit вне форума Ответить с цитированием
Старый 13.04.2009, 00:22   #9
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Проект надо посмотреть. Упакуйте файлы проекта: .dpr, .res, .dfm и .pas и отправьте мне на мыло или сюда вложением. Какая версия Delphi?
Скандербег вне форума Ответить с цитированием
Старый 13.04.2009, 00:42   #10
Pirit
 
Регистрация: 09.04.2009
Сообщений: 9
По умолчанию

Delphi 7
высылаю код
Вложения
Тип файла: rar VertButton.rar (7.2 Кб, 36 просмотров)
Pirit вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отобразить левую половину матрицы на правую зеркально симметрично относительно вертикальной оси durachok) Паскаль, Turbo Pascal, PascalABC.NET 0 26.12.2008 16:03
Отобразить левую половину матрицы на правую зеркально симметрично относительно вертикальной оси. Заполнит durachok) Паскаль, Turbo Pascal, PascalABC.NET 0 26.12.2008 16:03
Шифр вертикальной перестановки funny Общие вопросы C/C++ 0 27.09.2008 18:59
Кнопка пуск Черничный Общие вопросы Delphi 2 07.08.2008 08:30
Ограничение вертикальной прокрутки valerij Microsoft Office Excel 11 18.06.2008 18:00