Как сделать текст жирным?

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Eugie, Romeo

Redcat
Сообщения: 19
Зарегистрирован: Чт дек 08, 2005 6:48 pm
Откуда: Russia

Как сделать текст жирным?

Сообщение Redcat » Ср дек 14, 2005 6:24 pm

Кто-нибудь знает, можно ли сделать текст окна жирным с помощью функции Win API SetWindowText? Если нет, то подскажите как? (нужна функция WinAPI)

Kolinus
Сообщения: 449
Зарегистрирован: Пн авг 23, 2004 1:02 pm
Откуда: Минск

Сообщение Kolinus » Ср дек 14, 2005 7:38 pm

задаешь нужный фонт и устанавливаешь его
вродебы CreateFontIndirect должно помочь
В SAD - все в SAD.

AlexDav
Сообщения: 34
Зарегистрирован: Вт окт 18, 2005 2:37 pm

Сообщение AlexDav » Чт дек 15, 2005 2:50 pm

Код: Выделить всё

CWnd *cWnd;
CFont font;
	cWnd = GetDlgItem(IDC_STATIC1);
	LOGFONT lf;
	ZeroMemory(&lf, sizeof LOGFONT);
	CClientDC clientDC(this);
	lf.lfHeight = 18;//-(MulDiv(75, ::GetDeviceCaps(clientDC.m_hDC, LOGPIXELSY), 72)); //PointSizeToHeight(24,clientDC.m_hDC);
	lf.lfWeight = FW_BOLD;
	wcscpy(lf.lfFaceName, _T("MS Sans Serif"));
	VERIFY(font.CreateFontIndirect(&lf));
	cWnd->SetFont(&font);
но это MFC

Redcat
Сообщения: 19
Зарегистрирован: Чт дек 08, 2005 6:48 pm
Откуда: Russia

Сообщение Redcat » Сб дек 17, 2005 10:16 am

Спасибо, но мне только API надо :-)

Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: Вт мар 02, 2004 5:25 pm
Откуда: Крым, Севастополь
Контактная информация:

Сообщение Romeo » Пн дек 19, 2005 1:57 pm

Всё, что написал AlexDav, без проблем переводится на WinAPI с точностью до переобозначений. Вопрос в другом. Тебе нужно специальным фонтом писать на клиентской области или в заголовке окна. Первое продемонстрировал AlexDav. Для второго придётся перехватывать WM_NCPAINT либо программно менять настройки Windows (в этом случае шрифт заголовка поменятеся для всех окон системы).
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

Eugie
Сообщения: 707
Зарегистрирован: Вт фев 17, 2004 11:59 pm
Откуда: SPb

Сообщение Eugie » Чт дек 22, 2005 1:02 pm

Redcat, SetWindowText() только меняет текст заголовка окна (или содержимого контрола, типа editbox). Шрифт, как уже отмечалось, задается непосредственно в процедуре отрисовки, т.е. в обработчике событий (WM_PAINT - для клиентской (внутренней) части, WM_NCPAINT - для заголовка) - это для своего окна. А для чужого - в общем случае никак (вариант через настройки ОС не рассматриваю, ну, можно еще путем subclassing'а, но это геморрой), а для контролов - сообщение WM_SETFONT позволяет заменить шрифт.

Redcat
Сообщения: 19
Зарегистрирован: Чт дек 08, 2005 6:48 pm
Откуда: Russia

Сообщение Redcat » Пт дек 23, 2005 9:32 am

А я вот как делаю: мне надо, чтобы текст в static control был жирным, я получаю контекст устройства для этого контрола, создаю логический шрифт и вешаю этот шрифт на этот контекст.
Но у меня следующая проблема: при сворачивании и разворачивании окна текст в этом окошке почему-то пропадает. A когда я хочу вывести новую строку в этот контекст, она накладывается на предидущую строку и получается каша. Строку в контекст я вывожу при помощи TextOut. Как тут быть - как сделать так чтобы очищать контекст устройства от предидущей строки перед выводом новой, и чтобы текст не пропадал из окна при сворачивании/разворачивании?

А вообще я повторяю кусок кода по созданию контекста устройства, выводу туда текста и освобождению контекста в цикле. Насколько это грамотно?

Eugie
Сообщения: 707
Зарегистрирован: Вт фев 17, 2004 11:59 pm
Откуда: SPb

Сообщение Eugie » Пн дек 26, 2005 6:01 pm

Чтобы содержимое окна не "пропадало", нужно его каждый раз обновлять при перерисовке окна, т.е. обрабатывать сообщение WM_PAINT (см. предыдущий вопрос).
Но в твоем случае все проще - я же сказал, в случае контролов (а static text - контрол) есть спец.сообщение WM_SETFONT, которое позволяет поменять шрифт "на лету":

Код: Выделить всё

  HFONT hFont;
  // откуда-то получили hFont, напр., создали с помощью CreateFont()
  SendMessage(GetDlgItem(hDltg, IDC_STATIC1), WM_SETFONT, (WPARAM) hFont, TRUE);

Redcat
Сообщения: 19
Зарегистрирован: Чт дек 08, 2005 6:48 pm
Откуда: Russia

Сообщение Redcat » Пн дек 26, 2005 11:32 pm

OK!! усё ясно!

Ответить