#c #visual-studio-2010 #fonts #gdi
#c #visual-studio-2010 #шрифты #gdi
Вопрос:
В настоящее время у меня есть следующая функция для попытки получить ширину символов для определенных символов в строке. Он возвращает одинаковые значения для шрифта независимо от размера точки. Я знаю, что это в логических единицах. Какой множитель мне нужно учитывать, чтобы перевести его из логических единиц в пиксели?
Спасибо!
double Utils::GetFormattedCharWidth(char theChar, Gdiplus::Font* pFont, RectFamp; rectArc, Graphicsamp; graphics)
{
double textWidth = 0;
HDC hdc = NULL;
DWORD outLine = 0; //= GetLastError();
hdc = graphics.GetHDC();
outLine = GetLastError();
LPINT lpBuffer = new int;
/*ABC *abc = new ABC[256];
for(int iCon = 0; iCon < 256; iCon )
{
(amp;abc[iCon])->abcA = 0;
(amp;abc[iCon])->abcB = 0;
(amp;abc[iCon])->abcC = 0;
}*/
DWORD dSize = 0;
SetMapMode(hdc,MM_TEXT);
HGDIOBJ hOldFont = SelectObject(hdc, pFont);
outLine = GetLastError();
//outLine = GetLastError();
//DWORD d = GetGlyphOutline(hdc, theChar, GGO_METRICS, lpg, dSize, lpvBuffer, LPM);
DWORD d = GetCharWidth32(hdc, theChar, theChar, lpBuffer);
//lpABC = (LPABC)GlobalAllocPtr( GHND, 256*sizeof(ABC) );
//d = GetCharABCWidthsA(hdc, 0, 255, abc);
outLine = GetLastError();
//DWORD d = GetCharABCWidthsA(hdc, theChar, theChar, abc);
int iExtraSpacing = GetTextCharacterExtra(hdc);
outLine = GetLastError();
graphics.ReleaseHDC(hdc);
textWidth = (double)(*lpBuffer) ;
//delete abc;
delete lpBuffer;
graphics.ReleaseHDC(hdc);
return textWidth iExtraSpacing;
}
Новый код для метки с использованием строки измерения.
double Utils::GetFormattedCharWidth(char theChar, Gdiplus::Font* pFont, RectFamp; rectArc, Graphicsamp; graphics)
{
double textWidth = 0;
char charBuff[4];
memset(amp;charBuff, 0, 4);
charBuff[0] = theChar;
RectF rectTemp;
WCHAR* pChar = (WCHAR*)charBuff;
graphics.MeasureString(pChar, 1, pFont, rectArc, amp;rectTemp);
textWidth = rectTemp.Width;
return textWidth;
}
Ответ №1:
Вы пытаетесь выбрать шрифт GDI в GDI DC. Я почти уверен, что это не сработает. Для шрифта нужен дескриптор GDI.
Комментарии:
1. Интересно. Какой тип дескриптора мне понадобится? Откуда я могу это получить в GDI?
2. Или даже лучше, какую функцию я хотел бы использовать для GDI ?
3. @Alikar, попробуй Graphics::MeasureString или Graphics::MeasureDriverString.
4. К сожалению, это возвращает ячейку символа, я полагаю, а не символ глифа. Новый код см. в разделе Редактирование. Я пробовал это раньше, и символы в конечном итоге получаются очень широкими, потому что этот вызов не учитывает ширину самого глифа, а не кернинг символов, с которыми он находится рядом. Кроме того, он по-прежнему возвращает измерения в логических символьных единицах вместо пикселей.
5. Глупый лимит в 5 минут. В любом случае, я думаю, что это может вернуть его в пикселях. Я думаю, что просто ошибка в моем коде. К сожалению, все еще выдаю ячейку.