From 46326d57e0c912f265595ffed375d211bbe23f44 Mon Sep 17 00:00:00 2001 From: Jonas Kümmerlin Date: Thu, 28 May 2020 00:12:09 +0200 Subject: minor rotations on window initialization, ALF_EnsureWindowBigEnough --- alf/alf.h | 3 ++ alf/alfwindow.cpp | 83 +++++++++++++++++++++++++++++++++++-------------------- widgetfactory.cpp | 3 +- 3 files changed, 57 insertions(+), 32 deletions(-) diff --git a/alf/alf.h b/alf/alf.h index e1ad26e..391f62a 100644 --- a/alf/alf.h +++ b/alf/alf.h @@ -174,6 +174,9 @@ ALF_GetDpi(HWND hwnd); LRESULT ALF_DefWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam); +void +ALF_EnsureWindowBigEnough(HWND toplevel); + HWND ALF_AddLabel(HWND win, WORD id, int x, int y, const TCHAR *text); diff --git a/alf/alfwindow.cpp b/alf/alfwindow.cpp index 15b635b..3434cf5 100644 --- a/alf/alfwindow.cpp +++ b/alf/alfwindow.cpp @@ -7,7 +7,6 @@ typedef struct { ALFLayout layout; HWND hwndFocus; HFONT hMessageFont; - WORD defid; } ALFWindowPriv; struct ALFWindow_CreateParams{ @@ -18,21 +17,18 @@ struct ALFWindow_CreateParams{ TCHAR _alf_windowClass[28] = {0}; static void -ALF_InitializeWindowPriv(HWND hwnd, ALFWindowPriv *priv, struct ALFWindow_CreateParams *params) +ALF_InitializeWindowPriv(HWND hwnd, ALFWindowPriv *priv) { (void)hwnd; - priv->vtbl = params->vtbl; - priv->closure = params->closure; ALF_Layout_Init(&priv->layout); priv->layout.bgcolor = ALF_COLOR_SYS(COLOR_BTNFACE); - priv->defid = IDOK; } static void ALF_DestroyWindowPriv(ALFWindowPriv *priv) { - if (priv->vtbl->postdestroy) + if (priv->vtbl && priv->vtbl->postdestroy) priv->vtbl->postdestroy(priv->closure); ALF_Layout_Clear(&priv->layout); @@ -92,6 +88,30 @@ ALF_PreTranslateMessagePriv(HWND win, ALFWindowPriv *priv, MSG *message) return ret; }*/ +void +ALF_EnsureWindowBigEnough(HWND toplevel) +{ + MINMAXINFO i; + ZeroMemory(&i, sizeof(i)); + SendMessage(toplevel, WM_GETMINMAXINFO, 0, (LPARAM)&i); + + WINDOWPLACEMENT wp; + ZeroMemory(&wp, sizeof(wp)); + wp.length = sizeof(wp); + + GetWindowPlacement(toplevel, &wp); + + if (wp.rcNormalPosition.right - wp.rcNormalPosition.left < i.ptMinTrackSize.x || + wp.rcNormalPosition.bottom - wp.rcNormalPosition.top < i.ptMinTrackSize.y) { + if (wp.rcNormalPosition.right - wp.rcNormalPosition.left < i.ptMinTrackSize.x) + wp.rcNormalPosition.right = wp.rcNormalPosition.left + i.ptMinTrackSize.x; + if (wp.rcNormalPosition.bottom - wp.rcNormalPosition.top < i.ptMinTrackSize.y) + wp.rcNormalPosition.bottom = wp.rcNormalPosition.top + i.ptMinTrackSize.y; + + SetWindowPlacement(toplevel, &wp); + } +} + static INT_PTR CALLBACK ALF_Window_DlgProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { @@ -107,27 +127,18 @@ ALF_Window_DlgProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) static LRESULT CALLBACK ALF_WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { - if (msg == WM_INITDIALOG) { - struct ALFWindow_CreateParams *params = (struct ALFWindow_CreateParams *)lparam; - + if (msg == WM_CREATE) { ALFWindowPriv *priv = ALF_New(ALFWindowPriv, 1); SetWindowLongPtr(hwnd, DLGWINDOWEXTRA, (LONG_PTR)priv); - ALF_InitializeWindowPriv(hwnd, priv, params); + ALF_InitializeWindowPriv(hwnd, priv); int dpi = (int)ALF_Compat_GetDpiForWindow(hwnd); SendMessage(hwnd, ALF_WM_DPICHANGE, 0, (LPARAM)dpi); // will also update fonts - - // TODO: after initializing, update window size and layout - if (priv->vtbl && priv->vtbl->initialize) { - return priv->vtbl->initialize(priv->closure, hwnd); - } else { - return TRUE; - } } ALFWindowPriv *priv = (ALFWindowPriv*)(void*)GetWindowLongPtr(hwnd, DLGWINDOWEXTRA); if (priv != NULL) { - if (priv->vtbl->message) { + if (priv->vtbl && priv->vtbl->message) { return priv->vtbl->message(priv->closure, hwnd, msg, wparam, lparam); } else { return ALF_DefWindowProc(hwnd, msg, wparam, lparam); @@ -152,6 +163,22 @@ ALF_DefWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { ALFWindowPriv *priv = (ALFWindowPriv*)GetWindowLongPtr(hwnd, DLGWINDOWEXTRA); + if (msg == WM_INITDIALOG) { + struct ALFWindow_CreateParams *params = (struct ALFWindow_CreateParams *)lparam; + + priv->vtbl = params->vtbl; + priv->closure = params->closure; + + BOOL retval = TRUE; + if (priv->vtbl && priv->vtbl->initialize) { + retval = priv->vtbl->initialize(priv->closure, hwnd); + } + + ALF_EnsureWindowBigEnough(hwnd); + + return retval; + } + if (msg == ALF_WM_GETMODALRESULT) { return (LRESULT)priv->modalResult; } @@ -200,7 +227,7 @@ ALF_DefWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) if (source != 0) ret = SendMessage(source, 0x2000 + WM_COMMAND, wparam, lparam); - if (ret == 0 && priv->vtbl->command) + if (ret == 0 && priv->vtbl && priv->vtbl->command) ret = priv->vtbl->command(priv->closure, hwnd, code, id, source); return ret; @@ -213,7 +240,7 @@ ALF_DefWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) if (nmhdr->hwndFrom) ret = SendMessage(nmhdr->hwndFrom, 0x2000 + WM_NOTIFY, wparam, lparam); - if (ret == 0 && priv->vtbl->notify) + if (ret == 0 && priv->vtbl && priv->vtbl->notify) ret = priv->vtbl->notify(priv->closure, hwnd, wparam, nmhdr); return ret; @@ -287,12 +314,12 @@ ALF_DefWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) } } - if (msg == WM_DESTROY && priv->vtbl->destroy) { + if (msg == WM_DESTROY && priv->vtbl && priv->vtbl->destroy) { priv->vtbl->destroy(priv->closure, hwnd); } if (msg == WM_CLOSE) { - if (!priv->vtbl->close || !priv->vtbl->close(priv->closure, hwnd)) { + if (!priv->vtbl || !priv->vtbl->close || !priv->vtbl->close(priv->closure, hwnd)) { priv->modalResult = 2; ShowWindow(hwnd, FALSE); } @@ -328,12 +355,8 @@ ALF_DefWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) LRESULT ret = 0; if (ALF_Layout_HandleMessage(&priv->layout, hwnd, msg, wparam, lparam, &ret)) { // if the layout was changed, our current size might be too small - // windows will call WM_GETMINMAXINFO and fix it if (msg == ALF_WM_VALIDATELAYOUT) { - RECT r; - if (GetWindowRect(hwnd, &r)) { - SetWindowPos(hwnd, NULL, r.left, r.top, r.right - r.left, r.bottom - r.top, SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOOWNERZORDER|SWP_NOZORDER); - } + ALF_EnsureWindowBigEnough(hwnd); } if (msg == ALF_WM_DPICHANGE) { @@ -379,12 +402,12 @@ ALF_CreateToplevelWindow(HWND hwndParent, ALFWindowVTable *vtbl, void *closure) } t; #pragma pack(pop) ZeroMemory(&t, sizeof(t)); - t.t.style = WS_OVERLAPPEDWINDOW | DS_CENTER; + t.t.style = WS_OVERLAPPEDWINDOW; t.t.dwExtendedStyle = 0; t.t.x = 0; t.t.y = 0; - t.t.cx = 200; - t.t.cy = 80; + t.t.cx = 10; + t.t.cy = 10; t.t.cdit = 0; // NOTE: this only works because we know the window class name is all ascii diff --git a/widgetfactory.cpp b/widgetfactory.cpp index db720ac..69d0c48 100644 --- a/widgetfactory.cpp +++ b/widgetfactory.cpp @@ -867,8 +867,6 @@ WinMain ALF_SetDefaultButton(win, ID_HELLO); ALF_SetFocus(GetNextDlgTabItem(win, win, FALSE)); - ALF_ResizeWindow(win, 1, 1); - HMENU mainmenu = CreateMenu(); HMENU filemenu = CreateMenu(); HMENU newtabmn = CreateMenu(); @@ -898,6 +896,7 @@ WinMain SetMenu(win, mainmenu); + ALF_EnsureWindowBigEnough(win); ALF_ShowModal(win); ALF_DestroyWindow(win); -- cgit v1.2.3