Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WinAPI - вывод текста, установка текущего шрифта и его параметр 
:(
    Опции темы
youri
Дата 6.6.2004, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Выбрать шрифт у меня вроде получилось, правда не уверен, что это был самый простой способ: с помощью EnumFontFamilies нашел параметры нужного шрифта (LOGFONT), создал объект шрифта (CreateFont) и с помощью SelectObject сделал шрифт текущим. А вот не пойму как указать размер шрифта (в pointах) sad.gif
PM   Вверх
Vex
Дата 6.6.2004, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


кацапосрачмученiкъ
****


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

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



Код
fontText.CreateFont(Размер в пойнтах*-20, 0, 0, 0, 400, FALSE, FALSE, 0,
                       ANSI_CHARSET, OUT_DEFAULT_PRECIS,
                       CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
                       DEFAULT_PITCH | FF_SWISS, "Arial");



--------------------
Слава Україні.
PM   Вверх
youri
Дата 7.6.2004, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А как добится того же средствами WinAPI? Кстати, fontText - это что за объект?
PM   Вверх
Vex
Дата 7.6.2004, 01:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


кацапосрачмученiкъ
****


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

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



Сорри, не обратил внимание, что надо на АПИ.

Цитата
А как добится того же средствами WinAPI?


Код

...
    LOGFONT     lf;
    HFONT       hFont;

    // Let's create a TrueType font to display.
    memset(&lf,0,sizeof(LOGFONT));
    lf.lfHeight               =   -20*размер в пойнтах;
    lf.lfWeight               =   FW_NORMAL;
    lf.lfCharSet              =   ANSI_CHARSET;
    lf.lfOutPrecision         =   OUT_DEFAULT_PRECIS;
    lf.lfClipPrecision        =   CLIP_DEFAULT_PRECIS;
    lf.lfQuality              =   DEFAULT_QUALITY;
    lf.lfPitchAndFamily       =   FF_DONTCARE|DEFAULT_PITCH;
    lstrcpy (lf.lfFaceName, "Arial");

    hFont = CreateFontIndirect(&lf);
   
...


Цитата
fontText - это что за объект?

CFont;


--------------------
Слава Україні.
PM   Вверх
Масяня
Дата 7.6.2004, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вы упустили из виду один важный момент!!!
Да шрифт будет в точках, но только если текущий режим будет MM_TEXT
PM MAIL   Вверх
mr.DUDA
Дата 7.6.2004, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



...поэтому пользуйтесь CFont::CreatePointFont / CFont::CreatePointFontIndirect...


--------------------
user posted image
PM MAIL WWW   Вверх
youri
Дата 9.6.2004, 02:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Люди, а вы ничего не перепутали. Я тут получше почитал help.
lf.lfHeight - размер в пикселах, а если нужен размер в поинтах -
Цитата
MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72)

PM   Вверх
Масяня
Дата 9.6.2004, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(youri @ 9.6.2004, 02:44)
Люди, а вы ничего не перепутали. Я тут получше почитал help.
lf.lfHeight - размер в пикселах...

А вот что в MSDN пишут:
Цитата

CFont::CreateFont

BOOL CreateFont( int nHeight, ....
nHeight

Specifies the desired height (in logical units) of the font. The font height can be specified in the following ways:



Это сообщение отредактировал(а) Масяня - 9.6.2004, 09:51
PM MAIL   Вверх
youri
Дата 9.6.2004, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Масяня, ты все правильно написал
Цитата
nHeight
Specifies the desired height (in logical units) of the font

А теперь, если посмотреть описание функции SetMapMode, то там (Win32 Programmer's Reference) написано
Цитата
MM_TEXT
Each logical unit is mapped to one device pixel. Positive x is to the right; positive y is down.

А дальше там (Win32 Programmer's Reference, CreateFont) написано
Цитата
For the MM_TEXT mapping mode, you can use the following formula to specify a height for a font with a specified point size:
nHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);



PM   Вверх
Масяня
Дата 10.6.2004, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



youri, это подойдет для экрана, а для принтера - там уже должно быть не 72, а 300 или более... а можно установить какой-нибудь MapMode, например, HIMETRIC 500 = 5 мм. перевести их с помощью LPtoDP() в ед. уст-ва, а затем установить другой режим и затем DPtoLP() и получишь нужные лог. единицы!

А самое главное это то, что когда будешь выводить текст этим шрифтом, то надо восстанавливать "родной" MapMode для вывода текста!!! Поэтому лучше всего для печати и отображения подходит MM_TWIPS т.к. можно один раз сделать фонт и потом его выводить в контекст окна или в контекст принтера (по умолчанию он в твипах!) и не надо будет думать о масштабе. Ну, а если же хочешь работать в MM_TEXT, то прийдется каждый раз пересчитывать высоту текста для печати и вывода в окно smile.gif

Это сообщение отредактировал(а) Масяня - 10.6.2004, 00:45
PM MAIL   Вверх
Oleg IT
Дата 24.11.2004, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Хотел бы продолжить тему.
Проблема такая, (я её уже выносил на обсуждение, но ответов 0).
Работаю с ::SetMapMode(m_DC,MM_TWIPS);
Размер шрифта задаю в миллиметрах и перевожу их в девайсные точки так
int D = MM_to_LP(Hf);
где Hf высота шрифта в миллиметрах.
int MM_to_LP(float mm)
{
::GetViewportExtEx(DC,&m_sizeVpExt);
::GetWindowExtEx(DC,&m_sizeWinExt);
float x = mm/25.4f*(float)GetDeviceCaps(DC,LOGPIXELSX);
return (int)MulDiv(x, abs(m_sizeWinExt.cx), abs(m_sizeVpExt.cx));
}

Но размер текста на экране не совподает с размерами на притере. В чем дело?
PM MAIL   Вверх
Hroft
Дата 4.12.2004, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 20.10.2003
Где: Москва

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



Вроде бы уже разобрались, но можно и без Indirect:
Код
HFONT hcourier= CreateFont(font_size,0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,
 OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH | FF_SWISS,
 "Courier");
HFONT holdfont = static_cast<HFONT>(SelectObject(hdc,hcourier));

, потом выбрать старый и удалить новый.

Это сообщение отредактировал(а) Hroft - 4.12.2004, 11:13
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


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

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


 




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


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

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