你能比在使用GetTextMetrics函数和使用tmAveCharWidth * strSize更精确地在WIN32中测量string的宽度吗?
尝试使用GetTextExtentPoint32 。 它使用给定设备上下文的当前字体以逻辑单位度量渲染字符串的宽度和高度。 对于默认映射模式MM_TEXT,1个逻辑单元是1个像素。
但是,如果您更改了当前设备上下文的映射模式,则逻辑单元可能与像素不同。 您可以阅读有关MSDN上不同的映射模式 。 使用映射模式,您可以将由GetTextExtentPoint32返回给您的维度转换为像素。
我不确定,但似乎是:
HDC hDC = GetDC(NULL); RECT r = { 0, 0, 0, 0 }; char str[] = "Whatever"; DrawText(hDC, str, strlen(str), &r, DT_CALCRECT);
可能会工作。
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); }
根据你如何使用这个,你可以使用DrawText和DT_CALCRECT指定的,它会(它总是对我来说相当准确)根据文本/字体/等等来计算所需矩形的大小。
对于Builder C ++首先动态创建新的TLabel,然后更改字体属性。将TLabel设置为autosize。然后可以得到TLabel width witch表示您的字符串宽度(以像素为单位)。
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");