18 #error atlscrl.h requires atlapp.h to be included first 22 #error atlscrl.h requires atlwin.h to be included first 25 #if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) 27 #endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) 29 #ifndef GET_WHEEL_DELTA_WPARAM 30 #define GET_WHEEL_DELTA_WPARAM(wParam) ((short)HIWORD(wParam)) 54 #define SCRL_SCROLLCHILDREN 0x00000001 55 #define SCRL_ERASEBACKGROUND 0x00000002 56 #define SCRL_NOTHUMBTRACKING 0x00000004 57 #if (WINVER >= 0x0500) 58 #define SCRL_SMOOTHSCROLL 0x00000008 59 #endif // (WINVER >= 0x0500) 60 #define SCRL_DISABLENOSCROLLV 0x00000010 61 #define SCRL_DISABLENOSCROLLH 0x00000020 62 #define SCRL_DISABLENOSCROLL (SCRL_DISABLENOSCROLLV | SCRL_DISABLENOSCROLLH) 69 enum { uSCROLL_FLAGS = SW_INVALIDATE };
78 #if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) 80 UINT m_uMsgMouseWheel;
81 #endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) 85 DWORD m_dwExtendedStyle;
89 #if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) 91 #endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) 92 m_zHDelta(0), m_nHWheelChars(3),
93 m_uScrollFlags(0U), m_dwExtendedStyle(0)
106 SetScrollExtendedStyle(SCRL_SCROLLCHILDREN | SCRL_ERASEBACKGROUND);
110 DWORD GetScrollExtendedStyle()
const 112 return m_dwExtendedStyle;
115 DWORD SetScrollExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0)
117 DWORD dwPrevStyle = m_dwExtendedStyle;
119 m_dwExtendedStyle = dwExtendedStyle;
121 m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask);
123 T* pT =
static_cast<T*
>(
this);
125 m_uScrollFlags = pT->uSCROLL_FLAGS | (IsScrollingChildren() ? SW_SCROLLCHILDREN : 0) | (IsErasingBackground() ? SW_ERASE : 0);
126 #if (WINVER >= 0x0500) && !defined(_WIN32_WCE) 127 m_uScrollFlags |= (IsSmoothScroll() ? SW_SMOOTHSCROLL : 0);
128 #endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE) 133 void SetScrollOffset(
int x,
int y, BOOL bRedraw = TRUE)
135 T* pT =
static_cast<T*
>(
this);
136 ATLASSERT(::IsWindow(pT->m_hWnd));
138 pT->AdjustScrollOffset(x, y);
140 int dx = m_ptOffset.x - x;
141 int dy = m_ptOffset.y - y;
147 SCROLLINFO si = {
sizeof(SCROLLINFO) };
149 if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLH) != 0)
150 si.fMask |= SIF_DISABLENOSCROLL;
151 si.nPos = m_ptOffset.x;
152 pT->SetScrollInfo(SB_HORZ, &si, bRedraw);
157 SCROLLINFO si = {
sizeof(SCROLLINFO) };
159 if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLV) != 0)
160 si.fMask |= SIF_DISABLENOSCROLL;
161 si.nPos = m_ptOffset.y;
162 pT->SetScrollInfo(SB_VERT, &si, bRedraw);
166 if(IsScrollingChildren() && (dx != 0 || dy != 0))
168 for(HWND hWndChild = ::GetWindow(pT->m_hWnd, GW_CHILD); hWndChild != NULL; hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT))
171 ::GetWindowRect(hWndChild, &rect);
172 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rect, 1);
173 ::SetWindowPos(hWndChild, NULL, rect.left + dx, rect.top + dy, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);
181 void SetScrollOffset(POINT ptOffset, BOOL bRedraw = TRUE)
183 SetScrollOffset(ptOffset.x, ptOffset.y, bRedraw);
186 void GetScrollOffset(POINT& ptOffset)
const 188 ptOffset = m_ptOffset;
192 void SetScrollSize(
int cx,
int cy, BOOL bRedraw = TRUE,
bool bResetOffset =
true)
194 T* pT =
static_cast<T*
>(
this);
195 ATLASSERT(::IsWindow(pT->m_hWnd));
206 pT->AdjustScrollOffset(x, y);
209 int dx = m_ptOffset.x - x;
210 int dy = m_ptOffset.y - y;
216 SCROLLINFO si = {
sizeof(SCROLLINFO) };
217 si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
218 if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLH) != 0)
219 si.fMask |= SIF_DISABLENOSCROLL;
221 si.nMax = m_sizeAll.cx - 1;
222 si.nPage = m_sizeClient.cx;
223 si.nPos = m_ptOffset.x;
224 pT->SetScrollInfo(SB_HORZ, &si, bRedraw);
229 SCROLLINFO si = {
sizeof(SCROLLINFO) };
230 si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
231 if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLV) != 0)
232 si.fMask |= SIF_DISABLENOSCROLL;
234 si.nMax = m_sizeAll.cy - 1;
235 si.nPage = m_sizeClient.cy;
236 si.nPos = m_ptOffset.y;
237 pT->SetScrollInfo(SB_VERT, &si, bRedraw);
241 if(IsScrollingChildren() && (dx != 0 || dy != 0))
243 for(HWND hWndChild = ::GetWindow(pT->m_hWnd, GW_CHILD); hWndChild != NULL; hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT))
246 ::GetWindowRect(hWndChild, &rect);
247 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rect, 1);
248 ::SetWindowPos(hWndChild, NULL, rect.left + dx, rect.top + dy, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);
259 void SetScrollSize(SIZE size, BOOL bRedraw = TRUE,
bool bResetOffset =
true)
261 SetScrollSize(size.cx, size.cy, bRedraw, bResetOffset);
264 void GetScrollSize(SIZE& sizeWnd)
const 270 void SetScrollLine(
int cxLine,
int cyLine)
272 ATLASSERT(cxLine >= 0 && cyLine >= 0);
273 ATLASSERT(m_sizeAll.cx != 0 && m_sizeAll.cy != 0);
275 m_sizeLine.cx = T::CalcLineOrPage(cxLine, m_sizeAll.cx, 100);
276 m_sizeLine.cy = T::CalcLineOrPage(cyLine, m_sizeAll.cy, 100);
279 void SetScrollLine(SIZE sizeLine)
281 SetScrollLine(sizeLine.cx, sizeLine.cy);
284 void GetScrollLine(SIZE& sizeLine)
const 286 sizeLine = m_sizeLine;
290 void SetScrollPage(
int cxPage,
int cyPage)
292 ATLASSERT(cxPage >= 0 && cyPage >= 0);
293 ATLASSERT(m_sizeAll.cx != 0 && m_sizeAll.cy != 0);
295 m_sizePage.cx = T::CalcLineOrPage(cxPage, m_sizeAll.cx, 10);
296 m_sizePage.cy = T::CalcLineOrPage(cyPage, m_sizeAll.cy, 10);
299 void SetScrollPage(SIZE sizePage)
301 SetScrollPage(sizePage.cx, sizePage.cy);
304 void GetScrollPage(SIZE& sizePage)
const 306 sizePage = m_sizePage;
310 void ScrollLineDown()
312 T* pT =
static_cast<T*
>(
this);
313 ATLASSERT(::IsWindow(pT->m_hWnd));
314 pT->DoScroll(SB_VERT, SB_LINEDOWN, (
int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);
319 T* pT =
static_cast<T*
>(
this);
320 ATLASSERT(::IsWindow(pT->m_hWnd));
321 pT->DoScroll(SB_VERT, SB_LINEUP, (
int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);
324 void ScrollPageDown()
326 T* pT =
static_cast<T*
>(
this);
327 ATLASSERT(::IsWindow(pT->m_hWnd));
328 pT->DoScroll(SB_VERT, SB_PAGEDOWN, (
int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);
333 T* pT =
static_cast<T*
>(
this);
334 ATLASSERT(::IsWindow(pT->m_hWnd));
335 pT->DoScroll(SB_VERT, SB_PAGEUP, (
int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);
340 T* pT =
static_cast<T*
>(
this);
341 ATLASSERT(::IsWindow(pT->m_hWnd));
342 pT->DoScroll(SB_VERT, SB_TOP, (
int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);
347 T* pT =
static_cast<T*
>(
this);
348 ATLASSERT(::IsWindow(pT->m_hWnd));
349 pT->DoScroll(SB_VERT, SB_BOTTOM, (
int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);
352 void ScrollLineRight()
354 T* pT =
static_cast<T*
>(
this);
355 ATLASSERT(::IsWindow(pT->m_hWnd));
356 pT->DoScroll(SB_HORZ, SB_LINEDOWN, (
int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);
359 void ScrollLineLeft()
361 T* pT =
static_cast<T*
>(
this);
362 ATLASSERT(::IsWindow(pT->m_hWnd));
363 pT->DoScroll(SB_HORZ, SB_LINEUP, (
int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);
366 void ScrollPageRight()
368 T* pT =
static_cast<T*
>(
this);
369 ATLASSERT(::IsWindow(pT->m_hWnd));
370 pT->DoScroll(SB_HORZ, SB_PAGEDOWN, (
int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);
373 void ScrollPageLeft()
375 T* pT =
static_cast<T*
>(
this);
376 ATLASSERT(::IsWindow(pT->m_hWnd));
377 pT->DoScroll(SB_HORZ, SB_PAGEUP, (
int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);
382 T* pT =
static_cast<T*
>(
this);
383 ATLASSERT(::IsWindow(pT->m_hWnd));
384 pT->DoScroll(SB_HORZ, SB_TOP, (
int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);
387 void ScrollAllRight()
389 T* pT =
static_cast<T*
>(
this);
390 ATLASSERT(::IsWindow(pT->m_hWnd));
391 pT->DoScroll(SB_HORZ, SB_BOTTOM, (
int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);
395 void ScrollToView(POINT pt)
397 T* pT =
static_cast<T*
>(
this);
398 ATLASSERT(::IsWindow(pT->m_hWnd));
399 RECT rect = { pt.x, pt.y, pt.x, pt.y };
400 pT->ScrollToView(rect);
403 void ScrollToView(RECT& rect)
405 T* pT =
static_cast<T*
>(
this);
406 ATLASSERT(::IsWindow(pT->m_hWnd));
408 RECT rcClient = { 0 };
409 pT->GetClientRect(&rcClient);
411 int x = m_ptOffset.x;
412 if(rect.left < m_ptOffset.x)
414 else if(rect.right > (m_ptOffset.x + rcClient.right))
415 x = rect.right - rcClient.right;
417 int y = m_ptOffset.y;
418 if(rect.top < m_ptOffset.y)
420 else if(rect.bottom > (m_ptOffset.y + rcClient.bottom))
421 y = rect.bottom - rcClient.bottom;
423 SetScrollOffset(x, y);
426 void ScrollToView(HWND hWnd)
428 T* pT =
static_cast<T*
>(
this);
429 ATLASSERT(::IsWindow(pT->m_hWnd));
432 ::GetWindowRect(hWnd, &rect);
433 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rect, 2);
438 MESSAGE_HANDLER(WM_CREATE, OnCreate)
439 MESSAGE_HANDLER(WM_VSCROLL, OnVScroll)
440 MESSAGE_HANDLER(WM_HSCROLL, OnHScroll)
441 MESSAGE_HANDLER(WM_MOUSEWHEEL, OnMouseWheel)
442 #if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) 443 MESSAGE_HANDLER(m_uMsgMouseWheel, OnMouseWheel)
444 #endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) 445 MESSAGE_HANDLER(WM_MOUSEHWHEEL, OnMouseHWheel)
446 MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)
447 MESSAGE_HANDLER(WM_SIZE, OnSize)
448 MESSAGE_HANDLER(WM_PAINT, OnPaint)
450 MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)
451 #endif // !_WIN32_WCE 454 COMMAND_ID_HANDLER(ID_SCROLL_UP, OnScrollUp)
455 COMMAND_ID_HANDLER(ID_SCROLL_DOWN, OnScrollDown)
456 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, OnScrollPageUp)
457 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, OnScrollPageDown)
458 COMMAND_ID_HANDLER(ID_SCROLL_TOP, OnScrollTop)
459 COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, OnScrollBottom)
460 COMMAND_ID_HANDLER(ID_SCROLL_LEFT, OnScrollLeft)
461 COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, OnScrollRight)
462 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, OnScrollPageLeft)
463 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, OnScrollPageRight)
464 COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, OnScrollAllLeft)
465 COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, OnScrollAllRight)
468 LRESULT OnCreate(UINT , WPARAM , LPARAM , BOOL& bHandled)
475 LRESULT OnVScroll(UINT , WPARAM wParam, LPARAM , BOOL& )
477 T* pT =
static_cast<T*
>(
this);
478 ATLASSERT(::IsWindow(pT->m_hWnd));
479 pT->DoScroll(SB_VERT, (
int)(
short)LOWORD(wParam), (
int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);
483 LRESULT OnHScroll(UINT , WPARAM wParam, LPARAM , BOOL& )
485 T* pT =
static_cast<T*
>(
this);
486 ATLASSERT(::IsWindow(pT->m_hWnd));
487 pT->DoScroll(SB_HORZ, (
int)(
short)LOWORD(wParam), (
int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);
491 LRESULT OnMouseWheel(UINT uMsg, WPARAM wParam, LPARAM , BOOL& )
493 T* pT =
static_cast<T*
>(
this);
494 ATLASSERT(::IsWindow(pT->m_hWnd));
496 #if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400) || defined(_WIN32_WCE) 498 int zDelta = (int)GET_WHEEL_DELTA_WPARAM(wParam);
500 int zDelta = (uMsg == WM_MOUSEWHEEL) ? (
int)GET_WHEEL_DELTA_WPARAM(wParam) : (int)wParam;
501 #endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400) || defined(_WIN32_WCE)) 502 int nScrollCode = (m_nWheelLines == WHEEL_PAGESCROLL) ? ((zDelta > 0) ? SB_PAGEUP : SB_PAGEDOWN) : ((zDelta > 0) ? SB_LINEUP : SB_LINEDOWN);
504 int zTotal = (m_nWheelLines == WHEEL_PAGESCROLL) ? abs(m_zDelta) : abs(m_zDelta) * m_nWheelLines;
505 if(m_sizeAll.cy > m_sizeClient.cy)
507 for(
int i = 0; i < zTotal; i += WHEEL_DELTA)
509 pT->DoScroll(SB_VERT, nScrollCode, (
int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);
515 for(
int i = 0; i < zTotal; i += WHEEL_DELTA)
517 pT->DoScroll(SB_HORZ, nScrollCode, (
int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);
521 m_zDelta %= WHEEL_DELTA;
526 LRESULT OnMouseHWheel(UINT , WPARAM wParam, LPARAM , BOOL& )
528 T* pT =
static_cast<T*
>(
this);
529 ATLASSERT(::IsWindow(pT->m_hWnd));
531 int zDelta = (int)GET_WHEEL_DELTA_WPARAM(wParam);
532 int nScrollCode = (m_nHWheelChars == WHEEL_PAGESCROLL) ? ((zDelta > 0) ? SB_PAGERIGHT : SB_PAGELEFT) : ((zDelta > 0) ? SB_LINERIGHT : SB_LINELEFT);
534 int zTotal = (m_nHWheelChars == WHEEL_PAGESCROLL) ? abs(m_zHDelta) : abs(m_zHDelta) * m_nHWheelChars;
535 if(m_sizeAll.cx > m_sizeClient.cx)
537 for(
int i = 0; i < zTotal; i += WHEEL_DELTA)
539 pT->DoScroll(SB_HORZ, nScrollCode, (
int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);
543 m_zHDelta %= WHEEL_DELTA;
548 LRESULT OnSettingChange(UINT , WPARAM , LPARAM , BOOL& )
554 LRESULT OnSize(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
556 T* pT =
static_cast<T*
>(
this);
557 ATLASSERT(::IsWindow(pT->m_hWnd));
559 m_sizeClient.cx = GET_X_LPARAM(lParam);
560 m_sizeClient.cy = GET_Y_LPARAM(lParam);
564 SCROLLINFO si = {
sizeof(SCROLLINFO) };
565 si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
567 si.nMax = m_sizeAll.cx - 1;
568 if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLH) != 0)
569 si.fMask |= SIF_DISABLENOSCROLL;
570 si.nPage = m_sizeClient.cx;
571 si.nPos = m_ptOffset.x;
572 pT->SetScrollInfo(SB_HORZ, &si, TRUE);
577 SCROLLINFO si = {
sizeof(SCROLLINFO) };
578 si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
580 si.nMax = m_sizeAll.cy - 1;
581 if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLV) != 0)
582 si.fMask |= SIF_DISABLENOSCROLL;
583 si.nPage = m_sizeClient.cy;
584 si.nPos = m_ptOffset.y;
585 pT->SetScrollInfo(SB_VERT, &si, TRUE);
588 int x = m_ptOffset.x;
589 int y = m_ptOffset.y;
590 if(pT->AdjustScrollOffset(x, y))
593 pT->ScrollWindowEx(m_ptOffset.x - x, m_ptOffset.y - y, (m_uScrollFlags & ~SCRL_SCROLLCHILDREN));
594 SetScrollOffset(x, y, FALSE);
601 LRESULT OnPaint(UINT , WPARAM wParam, LPARAM , BOOL& )
603 T* pT =
static_cast<T*
>(
this);
604 ATLASSERT(::IsWindow(pT->m_hWnd));
608 POINT ptViewportOrg = { 0, 0 };
609 dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y, &ptViewportOrg);
611 dc.SetViewportOrg(ptViewportOrg);
616 dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y);
617 pT->DoPaint(dc.m_hDC);
623 LRESULT OnScrollUp(WORD , WORD , HWND , BOOL& )
629 LRESULT OnScrollDown(WORD , WORD , HWND , BOOL& )
635 LRESULT OnScrollPageUp(WORD , WORD , HWND , BOOL& )
641 LRESULT OnScrollPageDown(WORD , WORD , HWND , BOOL& )
647 LRESULT OnScrollTop(WORD , WORD , HWND , BOOL& )
653 LRESULT OnScrollBottom(WORD , WORD , HWND , BOOL& )
659 LRESULT OnScrollLeft(WORD , WORD , HWND , BOOL& )
665 LRESULT OnScrollRight(WORD , WORD , HWND , BOOL& )
671 LRESULT OnScrollPageLeft(WORD , WORD , HWND , BOOL& )
677 LRESULT OnScrollPageRight(WORD , WORD , HWND , BOOL& )
683 LRESULT OnScrollAllLeft(WORD , WORD , HWND , BOOL& )
689 LRESULT OnScrollAllRight(WORD , WORD , HWND , BOOL& )
703 void DoScroll(
int nType,
int nScrollCode,
int& cxyOffset,
int cxySizeAll,
int cxySizePage,
int cxySizeLine)
705 T* pT =
static_cast<T*
>(
this);
707 pT->GetClientRect(&rect);
708 int cxyClient = (nType == SB_VERT) ? rect.bottom : rect.right;
709 int cxyMax = cxySizeAll - cxyClient;
720 cxyScroll = cxyOffset;
724 cxyScroll = cxyOffset - cxyMax;
728 if(cxyOffset >= cxySizeLine)
730 cxyScroll = cxySizeLine;
731 cxyOffset -= cxySizeLine;
735 cxyScroll = cxyOffset;
740 if(cxyOffset < cxyMax - cxySizeLine)
742 cxyScroll = -cxySizeLine;
743 cxyOffset += cxySizeLine;
747 cxyScroll = cxyOffset - cxyMax;
752 if(cxyOffset >= cxySizePage)
754 cxyScroll = cxySizePage;
755 cxyOffset -= cxySizePage;
759 cxyScroll = cxyOffset;
764 if(cxyOffset < cxyMax - cxySizePage)
766 cxyScroll = -cxySizePage;
767 cxyOffset += cxySizePage;
771 cxyScroll = cxyOffset - cxyMax;
776 if(IsNoThumbTracking())
779 case SB_THUMBPOSITION:
781 SCROLLINFO si = {
sizeof(SCROLLINFO), SIF_TRACKPOS };
782 if(pT->GetScrollInfo(nType, &si))
784 cxyScroll = cxyOffset - si.nTrackPos;
785 cxyOffset = si.nTrackPos;
795 if(bUpdate && cxyScroll != 0)
797 pT->SetScrollPos(nType, cxyOffset, TRUE);
799 pT->ScrollWindowEx(0, cxyScroll, m_uScrollFlags);
801 pT->ScrollWindowEx(cxyScroll, 0, m_uScrollFlags);
805 static int CalcLineOrPage(
int nVal,
int nMax,
int nDiv)
821 bool AdjustScrollOffset(
int& x,
int& y)
826 int cxMax = m_sizeAll.cx - m_sizeClient.cx;
828 x = (cxMax >= 0) ? cxMax : 0;
832 int cyMax = m_sizeAll.cy - m_sizeClient.cy;
834 y = (cyMax >= 0) ? cyMax : 0;
838 return (x != xOld || y != yOld);
841 void GetSystemSettings()
844 #ifndef SPI_GETWHEELSCROLLLINES 845 const UINT SPI_GETWHEELSCROLLLINES = 104;
846 #endif // !SPI_GETWHEELSCROLLLINES 847 ::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &m_nWheelLines, 0);
849 #ifndef SPI_GETWHEELSCROLLCHARS 850 const UINT SPI_GETWHEELSCROLLCHARS = 0x006C;
851 #endif // !SPI_GETWHEELSCROLLCHARS 852 ::SystemParametersInfo(SPI_GETWHEELSCROLLCHARS, 0, &m_nHWheelChars, 0);
854 #if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) 855 if(m_uMsgMouseWheel != 0)
856 m_uMsgMouseWheel = ::RegisterWindowMessage(MSH_MOUSEWHEEL);
858 HWND hWndWheel = FindWindow(MSH_WHEELMODULE_CLASS, MSH_WHEELMODULE_TITLE);
859 if(::IsWindow(hWndWheel))
861 UINT uMsgScrollLines = ::RegisterWindowMessage(MSH_SCROLL_LINES);
862 if(uMsgScrollLines != 0)
863 m_nWheelLines = (int)::SendMessage(hWndWheel, uMsgScrollLines, 0, 0L);
865 #endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) 866 #endif // !_WIN32_WCE 869 bool IsScrollingChildren()
const 871 return (m_dwExtendedStyle & SCRL_SCROLLCHILDREN) != 0;
874 bool IsErasingBackground()
const 876 return (m_dwExtendedStyle & SCRL_ERASEBACKGROUND) != 0;
879 bool IsNoThumbTracking()
const 881 return (m_dwExtendedStyle & SCRL_NOTHUMBTRACKING) != 0;
884 #if (WINVER >= 0x0500) 885 bool IsSmoothScroll()
const 887 return (m_dwExtendedStyle & SCRL_SMOOTHSCROLL) != 0;
889 #endif // (WINVER >= 0x0500) 896 template <
class T,
class TBase = ATL::CWindow,
class TWinTraits = ATL::CControlWinTraits>
904 #if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) 906 #endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) 913 #endif // !_WIN32_WCE 948 ::SetRectEmpty(&m_rectLogAll);
949 m_sizeLogPage.cx = 0;
950 m_sizeLogPage.cy = 0;
951 m_sizeLogLine.cx = 0;
952 m_sizeLogLine.cy = 0;
957 void SetScrollMapMode(
int nMapMode)
959 ATLASSERT(nMapMode >= MM_MIN && nMapMode <= MM_MAX_FIXEDSCALE);
960 m_nMapMode = nMapMode;
963 int GetScrollMapMode()
const 965 ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);
970 void SetScrollOffset(
int x,
int y, BOOL bRedraw = TRUE)
972 ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);
973 POINT ptOff = { x, y };
977 dc.SetMapMode(m_nMapMode);
983 void SetScrollOffset(POINT ptOffset, BOOL bRedraw = TRUE)
985 SetScrollOffset(ptOffset.x, ptOffset.y, bRedraw);
988 void GetScrollOffset(POINT& ptOffset)
const 990 ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);
991 ptOffset = m_ptOffset;
995 dc.SetMapMode(m_nMapMode);
996 dc.DPtoLP(&ptOffset);
1001 void SetScrollSize(
int xMin,
int yMin,
int xMax,
int yMax, BOOL bRedraw = TRUE,
bool bResetOffset =
true)
1003 ATLASSERT(xMax > xMin && yMax > yMin);
1004 ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);
1006 ::SetRect(&m_rectLogAll, xMin, yMin, xMax, yMax);
1008 SIZE sizeAll = { 0 };
1009 sizeAll.cx = xMax - xMin + 1;
1010 sizeAll.cy = yMax - yMin + 1;
1014 dc.SetMapMode(m_nMapMode);
1015 dc.LPtoDP(&sizeAll);
1018 SetScrollLine(0, 0);
1019 SetScrollPage(0, 0);
1022 void SetScrollSize(RECT& rcScroll, BOOL bRedraw = TRUE,
bool bResetOffset =
true)
1024 SetScrollSize(rcScroll.left, rcScroll.top, rcScroll.right, rcScroll.bottom, bRedraw, bResetOffset);
1027 void SetScrollSize(
int cx,
int cy, BOOL bRedraw = TRUE,
bool bResetOffset =
true)
1029 SetScrollSize(0, 0, cx, cy, bRedraw, bResetOffset);
1032 void SetScrollSize(SIZE size, BOOL bRedraw = TRUE,
bool bResetOffset =
true)
1034 SetScrollSize(0, 0, size.cx, size.cy, bRedraw, bResetOffset);
1037 void GetScrollSize(RECT& rcScroll)
const 1039 ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);
1040 rcScroll = m_rectLogAll;
1044 void SetScrollLine(
int cxLine,
int cyLine)
1046 ATLASSERT(cxLine >= 0 && cyLine >= 0);
1047 ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);
1049 m_sizeLogLine.cx = cxLine;
1050 m_sizeLogLine.cy = cyLine;
1051 SIZE sizeLine = m_sizeLogLine;
1055 dc.SetMapMode(m_nMapMode);
1056 dc.LPtoDP(&sizeLine);
1061 void SetScrollLine(SIZE sizeLine)
1063 SetScrollLine(sizeLine.cx, sizeLine.cy);
1066 void GetScrollLine(SIZE& sizeLine)
const 1068 ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);
1069 sizeLine = m_sizeLogLine;
1073 void SetScrollPage(
int cxPage,
int cyPage)
1075 ATLASSERT(cxPage >= 0 && cyPage >= 0);
1076 ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);
1078 m_sizeLogPage.cx = cxPage;
1079 m_sizeLogPage.cy = cyPage;
1080 SIZE sizePage = m_sizeLogPage;
1084 dc.SetMapMode(m_nMapMode);
1085 dc.LPtoDP(&sizePage);
1090 void SetScrollPage(SIZE sizePage)
1092 SetScrollPage(sizePage.cx, sizePage.cy);
1095 void GetScrollPage(SIZE& sizePage)
const 1097 ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);
1098 sizePage = m_sizeLogPage;
1105 #if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) 1107 #endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) 1111 MESSAGE_HANDLER(WM_PAINT, OnPaint)
1112 MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)
1128 LRESULT OnPaint(UINT , WPARAM wParam, LPARAM , BOOL& )
1130 T* pT =
static_cast<T*
>(
this);
1131 ATLASSERT(::IsWindow(pT->m_hWnd));
1135 int nMapModeSav = dc.GetMapMode();
1136 dc.SetMapMode(m_nMapMode);
1137 POINT ptViewportOrg = { 0, 0 };
1138 if(m_nMapMode == MM_TEXT)
1139 dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y, &ptViewportOrg);
1141 dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y + m_sizeAll.cy, &ptViewportOrg);
1142 POINT ptWindowOrg = { 0, 0 };
1143 dc.SetWindowOrg(m_rectLogAll.left, m_rectLogAll.top, &ptWindowOrg);
1147 dc.SetMapMode(nMapModeSav);
1148 dc.SetViewportOrg(ptViewportOrg);
1149 dc.SetWindowOrg(ptWindowOrg);
1154 dc.SetMapMode(m_nMapMode);
1155 if(m_nMapMode == MM_TEXT)
1156 dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y);
1158 dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y + m_sizeAll.cy);
1159 dc.SetWindowOrg(m_rectLogAll.left, m_rectLogAll.top);
1160 pT->DoPaint(dc.m_hDC);
1166 #endif // !_WIN32_WCE 1174 template <
class T,
class TBase = ATL::CWindow,
class TWinTraits = ATL::CControlWinTraits>
1182 #if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) 1184 #endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) 1206 #endif // !_WIN32_WCE 1212 #if defined(__ATLCTRLS_H__) && (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) 1214 template <
class TBase = ATL::CWindow>
1215 class CFSBWindowT :
public TBase,
public CFlatScrollBarImpl<CFSBWindowT< TBase > >
1219 CFSBWindowT(HWND hWnd = NULL) : TBase(hWnd)
1222 CFSBWindowT< TBase >& operator =(HWND hWnd)
1230 int SetScrollPos(
int nBar,
int nPos, BOOL bRedraw = TRUE)
1232 ATLASSERT(::IsWindow(m_hWnd));
1233 return FlatSB_SetScrollPos(nBar, nPos, bRedraw);
1236 BOOL GetScrollInfo(
int nBar, LPSCROLLINFO lpScrollInfo)
1238 ATLASSERT(::IsWindow(m_hWnd));
1239 return FlatSB_GetScrollInfo(nBar, lpScrollInfo);
1242 BOOL SetScrollInfo(
int nBar, LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE)
1244 ATLASSERT(::IsWindow(m_hWnd));
1245 return FlatSB_SetScrollInfo(nBar, lpScrollInfo, bRedraw);
1249 typedef CFSBWindowT<ATL::CWindow> CFSBWindow;
1251 #endif // defined(__ATLCTRLS_H__) && (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) 1268 #define ZSN_ZOOMCHANGED (NM_FIRST - 50) 1274 enum { m_cxyMinZoomRect = 12 };
1281 float m_fZoomScaleMin;
1290 m_fZoomScaleMin(0.5),
1292 m_nZoomMode(ZOOMMODE_OFF),
1295 m_sizeLogAll.cx = 0;
1296 m_sizeLogAll.cy = 0;
1297 m_sizeLogPage.cx = 0;
1298 m_sizeLogPage.cy = 0;
1299 m_sizeLogLine.cx = 0;
1300 m_sizeLogLine.cy = 0;
1301 ::SetRectEmpty(&m_rcTrack);
1307 void SetScrollSize(
int cxLog,
int cyLog, BOOL bRedraw = TRUE,
bool bResetOffset =
true)
1309 ATLASSERT(cxLog >= 0 && cyLog >= 0);
1312 if (cxLog == 0 && cyLog == 0)
1318 m_sizeLogAll.cx = cxLog;
1319 m_sizeLogAll.cy = cyLog;
1320 SIZE sizeAll = { 0 };
1321 sizeAll.cx = (int)((
float)m_sizeLogAll.cx * m_fZoomScale);
1322 sizeAll.cy = (int)((
float)m_sizeLogAll.cy * m_fZoomScale);
1327 void SetScrollSize(SIZE sizeLog, BOOL bRedraw = TRUE,
bool bResetOffset =
true)
1329 SetScrollSize(sizeLog.cx, sizeLog.cy, bRedraw, bResetOffset);
1332 void GetScrollSize(SIZE& sizeLog)
const 1334 sizeLog = m_sizeLogAll;
1338 void SetScrollLine(
int cxLogLine,
int cyLogLine)
1340 ATLASSERT(cxLogLine >= 0 && cyLogLine >= 0);
1342 m_sizeLogLine.cx = cxLogLine;
1343 m_sizeLogLine.cy = cyLogLine;
1345 SIZE sizeLine = { 0 };
1346 sizeLine.cx = (int)((
float)m_sizeLogLine.cx * m_fZoomScale);
1347 sizeLine.cy = (int)((
float)m_sizeLogLine.cy * m_fZoomScale);
1351 void SetScrollLine(SIZE sizeLogLine)
1353 SetScrollLine(sizeLogLine.cx, sizeLogLine.cy);
1356 void GetScrollLine(SIZE& sizeLogLine)
const 1358 sizeLogLine = m_sizeLogLine;
1362 void SetScrollPage(
int cxLogPage,
int cyLogPage)
1364 ATLASSERT(cxLogPage >= 0 && cyLogPage >= 0);
1366 m_sizeLogPage.cx = cxLogPage;
1367 m_sizeLogPage.cy = cyLogPage;
1369 SIZE sizePage = { 0 };
1370 sizePage.cx = (int)((
float)m_sizeLogPage.cx * m_fZoomScale);
1371 sizePage.cy = (int)((
float)m_sizeLogPage.cy * m_fZoomScale);
1376 void SetScrollPage(SIZE sizeLogPage)
1378 SetScrollPage(sizeLogPage.cx, sizeLogPage.cy);
1381 void GetScrollPage(SIZE& sizeLogPage)
const 1383 sizeLogPage = m_sizeLogPage;
1386 void SetZoomScale(
float fZoomScale)
1388 ATLASSERT(fZoomScale > 0);
1390 if(fZoomScale > 0 && fZoomScale >= m_fZoomScaleMin)
1391 m_fZoomScale = fZoomScale;
1394 float GetZoomScale()
const 1396 return m_fZoomScale;
1399 void SetZoomScaleMin(
float fZoomScaleMin)
1401 m_fZoomScaleMin = fZoomScaleMin;
1404 float GetZoomScaleMin()
const 1406 return m_fZoomScaleMin;
1409 void SetZoomDelta(
float fZoomDelta)
1411 ATLASSERT(fZoomDelta >= 0);
1414 m_fZoomDelta = fZoomDelta;
1417 float GetZoomDelta()
const 1419 return m_fZoomDelta;
1422 void SetZoomMode(
int nZoomMode)
1424 m_nZoomMode = nZoomMode;
1427 int GetZoomMode()
const 1432 void Zoom(
int x,
int y,
float fZoomScale)
1437 fZoomScale = max(fZoomScale, m_fZoomScaleMin);
1439 T* pT =
static_cast<T*
>(
this);
1440 POINT pt = { x, y };
1441 if(!pT->PtInDevRect(pt))
1444 pT->ViewDPtoLP(&pt);
1445 pT->Zoom(fZoomScale,
false);
1446 pT->CenterOnLogicalPoint(pt);
1449 void Zoom(POINT pt,
float fZoomScale)
1451 T* pT =
static_cast<T*
>(
this);
1452 pT->Zoom(pt.x, pt.y, fZoomScale);
1457 T* pT =
static_cast<T*
>(
this);
1459 pT->NormalizeRect(rcZoom);
1460 SIZE size = { rcZoom.right - rcZoom.left, rcZoom.bottom - rcZoom.top };
1461 POINT pt = { rcZoom.left + size.cx / 2, rcZoom.top + size.cy / 2 };
1462 if(size.cx < m_cxyMinZoomRect || size.cy < m_cxyMinZoomRect)
1464 pT->Zoom(pt, m_fZoomScale + m_fZoomDelta);
1468 ATLASSERT(size.cx > 0 && size.cy > 0);
1470 float fScaleH = (float)(m_sizeClient.cx + 1) / (float)size.cx;
1471 float fScaleV = (
float)(m_sizeClient.cy + 1) / (
float)size.cy;
1472 float fZoomScale = min(fScaleH, fScaleV) * m_fZoomScale;
1473 pT->Zoom(pt, fZoomScale);
1476 void Zoom(
float fZoomScale,
bool bCenter =
true)
1481 fZoomScale = max(fZoomScale, m_fZoomScaleMin);
1484 T* pT =
static_cast<T*
>(
this);
1489 ::GetClientRect(pT->m_hWnd, &rc);
1490 pt.x = rc.right / 2;
1491 pt.y = rc.bottom / 2;
1492 pT->ViewDPtoLP(&pt);
1496 m_fZoomScale = fZoomScale;
1497 SIZE sizeAll = { 0 };
1498 sizeAll.cx = (int)((
float)m_sizeLogAll.cx * fZoomScale);
1499 sizeAll.cy = (int)((
float)m_sizeLogAll.cy * fZoomScale);
1505 pT->CenterOnLogicalPoint(pt);
1511 ATLASSERT(m_sizeAll.cx >= 0 && m_sizeAll.cy >= 0);
1512 dc.SetMapMode(MM_ANISOTROPIC);
1513 dc.SetWindowExt(m_sizeLogAll);
1514 dc.SetViewportExt(m_sizeAll);
1515 dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y);
1518 void ViewDPtoLP(LPPOINT lpPoints,
int nCount = 1)
1520 ATLASSERT(lpPoints);
1521 T* pT =
static_cast<T*
>(
this);
1522 ATLASSERT(::IsWindow(pT->m_hWnd));
1525 pT->PrepareDC(dc.m_hDC);
1526 dc.DPtoLP(lpPoints, nCount);
1529 void ViewLPtoDP(LPPOINT lpPoints,
int nCount = 1)
1531 ATLASSERT(lpPoints);
1532 T* pT =
static_cast<T*
>(
this);
1533 ATLASSERT(::IsWindow(pT->m_hWnd));
1536 pT->PrepareDC(dc.m_hDC);
1537 dc.LPtoDP(lpPoints, nCount);
1540 void ClientToDevice(POINT &pt)
1542 pt.x += m_ptOffset.x;
1543 pt.y += m_ptOffset.y;
1546 void DeviceToClient(POINT &pt)
1548 pt.x -= m_ptOffset.x;
1549 pt.y -= m_ptOffset.y;
1552 void CenterOnPoint(POINT pt)
1554 T* pT =
static_cast<T*
>(
this);
1556 pT->GetClientRect(&rect);
1558 int xOfs = pt.x - (rect.right / 2) + m_ptOffset.x;
1565 int xMax = max((
int)(m_sizeAll.cx - rect.right), 0);
1570 int yOfs = pt.y - (rect.bottom / 2) + m_ptOffset.y;
1577 int yMax = max((
int)(m_sizeAll.cy - rect.bottom), 0);
1585 void CenterOnLogicalPoint(POINT ptLog)
1587 T* pT =
static_cast<T*
>(
this);
1588 pT->ViewLPtoDP(&ptLog);
1589 pT->DeviceToClient(ptLog);
1590 pT->CenterOnPoint(ptLog);
1593 BOOL PtInDevRect(POINT pt)
1595 RECT rc = { 0, 0, m_sizeAll.cx, m_sizeAll.cy };
1596 ::OffsetRect(&rc, -m_ptOffset.x, -m_ptOffset.y);
1597 return ::PtInRect(&rc, pt);
1600 void NormalizeRect(RECT& rc)
1602 if(rc.left > rc.right)
1608 if(rc.top > rc.bottom)
1616 void DrawTrackRect()
1618 T* pT =
static_cast<T*
>(
this);
1619 const SIZE sizeLines = { 2, 2 };
1620 RECT rc = m_rcTrack;
1621 pT->NormalizeRect(rc);
1622 if(!::IsRectEmpty(&rc))
1624 ::MapWindowPoints(pT->m_hWnd, NULL, (LPPOINT)&rc, 2);
1626 dc.DrawDragRect(&rc, sizeLines, NULL, sizeLines);
1630 void NotifyParentZoomChanged()
1632 T* pT =
static_cast<T*
>(
this);
1633 int nId = pT->GetDlgCtrlID();
1634 NMHDR nmhdr = { pT->m_hWnd, nId, ZSN_ZOOMCHANGED };
1635 ::SendMessage(pT->GetParent(), WM_NOTIFY, (WPARAM)nId, (LPARAM)&nmhdr);
1639 MESSAGE_HANDLER(WM_SETCURSOR, OnSetCursor)
1643 #if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) 1645 #endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) 1649 MESSAGE_HANDLER(WM_PAINT, OnPaint)
1650 MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)
1651 MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown)
1652 MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)
1653 MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp)
1654 MESSAGE_HANDLER(WM_CAPTURECHANGED, OnCaptureChanged)
1670 LRESULT OnPaint(UINT , WPARAM wParam, LPARAM , BOOL& )
1672 T* pT =
static_cast<T*
>(
this);
1673 ATLASSERT(::IsWindow(pT->m_hWnd));
1674 ATLASSERT(m_sizeLogAll.cx >= 0 && m_sizeLogAll.cy >= 0);
1675 ATLASSERT(m_sizeAll.cx >= 0 && m_sizeAll.cy >= 0);
1680 int nMapModeSav = dc.GetMapMode();
1681 dc.SetMapMode(MM_ANISOTROPIC);
1682 SIZE szWindowExt = { 0, 0 };
1683 dc.SetWindowExt(m_sizeLogAll, &szWindowExt);
1684 SIZE szViewportExt = { 0, 0 };
1685 dc.SetViewportExt(m_sizeAll, &szViewportExt);
1686 POINT ptViewportOrg = { 0, 0 };
1687 dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y, &ptViewportOrg);
1691 dc.SetMapMode(nMapModeSav);
1692 dc.SetWindowExt(szWindowExt);
1693 dc.SetViewportExt(szViewportExt);
1694 dc.SetViewportOrg(ptViewportOrg);
1699 pT->PrepareDC(dc.m_hDC);
1700 pT->DoPaint(dc.m_hDC);
1705 LRESULT OnLButtonDown(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
1707 if(m_nZoomMode == ZOOMMODE_IN && !m_bTracking)
1709 T* pT =
static_cast<T*
>(
this);
1710 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
1711 if(pT->PtInDevRect(pt))
1715 ::SetRect(&m_rcTrack, pt.x, pt.y, pt.x, pt.y);
1722 LRESULT OnMouseMove(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
1726 T* pT =
static_cast<T*
>(
this);
1727 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
1728 if(pT->PtInDevRect(pt))
1730 pT->DrawTrackRect();
1731 m_rcTrack.right = pt.x;
1732 m_rcTrack.bottom = pt.y;
1733 pT->DrawTrackRect();
1740 LRESULT OnLButtonUp(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
1743 if(m_nZoomMode == ZOOMMODE_OUT)
1745 T* pT =
static_cast<T*
>(
this);
1746 pT->Zoom(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), m_fZoomScale - m_fZoomDelta);
1747 pT->NotifyParentZoomChanged();
1753 LRESULT OnCaptureChanged(UINT , WPARAM , LPARAM , BOOL& bHandled)
1757 m_bTracking =
false;
1758 T* pT =
static_cast<T*
>(
this);
1759 pT->DrawTrackRect();
1760 pT->Zoom(m_rcTrack);
1761 pT->NotifyParentZoomChanged();
1762 ::SetRectEmpty(&m_rcTrack);
1768 LRESULT OnSetCursor(UINT , WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1770 if(LOWORD(lParam) == HTCLIENT && m_nZoomMode != ZOOMMODE_OFF)
1772 T* pT =
static_cast<T*
>(
this);
1773 if((HWND)wParam == pT->m_hWnd)
1775 DWORD dwPos = ::GetMessagePos();
1776 POINT pt = { GET_X_LPARAM(dwPos), GET_Y_LPARAM(dwPos) };
1777 pT->ScreenToClient(&pt);
1778 if(pT->PtInDevRect(pt))
1780 ::SetCursor(::LoadCursor(NULL, IDC_CROSS));
1793 template <
class T,
class TBase = ATL::CWindow,
class TWinTraits = ATL::CControlWinTraits>
1802 #if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) 1804 #endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) 1830 #endif // !_WIN32_WCE 1836 template <
class T,
class TBase = ATL::CWindow,
class TWinTraits = ATL::CControlWinTraits>
1840 DECLARE_WND_CLASS_EX(NULL, 0, -1)
1845 ATL::CWindow m_wndClient;
1846 bool m_bAutoSizeClient;
1847 bool m_bDrawEdgeIfEmpty;
1853 SetScrollExtendedStyle(SCRL_SCROLLCHILDREN);
1857 HWND GetClient()
const 1862 HWND SetClient(HWND hWndClient,
bool bClientSizeAsMin =
true)
1864 ATLASSERT(::IsWindow(m_hWnd));
1866 HWND hWndOldClient = m_wndClient;
1867 m_wndClient = hWndClient;
1870 SetScrollSize(1, 1, FALSE);
1872 if(m_wndClient.m_hWnd != NULL)
1874 m_wndClient.SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
1876 if(bClientSizeAsMin)
1879 m_wndClient.GetWindowRect(&rect);
1880 if((rect.right - rect.left) > 0 && (rect.bottom - rect.top) > 0)
1881 SetScrollSize(rect.right - rect.left, rect.bottom - rect.top, FALSE);
1884 T* pT =
static_cast<T*
>(
this);
1889 RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_FRAME | RDW_UPDATENOW | RDW_ALLCHILDREN);
1891 return hWndOldClient;
1896 MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
1897 MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
1898 MESSAGE_HANDLER(WM_SIZE, OnSize)
1899 CHAIN_MSG_MAP(_baseClass)
1900 FORWARD_NOTIFICATIONS()
1902 CHAIN_MSG_MAP_ALT(_baseClass, 1)
1905 LRESULT OnSetFocus(UINT , WPARAM , LPARAM , BOOL& )
1907 if(m_wndClient.m_hWnd != NULL)
1908 m_wndClient.SetFocus();
1913 LRESULT OnEraseBackground(UINT , WPARAM , LPARAM , BOOL& )
1918 LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& )
1921 LRESULT lRet = _baseClass::OnSize(uMsg, wParam, lParam, bTmp);
1923 T* pT =
static_cast<T*
>(
this);
1932 if(!m_bAutoSizeClient || m_wndClient.m_hWnd == NULL)
1934 T* pT =
static_cast<T*
>(
this);
1936 pT->GetContainerRect(rect);
1938 if(m_bDrawEdgeIfEmpty && m_wndClient.m_hWnd == NULL)
1939 dc.DrawEdge(&rect, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
1941 dc.FillRect(&rect, COLOR_APPWORKSPACE);
1945 void ScrollToView(POINT pt)
1950 void ScrollToView(RECT& rect)
1955 void ScrollToView(HWND hWnd)
1957 T* pT =
static_cast<T*
>(
this);
1959 ATLASSERT(::IsWindow(pT->m_hWnd));
1960 ATLASSERT(m_wndClient.IsWindow());
1963 ::GetWindowRect(hWnd, &rect);
1964 ::MapWindowPoints(NULL, m_wndClient.m_hWnd, (LPPOINT)&rect, 2);
1971 ATLASSERT(::IsWindow(m_hWnd));
1973 if(m_bAutoSizeClient && m_wndClient.m_hWnd != NULL)
1975 T* pT =
static_cast<T*
>(
this);
1977 pT->GetContainerRect(rect);
1979 m_wndClient.SetWindowPos(NULL, &rect, SWP_NOZORDER | SWP_NOMOVE);
1987 void GetContainerRect(RECT& rect)
1989 GetClientRect(&rect);
1991 if(rect.right < m_sizeAll.cx)
1992 rect.right = m_sizeAll.cx;
1994 if(rect.bottom < m_sizeAll.cy)
1995 rect.bottom = m_sizeAll.cy;
2002 DECLARE_WND_CLASS_EX(_T(
"WTL_ScrollContainer"), 0, -1)
2007 #endif // __ATLSCRL_H__
Definition: atlgdi.h:1211
Definition: atlgdi.h:3364
Definition: atlgdi.h:3409