From 249cc1f2f014405a9d0740ef79176a5ffdedcf96 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Tue, 7 Apr 2015 01:33:26 -0400 Subject: [PATCH] More work on the Windows control hooking. --- ...lehandle_windows.c => newcontrol_windows.c | 29 ++++++++++++++----- ui_windows.h | 6 ++-- uipriv_windows.h | 10 ------- 3 files changed, 25 insertions(+), 20 deletions(-) rename singlehandle_windows.c => newcontrol_windows.c (64%) diff --git a/singlehandle_windows.c b/newcontrol_windows.c similarity index 64% rename from singlehandle_windows.c rename to newcontrol_windows.c index b55a8b9f..0a46c0a9 100644 --- a/singlehandle_windows.c +++ b/newcontrol_windows.c @@ -1,8 +1,15 @@ // 6 april 2015 #include "uipriv_windows.h" -// Common code for controls with a single window handle. -// The only method NOT defined is preferredSize(); this differs between controls. +typedef struct uiSingleHWNDControl uiSingleHWNDControl; + +struct uiSingleHWNDControl { + uiControl control; + HWND hwnd; + BOOL (*onWM_COMMAND)(uiControl *, WPARAM, LPARAM, void *, LRESULT *); + BOOL (*onWM_NOTIFY)(uiControl *, WPARAM, LPARAM, void *, LRESULT *); + void *onCommandNotifyData; +}; #define S(c) ((uiSingleHWNDControl *) (c)) @@ -17,6 +24,8 @@ void singleSetParent(uiControl *c, uintptr_t parentHWND) logLastError("error changing control parent in singleSetParent()"); } +// TODO preferred size + static void singleResize(uiControl *c, intmax_t x, intmax_t y, intmax_t width, intmax_t height, uiSizing *d) { if (MoveWindow(S(c)->hwnd, x, y, width, height, TRUE) == 0) @@ -33,18 +42,18 @@ static void singleContainerHide(uiControl *c) ShowWindow(S(c)->hwnd, SW_HIDE); } -uiSingleHWNDControl *newSingleHWNDControl(DWORD exstyle, const WCHAR *class, DWORD style, HINSTANCE hInstance) +uiControl *uiWindowsNewControl(uiWindowsNewControlParams *p) { uiSingleHWNDControl *c; c = uiNew(uiSingleHWNDControl); - c->hwnd = CreateWindowExW(exstyle, - class, L"", - style | WS_CHILD | WS_VISIBLE, + c->hwnd = CreateWindowExW(p->dwExStyle, + p->lpClassName, L"", + p->dwStyle | WS_CHILD | WS_VISIBLE, 0, 0, 100, 100, // TODO specify control IDs properly - initialParent, NULL, hInstance, NULL); + initialParent, NULL, p->hInstance, NULL); if (c->hwnd == NULL) logLastError("error creating control in newSingleHWNDControl()"); @@ -54,5 +63,9 @@ uiSingleHWNDControl *newSingleHWNDControl(DWORD exstyle, const WCHAR *class, DWO c->control.containerShow = singleContainerShow; c->control.containerHide = singleContainerHide; - return c; + c->onWM_COMMAND = p->onWM_COMMAND; + c->onWM_NOTIFY = p->onWM_NOTIFY; + c->onCommandNotifyData = p->onCommandNotifyData; + + return (uiControl *) c; } diff --git a/ui_windows.h b/ui_windows.h index eb68475e..675f45b4 100644 --- a/ui_windows.h +++ b/ui_windows.h @@ -21,8 +21,10 @@ struct uiWindowsNewControlParams { // ui redirects the message back and calls these functions. // Store the result in the LRESULT pointer and return TRUE to return the given result; return FALSE to pass the notification up to your window procedure. // Note that these are only issued if they come from the uiControl itself; notifications from children of the uiControl (such as a header control) will be received normally. - BOOL (*onWM_COMMAND)(uiControl *, WPARAM, LPARAM, LRESULT *); - BOOL (*onWM_NOTIFY)(uiControl *, WPARAM, LPARAM, LRESULT *); + BOOL (*onWM_COMMAND)(uiControl *, WPARAM, LPARAM, void *, LRESULT *); + BOOL (*onWM_NOTIFY)(uiControl *, WPARAM, LPARAM, void *, LRESULT *); + // This is the void * parameter to both of the above. + void *onCommandNotifyData; }; uiControl *uiWindowsNewControl(uiWindowsNewControlParams *); diff --git a/uipriv_windows.h b/uipriv_windows.h index 7f714aca..bdaf793c 100644 --- a/uipriv_windows.h +++ b/uipriv_windows.h @@ -51,13 +51,3 @@ extern WCHAR *toUTF16(const char *); // window_windows.c extern ATOM registerWindowClass(HICON, HCURSOR); - -// singlehandle_windows.c -typedef struct uiSingleHWNDControl uiSingleHWNDControl; -struct uiSingleHWNDControl { - uiControl control; - HWND hwnd; - void (*voidEvent)(uiControl *, void *); - void *voidEventData; -}; -extern uiSingleHWNDControl *newSingleHWNDControl(DWORD, const WCHAR *, DWORD, HINSTANCE);