2016-06-08 14 views
0

Ich muss die Breite einer Zeichenfolge mit beliebiger Schriftart finden. Wenn ich jedoch GetTextExtentPoint32 verwende, wird die aktuelle Schriftart nicht berücksichtigt. Das ist mein Code:GetTextExtentPoint32 berücksichtigt nicht die aktuelle Schriftart

HFONT hFont = CreateFont(36, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, 
    OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, NULL); 

SelectObject(GetDC(m_hSettingsWnd), hFont); 
GetTextExtentPoint32(GetDC(m_hSettingsWnd), TITLE_TEXT, wcslen(TITLE_TEXT), &sTextSize); 
// TITLE_TEXT is the string I'm trying to get the width of. 

Kann jemand die Formatierung auch bitte korrigieren? Ich bin neu in Stack Overflow und das Codebeispiel funktioniert nicht richtig für mich.

Antwort

3
SelectObject(GetDC(m_hSettingsWnd), ...); 
GetTextExtentPoint32(GetDC(m_hSettingsWnd), ...); 

Durch die Verwendung von GetDC() auf diese Weise, erstellen Sie Ressourcenlecks. Jeder Anruf an GetDC() muss von einem Anruf an ReleaseDC() gefolgt werden. Und jeder Anruf an GetDC() erstellt eine separate HDC, weshalb GetTextExtentPoint32() nicht über Ihre Schriftart bekannt ist, wie Sie es in diesem zweiten HDC nicht ausgewählt haben.

Korrekte Verwendung von GetDC() sollte das Schriftartproblem beheben. Stellen Sie sicher, dass Sie auch die alte Schriftart wiederherstellen, bevor Sie die HDC:

HDC hdc = GetDC(hwnd); 
const wchar_t *buf = L"buf"; 
HFONT hFont = CreateFont(36, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, 
    OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, NULL); 

SIZE size; 
HFONT oldfont = (HFONT) SelectObject(hdc, hFont); 
GetTextExtentPoint32(hdc, buf, wcslen(buf), &size); 

SelectObject(hdc, oldfont); 
DeleteObject(hFont); 

ReleaseDC(hwnd, hdc); 
freigeben
Verwandte Themen