diff options
| author | Pietro Gagliardi <[email protected]> | 2015-04-07 01:33:26 -0400 |
|---|---|---|
| committer | Pietro Gagliardi <[email protected]> | 2015-04-07 01:33:26 -0400 |
| commit | dd8de11cc2b4601c6b6252c859d52b840ea801c3 (patch) | |
| tree | 51f55f4b953b8a4dc91628f63943313103d33a70 /new/newcontrol_windows.c | |
| parent | ab936d304f593ab14853216ce3e77bba1e71d4f4 (diff) | |
More work on the Windows control hooking.
Diffstat (limited to 'new/newcontrol_windows.c')
| -rw-r--r-- | new/newcontrol_windows.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/new/newcontrol_windows.c b/new/newcontrol_windows.c new file mode 100644 index 0000000..0a46c0a --- /dev/null +++ b/new/newcontrol_windows.c @@ -0,0 +1,71 @@ +// 6 april 2015 +#include "uipriv_windows.h" + +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)) + +static uintptr_t singleHandle(uiControl *c) +{ + return (uintptr_t) (S(c)->hwnd); +} + +void singleSetParent(uiControl *c, uintptr_t parentHWND) +{ + if (SetParent(S(c)->hwnd, (HWND) parentHWND) == NULL) + 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) + logLastError("error moving control in singleResize()"); +} + +static void singleContainerShow(uiControl *c) +{ + ShowWindow(S(c)->hwnd, SW_SHOW); +} + +static void singleContainerHide(uiControl *c) +{ + ShowWindow(S(c)->hwnd, SW_HIDE); +} + +uiControl *uiWindowsNewControl(uiWindowsNewControlParams *p) +{ + uiSingleHWNDControl *c; + + c = uiNew(uiSingleHWNDControl); + 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, p->hInstance, NULL); + if (c->hwnd == NULL) + logLastError("error creating control in newSingleHWNDControl()"); + + c->control.handle = singleHandle; + c->control.setParent = singleSetParent; + c->control.resize = singleResize; + c->control.containerShow = singleContainerShow; + c->control.containerHide = singleContainerHide; + + c->onWM_COMMAND = p->onWM_COMMAND; + c->onWM_NOTIFY = p->onWM_NOTIFY; + c->onCommandNotifyData = p->onCommandNotifyData; + + return (uiControl *) c; +} |
