From 144736e53fd0142ec215a375bf588b9634e312ed Mon Sep 17 00:00:00 2001 From: Jonas Kümmerlin Date: Sun, 19 Apr 2020 13:00:57 +0200 Subject: calc edit sizes in layout, no more subclassing --- alf/alf.h | 2 +- alf/alfedit.cpp | 52 +----------------------------------- alf/alflayout.cpp | 79 +++++++++++++++++++++++++++++++++++++++++++------------ 3 files changed, 64 insertions(+), 69 deletions(-) diff --git a/alf/alf.h b/alf/alf.h index 20dccfc..cc3fc6f 100644 --- a/alf/alf.h +++ b/alf/alf.h @@ -29,7 +29,7 @@ typedef struct { #define ALF_LAYOUT_SIZE_QUERY 0x01 #define ALF_LAYOUT_SIZE_PUSHBUTTON 0x04 /* unimplemented */ #define ALF_LAYOUT_SIZE_STATICTEXT 0x05 /* unimplemented */ -#define ALF_LAYOUT_SIZE_EDIT 0x06 /* unimplemented */ +#define ALF_LAYOUT_SIZE_EDIT 0x06 #define ALF_LAYOUT_SIZE_RADIOBUTTON 0x07 /* unimplemented */ #define ALF_LAYOUT_SIZE_CHECKBOX 0x07 /* unimplemented */ #define ALF_LAYOUT_SIZETYPE_MASK 0x0f diff --git a/alf/alfedit.cpp b/alf/alfedit.cpp index 87ddf80..f732452 100644 --- a/alf/alfedit.cpp +++ b/alf/alfedit.cpp @@ -1,55 +1,6 @@ #include "alfpriv.h" /* EDIT */ -static LRESULT CALLBACK -ALF__EditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData) -{ - (void)uIdSubclass; - (void)dwRefData; - - if (uMsg == ALF_WM_QUERYSIZE) { - HDC hDc = GetDC(hwnd); - HFONT font = (HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0); - - HFONT oldfont = SelectFont(hDc, font); - - TEXTMETRIC tm; - ZeroMemory(&tm, sizeof(tm)); - - if (GetTextMetrics(hDc, &tm)) { - SIZE *ps = (SIZE*)lParam; - if (!ps->cx) { - ps->cx = ALF_CentipointsToPixels(GetParent(hwnd), 12000); - } - - if (!ps->cy) { - ps->cy = tm.tmHeight + 2*ALF_Compat_GetSystemMetricsForDpi( - SM_CYEDGE, (UINT)ALF_CentipointsToPixels(GetParent(hwnd), 7200)) - + 4 /* padding internal to the edit control */; - } - } - - SelectFont(hDc, oldfont); - - ReleaseDC(hwnd, hDc); - return 0; - } else if (uMsg == ALF_WM_APPLYSIZE) { - RECT *p = (RECT *)lParam; - - // SWP_NOCOPYBITS as a bandaid since NT 3.51 doesn't invalidate properly - return (LRESULT)DeferWindowPos((HDWP)wParam, - hwnd, NULL, - p->left, p->top, - p->right - p->left, p->bottom - p->top, - SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOCOPYBITS); - } else if (uMsg == WM_DESTROY) { - ALF_Compat_RemoveWindowSubclass(hwnd, ALF__EditSubclassProc, 0); - } else if (uMsg == WM_SETFONT) { - ALF_InvalidateLayout(GetParent(hwnd)); - } - - return ALF_Compat_DefSubclassProc(hwnd, uMsg, wParam, lParam); -} HWND ALF_AddEdit(HWND win, WORD id, int x, int y, const TCHAR *text) @@ -75,10 +26,9 @@ ALF_AddEdit(HWND win, WORD id, int x, int y, const TCHAR *text) (HINSTANCE)GetWindowLongPtr(win, GWLP_HINSTANCE), NULL); - ALF_Compat_SetWindowSubclass(hwndEdit, ALF__EditSubclassProc, 0, 0); SetWindowPos(hwndEdit, NULL, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_FRAMECHANGED); - ALF_AddWidget(win, x, y, hwndEdit, 0, 0, ALF_LAYOUT_SIZE_QUERY | ALF_LAYOUT_CUSTOMPOS | ALF_LAYOUT_INHERITFONT); + ALF_AddWidget(win, x, y, hwndEdit, 0, 0, ALF_LAYOUT_SIZE_EDIT | ALF_LAYOUT_INHERITFONT); return hwndEdit; } diff --git a/alf/alflayout.cpp b/alf/alflayout.cpp index 73b05a8..ecd501c 100644 --- a/alf/alflayout.cpp +++ b/alf/alflayout.cpp @@ -90,15 +90,24 @@ ALF_Layout_Clear(ALFLayout *layout) layout->nRows = 0; } +static void +ALF_Layout_ForwardFontToWidget(ALFLayout *layout, HWND window, ALFWidgetPriv *widget, HFONT font, LPARAM redraw) +{ + if (widget->flags & ALF_LAYOUT_INHERITFONT) { + SendMessage(widget->hwnd, WM_SETFONT, (WPARAM)font, redraw); + + if (widget->flags & ALF_LAYOUT_SIZE_EDIT) + ALF_Layout_Invalidate(layout, window); + } +} + static void ALF_Layout_ForwardFont(ALFLayout *layout, HWND window, HFONT font, LPARAM redraw) { (void)window; ALF_FOR_LIST(ALFWidgetPriv, list, &layout->widgets, i) { - if (i->flags & ALF_LAYOUT_INHERITFONT) { - SendMessage(i->hwnd, WM_SETFONT, (WPARAM)font, redraw); - } + ALF_Layout_ForwardFontToWidget(layout, window, i, font, redraw); } } @@ -133,7 +142,37 @@ ALF_Layout_EnsureColumnExists(ALFLayout *layout, int colno) } static void -ALF_Layout_CalcMinWidgetSize(ALFWidgetPriv *c, HWND window, SIZE *s) +ALF_Layout_CalcEditSize(HWND hwndWindow, ALFLayout *layout, HWND hwndEdit, SIZE *ps) +{ + (void)layout; + + HDC hDc = GetDC(hwndEdit); + HFONT font = (HFONT)SendMessage(hwndEdit, WM_GETFONT, 0, 0); + + HFONT oldfont = SelectFont(hDc, font); + + TEXTMETRIC tm; + ZeroMemory(&tm, sizeof(tm)); + + if (GetTextMetrics(hDc, &tm)) { + if (!ps->cx) { + ps->cx = ALF_CentipointsToPixels(hwndWindow, 12000); + } + + if (!ps->cy) { + ps->cy = tm.tmHeight + 2*ALF_Compat_GetSystemMetricsForDpi( + SM_CYEDGE, (UINT)ALF_CentipointsToPixels(hwndWindow, 7200)) + + 4 /* padding internal to the edit control */; + } + } + + SelectFont(hDc, oldfont); + + ReleaseDC(hwndEdit, hDc); +} + +static void +ALF_Layout_CalcMinWidgetSize(ALFLayout *layout, ALFWidgetPriv *c, HWND window, SIZE *s) { if (c->flags & ALF_LAYOUT_SIZE_PX) { s->cx = c->width; @@ -150,6 +189,8 @@ ALF_Layout_CalcMinWidgetSize(ALFWidgetPriv *c, HWND window, SIZE *s) case ALF_LAYOUT_SIZE_QUERY: SendMessage(c->hwnd, ALF_WM_QUERYSIZE, 0, (LPARAM)s); break; + case ALF_LAYOUT_SIZE_EDIT: + ALF_Layout_CalcEditSize(window, layout, c->hwnd, s); default: // FIXME! unimplemented break; @@ -197,7 +238,7 @@ ALF_Layout_CalcSizes(ALFLayout* layout, HWND window) ALF_Layout_EnsureRowExists(layout, row); SIZE qs = { 0, 0 }; - ALF_Layout_CalcMinWidgetSize(c, window, &qs); + ALF_Layout_CalcMinWidgetSize(layout, c, window, &qs); if (qs.cx > layout->columns[col].calculatedMinWidth) layout->columns[col].calculatedMinWidth = qs.cx; @@ -339,6 +380,10 @@ ALF_Layout_Apply(ALFLayout* layout, HWND window) if (bgcolor == ALF_COLOR_TRANSPARENT) flags |= SWP_NOCOPYBITS; + // NT 3.51 and Win32s have so many invalidation bugs it's not even funny + if (!ALF_Compat_IsMinWindowsVersion(4, 0)) + flags |= SWP_NOCOPYBITS; + hdwp = DeferWindowPos(hdwp, c->hwnd, 0, r.left, r.top, r.right - r.left, r.bottom - r.top, @@ -366,7 +411,7 @@ ALF_Layout_AddWidget(ALFLayout* layout, HWND window, const ALFAddWidgetParams* p SetParent(w->hwnd, window); if (w->flags & ALF_LAYOUT_INHERITFONT) { - SendMessage(w->hwnd, WM_SETFONT, (WPARAM)SendMessage(window, WM_GETFONT, 0, 0), 0); + ALF_Layout_ForwardFontToWidget(layout, window, w, (HFONT)SendMessage(window, WM_GETFONT, 0, 0), 0); } if (w->flags & ALF_LAYOUT_INHERITBGCOLOR) { SendMessage(w->hwnd, ALF_WM_SETBGCOLOR, (WPARAM)SendMessage(window, ALF_WM_GETBGCOLOR, 0, 0), 0); @@ -374,7 +419,7 @@ ALF_Layout_AddWidget(ALFLayout* layout, HWND window, const ALFAddWidgetParams* p ALF_ListInsert(layout->widgets.prev, &w->list); - ALF_InvalidateLayout(window); + ALF_Layout_Invalidate(layout, window); } HWND @@ -459,7 +504,7 @@ ALF_Layout_SetWidgetPos(ALFLayout *layout, HWND window, HWND needle, POINT *p) w->x = p->x; w->y = p->y; - ALF_InvalidateLayout(window); + ALF_Layout_Invalidate(layout, window); return TRUE; } @@ -492,7 +537,7 @@ ALF_Layout_SetWidgetSize(ALFLayout *layout, HWND window, HWND needle, SIZE *s) w->width = s->cx; w->height = s->cy; - ALF_InvalidateLayout(window); + ALF_Layout_Invalidate(layout, window); return TRUE; } @@ -523,11 +568,11 @@ ALF_Layout_SetWidgetFlags(ALFLayout *layout, HWND window, HWND needle, DWORD fla w->flags = flags; if (flags & ALF_LAYOUT_INHERITFONT) - SendMessage(w->hwnd, WM_SETFONT, (WPARAM)SendMessage(window, WM_GETFONT, 0, 0), 0); + ALF_Layout_ForwardFontToWidget(layout, window, w, (HFONT)SendMessage(window, WM_GETFONT, 0, 0), 0); if (flags & ALF_LAYOUT_INHERITBGCOLOR) SendMessage(w->hwnd, ALF_WM_SETBGCOLOR, (WPARAM)SendMessage(window, ALF_WM_GETBGCOLOR, 0, 0), 0); - ALF_InvalidateLayout(window); + ALF_Layout_Invalidate(layout, window); return TRUE; } @@ -554,7 +599,7 @@ ALF_Layout_SetColumnSize(ALFLayout *layout, HWND window, int colno, int size) layout->columns[colno].requestedMinWidth = size; - ALF_InvalidateLayout(window); + ALF_Layout_Invalidate(layout, window); return TRUE; } @@ -577,7 +622,7 @@ ALF_Layout_SetColumnExpand(ALFLayout *layout, HWND window, int colno, int expand layout->columns[colno].requestedExpandNumerator = expand; - ALF_InvalidateLayout(window); + ALF_Layout_Invalidate(layout, window); return TRUE; } @@ -600,7 +645,7 @@ ALF_Layout_SetColumnFlags(ALFLayout *layout, HWND window, int colno, DWORD flags layout->columns[colno].requestedFlags = flags; - ALF_InvalidateLayout(window); + ALF_Layout_Invalidate(layout, window); return TRUE; } @@ -623,7 +668,7 @@ ALF_Layout_SetRowSize(ALFLayout *layout, HWND window, int rowno, int size) layout->rows[rowno].requestedMinWidth = size; - ALF_InvalidateLayout(window); + ALF_Layout_Invalidate(layout, window); return TRUE; } @@ -646,7 +691,7 @@ ALF_Layout_SetRowExpand(ALFLayout *layout, HWND window, int rowno, int expand) layout->rows[rowno].requestedExpandNumerator = expand; - ALF_InvalidateLayout(window); + ALF_Layout_Invalidate(layout, window); return TRUE; } @@ -669,7 +714,7 @@ ALF_Layout_SetRowFlags(ALFLayout *layout, HWND window, int rowno, DWORD flags) layout->rows[rowno].requestedFlags = flags; - ALF_InvalidateLayout(window); + ALF_Layout_Invalidate(layout, window); return TRUE; } -- cgit v1.2.3