From be3ddf7cb2400f2a744799303ebe05d4caba54c3 Mon Sep 17 00:00:00 2001 From: Jonas Kümmerlin Date: Thu, 11 Jun 2020 11:11:33 +0200 Subject: refactor message reflection code should be more complete and correct, but not well tested yet --- alf/alf.cpp | 79 ++++++++++++++++++++++++++++++++++++++++++++++ alf/alfpriv.h | 3 ++ alf/alftoplevel.cpp | 90 +++++++++++++++++------------------------------------ 3 files changed, 110 insertions(+), 62 deletions(-) diff --git a/alf/alf.cpp b/alf/alf.cpp index 605f663..9cc2a59 100644 --- a/alf/alf.cpp +++ b/alf/alf.cpp @@ -240,3 +240,82 @@ ALF_MessageBox(HWND hwnd, const TCHAR *text, const TCHAR *caption, UINT type) return retval; } + +BOOL +ALF_ReflectMessage(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, LRESULT *pRet) +{ + switch (msg) { + case WM_DRAWITEM: { + if (wparam) { + DRAWITEMSTRUCT *dis = (DRAWITEMSTRUCT *)lparam; + *pRet = SendMessage(dis->hwndItem, 0x2000 + WM_DRAWITEM, wparam, lparam); + return TRUE; + } else { + // sent by a menu + return FALSE; + } + } + case WM_MEASUREITEM: { + if (wparam) { + // no HWND in MEASUREITEMSTRUCT, need to find the control by its id + HWND hwndControl = ALF_ControlHwndById(hwnd, (WORD)wparam); + if (hwndControl) { + *pRet = SendMessage(hwndControl, 0x2000 + WM_MEASUREITEM, wparam, lparam); + return TRUE; + } else { + return FALSE; + } + } else { + // sent by a menu + return FALSE; + } + + return TRUE; + } + case WM_DELETEITEM: { + DELETEITEMSTRUCT *dis = (DELETEITEMSTRUCT *)lparam; + *pRet = SendMessage(dis->hwndItem, 0x2000 + WM_DELETEITEM, wparam, lparam); + return TRUE; + } + case WM_VKEYTOITEM: + case WM_CHARTOITEM: + *pRet = SendMessage((HWND)lparam, 0x2000 + msg, wparam, lparam); + return TRUE; + case WM_COMPAREITEM: { + COMPAREITEMSTRUCT *cis = (COMPAREITEMSTRUCT *)lparam; + *pRet = SendMessage(cis->hwndItem, 0x2000 + WM_COMPAREITEM, wparam, lparam); + return TRUE; + } + case WM_NOTIFY: { + NMHDR *nmhdr = (NMHDR *)lparam; + if (nmhdr->hwndFrom) { + *pRet = SendMessage(nmhdr->hwndFrom, 0x2000 + WM_NOTIFY, wparam, lparam); + return !!*pRet; + } else { + return FALSE; + } + } + case WM_COMMAND: + if (lparam) { + *pRet = SendMessage((HWND)lparam, 0x2000 + WM_COMMAND, wparam, lparam); + return !!*pRet; + } else { + return FALSE; + } + case WM_HSCROLL: + case WM_VSCROLL: + SendMessage((HWND)lparam, 0x2000 + msg, wparam, lparam); + return FALSE; // always continue processing in parent + case WM_CTLCOLOR: + case WM_CTLCOLORMSGBOX: + case WM_CTLCOLOREDIT: + case WM_CTLCOLORLISTBOX: + case WM_CTLCOLORBTN: + case WM_CTLCOLORSTATIC: + case WM_CTLCOLORSCROLLBAR: + *pRet = SendMessage((HWND)lparam, 0x2000 + msg, wparam, lparam); + return !!*pRet; // let owner handle color stuff if the control didn’t return a brush + default: + return FALSE; + } +} diff --git a/alf/alfpriv.h b/alf/alfpriv.h index 586bbba..fb8f1c3 100644 --- a/alf/alfpriv.h +++ b/alf/alfpriv.h @@ -35,6 +35,9 @@ ALF_CreatePanelWindow(HWND parent, WORD id); BOOL ALF_ShouldMessageBubble(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam); +BOOL +ALF_ReflectMessage(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, LRESULT *pRet); + // TODO: refine custom control API, make it public // passed as ptr in WM_CREATE diff --git a/alf/alftoplevel.cpp b/alf/alftoplevel.cpp index 29e43cb..0a8ece7 100644 --- a/alf/alftoplevel.cpp +++ b/alf/alftoplevel.cpp @@ -193,6 +193,10 @@ ALF_Toplevel_DefWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { ALFToplevelPriv *priv = (ALFToplevelPriv*)GetWindowLongPtr(hwnd, DLGWINDOWEXTRA); + LRESULT r; + if (ALF_ReflectMessage(hwnd, msg, wparam, lparam, &r)) + return r; + if (msg == WM_INITDIALOG) { struct ALFToplevel_CreateParams *params = (struct ALFToplevel_CreateParams *)lparam; @@ -278,84 +282,46 @@ ALF_Toplevel_DefWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) return 0; } - if (msg == WM_COMMAND) { + if (msg == WM_COMMAND && priv->vtbl && priv->vtbl->command) { HWND source = (HWND)lparam; WORD code = HIWORD(wparam); WORD id = LOWORD(wparam); - LRESULT ret = 0; - if (source != 0) - ret = SendMessage(source, 0x2000 + WM_COMMAND, wparam, lparam); - - if (ret == 0 && priv->vtbl && priv->vtbl->command) - ret = priv->vtbl->command(priv->closure, hwnd, code, id, source); - - return ret; + return priv->vtbl->command(priv->closure, hwnd, code, id, source); } - if (msg == WM_NOTIFY) { + if (msg == WM_NOTIFY && priv->vtbl && priv->vtbl->notify) { NMHDR *nmhdr = (NMHDR *)lparam; - LRESULT ret = 0; - - if (nmhdr->hwndFrom) - ret = SendMessage(nmhdr->hwndFrom, 0x2000 + WM_NOTIFY, wparam, lparam); - - if (ret == 0 && priv->vtbl && priv->vtbl->notify) - ret = priv->vtbl->notify(priv->closure, hwnd, wparam, nmhdr); - - return ret; + return priv->vtbl->notify(priv->closure, hwnd, wparam, nmhdr); } - if (msg == WM_DRAWITEM) { - LPDRAWITEMSTRUCT dis = (DRAWITEMSTRUCT *)lparam; - LRESULT ret = 0; - if (wparam && dis->hwndItem) { - ret = SendMessage(dis->hwndItem, 0x2000 + WM_DRAWITEM, wparam, lparam); - } + if (msg == WM_CTLCOLORSTATIC) { + if (ALF_Compat_IsComCtlV6() && !ALF_Compat_IsVista()) { + // HACK! transparent checkbox background for comctl v6 on XP + // broken on every other version of windows, but not needed for Vista - if (ret) - return ret; - } + WCHAR c[32] = {0}; + GetClassNameW((HWND)lparam, c, sizeof(c)/sizeof(c[0])); - if (msg == WM_CTLCOLORSTATIC) { - LRESULT ret = SendMessage((HWND)lparam, 0x2000 + WM_CTLCOLORSTATIC, wparam, lparam); + if (!lstrcmpW(c, WC_BUTTONW)) { + RECT rcClient; + GetClientRect((HWND)lparam, &rcClient); - if (ret) { - return ret; - } else { - if (ALF_Compat_IsComCtlV6() && !ALF_Compat_IsVista()) { - // HACK! transparent checkbox background for comctl v6 on XP - // broken on every other version of windows, but not needed for Vista - - WCHAR c[32] = {0}; - GetClassNameW((HWND)lparam, c, sizeof(c)/sizeof(c[0])); - - if (!lstrcmpW(c, WC_BUTTONW)) { - RECT rcClient; - GetClientRect((HWND)lparam, &rcClient); - - ALF_Compat_DrawThemeParentBackground((HWND)lparam, (HDC)wparam, &rcClient); - SetBkColor((HDC)wparam, GetSysColor(COLOR_BTNFACE)); - SetTextColor((HDC)wparam, GetSysColor(COLOR_BTNTEXT)); - return (LRESULT)GetStockObject(HOLLOW_BRUSH); - } + ALF_Compat_DrawThemeParentBackground((HWND)lparam, (HDC)wparam, &rcClient); + SetBkColor((HDC)wparam, GetSysColor(COLOR_BTNFACE)); + SetTextColor((HDC)wparam, GetSysColor(COLOR_BTNTEXT)); + return (LRESULT)GetStockObject(HOLLOW_BRUSH); } - - SetBkColor((HDC)wparam, GetSysColor(COLOR_BTNFACE)); - SetTextColor((HDC)wparam, GetSysColor(COLOR_BTNTEXT)); - return (LRESULT)GetSysColorBrush(COLOR_BTNFACE); } + + SetBkColor((HDC)wparam, GetSysColor(COLOR_BTNFACE)); + SetTextColor((HDC)wparam, GetSysColor(COLOR_BTNTEXT)); + return (LRESULT)GetSysColorBrush(COLOR_BTNFACE); } if (msg == WM_CTLCOLORBTN) { - LRESULT ret = SendMessage((HWND)lparam, 0x2000 + WM_CTLCOLORBTN, wparam, lparam); - - if (ret) { - return ret; - } else { - SetBkColor((HDC)wparam, GetSysColor(COLOR_BTNFACE)); - SetTextColor((HDC)wparam, GetSysColor(COLOR_BTNTEXT)); - return (LRESULT)GetSysColorBrush(COLOR_BTNFACE); - } + SetBkColor((HDC)wparam, GetSysColor(COLOR_BTNFACE)); + SetTextColor((HDC)wparam, GetSysColor(COLOR_BTNTEXT)); + return (LRESULT)GetSysColorBrush(COLOR_BTNFACE); } if (msg == WM_SIZE) { -- cgit v1.2.3