From 24a42d29a54a0e607daf4e15abe915b56620bfd7 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Tue, 12 Aug 2014 13:10:30 -0400 Subject: [PATCH] Improved dialog base units calculations on Windows. --- redo/container_windows.c | 5 ++++- redo/container_windows.go | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/redo/container_windows.c b/redo/container_windows.c index 5f71fe2..e393861 100644 --- a/redo/container_windows.c +++ b/redo/container_windows.c @@ -88,6 +88,7 @@ void calculateBaseUnits(HWND hwnd, int *baseX, int *baseY, LONG *internalLeading HDC dc; HFONT prevFont; TEXTMETRICW tm; + SIZE size; dc = GetDC(hwnd); if (dc == NULL) @@ -97,7 +98,9 @@ void calculateBaseUnits(HWND hwnd, int *baseX, int *baseY, LONG *internalLeading xpanic("error loading control font into device context for preferred size calculation", GetLastError()); if (GetTextMetricsW(dc, &tm) == 0) xpanic("error getting text metrics for preferred size calculations", GetLastError()); - *baseX = (int) tm.tmAveCharWidth; /* TODO not optimal; third reference below has better way */ + if (GetTextExtentPoint32W(dc, L"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", 52, &size) == 0) + xpanic("error getting text extent point for preferred size calculations", GetLastError()); + *baseX = (int) ((size.cx / 26 + 1) / 2); *baseY = (int) tm.tmHeight; *internalLeading = tm.tmInternalLeading; if (SelectObject(dc, prevFont) != controlFont) diff --git a/redo/container_windows.go b/redo/container_windows.go index 41d7aad..5cd1877 100644 --- a/redo/container_windows.go +++ b/redo/container_windows.go @@ -86,6 +86,7 @@ func containerResize(data unsafe.Pointer, r *C.RECT) { // - http://msdn.microsoft.com/en-us/library/ms645502%28VS.85%29.aspx - the calculation needed // - http://support.microsoft.com/kb/125681 - to get the base X and Y // (thanks to http://stackoverflow.com/questions/58620/default-button-size) +// In my tests (see https://github.com/andlabs/windlgunits), the GetTextExtentPoint32() option for getting the base X produces much more accurate results than the tmAveCharWidth option when tested against the sample values given in http://msdn.microsoft.com/en-us/library/windows/desktop/dn742486.aspx#sizingandspacing, but can be off by a pixel in either direction (probably due to rounding errors). // note on MulDiv(): // div will not be 0 in the usages below