static void radiobuttonsRelayout(uiRadioButtons *r) { RECT client; intmax_t height1; intmax_t h; intmax_t x, y, width, height; uiWindowsEnsureGetClientRect(r->hwnd, &client); x = client.left; y = client.top; width = client.right - client.left; height = client.bottom - client.top; // TODO compute the real height1 height1 = 25; for (const HWND &hwnd : *(r->hwnds)) { h = height1; if (h > height) // clip to height h = height; uiWindowsEnsureMoveWindowDuringResize(hwnd, x, y, width, h); y += height1; height -= height1; if (height <= 0) // clip to height break; // TODO don't do the above to avoid overlap // TODO in fact, only do this on add/remove/change labels/etc. } }
static void spinboxRelayout(uiSpinbox *s) { RECT r; // make the edit fill the container first; the new updown will resize it uiWindowsEnsureGetClientRect(s->hwnd, &r); uiWindowsEnsureMoveWindowDuringResize(s->edit, r.left, r.top, r.right - r.left, r.bottom - r.top); recreateUpDown(s); }
static void groupRelayout(uiGroup *g) { RECT r; int mx, mtop, mbottom; if (g->child == NULL) return; uiWindowsEnsureGetClientRect(g->hwnd, &r); groupMargins(g, &mx, &mtop, &mbottom); r.left += mx; r.top += mtop; r.right -= mx; r.bottom -= mbottom; uiWindowsEnsureMoveWindowDuringResize((HWND) uiControlHandle(g->child), r.left, r.top, r.right - r.left, r.bottom - r.top); }
static void moveWindowsUp(struct colorDialog *c, LONG by, ...) { va_list ap; HWND cur; RECT r; va_start(ap, by); for (;;) { cur = va_arg(ap, HWND); if (cur == NULL) break; uiWindowsEnsureGetWindowRect(cur, &r); mapWindowRect(NULL, c->hwnd, &r); r.top -= by; r.bottom -= by; // TODO this isn't technically during a resize uiWindowsEnsureMoveWindowDuringResize(cur, r.left, r.top, r.right - r.left, r.bottom - r.top); } va_end(ap); }
static void windowRelayout(uiWindow *w) { uiWindowsSizing sizing; int x, y, width, height; RECT r; int mx, my; HWND child; if (w->child == NULL) return; x = 0; y = 0; uiWindowsEnsureGetClientRect(w->hwnd, &r); width = r.right - r.left; height = r.bottom - r.top; windowMargins(w, &mx, &my); x += mx; y += my; width -= 2 * mx; height -= 2 * my; child = (HWND) uiControlHandle(w->child); uiWindowsEnsureMoveWindowDuringResize(child, x, y, width, height); }
static void formRelayout(uiForm *f) { RECT r; int x, y, width, height; int xpadding, ypadding; int nStretchy; int labelwid, stretchyht; int thiswid; int i; int minimumWidth, minimumHeight; uiWindowsSizing sizing; int labelht, labelyoff; int nVisible; if (f->controls->size() == 0) return; uiWindowsEnsureGetClientRect(f->hwnd, &r); x = r.left; y = r.top; width = r.right - r.left; height = r.bottom - r.top; // 0) get this Form's padding formPadding(f, &xpadding, &ypadding); // 1) get width of labels and height of non-stretchy controls // this will tell us how much space will be left for controls labelwid = 0; stretchyht = height; nStretchy = 0; nVisible = 0; for (struct formChild &fc : *(f->controls)) { if (!uiControlVisible(fc.c)) { ShowWindow(fc.label, SW_HIDE); continue; } ShowWindow(fc.label, SW_SHOW); nVisible++; thiswid = uiWindowsWindowTextWidth(fc.label); if (labelwid < thiswid) labelwid = thiswid; if (fc.stretchy) { nStretchy++; continue; } uiWindowsControlMinimumSize(uiWindowsControl(fc.c), &minimumWidth, &minimumHeight); fc.height = minimumHeight; stretchyht -= minimumHeight; } if (nVisible == 0) // nothing to do return; // 2) inset the available rect by the needed padding width -= xpadding; height -= (nVisible - 1) * ypadding; stretchyht -= (nVisible - 1) * ypadding; // 3) now get the width of controls and the height of stretchy controls width -= labelwid; if (nStretchy != 0) { stretchyht /= nStretchy; for (struct formChild &fc : *(f->controls)) { if (!uiControlVisible(fc.c)) continue; if (fc.stretchy) fc.height = stretchyht; } } // 4) get the y offset labelyoff = labelYOffset; uiWindowsGetSizing(f->hwnd, &sizing); uiWindowsSizingDlgUnitsToPixels(&sizing, NULL, &labelyoff); // 5) now we can position controls // first, make relative to the top-left corner of the container // also prefer left alignment on Windows x = labelwid + xpadding; y = 0; for (const struct formChild &fc : *(f->controls)) { if (!uiControlVisible(fc.c)) continue; labelht = labelHeight; uiWindowsGetSizing(f->hwnd, &sizing); uiWindowsSizingDlgUnitsToPixels(&sizing, NULL, &labelht); uiWindowsEnsureMoveWindowDuringResize(fc.label, 0, y + labelyoff - sizing.InternalLeading, labelwid, labelht); uiWindowsEnsureMoveWindowDuringResize((HWND) uiControlHandle(fc.c), x, y, width, fc.height); y += fc.height + ypadding; } }