如何在WIN32中查找字符串的宽度(以像素为单位)

时间:2009-07-14 17:06:22

标签: c++ windows winapi

你能否在WIN32中更准确地测量字符串的宽度,而不是使用GetTextMetrics函数并使用tmAveCharWidth * strSize?

5 个答案:

答案 0 :(得分:21)

尝试使用GetTextExtentPoint32。它使用给定设备上下文的当前字体来以逻辑单位测量呈现的字符串的宽度和高度。对于默认映射模式,MM_TEXT,1个逻辑单位是1个像素。

但是,如果您更改了当前设备上下文的映射模式,则逻辑单元可能与像素不同。您可以阅读有关不同mapping modes on MSDN的内容。使用映射模式,您可以将GetTextExtentPoint32返回给您的尺寸转换为像素。

答案 1 :(得分:15)

我不确定,但似乎:

HDC hDC = GetDC(NULL);
RECT r = { 0, 0, 0, 0 };
char str[] = "Whatever";
DrawText(hDC, str, strlen(str), &r, DT_CALCRECT);

可能有用。

答案 2 :(得分:3)

Graphics::MeasureString

VOID Example_MeasureString(HDC hdc)
{
   Graphics graphics(hdc);
   // Set up the string.
   WCHAR string[] = L"Measure Text";
   Font font(L"Arial", 16);
   RectF layoutRect(0, 0, 100, 50);
   RectF boundRect;
   // Measure the string.
   graphics.MeasureString(string, 12, &font, layoutRect, &boundRect);
   // Draw a rectangle that represents the size of the string.
   graphics.DrawRectangle(&Pen(Color(255, 0, 0, 0)), boundRect);
}

答案 3 :(得分:1)

根据您使用它的方式,您可以使用指定了DT_CALCRECT的DrawText,它将(它总是相当准确地为我完成)根据text / font /等计算所需矩形的大小。

答案 4 :(得分:0)

对于Builder C ++,首先动态创建新的TLabel,然后更改字体属性。将你的TLabel设置为自动调整大小。然后你可以得到TLabel宽度,以像素为单位表示你的字符串宽度。

 int WidthPixels (String font, int size, String text)
 {
    TLabel* label = new TLabel(Form1); // dynamic TLabel
    label->AutoSize = true;
    label->Font->Name = font; // your font
    label->Font->Size = size; // your font size
    label->Caption = text; // your string
    return label->Width;
 }

int width = WidthPixels("Times New Roman", 19 , "Hey");