2013-06-20 3 views
-1

Я пытаюсь создать метод, который дает мне ширину строки в пикселях. Мой код до сих пор:Winapi получить ширину строки в пикселях

inline void getTextWidth(HWND hwnd char* text) { 
    SIZE textSize; 
    GetTextExtentPoint32(GetDC(hwnd), text, strlen(text), &textSize); 
    return ?; 
} 

Я знаю, что я должен использовать LPtoDP (MSDN), но хочет точек в качестве параметров и не размер, что GetTextExtentPoint32 возвращается.

Как это сделать?

+2

Это довольно неясно. Ваше название вопроса говорит о пикселях, ваше тело говорит о точках. Вы пытаетесь получить функцию, которая возвращает void, чтобы что-то вернуть. Вы говорите о параметрах, когда вы представляете собой возвращаемое значение. Небрежный, сделай это лучше. И объясните, почему вы считаете, что вам нужно изменить режим отображения в контексте устройства, созданного с нуля. –

+3

И не забудьте также исправить утечку «HDC». 'HDC', возвращаемый' GetDC() ', должен быть освобожден с помощью' ReleaseDC() ', когда вы закончите использовать его. –

+0

Возможный дубликат [Как найти ширину строки (в пикселях) в WIN32] (http://stackoverflow.com/questions/1126730/how-to-find-the-width-of-a-string-in -pixels-in-win32) –

ответ

3

Структура SIZE содержит как высоту, так и ширину. Поскольку вы только заботитесь о ширине, вы, по-видимому, хотите LPtoDP(textSize.cx);.

0

Я решил использовать его другим способом. Для всех, кому это интересно, это мое решение:

int getStringWidth(char *text, HFONT font) { 
    HDC dc = GetDC(NULL); 
    SelectObject(dc, font); 

    RECT rect = { 0, 0, 0, 0 }; 
    DrawText(dc, text, strlen(text), &rect, DT_CALCRECT | DT_NOPREFIX | DT_SINGLELINE); 
    int textWidth = abs(rect.right - rect.left); 

    DeleteDC(dc); 
    return textWidth; 
} 
+0

Вы сравниваете 'ReleaseDC' с' GetDC', *** not *** 'DeleteDC'. –

+0

Итак, 'ReleaseDC (NULL, dc);'? –

Смежные вопросы