soui 5.0.0.1
Soui5 Doc
 
Loading...
Searching...
No Matches
SSliderBar.cpp
1#include "souistd.h"
3SNSBEGIN
4
5#define TIMERID_NOTIFY1 1
6#define TIMERID_DELAY1 2
7
8//////////////////////////////////////////////////////////////////////////
9// SSliderBar
11 : m_bDrag(FALSE)
12 , m_uHtPrev(-1)
13 , m_pSkinThumb(GETBUILTINSKIN(SKIN_SYS_SLIDER_THUMB))
14 , m_bThumbInRail(FALSE)
15 , m_bDrawRail(TRUE)
16 , m_bDragTip(FALSE)
17{
18 m_evtSet.addEvent(EVENTID(EventSliderPos));
19 m_evtSet.addEvent(EVENTID(EventSliderValueTip));
20}
21
25
26int SSliderBar::HitTest(CPoint pt)
27{
28 CRect rc;
29
30 rc = GetPartRect(SC_THUMB);
31 if (rc.PtInRect(pt))
32 return SC_THUMB;
33
34 rc = GetPartRect(SC_SELECT);
35 if (rc.PtInRect(pt))
36 return SC_SELECT;
37
38 rc = GetPartRect(SC_RAIL);
39 if (rc.PtInRect(pt))
40 return SC_RAIL;
41
42 return -1;
43}
44
45SSliderBar::RANGE SSliderBar::_GetPartRange(int nLength, int nThumbSize, BOOL bThumbInRail, int nMin, int nMax, int nValue, UINT uSBCode)
46{
47 int64_t nRailLen = nLength - nThumbSize;
48
49 int nHalfThumb = nThumbSize / 2;
50 int64_t nSelect = nRailLen * (nValue - nMin) / (nMax - nMin);
51
52 RANGE rRet = { 0 };
53 switch (uSBCode)
54 {
55 case SC_RAILBACK: //轨道背景
56 rRet.value1 = 0;
57 rRet.value2 = nLength;
58 if (!bThumbInRail)
59 {
60 rRet.value1 += nHalfThumb;
61 rRet.value2 -= nHalfThumb;
62 }
63 break;
64 case SC_RAIL: //轨道区
65 rRet.value1 = 0;
66 rRet.value2 = nLength;
67 rRet.value1 += nHalfThumb;
68 rRet.value2 -= nHalfThumb;
69 break;
70 case SC_SELECT:
71 rRet.value1 = 0;
72 rRet.value2 = (int)nSelect;
73 if (!bThumbInRail)
74 {
75 rRet.value1 += nHalfThumb;
76 }
77 rRet.value2 += nHalfThumb;
78 break;
79 case SC_THUMB:
80 rRet.value1 = (int)nSelect;
81 rRet.value2 = (int)nSelect + nThumbSize;
82 break;
83 }
84
85 return rRet;
86}
87
88CRect SSliderBar::GetPartRect(UINT uSBCode)
89{
90 CRect rcClient;
91 GetClientRect(&rcClient);
92
93 SIZE szThumb = { 0 };
94 SIZE szRail = m_pSkinBg->GetSkinSize();
95 if (m_pSkinThumb)
96 szThumb = m_pSkinThumb->GetSkinSize();
97 if (IsVertical())
98 {
99 RANGE r = _GetPartRange(rcClient.Height(), szThumb.cy, m_bThumbInRail, m_nMinValue, m_nMaxValue, m_nValue, uSBCode);
100 CRect rc(rcClient.left, rcClient.Height() - r.value2, rcClient.right, rcClient.Height() - r.value1);
101 rc.OffsetRect(0, rcClient.top);
102 int nSliderSize = smax(szThumb.cx, szRail.cx);
103 rc.DeflateRect((rcClient.Width() - nSliderSize) / 2, 0);
104 if (uSBCode != SC_THUMB)
105 {
106 rc.DeflateRect((nSliderSize - szRail.cx) / 2, 0);
107 }
108 return rc;
109 }
110 else
111 {
112 RANGE r = _GetPartRange(rcClient.Width(), szThumb.cx, m_bThumbInRail, m_nMinValue, m_nMaxValue, m_nValue, uSBCode);
113 CRect rc(r.value1, rcClient.top, r.value2, rcClient.bottom);
114 rc.OffsetRect(rcClient.left, 0);
115 int nSliderSize = smax(szThumb.cy, szRail.cy);
116 rc.DeflateRect(0, (rcClient.Height() - nSliderSize) / 2);
117 if (uSBCode != SC_THUMB)
118 {
119 rc.DeflateRect(0, (nSliderSize - szRail.cy) / 2);
120 }
121 return rc;
122 }
123}
124
126{
127 SPainter painter;
128
129 BeforePaint(pRT, painter);
130
131 if (m_bDrawRail)
132 {
133 CRect rcRail = GetPartRect(SC_RAILBACK);
134 if (m_pSkinBg)
135 m_pSkinBg->DrawByIndex(pRT, rcRail, 0);
137 {
138 CRect rcSel = GetPartRect(SC_SELECT);
139 m_pSkinPos->DrawByIndex(pRT, rcSel, 0);
140 }
141 }
142 if (m_pSkinThumb)
143 {
144 CRect rcThumb = GetPartRect(SC_THUMB);
145 int nState = 0; // normal
146 if (IsDisabled(TRUE) && m_pSkinThumb->GetStates() > 3)
147 nState = 3;
148 else if (m_bDrag)
149 nState = 2; // pushback
150 else if (m_uHtPrev == SC_THUMB)
151 nState = 1; // hover
152 m_pSkinThumb->DrawByIndex(pRT, rcThumb, nState);
153 }
154 AfterPaint(pRT, painter);
155}
156
157void SSliderBar::OnLButtonUp(UINT nFlags, CPoint point)
158{
160 if (m_bDrag)
161 {
162 m_bDrag = FALSE;
163 CRect rcThumb = GetPartRect(SC_THUMB);
164 InvalidateRect(rcThumb);
165 NotifyPos(SBA_MOUSE_UP, m_nValue);
166 if (m_bDragTip)
167 {
168 // hide tooltip
169 GetContainer()->SetToolTip(NULL, TA_AUTO, NULL);
170 }
171 }
172 OnMouseMove(nFlags, point);
173}
174
175void SSliderBar::OnLButtonDown(UINT nFlags, CPoint point)
176{
177 SetCapture();
178
179 UINT uHit = HitTest(point);
180 if (uHit == SC_THUMB)
181 {
182 m_bDrag = TRUE;
183 m_ptDrag = point;
185 Invalidate();
186 ShowValueInTip(m_nValue);
187 }
188 else
189 {
190 CRect rcRail = GetPartRect(SC_RAIL);
191 int nValue = 0;
192 if (IsVertical())
193 {
194 nValue = ((int64_t)(rcRail.bottom - point.y)) * (m_nMaxValue - m_nMinValue + 1) / rcRail.Height() + m_nMinValue;
195 }
196 else
197 {
198 nValue = ((int64_t)(point.x - rcRail.left)) * (m_nMaxValue - m_nMinValue + 1) / rcRail.Width() + m_nMinValue;
199 }
200 SetValue(nValue);
201 Invalidate();
202
203 m_bDrag = TRUE;
204 m_ptDrag = point;
206
207 NotifyPos(SBA_MOUSE_DOWN, m_nValue);
208 }
209}
210
211void SSliderBar::OnMouseMove(UINT nFlags, CPoint point)
212{
213 if (m_bDrag)
214 {
215 CRect rcRail = GetPartRect(SC_RAIL);
216
217 int nInterHei = (IsVertical() ? rcRail.Height() : rcRail.Width());
218 int nDragLen = IsVertical() ? (m_ptDrag.y - point.y) : (point.x - m_ptDrag.x);
219 int nSlide = nDragLen * (m_nMaxValue - m_nMinValue + 1) / nInterHei;
220
221 int nNewTrackPos = m_nDragValue + nSlide;
222 if (nNewTrackPos < m_nMinValue)
223 {
224 nNewTrackPos = m_nMinValue;
225 }
226 else if (nNewTrackPos > m_nMaxValue)
227 {
228 nNewTrackPos = m_nMaxValue;
229 }
230 if (nNewTrackPos != m_nValue)
231 {
232 m_nValue = nNewTrackPos;
233 Invalidate();
234 NotifyPos(SBA_MOUSE_MOVING, m_nValue);
235 ShowValueInTip(nNewTrackPos);
236 }
237 }
238 else
239 {
240 int uHit = HitTest(point);
241 if (uHit != m_uHtPrev && (m_uHtPrev == SC_THUMB || uHit == SC_THUMB))
242 {
243 m_uHtPrev = uHit;
244 CRect rcThumb = GetPartRect(SC_THUMB);
245 InvalidateRect(rcThumb);
246 }
247 }
248}
249
251{
252 if (!m_bDrag && m_uHtPrev == SC_THUMB)
253 {
254 CRect rcThumb = GetPartRect(SC_THUMB);
255 InvalidateRect(rcThumb);
256 Invalidate();
257 m_uHtPrev = -1;
258 }
259}
260
261LRESULT SSliderBar::NotifyPos(SliderBarAction action, int nPos)
262{
263 EventSliderPos evt(this);
264 evt.nPos = nPos;
265 evt.action = action;
266 return FireEvent(evt);
267}
268
269SIZE SSliderBar::GetDesiredSize(int wid, int hei)
270{
271 if (!m_pBgSkin)
272 return CSize();
273 CSize szRet;
274 SIZE sizeBg = m_pSkinBg->GetSkinSize();
275 SIZE sizeThumb = { 0 };
276 if (m_pSkinThumb)
277 sizeThumb = m_pSkinThumb->GetSkinSize();
278
279 if (IsVertical())
280 {
281 szRet.cx = smax(sizeBg.cx, sizeThumb.cx);
282 szRet.cy = 100;
283 }
284 else
285 {
286 szRet.cy = smax(sizeBg.cy, sizeThumb.cy);
287 szRet.cx = 100;
288 }
289 return szRet;
290}
291
292void SSliderBar::OnColorize(COLORREF cr)
293{
294 __baseCls::OnColorize(cr);
295 if (m_pSkinThumb)
296 m_pSkinThumb->OnColorize(cr);
297}
298
300{
301 __baseCls::OnScaleChanged(scale);
303}
304
305BOOL SSliderBar::SetValue(THIS_ int nValue)
306{
307 if (m_bDrag)
308 return FALSE;
309 return __baseCls::SetValue(nValue);
310}
311
312void SSliderBar::ShowValueInTip(int nValue)
313{
314 if (m_bDragTip)
315 {
316 CRect rcThumb = GetPartRect(SC_THUMB);
317 rcThumb.InflateRect(5, 5);
318 SStringT buf = SStringT().Format(_T("%d"), nValue);
319 EventSliderValueTip evt(this);
320 evt.nPos = nValue;
321 evt.buf = &buf;
322 FireEvent(&evt);
323 UINT tipAlign = IsVertical() ? (TA_X_RIGHT | TA_Y_CENTER) : (TA_X_CENTER | TA_Y_TOP);
324 GetContainer()->SetToolTip(&rcThumb, tipAlign, buf);
325 }
326}
327
328SNSEND
Helper class for painting.
Definition SWnd.h:178
SAutoRefPtr< ISkinObj > m_pSkinPos
前景资源
Definition SCmnCtrl.h:786
int m_nValue
进度值
Definition SCmnCtrl.h:766
int m_nMaxValue
进度最大值
Definition SCmnCtrl.h:761
BOOL IsVertical() SCONST OVERRIDE
判断进度条是否为竖直状态
Definition SCmnCtrl.h:714
int m_nMinValue
进度最小值
Definition SCmnCtrl.h:756
SAutoRefPtr< ISkinObj > m_pSkinBg
背景资源
Definition SCmnCtrl.h:781
CPoint m_ptDrag
Definition SSliderBar.h:72
int m_uHtPrev
Definition SSliderBar.h:74
CRect GetPartRect(UINT uSBCode)
void OnMouseMove(UINT nFlags, CPoint point)
鼠标移动
BOOL m_bThumbInRail
Definition SSliderBar.h:77
SSliderBar()
构造函数
void OnMouseLeave()
鼠标移动事件
SAutoRefPtr< ISkinObj > m_pSkinThumb
Definition SSliderBar.h:76
int m_nDragValue
Definition SSliderBar.h:73
BOOL m_bDragTip
Definition SSliderBar.h:79
virtual void OnColorize(COLORREF cr)
处理颜色化事件
virtual void OnScaleChanged(int scale)
处理缩放变化事件
~SSliderBar()
析构函数
int HitTest(CPoint pt)
测试点
void OnPaint(IRenderTarget *pRT)
绘制
void OnLButtonUp(UINT nFlags, CPoint point)
左键抬起
BOOL m_bDrawRail
Definition SSliderBar.h:78
BOOL m_bDrag
Definition SSliderBar.h:71
LRESULT NotifyPos(SliderBarAction action, int value)
通知
SIZE GetDesiredSize(int nParentWid, int nParentHei)
获取大小
void OnLButtonDown(UINT nFlags, CPoint point)
左键按下
BOOL __cdecl Format(HINSTANCE hInst, UINT nFormatID,...)
Formats a string using a format string and variable arguments.
Definition sstringa.cpp:534
BOOL FireEvent(IEvtArgs *evt) OVERRIDE
Fires an event.
Definition Swnd.cpp:1540
ISwndContainer * GetContainer() OVERRIDE
Retrieves the container associated with this window.
Definition Swnd.cpp:679
virtual CRect GetClientRect() const
Retrieves the client rectangle of the window.
Definition Swnd.cpp:243
virtual void BeforePaint(IRenderTarget *pRT, SPainter &painter)
Prepare rendering environment.
Definition Swnd.cpp:1755
void InvalidateRect(LPCRECT lprect) OVERRIDE
Invalidates a specific rectangle area of the window.
Definition Swnd.cpp:1444
SWND SetCapture() OVERRIDE
Sets the window to capture the mouse.
Definition Swnd.cpp:2484
virtual void AfterPaint(IRenderTarget *pRT, SPainter &painter)
Restore rendering environment.
Definition Swnd.cpp:1776
BOOL IsDisabled(BOOL bCheckParent=FALSE) SCONST OVERRIDE
Checks if the window is disabled.
Definition Swnd.cpp:638
SAutoRefPtr< ISkinObj > m_pBgSkin
Definition SWnd.h:2622
void Invalidate() OVERRIDE
Invalidates the entire window.
Definition Swnd.cpp:1437
SEventSet m_evtSet
Definition SWnd.h:2581
void GetScaleSkin(SAutoRefPtr< ISkinObj > &pSkin, int nScale)
Retrieves a scaled skin object based on the current scale factor.
Definition Swnd.cpp:3290
BOOL ReleaseCapture() OVERRIDE
Releases the mouse capture from the window.
Definition Swnd.cpp:2491
@ TA_Y_CENTER
Align center vertically.
Definition stooltip-i.h:47
@ TA_AUTO
Automatic alignment.
Definition stooltip-i.h:41
@ TA_X_RIGHT
Align right horizontally.
Definition stooltip-i.h:44
@ TA_Y_TOP
Align top vertically.
Definition stooltip-i.h:46
@ TA_X_CENTER
Align center horizontally.
Definition stooltip-i.h:43
Interface for rendering target objects.
Definition SRender-i.h:1440
void SetToolTip(LPCRECT rc, UINT tipAlign, LPCTSTR pszTip) PURE
Displays a tooltip at the specified position.