annotate foosdk/sdk/libPPUI/CMiddleDragImpl.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 #include "CMiddleDragOverlay.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include <utility>
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 class CMiddleDragCommon {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 KTimerID = 0x389675f8,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 KTimerPeriod = 15,
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 static double myPow(double p_val, double p_exp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 static double ProcessMiddleDragDeltaInternal(double p_delta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 static double radiusHelper(double p_x, double p_y);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 static int mySGN(LONG v);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 static int32_t Round(double val, double & acc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 static LONG LineToPixelsHelper(LONG & p_overflow, LONG p_pixels, LONG p_dpi, LONG p_lineWidth);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 template<typename TBase>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 class CMiddleDragImpl : public TBase, protected CMiddleDragCommon {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 typedef CMiddleDragImpl<TBase> TSelf;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 template<typename ... arg_t> CMiddleDragImpl( arg_t && ... arg ) : TBase(std::forward<arg_t>(arg) ... ) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 BEGIN_MSG_MAP_EX(TSelf)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 MESSAGE_HANDLER(WM_TIMER,OnTimer);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 MESSAGE_HANDLER(WM_CAPTURECHANGED,OnCaptureChanged);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 MESSAGE_HANDLER(WM_MBUTTONDOWN,OnMButtonDown);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 MESSAGE_HANDLER(WM_MBUTTONDBLCLK,OnMButtonDown);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 MESSAGE_HANDLER(WM_MBUTTONUP,OnMButtonUp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 MESSAGE_HANDLER(WM_LBUTTONDOWN,OnMouseAction);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 MESSAGE_HANDLER(WM_RBUTTONDOWN,OnMouseAction);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 MESSAGE_HANDLER(WM_LBUTTONDBLCLK,OnMouseAction);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 MESSAGE_HANDLER(WM_RBUTTONDBLCLK,OnMouseAction);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 MESSAGE_HANDLER(WM_LBUTTONUP,OnMouseAction);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 MESSAGE_HANDLER(WM_RBUTTONUP,OnMouseAction);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 MESSAGE_HANDLER(WM_XBUTTONDOWN,OnMouseAction);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 MESSAGE_HANDLER(WM_XBUTTONDBLCLK,OnMouseAction);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 MESSAGE_HANDLER(WM_XBUTTONUP,OnMouseAction);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 MESSAGE_HANDLER(WM_MOUSEMOVE,OnMouseMove);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 MESSAGE_HANDLER(WM_DESTROY,OnDestroyPassThru);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 CHAIN_MSG_MAP(TBase);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 bool CanSmoothScroll() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 return !m_active;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 bool m_active = false, m_dragged = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 CPoint m_base;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 CMiddleDragOverlay m_overlay;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 double m_accX = 0, m_accY = 0;
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 LRESULT OnDestroyPassThru(UINT,WPARAM,LPARAM,BOOL& bHandled) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 if (m_overlay != NULL) m_overlay.DestroyWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 return 0;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 LRESULT OnMButtonUp(UINT,WPARAM,LPARAM,BOOL&) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 if (m_active /*&& m_dragged*/) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 EndDrag();
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 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 LRESULT OnMButtonDown(UINT,WPARAM,LPARAM p_lp,BOOL&) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 if (m_active) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 EndDrag();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 return 0;
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 EndDrag();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 this->SetFocus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 CPoint pt(p_lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 WIN32_OP_D( this->ClientToScreen(&pt) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 StartDrag(pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 return 0;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 LRESULT OnMouseMove(UINT,WPARAM,LPARAM p_lp,BOOL& bHandled) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 if (m_active) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 if (!m_dragged) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 CPoint pt(p_lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 WIN32_OP_D( this->ClientToScreen(&pt) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 if (pt != m_base) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 m_dragged = true;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 bHandled = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 LRESULT OnMouseAction(UINT,WPARAM,LPARAM,BOOL& bHandled) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 EndDrag();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 return 0;
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 void StartDrag(CPoint const & p_point) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 ::SetCapture(NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 if (m_overlay == NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 PFC_ASSERT( this->m_hWnd != NULL );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 WIN32_OP_D(m_overlay.Create(*this));
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 //todo sanity checks - don't drag when the entire content is visible, perhaps use a different icon when only vertical or horizontal drag is possible
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 SetCursor(::LoadCursor(NULL,IDC_SIZEALL));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 m_active = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 m_dragged = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 m_base = p_point;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 m_accX = m_accY = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 this->SetCapture();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 this->SetTimer(KTimerID,KTimerPeriod);
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 m_overlay.ShowHere(p_point);
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 void EndDrag() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 if (m_active) ::SetCapture(NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 }
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 void HandleEndDrag() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 if (m_active) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 m_active = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 this->KillTimer(KTimerID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 if (m_overlay != NULL) m_overlay.ShowWindow(SW_HIDE);
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 }
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 LRESULT OnCaptureChanged(UINT,WPARAM,LPARAM,BOOL& bHandled) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 HandleEndDrag();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 return 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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 LRESULT OnTimer(UINT,WPARAM p_wp,LPARAM,BOOL& bHandled) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 switch(p_wp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 case KTimerID:
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 CPoint ptCursor;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 if (GetCursorPos(&ptCursor)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 this->MoveViewOriginDelta(ProcessMiddleDragDelta(ptCursor - m_base));
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 }
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 CPoint ProcessMiddleDragDelta(CPoint p_delta) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 const CSize dpi = QueryScreenDPIEx();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 if (dpi.cx <= 0 || dpi.cy <= 0 || p_delta == CPoint(0, 0)) return CPoint(0, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 const double dpiMulX = 96.0 / (double)dpi.cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 const double dpiMulY = 96.0 / (double)dpi.cy;
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 const double deltaTotal = ProcessMiddleDragDeltaInternal(radiusHelper((double)p_delta.x * dpiMulX, (double)p_delta.y * dpiMulY));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 double xVal = 0, yVal = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 if (p_delta.x == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 yVal = deltaTotal;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 } else if (p_delta.y == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 xVal = deltaTotal;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 const double ratio = (double)p_delta.x / (double)p_delta.y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 yVal = sqrt((deltaTotal*deltaTotal) / (1.0 + (ratio*ratio)));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 xVal = yVal * ratio;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 xVal = mySGN(p_delta.x) * fabs(xVal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 yVal = mySGN(p_delta.y) * fabs(yVal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 return CPoint(Round(xVal / dpiMulX, m_accX), Round(yVal / dpiMulY, m_accY));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 }
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 };
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 template<typename TBase>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 class CMiddleDragWrapper : public TBase {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 typedef CMiddleDragWrapper<TBase> TSelf;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 template<typename ... arg_t> CMiddleDragWrapper(arg_t && ... arg ) : TBase(std::forward<arg_t>(arg) ... ) { m_overflow = CPoint(0, 0); m_lineWidth = CSize(4, 16); }
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 BEGIN_MSG_MAP_EX(TSelf)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 MESSAGE_HANDLER(WM_CAPTURECHANGED,OnCaptureChanged);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 CHAIN_MSG_MAP(TBase)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 END_MSG_MAP()
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 void MoveViewOriginDelta(CPoint p_delta) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 MoveViewOriginDeltaLines( MiddleDrag_PixelsToLines( m_overflow, p_delta ) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 void MoveViewOriginDeltaLines(CPoint p_delta) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 FireScrollMessage(WM_HSCROLL,p_delta.x);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 FireScrollMessage(WM_VSCROLL,p_delta.y);
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 void SetLineWidth(CSize p_width) {m_lineWidth = p_width;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 void FireScrollMessage(UINT p_msg,int p_delta) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 UINT count = (UINT)(p_delta<0?-p_delta:p_delta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 const UINT which = (p_msg == WM_HSCROLL ? SB_HORZ : SB_VERT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 SCROLLINFO si = {}; si.cbSize = sizeof(si); si.fMask = SIF_PAGE | SIF_RANGE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 if (!this->GetScrollInfo(which, &si) || si.nPage <= 0) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 while(count >= si.nPage) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 const WPARAM code = p_delta < 0 ? SB_PAGEUP : SB_PAGEDOWN;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 this->SendMessage(p_msg, code, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 count -= si.nPage;
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 const WPARAM code = p_delta < 0 ? SB_LINEUP : SB_LINEDOWN;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 for(UINT walk = 0; walk < count; ++walk) this->SendMessage(p_msg, code, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 LRESULT OnCaptureChanged(UINT,WPARAM,LPARAM,BOOL& bHandled) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 m_overflow = CPoint(0,0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 CPoint MiddleDrag_PixelsToLines(CPoint & p_overflow,CPoint p_pixels) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 const CSize dpi = QueryScreenDPIEx();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 if (dpi.cx <= 0 || dpi.cy <= 0) return CPoint(0,0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 CPoint pt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 pt.x = CMiddleDragCommon::LineToPixelsHelper(p_overflow.x,p_pixels.x,dpi.cx,m_lineWidth.cx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 pt.y = CMiddleDragCommon::LineToPixelsHelper(p_overflow.y,p_pixels.y,dpi.cy,m_lineWidth.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 return pt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 }
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 CSize m_lineWidth;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 CPoint m_overflow;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 template<typename TBase = CWindow>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 class CWindow_DummyMsgMap : public TBase , public CMessageMap {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 LRESULT& lResult, DWORD dwMsgMapID = 0) {return FALSE;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 typedef CMiddleDragImpl<CMiddleDragWrapper<CWindow_DummyMsgMap<> > > CMiddleDragImplSimple;
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 template<typename TBase = CWindow>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 class CContainedWindow_MsgMap : public CContainedWindowT<CWindow_DummyMsgMap<TBase> > {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 CContainedWindow_MsgMap() : CContainedWindowT<CWindow_DummyMsgMap<TBase> >(msgMapCast(this)) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 template<typename t> static CMessageMap * msgMapCast(t* arg) { return arg; }
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 template<typename TBase>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 class CMiddleDragImplCtrlHook : public CMiddleDragImpl<CMiddleDragWrapper<CContainedWindow_MsgMap<TBase> > > {
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 template<typename TBase> class CMiddleDragImplCtrlHookEx : public CMiddleDragImplCtrlHook<TBase> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 CMiddleDragImplCtrlHookEx(CMessageMap * hook, DWORD hookMapID = 0) : m_hook(*hook), m_hookMapID(hookMapID) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 BEGIN_MSG_MAP_EX(CMiddleDragImplCtrlHookEx)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 CHAIN_MSG_MAP(CMiddleDragImplCtrlHook<TBase>)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 CHAIN_MSG_MAP_ALT_MEMBER(m_hook,m_hookMapID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 DWORD const m_hookMapID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 CMessageMap & m_hook;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 };