Конференция "Компоненты" » Пунктирное подчеркивание у TLabel
 
  • Kolan © (28.10.08 12:24) [0]
    Здравствуйте,
     Я уже задавал этот вопрос, но, к сожалению, дело до конца не довел.

    Мне нужно сделать лэйбл с пунктирным подчеркиванием. (Пример: http://www.ksoftware.ru/files/other/converter.html)
    В прошлый раз, я помню, было предложение сделать подчеркивание простым рисованием на канве, но мне это способ не нравится. Подчеркивание же связано со шрифтом и нарисовать линию нужной толщины и на нужной высоте, я думаю, будет сложно...

    Как сделать пунктирное подчёркивание у TLabel?
  • DimaBr © (28.10.08 14:04) [1]
    Так как у стандартного шрифта такого стиля нет, придётся в любом случае рисовать вручную
  • Kolan © (28.10.08 15:31) [2]
    Я думал, что есть какие-то флаги, которые можно использовать вместо
    LineTo

    ...
  • tesseract © (28.10.08 16:39) [3]
    Подчеркивание - свойство шрифта. Попробуй вывести формулу толщины строки от кегля шрифта.
  • Kolan © (29.10.08 13:59) [4]
    Для обычного же подчеркивания ничего вычислять не надо... Имхо, тут есть прямой путь.
  • tesseract © (29.10.08 19:59) [5]

    > Для обычного же подчеркивания ничего вычислять не надо..
    > .


    Так оно в файле шрифта прописано, справедливо только для ttf, для PS шрифтов - там отдельная песня. Там идёт отдельно файлы для наклонного, жирного, и подчеркнутого шрифта. Не веришь - проверь папку fonts.
  • Наиль © (30.10.08 08:19) [6]
    Если в Label одна строка, то можно проводить линию по нижнему краю Label'a.
    Т.е. при условии
    WordWrap:=false;
    Autosize:=true;

  • Kolan © (30.10.08 17:31) [7]
    Что-то не вериться, что браузер, в котором эта возможность есть, вычисляет ширину пункирного подчёркивания по какой-то непонятной формуле... Может есть еще идеи?
  • CodeMaster © (02.11.08 22:15) [8]
    Класс TCustomControl в зубы и вперёд. Ничего сложного.
  • Kolan © (06.11.08 10:29) [9]
    > Класс TCustomControl в зубы и вперёд. Ничего сложного.

    Хорошо, сделал наследника от TCustomControl, что делать дельше?
  • DimaBr © (06.11.08 10:33) [10]
    Дальше, рисуете на внутреннем битмапе текст с подчёркиванием, ищите на нём нижнюю полосу (сомо подчёркивание), и дробите его цветом фона. Дальше, полученное копируете на канву.
  • Kolan © (06.11.08 12:47) [11]
    Угу, попробую.
  • DimaBr © (06.11.08 12:47) [12]
    Потратил целых 15 минут
    TLabel = class (StdCtrls.TLabel)
     procedure Paint;override;
    end;
     TForm1 = class(TForm)
       Label1: TLabel;
     private
       { Private declarations }
     public
       { Public declarations }
     end;

    var
     Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TLabel.Paint;
    var i,X,Y, W: integer;
    const n = 8;
    begin
     inherited;
     X := Width div 2;
     Y := Height;
     W := Width div N;
     while (Canvas.Pixels[X,Y] <> clBlack) and (Y>0) do dec(Y);
     while (Canvas.Pixels[X,Y] = clBlack) and (Y>0) do dec(Y);
     if Y > 0 then begin
       Canvas.Brush.Color := clBtnFace;
       Canvas.Pen.Color := Canvas.Brush.Color;
       for i := 1 to N do
         Canvas.Rectangle((i-1)*W+W div 2,Y,i*W,Height);
     end;
    end;

  • {RASkov} © (06.11.08 12:54) [13]
    begin
    inherited;
    if not (fsUnderline in Font.Style) then Exit;
    X := Width div 2;
    ....


    :)
  • DimaBr © (06.11.08 13:19) [14]
    > RASkov
    Я не претендую на правильность, это просто идея, к тому же ещё нужно и Enabled учитовать
  • {RASkov} © (07.11.08 02:10) [15]
    А это, Дима, и не для тебя было, в твоих знаниях дела у меня сомнений нет ;)
    Просто интересно стало что получится, запустил [12] а стиль шрифта не выставил подчеркнутым, ну и.....)
  • DimaBr © (07.11.08 10:14) [16]
    > RASkov
    Можно и цвет шрифта поменять :))
  • {RASkov} © (07.11.08 13:26) [17]
    > [16] DimaBr ©   (07.11.08 10:14)

    И это тоже решаемо примерно так:
    (Canvas.Pixels[X,Y] <>{=} Font.Color)
    но самый обидный недостаток всего этого - однострочность :(
    Может и не нужна она, многострочность-то...
    :о)
 
Конференция "Компоненты" » Пунктирное подчеркивание у TLabel
Есть новые Нет новых   [134464   +62][b:0][p:0.001]