annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "StdAfx.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #ifdef FOOBAR2000_DESKTOP_WINDOWS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "dialog_resize_helper.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 static BOOL GetChildWindowRect(HWND wnd, UINT id, RECT* child)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 RECT temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 HWND wndChild = GetDlgItem(wnd, id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 if (wndChild == NULL) return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 if (!GetWindowRect(wndChild, &temp)) return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 if (!MapWindowPoints(0, wnd, (POINT*)&temp, 2)) return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 *child = temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 void dialog_resize_helper::set_parent(HWND wnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 parent = wnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 GetClientRect(parent,&orig_client);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 void dialog_resize_helper::reset()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 parent = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 sizegrip = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 void dialog_resize_helper::on_wm_size()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 if (parent)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 unsigned count = (unsigned) m_table.get_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 if (sizegrip != 0) count++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 HDWP hWinPosInfo = BeginDeferWindowPos(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 for(unsigned n=0;n<m_table.get_size();n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 param & e = m_table[n];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 const RECT & orig_rect = rects[n];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 RECT cur_client;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 GetClientRect(parent,&cur_client);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 HWND wnd = GetDlgItem(parent,e.id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 if (wnd != NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 unsigned dest_x = orig_rect.left, dest_y = orig_rect.top,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 dest_cx = orig_rect.right - orig_rect.left, dest_cy = orig_rect.bottom - orig_rect.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 int delta_x = cur_client.right - orig_client.right,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 delta_y = cur_client.bottom - orig_client.bottom;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 if (e.flags & X_MOVE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 dest_x += delta_x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 else if (e.flags & X_SIZE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 dest_cx += delta_x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 if (e.flags & Y_MOVE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 dest_y += delta_y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 else if (e.flags & Y_SIZE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 dest_cy += delta_y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 hWinPosInfo = DeferWindowPos(hWinPosInfo, wnd,0,dest_x,dest_y,dest_cx,dest_cy,SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 if (sizegrip != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 RECT rc, rc_grip;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 GetClientRect(parent, &rc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 GetWindowRect(sizegrip, &rc_grip);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 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);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 EndDeferWindowPos(hWinPosInfo);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 //RedrawWindow(parent,0,0,RDW_INVALIDATE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 bool dialog_resize_helper::process_message(HWND wnd,UINT msg,WPARAM wp,LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 LRESULT result = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 if (!ProcessWindowMessage(wnd,msg,wp,lp,result)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 SetWindowLongPtr(wnd,DWLP_MSGRESULT,result);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 BOOL dialog_resize_helper::ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 switch(uMsg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 case WM_SIZE:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 on_wm_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 case WM_GETMINMAXINFO:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 RECT r;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 LPMINMAXINFO info = (LPMINMAXINFO) lParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 DWORD dwStyle = GetWindowLong(hWnd, GWL_STYLE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 DWORD dwExStyle = GetWindowLong(hWnd, GWL_EXSTYLE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 if (max_x && max_y)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 r.left = 0; r.right = max_x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 r.top = 0; r.bottom = max_y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 MapDialogRect(hWnd,&r);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 AdjustWindowRectEx(&r, dwStyle, FALSE, dwExStyle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 info->ptMaxTrackSize.x = r.right - r.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 info->ptMaxTrackSize.y = r.bottom - r.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 if (min_x && min_y)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 r.left = 0; r.right = min_x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 r.top = 0; r.bottom = min_y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 MapDialogRect(hWnd,&r);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 AdjustWindowRectEx(&r, dwStyle, FALSE, dwExStyle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 info->ptMinTrackSize.x = r.right - r.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 info->ptMinTrackSize.y = r.bottom - r.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 lResult = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 case WM_INITDIALOG:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 set_parent(hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 t_size n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 for(n=0;n<m_table.get_size();n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 GetChildWindowRect(parent,m_table[n].id,&rects[n]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 case WM_DESTROY:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 void dialog_resize_helper::add_sizegrip()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 if (parent != 0 && sizegrip == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 sizegrip = CreateWindowEx(0, WC_SCROLLBAR, _T(""), WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | SBS_SIZEGRIP | SBS_SIZEBOXBOTTOMRIGHTALIGN,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 0, 0, CW_USEDEFAULT, CW_USEDEFAULT,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 parent, (HMENU)0, NULL, NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 if (sizegrip != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 RECT rc, rc_grip;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 GetClientRect(parent, &rc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 GetWindowRect(sizegrip, &rc_grip);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 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);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 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)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 : min_x(p_min_x), min_y(p_min_y), max_x(p_max_x), max_y(p_max_y), parent(0), sizegrip(0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 m_table.set_size(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 unsigned n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 for(n=0;n<count;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 m_table[n] = src[n];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 rects.set_size(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 dialog_resize_helper::~dialog_resize_helper()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 #endif // FOOBAR2000_DESKTOP_WINDOWS