Конференция "WinAPI" » Как рисовать каретку в TCustomEdit при PaintTo() [D7, WinXP]
 
  • Прохожий42 (29.06.15 22:45) [0]
    Вызываю TWinControl.PaintTo(...);
    Всё вроде работает, только проблемка - в окнах текстового ввода нет каретки. Совсем.
    Даже если окно активно, а обновляется по таймеру 1мс.
    Кто-то может подсказать как нарисовать вручную?
  • Игорь Шевченко © (30.06.15 19:04) [1]
    ShowCaret ?
  • Прохожий42 (01.07.15 02:08) [2]
    Это же не рисует. Да и вообще ShowCaret/HideCaret на VCL не дало видимых эффектов.
    Сделал - SetCaretBlinkTime(100000) - во всех окнах текстового ввода во всей системе стало постоянно рисовать каретку, не мигающую, но TWinControl.PaintTo(...); видимо без разницы отображается каретка или нет, просто не рисует её.
  • brother © (01.07.15 06:33) [3]
  • brother © (01.07.15 06:33) [4]
    Смотри также

  • Игорь Шевченко © (01.07.15 10:34) [5]
    Прохожий42   (01.07.15 02:08) [2]


    > Всё вроде работает, только проблемка - в окнах текстового
    > ввода нет каретки. Совсем.


    Невнимательно прочитал вопрос. То есть, ты рисуешь контролы в какой-то DC, и на этом рисунке нет каретки ? Это ожидаемое поведение.

    Возможно, следует пояснить, чего именно хочется, может быть, проиллюстрировать кодом.
  • Прохожий42 (01.07.15 11:52) [6]
    > [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;



    Надо чтоб оригинал и "мнимое изображение" не отличались. И там каретка "мигает" и там мигает.
  • Игорь Шевченко © (01.07.15 13:40) [7]
    Прохожий42   (01.07.15 11:52) [6]

    Каретка, как и курсор мыши не являются элементами, которые рисует конкретное окно, поэтому и их отсутствие на канве, куда рисуют себя контролы, очевидно. Если все-таки необходимо такое сделать, то, боюсь, что придется имитировать работу системных функций, связанных с кареткой. Каретка, кстати, это bitmap.
  • Прохожий42 (01.07.15 14:37) [8]
    Серьёзно? Не знал, представлял себе что это нечто типа DrawFocusRect()...
    Попробовал LineTo(), нечто похожее выходит, но не могу понять откуда берётся смещение в 2 пикселя по X и 2 пикселя по Y, и как dY длину линии вычислять...
  • Игорь Шевченко © (01.07.15 14:43) [9]
    Прохожий42   (01.07.15 14:37) [8]

    DrawFocusRect - это тоже рисование растром.


    > как dY длину линии вычислять...


    По высоте шрифта, я думаю
  • brother © (02.07.15 13:20) [10]
    textheight кажись у tfont
  • Прохожий42 (02.07.15 16:59) [11]
    Пока как-то так, но не явно совпадает с оригиналом: Trunc(-Font.Height*1.25)
  • brother © (03.07.15 05:49) [12]
    разбирайтесь:
    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;

  • Игорь Шевченко © (03.07.15 10:21) [13]
    brother ©   (03.07.15 05:49) [12]

    https://msdn.microsoft.com/ru-ru/library/windows/desktop/dd144941(v=vs.85).aspx

    Рекомендую изучить
  • brother © (23.07.15 12:36) [14]
    я не помню почему не использовал Вами рекомендованную функцию... что-то со шрифтами кажется было не то....
 
Конференция "WinAPI" » Как рисовать каретку в TCustomEdit при PaintTo() [D7, WinXP]
Есть новые Нет новых   [118595   +8][b:0][p:0.001]