diff --git a/redo/sizing_windows.c b/redo/sizing_windows.c index 133cbcc..e6f27a6 100644 --- a/redo/sizing_windows.c +++ b/redo/sizing_windows.c @@ -38,3 +38,24 @@ void moveWindow(HWND hwnd, int x, int y, int width, int height) if (MoveWindow(hwnd, x, y, width, height, TRUE) == 0) xpanic("error setting window/control rect", GetLastError()); } + +LONG controlTextLength(HWND hwnd, LPWSTR text) +{ + HDC dc; + HFONT prev; + SIZE size; + + dc = GetDC(hwnd); + if (dc == NULL) + xpanic("error getting DC of control for text length", GetLastError()); + prev = SelectObject(dc, controlFont); + if (prev == NULL) + xpanic("error setting control font to DC for text length", GetLastError()); + if (GetTextExtentPoint32W(dc, text, wcslen(text), &size) == 0) + xpanic("error actually getting text length", GetLastError()); + if (SelectObject(dc, prev) != controlFont) + xpanic("error restoring previous control font to DC for text length", GetLastError()); + if (ReleaseDC(hwnd, dc) == 0) + xpanic("error releasing DC of control for text length", GetLastError()); + return size.cx; +} diff --git a/redo/winapi_windows.h b/redo/winapi_windows.h index 4bd035c..12e5ddf 100644 --- a/redo/winapi_windows.h +++ b/redo/winapi_windows.h @@ -18,6 +18,8 @@ #include #include #include +#include +#include /* global messages unique to everything */ enum { @@ -68,6 +70,7 @@ extern int baseX; extern int baseY; extern void calculateBaseUnits(HWND); extern void moveWindow(HWND, int, int, int, int); +extern LONG controlTextLength(HWND, LPWSTR); /* window_windows.c */ extern DWORD makeWindowWindowClass(char **);