Опрделение ширины строки (+)
От: evergamer  
Дата: 07.04.02 04:00
Оценка:
Проблема: нужно подогнать Static компонент под конкретный текст, для этого нужно узнать ширину текста в ПИКСЕЛЯХ. Вызываю GetTextExtentPoint32 (или любой другой типа GetTextExtent) и получаю размер непонятно в чём... Почитал, что это диалоговые юниты и надо использовать GetDialogBaseUnits и пару алгоритмов чтобы их перевести в пиксели. Пробовал несколько путей и ничего не выходит — не получаются пиксели и всё!
Если кто знает, пожалуйста, помогите вычислить эти долбанные пиксели. :crash:

evergamer
Re: Опрделение ширины строки (+)
От: Alex Fedotov США  
Дата: 07.04.02 04:34
Оценка:
Здравствуйте evergamer, Вы писали:

E>Проблема: нужно подогнать Static компонент под конкретный текст, для этого нужно узнать ширину текста в ПИКСЕЛЯХ. Вызываю GetTextExtentPoint32 (или любой другой типа GetTextExtent) и получаю размер непонятно в чём... Почитал, что это диалоговые юниты и надо использовать GetDialogBaseUnits и пару алгоритмов чтобы их перевести в пиксели. Пробовал несколько путей и ничего не выходит — не получаются пиксели и всё!

E>Если кто знает, пожалуйста, помогите вычислить эти долбанные пиксели.

С долбанными пикселями — это в форум MFC или WINAPI, какой ближе. Там тебе расскажут, что сначала нужно подходящий шрифт в контекст выбрать, а уже потом GetTextExtentPoint32 вызывать.
-- Alex Fedotov
Re[2]: Опрделение ширины строки (+)
От: evergamer  
Дата: 07.04.02 05:43
Оценка:
Алекс, спасибо за ответ, но как понять "подходящий шрифт в контекст выбрать"? Это какой?

Я делаю следующую последовательность действий:


BOOL MyMessageBoxDlg::OnInitDialog()
{
...
// Определяю диалоговые юниты
CRect rc(0, 0, 4, 8);
MapDialogRect(&rc);
int baseUnitY = rc.bottom;
int baseUnitX = rc.right;

// Вызываю GetTextExtentPoint32
GetTextExtentPoint32(hdc, lpszTemp, lpszTemp.GetLength(), &size);

// Преобразую size
size.cx = (size.cx * baseUnitX)/4;
size.cy = (size.cy * baseUnitY)/8;

... и получаю совсем не пиксели :(

}

evergamer
Re[3]: Опрделение ширины строки (+)
От: Alex Fedotov США  
Дата: 07.04.02 07:28
Оценка: 3 (1)
Здравствуйте evergamer, Вы писали:

E>Алекс, спасибо за ответ, но как понять "подходящий шрифт в контекст выбрать"? Это какой?


Подходящий — это тот, который сейчас установлен у окна Static, ты же ведь в него текст выводить будешь. А GetTextExtentPoint32 возвращает размер в пикселях, так что никаких преобразований и танцев с бубнами не нужно.

E>Я делаю следующую последовательность действий:


E>BOOL MyMessageBoxDlg::OnInitDialog()

E>{
E> ...
E> // Определяю диалоговые юниты
E> CRect rc(0, 0, 4, 8);
E> MapDialogRect(&rc);
E> int baseUnitY = rc.bottom;
E> int baseUnitX = rc.right;

E> // Вызываю GetTextExtentPoint32

E> GetTextExtentPoint32(hdc, lpszTemp, lpszTemp.GetLength(), &size);

E> // Преобразую size

E> size.cx = (size.cx * baseUnitX)/4;
E> size.cy = (size.cy * baseUnitY)/8;

E> ... и получаю совсем не пиксели


E>}


CClientDC dc(this);

CFont * pFont = GetDlgItem(IDC_THATSTATIC)->GetFont();
CFont * pOldFont = dc.SelectObject(pFont);

CSize size;
GetTextExtentPoint32(dc, lpszTemp, lpszTemp.GetLength(), &size);

dc.SelectObject(pOldFont);

// size содержит размер текста в пикселях, каким его 
// выведет окно Static
-- Alex Fedotov
Re[4]: Опрделение ширины строки (+)
От: evergamer  
Дата: 07.04.02 08:28
Оценка:
YES!!! Я твой раб навеки. Про шрифт в static-е мне и в голову не приходило. Спасибо большое!!!

evergamer :super:
Re[5]: Опрделение ширины строки (+)
От: Кодт Россия  
Дата: 07.04.02 10:07
Оценка: 1 (1)
Здравствуйте evergamer, Вы писали:

E>YES!!! Я твой раб навеки. Про шрифт в static-е мне и в голову не приходило.


За базар отвечают
А оценочку Алексу поставить, или рабы не имеют права голоса?
Перекуём баги на фичи!
Re[6]: Опрделение ширины строки (+)
От: evergamer  
Дата: 07.04.02 10:22
Оценка:
Честно влепил трояк

evergamer
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.