diff options
| author | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-04-19 13:00:57 +0200 |
|---|---|---|
| committer | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-04-19 13:00:57 +0200 |
| commit | 144736e53fd0142ec215a375bf588b9634e312ed (patch) | |
| tree | 3ad531ef51c131cd8d78b9cd99a053d524b5a6d5 /alf/alflayout.cpp | |
| parent | a44a7820fe6b211ba2084175e7d96907457ba3df (diff) | |
calc edit sizes in layout, no more subclassing
Diffstat (limited to 'alf/alflayout.cpp')
| -rw-r--r-- | alf/alflayout.cpp | 79 |
1 files changed, 62 insertions, 17 deletions
diff --git a/alf/alflayout.cpp b/alf/alflayout.cpp index 73b05a8..ecd501c 100644 --- a/alf/alflayout.cpp +++ b/alf/alflayout.cpp @@ -91,14 +91,23 @@ ALF_Layout_Clear(ALFLayout *layout) } 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; } |
