Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение ширины символов 
V
    Опции темы
torero
Дата 8.2.2007, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 177
Регистрация: 1.2.2006

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



       У меня в проекте "вид" на основе CScrollView, и мне нужно ввести в него информацию с клавиатуры.
   И сделать это, как в Edit, чтобы курсор передвигался впереди букв. Шрифт выбираю через  CFontDialog, т.е.
    он может быть самый разный, значит ширина вводимых символов тоже разная.
   Методов определения ширины символов много, но не все поддерживает Windows-98. 
   Я проверил некоторые методы, например, GetCharWidth на шрифте "Ariel" и оказалось он даёт правильную ширину
    только для латинского алфавита. Для "кириллицы" он выдаёт для всех букв одно и то же значение, причём
    завышенное.   Но ведь под Windows-98 работают Edit, Блокнот, значит можно так сделать.
   Если кто занимался подобной темой, подскажите, какой метод здесь нужно применить, или, как по другому 
   решить эту проблему?

PM MAIL   Вверх
_hunter
Дата 8.2.2007, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



эээ... а что, CDC::GetTextExtentPoint32() уже отменили?
Цитата

Windows 95/98/Me: Included in Windows 95 and later.



--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Earnest
Дата 8.2.2007, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Никто не мешает поместить в любое место вида нормальный эдит. Это будет проще и правильнее, чем изобретать велосипед.


--------------------
...
PM   Вверх
torero
Дата 9.2.2007, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: 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); } 


PM MAIL   Вверх
Earnest
Дата 10.2.2007, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Совсем дурацкий вопрос: а RichEditView тебе не подходит? Там что-то еще кроме текста есть?

Добавлено @ 19:23 
HDC - это контекст устройства вывода, MFC предоставляет его обертку под именем CDC, можно использовать ее и ее функции.
Прежде чем спрашивать GetTextExtentPoint32 и тому подобное, нужно выбрать правильный шрифт в контексте. Контекст бери где хочешь, но проще у того окна, в котором пишешь. Шрифт спроси тоже у окна (GetFont), если, конечно, ты его не сам создаешь и держишь под рукой. 
Потом не забудь отменить выбор шрифта и освободить контекст. Примерно так:
Код

   CClientDC dc(pMyWnd); 
   CFont* pOldFont = dc.SelectFont (pMyWnd->GetFont());
   // вот теперь можно спрашивать
   ..
   dc.SelectFont (pOldFont);

Насчет точного синтаксиса не уверена, все примерно.



--------------------
...
PM   Вверх
torero
Дата 11.2.2007, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 177
Регистрация: 1.2.2006

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



     Я так и сделал, поставил  CClientDC dc(this);   и
                                               dc.SelectObject(m_font );
   и всё дальше получилось. Я считал что dc-это объект класса или объект контекста устройства
   и не знал, что это ещё и хэндл. Вообще то я делаю редактор данных, где всё привязано к     колонкам и строкам и алгоритм CRichEditView  совершенно не подходит. Гораздо ближе CListView, но и у него есть свои заморочки и бороться с ними себе дороже. Сечас прошёл вариант на основе чисто CView, но лучше, пожалуй, CView плюс на него окошко RichEdit. Хотя там шрифты немного не совпадают, но это мелочи.
  Ты правильно говоришь, что не стоит изобретать велосипед. На этом пока и остановлюсь.  Большое спасибо за все подсказки.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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