fix grid background painting

Tue, 11 Nov 2025 14:27:54 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Tue, 11 Nov 2025 14:27:54 +0100
changeset 891
0804fc9298f6
parent 890
8d30cbd1c465
child 892
0fbaac4aafc8

fix grid background painting

ui/win32/container.c file | annotate | diff | comparison | revisions
ui/win32/container.h file | annotate | diff | comparison | revisions
ui/win32/grid.c file | annotate | diff | comparison | revisions
ui/win32/toolkit.c file | annotate | diff | comparison | revisions
--- a/ui/win32/container.c	Tue Nov 04 20:38:19 2025 +0100
+++ b/ui/win32/container.c	Tue Nov 11 14:27:54 2025 +0100
@@ -35,7 +35,7 @@
 
 
 static W32WidgetClass grid_layout_widget_class = {
-    .eventproc = NULL,
+    .eventproc = ui_grid_widget_event,
     .enable = NULL,
     .show = w32_widget_default_show,
     .get_preferred_size = ui_grid_layout_get_preferred_size,
@@ -62,6 +62,14 @@
     ctn->container.newline = FALSE;
 }
 
+void ui_grid_widget_event(W32Widget *widget, HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
+    HDC hdc = (HDC)wParam;
+    UiGridWidget *grid = (UiGridWidget*)widget;
+    RECT rc;
+    GetClientRect(hwnd, &rc);
+    FillRect(hdc, &rc, grid->brush);
+}
+
 W32Size ui_grid_layout_get_preferred_size(W32Widget *widget) {
     UiGridLayout *grid = widget->layoutmanager;
     W32Size size;
@@ -134,26 +142,27 @@
             TEXT("STATIC"),
             NULL,
             WS_CHILD | WS_VISIBLE,
-            0, 0, 100, 100,
+            0, 0, 300, 300,
             parent,
             NULL,
             hInstance,
             NULL);
     SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)ui_default_eventproc);
 
-    W32Widget *widget = w32_widget_new(&grid_layout_widget_class, hwnd);
-    ui_container_add(container, widget, &layout);
+    UiGridWidget *widget = w32_widget_create(&grid_layout_widget_class, hwnd, sizeof(UiGridWidget));
+    ui_container_add(container, (W32Widget*)widget, &layout);
 
     UiContainerX *gridContainer = ui_grid_container_create(obj, hwnd, args->columnspacing, args->rowspacing, INSETS_ZERO);
     uic_object_push_container(obj, gridContainer);
 
     UiGridLayoutContainer *grid = (UiGridLayoutContainer*)gridContainer;
-    widget->layout = (W32LayoutFunc)ui_grid_layout;
-    widget->layoutmanager = grid->layout;
+    widget->widget.layout = (W32LayoutFunc)ui_grid_layout;
+    widget->widget.layoutmanager = grid->layout;
+    widget->brush = GetSysColorBrush(COLOR_BTNFACE);
     grid->layout->preferred_width = 200;
     grid->layout->preferred_height = 200;
 
-    return widget;
+    return (W32Widget*)widget;
 }
 
 UiContainerX* ui_grid_container_create(UiObject *obj, HWND hwnd, short columnspacing, short rowspacing, GridEdgeInsets padding) {
--- a/ui/win32/container.h	Tue Nov 04 20:38:19 2025 +0100
+++ b/ui/win32/container.h	Tue Nov 11 14:27:54 2025 +0100
@@ -40,6 +40,7 @@
 typedef struct UiContainerPrivate    UiContainerPrivate;
 typedef struct UiGridLayoutContainer UiGridLayoutContainer;
 typedef struct UiBoxContainer        UiBoxContainer;
+typedef struct UiGridWidget          UiGridWidget;
 
 enum UiBoxOrientation {
     UI_BOX_VERTICAL = 0,
@@ -88,10 +89,16 @@
     UiBool def_vfill;
 };
 
+struct UiGridWidget {
+    W32Widget widget;
+    HBRUSH brush;
+};
+
 UiContainerPrivate* ui_obj_container(UiObject *obj);
 HWND ui_container_get_parent(UiContainerPrivate *ctn);
 void ui_container_add(UiContainerPrivate *ctn, W32Widget *widget, UiLayout *layout);
 
+void ui_grid_widget_event(W32Widget *widget, HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
 W32Size ui_grid_layout_get_preferred_size(W32Widget *widget);
 
 UiContainerX* ui_box_container_create(UiObject *obj, HWND hwnd, UiBoxOrientation orientation, short spacing, GridEdgeInsets padding);
--- a/ui/win32/grid.c	Tue Nov 04 20:38:19 2025 +0100
+++ b/ui/win32/grid.c	Tue Nov 11 14:27:54 2025 +0100
@@ -294,6 +294,8 @@
         child_x = col->pos + elm->layout.margin.left;
         child_y = row->pos + elm->layout.margin.top;
         SetWindowPos(elm->widget->hwnd, NULL, child_x, child_y, child_width, child_height, SWP_NOZORDER);
+        InvalidateRect(elm->widget->hwnd, NULL, TRUE);
+        UpdateWindow(elm->widget->hwnd);
         if (elm->widget->layout) {
             elm->widget->layout(elm->widget->layoutmanager, child_width, child_height);
         }
--- a/ui/win32/toolkit.c	Tue Nov 04 20:38:19 2025 +0100
+++ b/ui/win32/toolkit.c	Tue Nov 11 14:27:54 2025 +0100
@@ -141,6 +141,7 @@
             if (cmdWidget && cmdWidget->wclass->eventproc) {
                 cmdWidget->wclass->eventproc(cmdWidget, hwnd, uMsg, wParam, lParam);
             }
+            break;
         }
         case WM_SIZE: {
             int width  = LOWORD(lParam);

mercurial