aboutsummaryrefslogtreecommitdiff
path: root/src/libui_sdl/libui/windows/container.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libui_sdl/libui/windows/container.cpp')
-rw-r--r--src/libui_sdl/libui/windows/container.cpp110
1 files changed, 110 insertions, 0 deletions
diff --git a/src/libui_sdl/libui/windows/container.cpp b/src/libui_sdl/libui/windows/container.cpp
new file mode 100644
index 0000000..9ec1e28
--- /dev/null
+++ b/src/libui_sdl/libui/windows/container.cpp
@@ -0,0 +1,110 @@
+// 26 april 2015
+#include "uipriv_windows.hpp"
+
+// Code for the HWND of the following uiControls:
+// - uiBox
+// - uiRadioButtons
+// - uiSpinbox
+// - uiTab
+// - uiForm
+// - uiGrid
+
+struct containerInit {
+ uiWindowsControl *c;
+ void (*onResize)(uiWindowsControl *);
+};
+
+static LRESULT CALLBACK containerWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ RECT r;
+ HDC dc;
+ PAINTSTRUCT ps;
+ CREATESTRUCTW *cs = (CREATESTRUCTW *) lParam;
+ WINDOWPOS *wp = (WINDOWPOS *) lParam;
+ MINMAXINFO *mmi = (MINMAXINFO *) lParam;
+ struct containerInit *init;
+ uiWindowsControl *c;
+ void (*onResize)(uiWindowsControl *);
+ int minwid, minht;
+ LRESULT lResult;
+
+ if (handleParentMessages(hwnd, uMsg, wParam, lParam, &lResult) != FALSE)
+ return lResult;
+ switch (uMsg) {
+ case WM_CREATE:
+ init = (struct containerInit *) (cs->lpCreateParams);
+ SetWindowLongPtrW(hwnd, GWLP_USERDATA, (LONG_PTR) (init->onResize));
+ SetWindowLongPtrW(hwnd, 0, (LONG_PTR) (init->c));
+ break; // defer to DefWindowProc()
+ case WM_WINDOWPOSCHANGED:
+ if ((wp->flags & SWP_NOSIZE) != 0)
+ break; // defer to DefWindowProc();
+ onResize = (void (*)(uiWindowsControl *)) GetWindowLongPtrW(hwnd, GWLP_USERDATA);
+ c = (uiWindowsControl *) GetWindowLongPtrW(hwnd, 0);
+ (*(onResize))(c);
+ return 0;
+ case WM_GETMINMAXINFO:
+ lResult = DefWindowProcW(hwnd, uMsg, wParam, lParam);
+ c = (uiWindowsControl *) GetWindowLongPtrW(hwnd, 0);
+ uiWindowsControlMinimumSize(c, &minwid, &minht);
+ mmi->ptMinTrackSize.x = minwid;
+ mmi->ptMinTrackSize.y = minht;
+ return lResult;
+ case WM_PAINT:
+ dc = BeginPaint(hwnd, &ps);
+ if (dc == NULL) {
+ logLastError(L"error beginning container paint");
+ // bail out; hope DefWindowProc() catches us
+ break;
+ }
+ r = ps.rcPaint;
+ paintContainerBackground(hwnd, dc, &r);
+ EndPaint(hwnd, &ps);
+ return 0;
+ // tab controls use this to draw the background of the tab area
+ case WM_PRINTCLIENT:
+ uiWindowsEnsureGetClientRect(hwnd, &r);
+ paintContainerBackground(hwnd, (HDC) wParam, &r);
+ return 0;
+ case WM_ERASEBKGND:
+ // avoid some flicker
+ // we draw the whole update area anyway
+ return 1;
+ }
+ return DefWindowProcW(hwnd, uMsg, wParam, lParam);
+}
+
+ATOM initContainer(HICON hDefaultIcon, HCURSOR hDefaultCursor)
+{
+ WNDCLASSW wc;
+
+ ZeroMemory(&wc, sizeof (WNDCLASSW));
+ wc.lpszClassName = containerClass;
+ wc.lpfnWndProc = containerWndProc;
+ wc.hInstance = hInstance;
+ wc.hIcon = hDefaultIcon;
+ wc.hCursor = hDefaultCursor;
+ wc.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1);
+ wc.cbWndExtra = sizeof (void *);
+ return RegisterClassW(&wc);
+}
+
+void uninitContainer(void)
+{
+ if (UnregisterClassW(containerClass, hInstance) == 0)
+ logLastError(L"error unregistering container window class");
+}
+
+HWND uiWindowsMakeContainer(uiWindowsControl *c, void (*onResize)(uiWindowsControl *))
+{
+ struct containerInit init;
+
+ // TODO onResize cannot be NULL
+ init.c = c;
+ init.onResize = onResize;
+ return uiWindowsEnsureCreateControlHWND(WS_EX_CONTROLPARENT,
+ containerClass, L"",
+ 0,
+ hInstance, (LPVOID) (&init),
+ FALSE);
+}