Как найти ширину строки (в пикселях) в WIN32 - PullRequest
16 голосов
/ 14 июля 2009

Можете ли вы измерить ширину строки более точно в WIN32, чем с помощью функции GetTextMetrics и с помощью tmAveCharWidth * strSize?

Ответы [ 5 ]

21 голосов
/ 14 июля 2009

Попробуйте использовать GetTextExtentPoint32 . При этом используется текущий шрифт для данного контекста устройства для измерения ширины и высоты отображаемой строки в логических единицах. Для режима отображения по умолчанию MM_TEXT, 1 логическая единица равна 1 пикселю.

Однако, если вы изменили режим отображения для текущего контекста устройства, логическая единица может не совпадать с пикселем. Вы можете прочитать о различных режимах отображения на MSDN . В режиме отображения вы можете преобразовать размеры, возвращаемые вам GetTextExtentPoint32, в пиксели.

15 голосов
/ 14 июля 2009

Не знаю наверняка, но кажется, что:

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

может работать.

3 голосов
/ 14 июля 2009

Графика :: 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);
}
1 голос
/ 14 июля 2009

В зависимости от того, как вы используете это, вы можете использовать DrawText с указанным DT_CALCRECT, и он будет (это всегда делалось достаточно точно для меня) вычислить размер требуемого прямоугольника на основе текста / шрифта / и т.д.

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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...