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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.02.2010, 12:46   #1
Diogo76
Пользователь
 
Регистрация: 11.02.2010
Сообщений: 13
По умолчанию Canvas.TextWidth и размер системного шрифта

Возникла потребность корректного отображения приложения под разные разрешения экрана и размер системного шрифта. С поведением компонентов и формы по большому счету разобрался, но вот столкнулся с такой проблемой (приложение мультиязычное, использую для работы TnT-компоненты. Но данный пример переделал под стандартные функции работы с канвой и "баг" все равно присутствует. Использую Д7):
1. В статус-баре несколько панелей и я его отрисовываю сам. Размер каждой панели высчитывается динамически при старте приложения (я знаю какой текст в каждой панели будет самым длинным и растягиваю размер панели под этот размер).
2. Все хорошо работает, если размер системного шрифта установлен Обычный. Стоит его установить в Крупный или Огромный, тогда функция TextWidth возвращает длину строки как и при размере Обычный. Но функция TextOut отрисовывает строку намного большего размера.

Вот маленький пример, который иллюстрирует данную проблему:
Код:
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    StatusBar1: TStatusBar;
    procedure FormShow(Sender: TObject);
    procedure StatusBar1DrawPanel(StatusBar: TStatusBar;
      Panel: TStatusPanel; const Rect: TRect);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

const
  S = 'Самая длинная строка в этой панели';
implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
  StatusBar1.Canvas.Font.Style := [fsBold];
  StatusBar1.Panels[1].Width := StatusBar1.Canvas.TextWidth(S);
end;

procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar;
  Panel: TStatusPanel; const Rect: TRect);
begin
  If Panel.Index=1 then
  begin
    StatusBar1.Canvas.Font.Style := [fsBold];
    StatusBar1.Canvas.Font.Color := clRed;
    StatusBar.Canvas.TextOut (Rect.Left, Rect.Top, S);
  end;
end;

end.
В данной примере при размере сист.шрифта Обычный все работает красиво. При увеличении размеров, строка в панели уезжает за пределы размеров самой панели.
Diogo76 вне форума Ответить с цитированием
Старый 23.02.2010, 19:26   #2
Fuadik
Пользователь
 
Регистрация: 22.01.2010
Сообщений: 37
По умолчанию

Поместите на форму Label, задайте Label.Visible:=false, Label.AutoSize:=true, Label.Font.Size:= нужный размер,
StatusBar1.Font.Size:=тот же размер, StatusBar1.Panels[1].Width := Label.Width. Это - одно из возможных решений, если я правильно вас понял.
Fuadik вне форума Ответить с цитированием
Старый 23.02.2010, 19:36   #3
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

Так ты просто забыл применить уже используемую тобой TextWidth(S) в событии StatusBar1DrawPanel. Забыл "повлиять" ею на ширину панели.
Добавь ...
Все должно получиться ...

Чуть позже попробую ... Отпишусь ...
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
размер шрифта varelik Общие вопросы Delphi 10 16.09.2009 13:58
Размер шрифта в WordArt Diego__ Microsoft Office Word 3 01.09.2009 11:59
Как изменять размеры шрифта при изменении размеров canvas? SkAndrew Мультимедиа в Delphi 2 07.12.2008 23:02
Размер шрифта Gorychev HTML и CSS 6 25.05.2008 11:42
Тип и размер шрифта rusif Помощь студентам 1 19.12.2007 17:48