annotate foosdk/sdk/foobar2000/helpers/WindowPositionUtils.h @ 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 #pragma once
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 _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include "win32_misc.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #include "../SDK/cfg_var.h"
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 static BOOL AdjustWindowRectHelper(CWindow wnd, CRect & rc) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 const DWORD style = wnd.GetWindowLong(GWL_STYLE), exstyle = wnd.GetWindowLong(GWL_EXSTYLE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 return AdjustWindowRectEx(&rc,style,(style & WS_POPUP) ? wnd.GetMenu() != NULL : FALSE, exstyle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 static void AdjustRectToScreenArea(CRect & rc, CRect rcParent) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 HMONITOR monitor = MonitorFromRect(rcParent,MONITOR_DEFAULTTONEAREST);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 MONITORINFO mi = {sizeof(MONITORINFO)};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 if (GetMonitorInfo(monitor,&mi)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 const CRect clip = mi.rcWork;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 if (rc.right > clip.right) rc.OffsetRect(clip.right - rc.right, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 if (rc.bottom > clip.bottom) rc.OffsetRect(0, clip.bottom - rc.bottom);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 if (rc.left < clip.left) rc.OffsetRect(clip.left - rc.left, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 if (rc.top < clip.top) rc.OffsetRect(0, clip.top - rc.top);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 static BOOL GetClientRectAsSC(CWindow wnd, CRect & rc) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 CRect temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 if (!wnd.GetClientRect(temp)) return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 if (temp.IsRectNull()) return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 if (!wnd.ClientToScreen(temp)) return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 rc = temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 }
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 static BOOL CenterWindowGetRect(CWindow wnd, CWindow wndParent, CRect & out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 CRect parent, child;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 if (!wndParent.GetWindowRect(&parent) || !wnd.GetWindowRect(&child)) return FALSE;
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 CPoint origin = parent.CenterPoint();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 origin.Offset( - child.Width() / 2, - child.Height() / 2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 child.OffsetRect( origin - child.TopLeft() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 AdjustRectToScreenArea(child, parent);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 out = child;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 }
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 static BOOL CenterWindowAbove(CWindow wnd, CWindow wndParent) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 CRect rc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 if (!CenterWindowGetRect(wnd, wndParent, rc)) return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 return wnd.SetWindowPos(NULL,rc,SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 static BOOL ShowWindowCentered(CWindow wnd,CWindow wndParent) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 CRect rc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 if (!CenterWindowGetRect(wnd, wndParent, rc)) return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 return wnd.SetWindowPos(HWND_TOP,rc,SWP_NOSIZE | SWP_SHOWWINDOW);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 typedef cfg_struct_t<SIZE> cfgWindowSize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 class cfgWindowSizeTracker {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 cfgWindowSizeTracker(cfgWindowSize & p_var) : m_var(p_var) {}
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 bool Apply(HWND p_wnd) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 bool retVal = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 m_applied = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 auto s = m_var.get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 if (s.cx > 0 && s.cy > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 CRect rect(0,0,s.cx,s.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 if (AdjustWindowRectHelper(p_wnd, rect)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 SetWindowPos(p_wnd,NULL,0,0,rect.right-rect.left,rect.bottom-rect.top,SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 retVal = true;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 m_applied = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 return retVal;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT & lResult) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 if (uMsg == WM_SIZE && m_applied) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 if (lParam != 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 m_var.set({ (short)LOWORD(lParam), (short)HIWORD(lParam) });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 }
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 cfgWindowSize & m_var;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 bool m_applied = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 class cfgDialogSizeTracker : public cfgWindowSizeTracker {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 cfgDialogSizeTracker(cfgWindowSize & p_var) : cfgWindowSizeTracker(p_var) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT & lResult) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 if (cfgWindowSizeTracker::ProcessWindowMessage(hWnd, uMsg, wParam, lParam, lResult)) return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 if (uMsg == WM_INITDIALOG) Apply(hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 }
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 struct cfgDialogPositionData {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 static constexpr int32_t
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 posInvalid = 0x80000000;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 static constexpr uint32_t
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 sizeInvalid = 0xFFFFFFFF,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 dpiInvalid = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 uint32_t m_width = sizeInvalid, m_height = sizeInvalid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 int32_t m_posX = posInvalid, m_posY = posInvalid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 uint32_t m_dpiX = dpiInvalid, m_dpiY = dpiInvalid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 cfgDialogPositionData reDPI(CSize) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 bool grabFrom(CWindow wnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 bool applyTo(CWindow wnd) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 bool overrideDefaultSize(t_uint32 width, t_uint32 height);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 pfc::string8 debug() const;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 struct cfgWindowPositionData {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 WINDOWPLACEMENT m_wp = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 SIZE m_dpi = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 bool grabFrom(CWindow wnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 bool applyTo(CWindow wnd, bool allowHidden = false) const;
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 FB2K_STREAM_READER_OVERLOAD(cfgDialogPositionData) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 stream >> value.m_width >> value.m_height;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 stream >> value.m_posX >> value.m_posY >> value.m_dpiX >> value.m_dpiY;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 } catch (exception_io_data const &) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 value.m_posX = value.m_posY = cfgDialogPositionData::posInvalid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 value.m_dpiX = value.m_dpiY = cfgDialogPositionData::dpiInvalid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 return stream;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 FB2K_STREAM_WRITER_OVERLOAD(cfgDialogPositionData) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 return stream << value.m_width << value.m_height << value.m_posX << value.m_posY << value.m_dpiX << value.m_dpiY;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 }
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 class cfgDialogPosition : public cfg_struct_t<cfgDialogPositionData> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 cfgDialogPosition(const GUID& id) : cfg_struct_t(id) {}
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 //! Read and save size data from HWND.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 void read_from_window(HWND);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 //! Apply saved size data to HWND.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 bool apply_to_window(HWND);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 void AddWindow(HWND wnd) { apply_to_window(wnd); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 void RemoveWindow(HWND wnd) { read_from_window(wnd); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 };
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 class cfgWindowPosition : public cfg_struct_t<cfgWindowPositionData> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 cfgWindowPosition(const GUID & id) : cfg_struct_t(id) {}
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 //! Read and save size data from HWND.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 void read_from_window(HWND);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 //! Apply saved size data to HWND.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 bool apply_to_window(HWND, bool allowHidden = false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 //! New window created, show it with saved metrics.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 void windowCreated(HWND, bool allowHidden = false, DWORD showHow = SW_SHOW);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 class cfgDialogPositionTracker {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 cfgDialogPositionTracker(cfgDialogPosition & p_var) : m_var(p_var) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 ~cfgDialogPositionTracker() {Cleanup();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT & lResult) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 if (uMsg == WM_CREATE || uMsg == WM_INITDIALOG) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 Cleanup();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 m_wnd = hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 m_var.AddWindow(m_wnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 } else if (uMsg == WM_DESTROY) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 PFC_ASSERT( hWnd == m_wnd );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 Cleanup();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 void Cleanup() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 if (m_wnd != NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 m_var.RemoveWindow(m_wnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 m_wnd = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 cfgDialogPosition & m_var;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 CWindow m_wnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 //! DPI-safe window size var \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 //! Stores size in pixel and original DPI\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 //! Use with cfgWindowSizeTracker2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 struct cfgWindowSize2_data {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 CSize m_size = CSize(0, 0), m_dpi = CSize(0, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 class cfgWindowSize2 : public cfg_struct_t< cfgWindowSize2_data > {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 cfgWindowSize2(const GUID & p_guid) : cfg_struct_t(p_guid) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 bool is_valid() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 auto v = cfg_struct_t::get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 return v.m_size.cx > 0 && v.m_size.cy > 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 CSize get( CSize forDPI ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 auto v = cfg_struct_t::get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 if ( forDPI == v.m_dpi ) return v.m_size;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 CSize ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 ret.cx = MulDiv( v.m_size.cx, forDPI.cx, v.m_dpi.cx );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 ret.cy = MulDiv( v.m_size.cy, forDPI.cy, v.m_dpi.cy );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 //! Forward messages to this class to utilize cfgWindowSize2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 class cfgWindowSizeTracker2 : public CMessageMap {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 cfgWindowSizeTracker2( cfgWindowSize2 & var ) : m_var(var) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 BEGIN_MSG_MAP_EX(cfgWindowSizeTracker2)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 if (uMsg == WM_CREATE || uMsg == WM_INITDIALOG) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 Apply(hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 MSG_WM_SIZE( OnSize )
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 bool Apply(HWND p_wnd) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 bool retVal = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 m_applied = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 if (m_var.is_valid()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 CRect rect( CPoint(0,0), m_var.get( m_DPI ) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 if (AdjustWindowRectHelper(p_wnd, rect)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 SetWindowPos(p_wnd,NULL,0,0,rect.right-rect.left,rect.bottom-rect.top,SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 retVal = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 m_applied = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 return retVal;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 void OnSize(UINT nType, CSize size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 if ( m_applied && size.cx > 0 && size.cy > 0 ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 m_var.set( { size, m_DPI } );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 cfgWindowSize2 & m_var;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 bool m_applied = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 const CSize m_DPI = QueryScreenDPIEx();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 #endif // _WIN32