summaryrefslogtreecommitdiff
path: root/alf/alflayout.cpp
diff options
context:
space:
mode:
authorJonas Kümmerlin <jonas@kuemmerlin.eu>2020-05-25 21:35:28 +0200
committerJonas Kümmerlin <jonas@kuemmerlin.eu>2020-05-25 21:43:48 +0200
commita06c7ff02ce50243cd1e4bef8bad25bd1978bcda (patch)
tree48c0462afd5a9566ffd44cb54659ecea934e70c1 /alf/alflayout.cpp
parentd1be0b5dce72a3bc355e915916955b1a9a267c47 (diff)
add explicit functions for adding native buttons
Diffstat (limited to 'alf/alflayout.cpp')
-rw-r--r--alf/alflayout.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/alf/alflayout.cpp b/alf/alflayout.cpp
index 470f728..974cd78 100644
--- a/alf/alflayout.cpp
+++ b/alf/alflayout.cpp
@@ -257,6 +257,46 @@ ALF_Layout_CalcCheckboxSize(HWND hwndWindow, ALFLayout *layout, HWND hwndCheckbo
}
static void
+ALF_Layout_CalcButtonSize(HWND hwndWindow, ALFLayout *layout, HWND hwndButton, SIZE *pSize)
+{
+ (void)hwndWindow;
+
+ HDC hdc = GetDC(hwndButton);
+ HFONT oldFont = SelectFont(hdc, (HFONT)SendMessage(hwndButton, WM_GETFONT, 0, 0));
+
+ // calc drawtext style
+ UINT format = DT_LEFT | DT_EXPANDTABS | DT_CALCRECT;
+
+ if (!(GetWindowLong(hwndButton, GWL_STYLE) & BS_MULTILINE))
+ format |= DT_SINGLELINE;
+
+ RECT r = { 0, 0, 0x7FFFFFFF, 100 };
+
+ TCHAR *textbuf = ALF_Text(hwndButton);
+ DrawText(hdc, textbuf, -1, &r, format);
+ ALF_Free(textbuf);
+
+ int xpadding = ALF_Compat_GetSystemMetricsForDpi(SM_CXEDGE,
+ (UINT)layout->dpi) * 2 + 6;
+ int ypadding = ALF_Compat_GetSystemMetricsForDpi(SM_CYEDGE,
+ (UINT)layout->dpi) * 2 + 4;
+
+ if (pSize->cx < r.right - r.left + xpadding) {
+ pSize->cx = r.right - r.left + xpadding;
+ }
+ if (pSize->cy < r.bottom - r.top + ypadding) {
+ pSize->cy = r.bottom - r.top + ypadding;
+ }
+ if (pSize->cx < pSize->cy) {
+ pSize->cx = pSize->cy;
+ }
+
+ SelectFont(hdc, oldFont);
+
+ ReleaseDC(hwndButton, hdc);
+}
+
+static void
ALF_Layout_CalcMinWidgetSize(ALFLayout *layout, ALFWidgetPriv *c, HWND window, SIZE *s)
{
if (c->flags & ALF_LAYOUT_SIZE_PX) {
@@ -280,6 +320,9 @@ ALF_Layout_CalcMinWidgetSize(ALFLayout *layout, ALFWidgetPriv *c, HWND window, S
case ALF_LAYOUT_SIZE_CHECKBOX:
ALF_Layout_CalcCheckboxSize(window, layout, c->hwnd, s);
break;
+ case ALF_LAYOUT_SIZE_PUSHBUTTON:
+ ALF_Layout_CalcButtonSize(window, layout, c->hwnd, s);
+ break;
default:
// FIXME! unimplemented
break;