G
Guest
Всем доброго дня!
Пишу свой компонент с использованием GDI+. Компонент предназначен для ввода однострочного текста (типа TEdit), но выводится на экран средствами GDI+. Возникла проблема - при перемещение каретки ввода вправо - влево, каретка появляется не между символами. Для определения ширины символа (и соответственно расстояния на которое должна сдвинуться каретка) использую API функцию GetCharABCWidthsFloat. Функция срабатывает нормально, возвращая три необходимых величины. При этом если увеличить/уменьшить шрифт, изменить гарнитуру и т.п., то и функция начинает возвращать соответственно большие или меньшие данные. Но если перемещать каретку на величину возвращаемую этой функцией она, каретка, появляется где попало.
Такое впечатление что результат функции не в пикселях, а в относительных единицах, хотя стоит режим MM_TEXT, что исходя из SDK соответствует - одна логическая единица = один пиксель.
Вот код обработки перемещения каретки
а вот результат работы
Может кто с подобным уже сталкивался?
Буду благодарен за любые ответы и советы!!!
Пишу свой компонент с использованием GDI+. Компонент предназначен для ввода однострочного текста (типа TEdit), но выводится на экран средствами GDI+. Возникла проблема - при перемещение каретки ввода вправо - влево, каретка появляется не между символами. Для определения ширины символа (и соответственно расстояния на которое должна сдвинуться каретка) использую API функцию GetCharABCWidthsFloat. Функция срабатывает нормально, возвращая три необходимых величины. При этом если увеличить/уменьшить шрифт, изменить гарнитуру и т.п., то и функция начинает возвращать соответственно большие или меньшие данные. Но если перемещать каретку на величину возвращаемую этой функцией она, каретка, появляется где попало.
Такое впечатление что результат функции не в пикселях, а в относительных единицах, хотя стоит режим MM_TEXT, что исходя из SDK соответствует - одна логическая единица = один пиксель.
Вот код обработки перемещения каретки
Код:
if msg.CharCode=VK_LEFT then
begin
GetCharABCWidthsFloat(FDC,ord(caption[FCharPos]),ord(caption[FCharPos]),a);
dec(FCaretPos.X,Round(a.abcfA+a.abcfB+a.abcfC));
dec(FCharPos);
SetCaretPos(FCaretPos.X,FCaretPos.Y);
end else
if msg.CharCode=VK_RIGHT then
begin
GetCharABCWidthsFloat(FDC,integer(pointer(caption[FCharPos+1])),integer(pointer(caption[FCharPos+1])),a);
inc(FCaretPos.X,Round(a.abcfA+a.abcfB+a.abcfC));
inc(FCharPos);
SetCaretPos(FCaretPos.X,FCaretPos.Y);
end;
Может кто с подобным уже сталкивался?
Буду благодарен за любые ответы и советы!!!