diff options
| author | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2019-01-03 01:06:00 +0100 |
|---|---|---|
| committer | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2019-01-03 01:06:00 +0100 |
| commit | cd7b608f0517c1100f79b4a3ec654e4178373506 (patch) | |
| tree | 7ffce716180ea4d28ab2d889348aa46601e496d8 /alf/alf.cpp | |
| parent | 2517546be1599c63843e45bf1ac6c9ddb9c0dbf4 (diff) | |
widget layout improvements
Diffstat (limited to 'alf/alf.cpp')
| -rw-r--r-- | alf/alf.cpp | 164 |
1 files changed, 158 insertions, 6 deletions
diff --git a/alf/alf.cpp b/alf/alf.cpp index 981d1e7..6936436 100644 --- a/alf/alf.cpp +++ b/alf/alf.cpp @@ -274,7 +274,7 @@ ALF_ApplyLayout(HWND hwnd, ALFWindowPriv *win) } static void -ALF_InternalAddWidget(HWND hwnd, ALFWindowPriv *priv, ALFAddWidgetParams *params) +ALF_InternalAddWidget(HWND hwnd, ALFWindowPriv *priv, ALFWidgetLayoutParams *params) { ALFWidgetPriv *w = (ALFWidgetPriv*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY|HEAP_GENERATE_EXCEPTIONS, sizeof(ALFWidgetPriv)); w->hwnd = params->hwnd; @@ -297,6 +297,64 @@ ALF_InternalAddWidget(HWND hwnd, ALFWindowPriv *priv, ALFAddWidgetParams *params ALF_UpdateFontForWidget(priv, w); } +static BOOL +ALF_InternalSetLayoutParams(ALFWindowPriv *priv, HWND widget, const ALFWidgetLayoutParams *params) +{ + ALF_FOR_LIST(ALFWidgetPriv, list, &priv->widgets, w) { + if (w->hwnd == widget) { + w->hwnd = params->hwnd; + w->x = params->x; + w->y = params->y; + w->cptWidth = params->width; + w->cptHeight = params->height; + w->flags = params->flags; + w->cptMarginTop = params->margins[0]; + w->cptMarginRight = params->margins[1]; + w->cptMarginBottom = params->margins[2]; + w->cptMarginLeft = params->margins[3]; + + return TRUE; + } + } + + return FALSE; +} + +static BOOL +ALF_InternalGetLayoutParams(ALFWindowPriv *priv, HWND widget, ALFWidgetLayoutParams *params) +{ + ALF_FOR_LIST(ALFWidgetPriv, list, &priv->widgets, w) { + if (w->hwnd == widget) { + params->hwnd = w->hwnd; + params->x = w->x; + params->y = w->y; + params->width = w->cptWidth; + params->height = w->cptHeight; + params->flags = w->flags; + params->margins[0] = w->cptMarginTop; + params->margins[1] = w->cptMarginRight; + params->margins[2] = w->cptMarginBottom; + params->margins[3] = w->cptMarginLeft; + + return TRUE; + } + } + + return FALSE; +} + +static HWND +ALF_InternalGetWidgetAtPos(ALFWindowPriv *priv, UINT x, UINT y) +{ + ALF_FOR_LIST(ALFWidgetPriv, list, &priv->widgets, w) { + if (w->x == x && w->y == y) { + return w->hwnd; + } + } + + return NULL; +} + static void ALF_ApplyFocus(HWND hwnd, ALFWindowPriv *priv, BOOL restoringFocus) { @@ -344,10 +402,22 @@ ALF_DefWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) } if (msg == ALF_WM_ADDWIDGET) { - ALF_InternalAddWidget(hwnd, priv, (ALFAddWidgetParams *)lparam); + ALF_InternalAddWidget(hwnd, priv, (ALFWidgetLayoutParams *)lparam); return 0; } + if (msg == ALF_WM_GETLAYOUTPARAMS) { + return (LRESULT)ALF_InternalGetLayoutParams(priv, (HWND)wparam, (ALFWidgetLayoutParams *)lparam); + } + + if (msg == ALF_WM_SETLAYOUTPARAMS) { + return (LRESULT)ALF_InternalSetLayoutParams(priv, (HWND)wparam, (const ALFWidgetLayoutParams *)lparam); + } + + if (msg == ALF_WM_GETWIDGETATPOS) { + return (LRESULT)ALF_InternalGetWidgetAtPos(priv, ((UINT*)lparam)[0], ((UINT*)lparam)[1]); + } + if (msg == ALF_WM_SETFOCUS) { priv->hwndFocus = (HWND)lparam; ALF_ApplyFocus(hwnd, priv, FALSE); @@ -485,7 +555,7 @@ ALF_DefWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) void ALF_AddWidget(HWND win, UINT x, UINT y, HWND widget, UINT minWidth, UINT minHeight, DWORD flags) { - ALFAddWidgetParams params; + ALFWidgetLayoutParams params; ZeroMemory(¶ms, sizeof(params)); params.hwnd = widget; params.x = x; @@ -496,10 +566,9 @@ ALF_AddWidget(HWND win, UINT x, UINT y, HWND widget, UINT minWidth, UINT minHeig ALF_AddWidgetEx(win, ¶ms); } -void -ALF_AddWidgetEx(HWND win, const ALFAddWidgetParams *p) +void ALF_AddWidgetEx(HWND win, const ALFWidgetLayoutParams* params) { - SendMessage(win, ALF_WM_ADDWIDGET, 0, (LPARAM)p); + SendMessage(win, ALF_WM_ADDWIDGET, 0, (LPARAM)params); } static LRESULT CALLBACK @@ -787,3 +856,86 @@ ALF_WidgetText(HWND parent, WORD id) return NULL; } + +DWORD +ALF_WidgetLayoutFlags(HWND parent, HWND widget) +{ + ALFWidgetLayoutParams p; + if (SendMessage(parent, ALF_WM_GETLAYOUTPARAMS, (WPARAM)widget, (LPARAM)&p)) { + return p.flags; + } else { + return 0; + } +} + +BOOL +ALF_SetWidgetLayoutFlags(HWND parent, HWND widget, DWORD flags) +{ + ALFWidgetLayoutParams p; + if (SendMessage(parent, ALF_WM_GETLAYOUTPARAMS, (WPARAM)widget, (LPARAM)&p)) { + p.flags = flags; + return SendMessage(parent, ALF_WM_SETLAYOUTPARAMS, (WPARAM)widget, (LPARAM)&p); + } + + return FALSE; +} + +BOOL +ALF_WidgetLayoutPosition(HWND parent, HWND widget, UINT *pX, UINT *pY) +{ + ALFWidgetLayoutParams p; + if (SendMessage(parent, ALF_WM_GETLAYOUTPARAMS, (WPARAM)widget, (LPARAM)&p)) { + *pX = p.x; + *pY = p.y; + return TRUE; + } else { + return FALSE; + } +} + +BOOL +ALF_SetWidgetLayoutPosition(HWND parent, HWND widget, UINT x, UINT y) +{ + ALFWidgetLayoutParams p; + if (SendMessage(parent, ALF_WM_GETLAYOUTPARAMS, (WPARAM)widget, (LPARAM)&p)) { + p.x = x; + p.y = y; + return SendMessage(parent, ALF_WM_SETLAYOUTPARAMS, (WPARAM)widget, (LPARAM)&p); + } + + return FALSE; +} + +BOOL +ALF_WidgetLayoutSize(HWND parent, HWND widget, UINT *pCptWidth, UINT *pCptHeight) +{ + ALFWidgetLayoutParams p; + if (SendMessage(parent, ALF_WM_GETLAYOUTPARAMS, (WPARAM)widget, (LPARAM)&p)) { + *pCptWidth = p.width; + *pCptHeight = p.height; + return TRUE; + } else { + return FALSE; + } +} + +BOOL +ALF_SetWidgetLayoutSize(HWND parent, HWND widget, UINT cptWidth, UINT cptHeight) +{ + ALFWidgetLayoutParams p; + if (SendMessage(parent, ALF_WM_GETLAYOUTPARAMS, (WPARAM)widget, (LPARAM)&p)) { + p.width = cptWidth; + p.height = cptHeight; + return SendMessage(parent, ALF_WM_SETLAYOUTPARAMS, (WPARAM)widget, (LPARAM)&p); + } + + return FALSE; +} + +HWND +ALF_WidgetAtLayoutPosition(HWND parent, UINT x, UINT y) +{ + UINT xy[2] = { x, y }; + + return (HWND)SendMessage(parent, ALF_WM_GETWIDGETATPOS, 0, (LPARAM)&xy); +} |
