-
Вызываю TWinControl.PaintTo(...); Всё вроде работает, только проблемка - в окнах текстового ввода нет каретки. Совсем. Даже если окно активно, а обновляется по таймеру 1мс. Кто-то может подсказать как нарисовать вручную?
-
ShowCaret ?
-
Это же не рисует. Да и вообще ShowCaret/HideCaret на VCL не дало видимых эффектов. Сделал - SetCaretBlinkTime(100000) - во всех окнах текстового ввода во всей системе стало постоянно рисовать каретку, не мигающую, но TWinControl.PaintTo(...); видимо без разницы отображается каретка или нет, просто не рисует её.
-
-
-
Прохожий42 (01.07.15 02:08) [2]
> Всё вроде работает, только проблемка - в окнах текстового > ввода нет каретки. Совсем.
Невнимательно прочитал вопрос. То есть, ты рисуешь контролы в какой-то DC, и на этом рисунке нет каретки ? Это ожидаемое поведение.
Возможно, следует пояснить, чего именно хочется, может быть, проиллюстрировать кодом.
-
> [3]Каретка изначально есть, и изначально [ShowCaret делает каретку видимой] видимая и уже [когда она видимая, она начинает автоматически мерцать] мерцает как надо. При отрисовке на заданный DC она всегда отсутствует. > [4]Что также? > [5]Да, именно так. И я даже изначально согласен что ожидаемое. Но тогда мне надо как-то нарисовать руками каретку. Не соображу какой функцией её рисовать (LineTo кажется сомнительным вариантом, не?) и как определить координаты. А какой код-то, ну вот тривиальный пример, TEdit, TMemo и TTimer: procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1.Interval:=90;
Edit1.Left:=5;
Edit1.Top:=5;
Memo1.Left:=5;
Memo1.Top:=30;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Edit1.PaintTo(Canvas, 200, 45);
Memo1.PaintTo(Canvas, 200, 70);
end; Надо чтоб оригинал и "мнимое изображение" не отличались. И там каретка "мигает" и там мигает.
-
Прохожий42 (01.07.15 11:52) [6]
Каретка, как и курсор мыши не являются элементами, которые рисует конкретное окно, поэтому и их отсутствие на канве, куда рисуют себя контролы, очевидно. Если все-таки необходимо такое сделать, то, боюсь, что придется имитировать работу системных функций, связанных с кареткой. Каретка, кстати, это bitmap.
-
Серьёзно? Не знал, представлял себе что это нечто типа DrawFocusRect()... Попробовал LineTo(), нечто похожее выходит, но не могу понять откуда берётся смещение в 2 пикселя по X и 2 пикселя по Y, и как dY длину линии вычислять...
-
Прохожий42 (01.07.15 14:37) [8]
DrawFocusRect - это тоже рисование растром.
> как dY длину линии вычислять...
По высоте шрифта, я думаю
-
textheight кажись у tfont
-
Пока как-то так, но не явно совпадает с оригиналом: Trunc(-Font.Height*1.25)
-
разбирайтесь: function GetTextSize(Text: string; Font: TFont; ScalerY: Real = 1.0): TSize;
var
Bmp32: TBitmap32;
begin
Bmp32:= TBitmap32.Create;
Bmp32.Font.Name:= Font.Name;
Bmp32.Font.Style:= Font.Style;
Bmp32.Font.Height:= Round((-Font.Size * Font.PixelsPerInch / 72) * ScalerY);
result.cx:= Bmp32.TextWidth(Text);
result.cy:= Bmp32.TextHeight(Text);
Bmp32.Free;
end;
-
-
я не помню почему не использовал Вами рекомендованную функцию... что-то со шрифтами кажется было не то....
|