summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--redo/sizing_windows.c21
-rw-r--r--redo/winapi_windows.h3
2 files changed, 24 insertions, 0 deletions
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 <commctrl.h>
#include <stdint.h>
#include <uxtheme.h>
+#include <string.h>
+#include <wchar.h>
/* 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 **);