soui 5.0.0.1
Soui5 Doc
 
Loading...
Searching...
No Matches
SScrollbar.cpp
1// Sscrollbar.h : implementation file
2// 模块:滚动条控件
3//////////////////////////////////////////////////////////////////////////
4#include "souistd.h"
6
7SNSBEGIN
8/////////////////////////////////////////////////////////////////////////////
9// SScrollBar
11 : m_pSkin(GETBUILTINSKIN(SKIN_SYS_SCROLLBAR))
12 , m_uAllowSize((UINT)-1)
13 , m_fadeFrames(0)
15 , m_sbHandler(this)
16{
17 memset(&m_si, 0, sizeof(SCROLLINFO));
18 m_si.nTrackPos = -1;
19 m_evtSet.addEvent(EVENTID(EventScroll));
20}
21
25
27{
28 return m_sbHandler.IsVertical();
29}
30
31int SScrollBar::SetPos(int nPos)
32{
33 if (nPos > (m_si.nMax - (int)m_si.nPage + 1))
34 nPos = (m_si.nMax - m_si.nPage + 1);
35 if (nPos < m_si.nMin)
36 nPos = m_si.nMin;
37 if (nPos != m_si.nPos)
38 {
39 if (m_si.nTrackPos == -1)
40 {
41 CRect rcOldThumb = m_sbHandler.GetPartRect(SB_THUMBTRACK);
42 m_si.nTrackPos = nPos;
43 CRect rcNewThumb = m_sbHandler.GetPartRect(SB_THUMBTRACK);
44 CRect rcUnion;
45 rcUnion.UnionRect(&rcOldThumb, &rcNewThumb);
46 if (IsVisible())
47 {
49 m_sbHandler.OnDraw(pRT, SScrollBarHandler::kSbRail);
50 m_sbHandler.OnDraw(pRT, SB_THUMBTRACK);
52 }
53 m_si.nTrackPos = -1;
54 }
55 m_si.nPos = nPos;
56 }
57 return m_si.nPos;
58}
59
61{
62 return m_si.nPos;
63}
64
66{
67 return m_si.nMax;
68}
69
71{
72 return m_si.nMin;
73}
74
76{
77 __baseCls::OnInitFinished(pNode);
78 if (m_uAllowSize == -1)
79 {
80 if (m_pSkin)
81 m_uAllowSize = m_pSkin->GetSkinSize().cx / 9;
82 else
83 m_uAllowSize = 0;
84 }
85}
86
88{
89 if (!m_pSkin)
90 return;
91 m_sbHandler.OnDraw(pRT, SB_LINEUP);
92 m_sbHandler.OnDraw(pRT, SScrollBarHandler::kSbRail);
93 m_sbHandler.OnDraw(pRT, SB_THUMBTRACK);
94 m_sbHandler.OnDraw(pRT, SB_LINEDOWN);
95}
96
97void SScrollBar::OnLButtonUp(UINT nFlags, CPoint point)
98{
99 m_sbHandler.OnMouseUp(point);
101}
102
103void SScrollBar::OnLButtonDown(UINT nFlags, CPoint point)
104{
105 SetCapture();
106 m_sbHandler.OnMouseDown(point);
107}
108
109void SScrollBar::OnMouseMove(UINT nFlags, CPoint point)
110{
111 m_sbHandler.OnMouseMove(point);
112}
113
114void SScrollBar::OnTimer(char nIDEvent)
115{
116 m_sbHandler.OnTimer(nIDEvent);
117}
118
119void SScrollBar::OnMouseHover(UINT nFlags, CPoint ptPos)
120{
121 m_sbHandler.OnMouseHover(ptPos);
122}
123
125{
126 m_sbHandler.OnMouseLeave();
127}
128
129LRESULT SScrollBar::OnSetScrollInfo(UINT uMsg, WPARAM wParam, LPARAM lParam)
130{
131 BOOL bRedraw = wParam != 0;
132 LPSCROLLINFO lpScrollInfo = (LPSCROLLINFO)lParam;
133 if (lpScrollInfo->fMask & SIF_PAGE)
134 m_si.nPage = lpScrollInfo->nPage;
135 if (lpScrollInfo->fMask & SIF_POS)
136 m_si.nPos = lpScrollInfo->nPos;
137 if (lpScrollInfo->fMask & SIF_RANGE)
138 {
139 m_si.nMin = lpScrollInfo->nMin;
140 m_si.nMax = lpScrollInfo->nMax;
141 }
142 if (m_si.nPos > (m_si.nMax - (int)m_si.nPage + 1))
143 m_si.nPos = (m_si.nMax - m_si.nPage + 1);
144 if (m_si.nPos < m_si.nMin)
145 m_si.nPos = m_si.nMin;
146 if (bRedraw)
147 Invalidate();
148
149 return TRUE;
150}
151
152LRESULT SScrollBar::OnGetScrollInfo(UINT uMsg, WPARAM wParam, LPARAM lParam)
153{
154 LPSCROLLINFO lpScrollInfo = (LPSCROLLINFO)lParam;
155 int nMask = lpScrollInfo->fMask;
156 if (nMask & SIF_PAGE)
157 lpScrollInfo->nPage = m_si.nPage;
158 if (nMask & SIF_POS)
159 lpScrollInfo->nPos = m_si.nPos;
160 if (nMask & SIF_TRACKPOS)
161 lpScrollInfo->nTrackPos = m_si.nTrackPos;
162 if (nMask & SIF_RANGE)
163 {
164 lpScrollInfo->nMin = m_si.nMin;
165 lpScrollInfo->nMax = m_si.nMax;
166 }
167 return TRUE;
168}
169
171{
172 m_sbHandler.OnDestroy();
174}
175
176void SScrollBar::NotifySbCode(int nCode, int nPos)
177{
178 EventScroll evt(this);
179 evt.nSbCode = nCode;
180 evt.nPos = nPos;
181 evt.bVertical = IsVertical();
182 FireEvent(evt);
183}
184
185HRESULT SScrollBar::OnAttrVertical(const SStringW &value, BOOL bLoading)
186{
187 bool bVert = STRINGASBOOL(value);
189 return bLoading ? S_FALSE : S_OK;
190}
191
192void SScrollBar::OnScrollUpdateThumbTrack(BOOL bVert, int nPos)
193{
194 CRect rcOldThumb = m_sbHandler.GetPartRect(SB_THUMBTRACK);
195 m_si.nTrackPos = nPos;
196 CRect rcThumb = m_sbHandler.GetPartRect(SB_THUMBTRACK);
197 CRect rcUnion;
198 rcUnion.UnionRect(rcOldThumb, rcThumb);
199 IRenderTarget *pRT = GetRenderTarget(&rcUnion, GRT_PAINTBKGND);
200 m_sbHandler.OnDraw(pRT, SScrollBarHandler::kSbRail);
201 m_sbHandler.OnDraw(pRT, SB_THUMBTRACK);
203 NotifySbCode(SB_THUMBTRACK, m_si.nTrackPos);
204}
205
206void SScrollBar::OnScrollCommand(BOOL bVert, int iCmd, int nPos)
207{
208 int nOldPos = m_si.nPos;
209 switch (iCmd)
210 {
211 case SB_LINEUP:
212 m_si.nPos--;
213 break;
214 case SB_PAGEUP:
215 m_si.nPos -= m_si.nPage;
216 break;
217 case SB_PAGEDOWN:
218 m_si.nPos += m_si.nPage;
219 break;
220 case SB_LINEDOWN:
221 m_si.nPos++;
222 break;
223 case SB_THUMBPOSITION:
224 m_si.nPos = nPos;
225 m_si.nTrackPos = -1;
226 break;
227 }
228 if (m_si.nPos < m_si.nMin)
229 m_si.nPos = m_si.nMin;
230 if (m_si.nPos > m_si.nMax - (int)m_si.nPage + 1)
231 m_si.nPos = m_si.nMax - (int)m_si.nPage + 1;
232 if (nOldPos != m_si.nPos)
233 {
234 NotifySbCode(iCmd, m_si.nPos);
235 OnScrollUpdatePart(bVert, SB_THUMBTRACK);
236 }
237}
238
239void SScrollBar::OnScrollSetTimer(BOOL bVert, char id, UINT uElapse)
240{
241 SetTimer(id, uElapse);
242}
243
244void SScrollBar::OnScrollKillTimer(BOOL bVert, char id)
245{
246 KillTimer(id);
247}
248
249CRect SScrollBar::GetScrollBarRect(BOOL bVert) const
250{
251 return GetClientRect();
252}
253
254ISkinObj *SScrollBar::GetScrollBarSkin(BOOL bVert) const
255{
256 return m_pSkin;
257}
258
259const SCROLLINFO *SScrollBar::GetScrollBarInfo(BOOL bVert) const
260{
261 return &m_si;
262}
263
264int SScrollBar::GetScrollBarArrowSize(BOOL bVert) const
265{
266 return m_uAllowSize;
267}
268
269const IInterpolator *SScrollBar::GetScrollInterpolator() const
270{
272 {
273 m_fadeInterpolator.Attach(CREATEINTERPOLATOR(L"Accelerate"));
274 }
275 return m_fadeInterpolator;
276}
277
278int SScrollBar::GetScrollFadeFrames() const
279{
280 return m_fadeFrames;
281}
282
283BYTE SScrollBar::GetScrollThumbTrackMinAlpha() const
284{
286}
287
288void SScrollBar::OnScrollUpdatePart(BOOL bVert, int iPart)
289{
290 if (iPart == -1)
291 {
292 CRect rc = GetScrollBarRect(bVert);
293 IRenderTarget *pRT = GetRenderTarget(&rc, GRT_PAINTBKGND);
294 m_sbHandler.OnDraw(pRT, SB_LINEUP);
295 m_sbHandler.OnDraw(pRT, SScrollBarHandler::kSbRail);
296 m_sbHandler.OnDraw(pRT, SB_THUMBTRACK);
297 m_sbHandler.OnDraw(pRT, SB_LINEDOWN);
299 }
300 else if (iPart == SB_THUMBTRACK)
301 {
302 CRect rc = m_sbHandler.GetPartRect(SScrollBarHandler::kSbRail);
303 IRenderTarget *pRT = GetRenderTarget(&rc, GRT_PAINTBKGND);
304 m_sbHandler.OnDraw(pRT, SScrollBarHandler::kSbRail);
305 m_sbHandler.OnDraw(pRT, SB_THUMBTRACK);
307 }
308 else if (iPart == SB_PAGEDOWN || iPart == SB_PAGEUP)
309 {
310 CRect rc = m_sbHandler.GetPartRect(iPart);
311 IRenderTarget *pRT = GetRenderTarget(&rc, GRT_PAINTBKGND);
312 m_sbHandler.OnDraw(pRT, SScrollBarHandler::kSbRail);
314 }
315 else
316 {
317 CRect rc = m_sbHandler.GetPartRect(iPart);
318 IRenderTarget *pRT = GetRenderTarget(&rc, GRT_PAINTBKGND);
319 m_sbHandler.OnDraw(pRT, iPart);
321 }
322}
323
324ISwndContainer *SScrollBar::GetScrollBarContainer()
325{
326 return GetContainer();
327}
328
329BOOL SScrollBar::IsScrollBarEnable(BOOL bVert) const
330{
331 return !IsDisabled(TRUE);
332}
333
334SNSEND
Scrollbar control.
@ GRT_PAINTBKGND
void SetVertical(bool bVert)
Sets the orientation of the scrollbar.
LRESULT OnSetScrollInfo(UINT uMsg, WPARAM wParam, LPARAM lParam)
Handles setting scroll information.
SScrollBar()
Constructor.
void OnMouseLeave()
Handles mouse leave event.
LRESULT OnGetScrollInfo(UINT uMsg, WPARAM wParam, LPARAM lParam)
Handles getting scroll information.
virtual void WINAPI OnInitFinished(IXmlNode *pNode)
Initialization after creation.
int GetMax()
Gets the maximum position of the scrollbar.
int GetMin()
Gets the minimum position of the scrollbar.
void OnLButtonUp(UINT nFlags, CPoint point)
Handles left button up event.
virtual ~SScrollBar()
Destructor.
void OnLButtonDown(UINT nFlags, CPoint point)
Handles left button down event.
void OnMouseHover(UINT nFlags, CPoint ptPos)
Handles mouse hover event.
int m_fadeFrames
Definition SScrollbar.h:268
void OnDestroy()
Handles destruction of the control.
BOOL IsVertical() const
Checks if the scrollbar is vertical.
void OnMouseMove(UINT nFlags, CPoint point)
Handles mouse move event.
int GetPos()
Gets the current position of the scrollbar.
void OnTimer(char nIDEvent)
Handles timer event.
SScrollBarHandler m_sbHandler
Definition SScrollbar.h:271
void OnPaint(IRenderTarget *pRT)
Paints the scrollbar.
SAutoRefPtr< ISkinObj > m_pSkin
Definition SScrollbar.h:263
UINT m_uAllowSize
Definition SScrollbar.h:264
BYTE m_byThumbTrackMinAlpha
Definition SScrollbar.h:270
SCROLLINFO m_si
Definition SScrollbar.h:266
int SetPos(int nPos)
Sets the position of the scrollbar.
SAutoRefPtr< IInterpolator > m_fadeInterpolator
Definition SScrollbar.h:269
void NotifySbCode(int nCode, int nPos)
Notifies the parent window of scrollbar events.
A class representing an ASCII string.
Definition sstringw.h:96
BOOL SetTimer(char id, UINT uElapse) OVERRIDE
Sets a timer for the window.
Definition Swnd.cpp:477
BOOL FireEvent(IEvtArgs *evt) OVERRIDE
Fires an event.
Definition Swnd.cpp:1540
void OnDestroy()
Handles the destruction of the window.
Definition Swnd.cpp:1701
void ReleaseRenderTarget(IRenderTarget *pRT)
Releases the RenderTarget obtained via GetRenderTarget.
Definition Swnd.cpp:2372
BOOL IsVisible(BOOL bCheckParent=FALSE) SCONST OVERRIDE
Checks if the window is visible.
Definition Swnd.cpp:646
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
SWND SetCapture() OVERRIDE
Sets the window to capture the mouse.
Definition Swnd.cpp:2484
BOOL IsDisabled(BOOL bCheckParent=FALSE) SCONST OVERRIDE
Checks if the window is disabled.
Definition Swnd.cpp:638
BOOL KillTimer(char id) OVERRIDE
Kills a timer for the window.
Definition Swnd.cpp:483
void Invalidate() OVERRIDE
Invalidates the entire window.
Definition Swnd.cpp:1437
SEventSet m_evtSet
Definition SWnd.h:2581
BOOL ReleaseCapture() OVERRIDE
Releases the mouse capture from the window.
Definition Swnd.cpp:2491
IRenderTarget * GetRenderTarget(LPCRECT pRc=NULL, GrtFlag gdcFlags=GRT_NODRAW, BOOL bClientRT=TRUE)
Retrieves a memory DC compatible with the SWND window.
Definition Swnd.cpp:2320
Interface for rendering target objects.
Definition SRender-i.h:1440
Interface for Skin Objects.
Definition SSkinobj-i.h:29
SOUI Window Container Interface.
Interface for XML nodes.
Definition sxml-i.h:128