Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с отрисовкой каретки 
:(
    Опции темы
larryspb
Дата 16.4.2010, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 16.4.2010

Репутация: нет
Всего: нет



Доброго времени суток. У меня возникла следующая проблема. 
Я использую метод SetCaretPos() для установки позиции каретки в окне ввода. 
Текст выводится при помощи метода TextOutW().
При этом, координата вывода каретки X  высчитывается на основе длины текста следующим образом:

Код

    WideString l_str  = Lines->Strings[CurLinePos].SubString(0, CursorPos);
     GetTextExtentPoint32W(hDC, l_str.c_bstr(), CursorPos, &l_sz);

     //GetDeviceCaps(hDC, LOGPIXELSX) - возвращает число пикселей на логический дюйм
     //l_sz.cx - кол-во логических пикселей в строке(длина)
     //72 - 1 point = 1/72 логического дюйма
     X        = MulDiv(l_sz.cx, 72, GetDeviceCaps(hDC, LOGPIXELSX));


При вводе некоторых символов, например z,s - каретка постепенно(с ростом числа символов) "убегает" вправо от текста
f,t - каретка убегает "влево" от конца текста. 

Я проверил, переменная CursorPos высчитывается верно. 
И что характерно, например, при использовании символа 'x' в строке ввода каретка ведет себя правильно. А при вводе символа 'z' - "убегает". Хотя длины этих символов ОДИНАКОВЫ. 

Никто не может подсказать, в чем здесь может быть ошибка? 
PM MAIL   Вверх
ИванМ
Дата 16.4.2010, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 5
Всего: 23



larryspb, почему если ты пишешь в Билдере используешь WinApi? Есть удобные билдеровские функции. На счет размера x и z - надо посмотреть, какой у тебя шрифт еще установлен в самом контроле.
Если ты в 6м пишешь, скинь мне на e-mail, посмотрю весь код. Так сложно сказать.
PM MAIL   Вверх
larryspb
Дата 17.4.2010, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 16.4.2010

Репутация: нет
Всего: нет



Цитата(ИванМ @ 16.4.2010,  20:24)
larryspb, почему если ты пишешь в Билдере используешь WinApi? Есть удобные билдеровские функции. На счет размера x и z - надо посмотреть, какой у тебя шрифт еще установлен в самом контроле.
Если ты в 6м пишешь, скинь мне на e-mail, посмотрю весь код. Так сложно сказать.

Какие именно функции можно использовать в билдере для определения длины строки в пикселяx?
Мне нужно, что бы эта функция поддерживала работу с Unicode строками. Т.е. могла работать, например, со строками, введенными на арабском языке.  smile 

PM MAIL   Вверх
ИванМ
Дата 18.4.2010, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 5
Всего: 23



Цитата(larryspb @  17.4.2010,  12:46 Найти цитируемый пост)
Какие именно функции можно использовать в билдере для определения длины строки в пикселяx?

Canvas::TextWidth
Цитата(larryspb @  17.4.2010,  12:46 Найти цитируемый пост)
Мне нужно, что бы эта функция поддерживала работу с Unicode строками

Это зависит от версии Билдера. В современных должно работать.
PM MAIL   Вверх
larryspb
Дата 19.4.2010, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 16.4.2010

Репутация: нет
Всего: нет



Цитата(ИванМ @ 18.4.2010,  17:34)
Это зависит от версии Билдера. В современных должно работать.

К сожалению, только 2006 билдер.  smile 
И тут поддержка только AnsiString, что меня никоим образом не устраивает. Необходима поддержка WideString.

Это сообщение отредактировал(а) larryspb - 19.4.2010, 09:16
PM MAIL   Вверх
larryspb
Дата 19.4.2010, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 16.4.2010

Репутация: нет
Всего: нет



Проблема решена при помощи функции GetTextExtentExPointW(); smile 
PM MAIL   Вверх
DCamer
Дата 21.4.2010, 12:39 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 29.1.2010

Репутация: нет
Всего: нет



Цитата(larryspb @  19.4.2010,  10:11 Найти цитируемый пост)
никоим образом не устраивает. Необходима поддержка WideString

слабо новую версию скачать?
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0438 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.