Проблема с получением charwidth32 и размером точки

#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 минут. В любом случае, я думаю, что это может вернуть его в пикселях. Я думаю, что просто ошибка в моем коде. К сожалению, все еще выдаю ячейку.