Mercurial > foo_out_sdl
diff foosdk/sdk/foobar2000/helpers/dialog_resize_helper.cpp @ 1:20d02a178406 default tip
*: check in everything else
yay
| author | Paper <paper@tflc.us> |
|---|---|
| date | Mon, 05 Jan 2026 02:15:46 -0500 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/foosdk/sdk/foobar2000/helpers/dialog_resize_helper.cpp Mon Jan 05 02:15:46 2026 -0500 @@ -0,0 +1,164 @@ +#include "StdAfx.h" + +#ifdef FOOBAR2000_DESKTOP_WINDOWS +#include "dialog_resize_helper.h" + +static BOOL GetChildWindowRect(HWND wnd, UINT id, RECT* child) +{ + RECT temp; + HWND wndChild = GetDlgItem(wnd, id); + if (wndChild == NULL) return FALSE; + if (!GetWindowRect(wndChild, &temp)) return FALSE; + if (!MapWindowPoints(0, wnd, (POINT*)&temp, 2)) return FALSE; + *child = temp; + return TRUE; +} + +void dialog_resize_helper::set_parent(HWND wnd) +{ + reset(); + parent = wnd; + GetClientRect(parent,&orig_client); +} + +void dialog_resize_helper::reset() +{ + parent = 0; + sizegrip = 0; +} + +void dialog_resize_helper::on_wm_size() +{ + if (parent) + { + unsigned count = (unsigned) m_table.get_size(); + if (sizegrip != 0) count++; + HDWP hWinPosInfo = BeginDeferWindowPos(count); + for(unsigned n=0;n<m_table.get_size();n++) + { + param & e = m_table[n]; + const RECT & orig_rect = rects[n]; + RECT cur_client; + GetClientRect(parent,&cur_client); + HWND wnd = GetDlgItem(parent,e.id); + if (wnd != NULL) { + unsigned dest_x = orig_rect.left, dest_y = orig_rect.top, + dest_cx = orig_rect.right - orig_rect.left, dest_cy = orig_rect.bottom - orig_rect.top; + + int delta_x = cur_client.right - orig_client.right, + delta_y = cur_client.bottom - orig_client.bottom; + + if (e.flags & X_MOVE) + dest_x += delta_x; + else if (e.flags & X_SIZE) + dest_cx += delta_x; + + if (e.flags & Y_MOVE) + dest_y += delta_y; + else if (e.flags & Y_SIZE) + dest_cy += delta_y; + + hWinPosInfo = DeferWindowPos(hWinPosInfo, wnd,0,dest_x,dest_y,dest_cx,dest_cy,SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE); + } + } + if (sizegrip != 0) + { + RECT rc, rc_grip; + GetClientRect(parent, &rc); + GetWindowRect(sizegrip, &rc_grip); + hWinPosInfo = DeferWindowPos(hWinPosInfo, sizegrip, NULL, rc.right - (rc_grip.right - rc_grip.left), rc.bottom - (rc_grip.bottom - rc_grip.top), 0, 0, SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE | SWP_NOSIZE); + } + EndDeferWindowPos(hWinPosInfo); + //RedrawWindow(parent,0,0,RDW_INVALIDATE); + } +} + +bool dialog_resize_helper::process_message(HWND wnd,UINT msg,WPARAM wp,LPARAM lp) { + LRESULT result = 0; + if (!ProcessWindowMessage(wnd,msg,wp,lp,result)) return false; + SetWindowLongPtr(wnd,DWLP_MSGRESULT,result); + return true; +} + +BOOL dialog_resize_helper::ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult) { + switch(uMsg) { + case WM_SIZE: + on_wm_size(); + return FALSE; + case WM_GETMINMAXINFO: + { + RECT r; + LPMINMAXINFO info = (LPMINMAXINFO) lParam; + DWORD dwStyle = GetWindowLong(hWnd, GWL_STYLE); + DWORD dwExStyle = GetWindowLong(hWnd, GWL_EXSTYLE); + if (max_x && max_y) + { + r.left = 0; r.right = max_x; + r.top = 0; r.bottom = max_y; + MapDialogRect(hWnd,&r); + AdjustWindowRectEx(&r, dwStyle, FALSE, dwExStyle); + info->ptMaxTrackSize.x = r.right - r.left; + info->ptMaxTrackSize.y = r.bottom - r.top; + } + if (min_x && min_y) + { + r.left = 0; r.right = min_x; + r.top = 0; r.bottom = min_y; + MapDialogRect(hWnd,&r); + AdjustWindowRectEx(&r, dwStyle, FALSE, dwExStyle); + info->ptMinTrackSize.x = r.right - r.left; + info->ptMinTrackSize.y = r.bottom - r.top; + } + } + lResult = 0; + return TRUE; + case WM_INITDIALOG: + set_parent(hWnd); + { + t_size n; + for(n=0;n<m_table.get_size();n++) { + GetChildWindowRect(parent,m_table[n].id,&rects[n]); + } + } + return FALSE; + case WM_DESTROY: + reset(); + return FALSE; + default: + return FALSE; + } +} + +void dialog_resize_helper::add_sizegrip() +{ + if (parent != 0 && sizegrip == 0) + { + sizegrip = CreateWindowEx(0, WC_SCROLLBAR, _T(""), WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | SBS_SIZEGRIP | SBS_SIZEBOXBOTTOMRIGHTALIGN, + 0, 0, CW_USEDEFAULT, CW_USEDEFAULT, + parent, (HMENU)0, NULL, NULL); + if (sizegrip != 0) + { + RECT rc, rc_grip; + GetClientRect(parent, &rc); + GetWindowRect(sizegrip, &rc_grip); + SetWindowPos(sizegrip, NULL, rc.right - (rc_grip.right - rc_grip.left), rc.bottom - (rc_grip.bottom - rc_grip.top), 0, 0, SWP_NOZORDER | SWP_NOSIZE); + } + } +} + + +dialog_resize_helper::dialog_resize_helper(const param * src,unsigned count,unsigned p_min_x,unsigned p_min_y,unsigned p_max_x,unsigned p_max_y) + : min_x(p_min_x), min_y(p_min_y), max_x(p_max_x), max_y(p_max_y), parent(0), sizegrip(0) +{ + m_table.set_size(count); + unsigned n; + for(n=0;n<count;n++) + m_table[n] = src[n]; + rects.set_size(count); +} + +dialog_resize_helper::~dialog_resize_helper() +{ +} + +#endif // FOOBAR2000_DESKTOP_WINDOWS
