GetCharWidth32 и проблема размера точки - PullRequest
0 голосов
/ 29 апреля 2011

В настоящее время у меня есть следующая функция, чтобы попытаться получить ширину символов для определенных символов в строке.Он возвращает одинаковые значения для шрифта независимо от размера точки.Я знаю, что это в логических единицах.Какой множитель нужно учитывать, чтобы вывести его из логических единиц и в пиксели?

Спасибо!

double Utils::GetFormattedCharWidth(char theChar, Gdiplus::Font* pFont, RectF&     rectArc, Graphics& 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++)
   {
      (&abc[iCon])->abcA = 0;
     (&abc[iCon])->abcB = 0;
     (&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;
}

Новый код для Марка с использованием Measure String.

double Utils::GetFormattedCharWidth(char theChar, Gdiplus::Font* pFont, RectF& rectArc, Graphics& graphics)
{
   double textWidth = 0;

   char charBuff[4];
   memset(&charBuff, 0, 4);
   charBuff[0] = theChar;
   RectF rectTemp;
   WCHAR* pChar = (WCHAR*)charBuff;

   graphics.MeasureString(pChar, 1, pFont, rectArc, &rectTemp);
   textWidth = rectTemp.Width;

   return textWidth;
}

1 Ответ

0 голосов
/ 29 апреля 2011

Вы пытаетесь выбрать шрифт GDI + в DC GDI. Я уверен, что это не сработает. Вам нужен дескриптор GDI для шрифта.

...