-
Здравствуйте, Я уже задавал этот вопрос, но, к сожалению, дело до конца не довел. Мне нужно сделать лэйбл с пунктирным подчеркиванием. (Пример: http://www.ksoftware.ru/files/other/converter.html) В прошлый раз, я помню, было предложение сделать подчеркивание простым рисованием на канве, но мне это способ не нравится. Подчеркивание же связано со шрифтом и нарисовать линию нужной толщины и на нужной высоте, я думаю, будет сложно... Как сделать пунктирное подчёркивание у TLabel?
-
Так как у стандартного шрифта такого стиля нет, придётся в любом случае рисовать вручную
-
Я думал, что есть какие-то флаги, которые можно использовать вместо LineTo ...
-
Подчеркивание - свойство шрифта. Попробуй вывести формулу толщины строки от кегля шрифта.
-
Для обычного же подчеркивания ничего вычислять не надо... Имхо, тут есть прямой путь.
-
> Для обычного же подчеркивания ничего вычислять не надо.. > .
Так оно в файле шрифта прописано, справедливо только для ttf, для PS шрифтов - там отдельная песня. Там идёт отдельно файлы для наклонного, жирного, и подчеркнутого шрифта. Не веришь - проверь папку fonts.
-
Если в Label одна строка, то можно проводить линию по нижнему краю Label'a. Т.е. при условии WordWrap:=false;
Autosize:=true;
-
Что-то не вериться, что браузер, в котором эта возможность есть, вычисляет ширину пункирного подчёркивания по какой-то непонятной формуле... Может есть еще идеи?
-
Класс TCustomControl в зубы и вперёд. Ничего сложного.
-
> Класс TCustomControl в зубы и вперёд. Ничего сложного.
Хорошо, сделал наследника от TCustomControl, что делать дельше?
-
Дальше, рисуете на внутреннем битмапе текст с подчёркиванием, ищите на нём нижнюю полосу (сомо подчёркивание), и дробите его цветом фона. Дальше, полученное копируете на канву.
-
Угу, попробую.
-
Потратил целых 15 минут TLabel = class (StdCtrls.TLabel)
procedure Paint;override;
end;
TForm1 = class(TForm)
Label1: TLabel;
private
public
end;
var
Form1: TForm1;
implementation
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;
-
begin
inherited;
if not (fsUnderline in Font.Style) then Exit;
X := Width div 2;
.... :)
-
> RASkov Я не претендую на правильность, это просто идея, к тому же ещё нужно и Enabled учитовать
-
А это, Дима, и не для тебя было, в твоих знаниях дела у меня сомнений нет ;) Просто интересно стало что получится, запустил [12] а стиль шрифта не выставил подчеркнутым, ну и.....)
-
> RASkov Можно и цвет шрифта поменять :))
-
> [16] DimaBr © (07.11.08 10:14)
И это тоже решаемо примерно так: (Canvas.Pixels[X,Y] <>{=} Font.Color) но самый обидный недостаток всего этого - однострочность :( Может и не нужна она, многострочность-то... :о)
|