![]() |
|
|
![]()
|
|
| torero |
|
|||
|
Бывалый ![]() Профиль Группа: Awaiting Authorisation Сообщений: 177 Регистрация: 1.2.2006 Репутация: нет Всего: нет |
У меня в проекте "вид" на основе CScrollView, и мне нужно ввести в него информацию с клавиатуры.
И сделать это, как в Edit, чтобы курсор передвигался впереди букв. Шрифт выбираю через CFontDialog, т.е. он может быть самый разный, значит ширина вводимых символов тоже разная. Методов определения ширины символов много, но не все поддерживает Windows-98. Я проверил некоторые методы, например, GetCharWidth на шрифте "Ariel" и оказалось он даёт правильную ширину только для латинского алфавита. Для "кириллицы" он выдаёт для всех букв одно и то же значение, причём завышенное. Но ведь под Windows-98 работают Edit, Блокнот, значит можно так сделать. Если кто занимался подобной темой, подскажите, какой метод здесь нужно применить, или, как по другому решить эту проблему? |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 5 Всего: 98 |
эээ... а что, CDC::GetTextExtentPoint32() уже отменили?
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Никто не мешает поместить в любое место вида нормальный эдит. Это будет проще и правильнее, чем изобретать велосипед.
-------------------- ... |
|||
|
||||
| torero |
|
|||
|
Бывалый ![]() Профиль Группа: Awaiting Authorisation Сообщений: 177 Регистрация: 1.2.2006 Репутация: нет Всего: нет |
Вначале отвечу на второй совет. Earnest, ты конечно права! Я уже капитально проверил этот способ, всё получается очень не плохо, кроме одной мелочи: не смог добиться полного совпадения шрифтов в окне "вид" и в окне RichEdit. Жирность не та и начертание букв отличается, хотя (я предполагаю), что они используют одну и ту же библиотеку шрифтов. Но можно представить, что это сделано специально для удобства (когда акробат в цирке падает, он делает вид что это в шутку). Всё равно спасибо за внимание.
Что касается GetTextExtentPoint32 я сделал, как в примере MSDN, но получил ерунду-ширина равна 7907 пиксел. Причина в том что я не знаю что такое хэндл вообще и HDC hdc в частности. Нигде не нашёл его описания, понял только что это структура, которую нужно инициализировать. Поэтому, hunter, если не сложно, объясни, пожалуйста, в общем виде что это такое и что вставить конкретно мне. Вот выдержка из MSDN которую я применил в программе: char str[16]; CSize sz; HDC hdc; ................................ sprintf(str,"Величина=0"); len=strlen(str); for(i=0;i<len;i++) { GetTextExtentPoint32(hdc,str,i+1,&sz);TRACE("sz.cx=%d",sz.cx); } |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Совсем дурацкий вопрос: а RichEditView тебе не подходит? Там что-то еще кроме текста есть?
Добавлено @ 19:23 HDC - это контекст устройства вывода, MFC предоставляет его обертку под именем CDC, можно использовать ее и ее функции. Прежде чем спрашивать GetTextExtentPoint32 и тому подобное, нужно выбрать правильный шрифт в контексте. Контекст бери где хочешь, но проще у того окна, в котором пишешь. Шрифт спроси тоже у окна (GetFont), если, конечно, ты его не сам создаешь и держишь под рукой. Потом не забудь отменить выбор шрифта и освободить контекст. Примерно так:
Насчет точного синтаксиса не уверена, все примерно. -------------------- ... |
|||
|
||||
| torero |
|
|||
|
Бывалый ![]() Профиль Группа: Awaiting Authorisation Сообщений: 177 Регистрация: 1.2.2006 Репутация: нет Всего: нет |
Я так и сделал, поставил CClientDC dc(this); и
dc.SelectObject(m_font ); и всё дальше получилось. Я считал что dc-это объект класса или объект контекста устройства и не знал, что это ещё и хэндл. Вообще то я делаю редактор данных, где всё привязано к колонкам и строкам и алгоритм CRichEditView совершенно не подходит. Гораздо ближе CListView, но и у него есть свои заморочки и бороться с ними себе дороже. Сечас прошёл вариант на основе чисто CView, но лучше, пожалуй, CView плюс на него окошко RichEdit. Хотя там шрифты немного не совпадают, но это мелочи. Ты правильно говоришь, что не стоит изобретать велосипед. На этом пока и остановлюсь. Большое спасибо за все подсказки. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |