summaryrefslogtreecommitdiff
path: root/alf/alf.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'alf/alf.cpp')
-rw-r--r--alf/alf.cpp79
1 files changed, 79 insertions, 0 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;
+ }
+}