15 #error atlscrl.h requires atlapp.h to be included first 19 #error atlscrl.h requires atlwin.h to be included first 22 #if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) 26 #ifndef GET_WHEEL_DELTA_WPARAM 27 #define GET_WHEEL_DELTA_WPARAM(wParam) ((short)HIWORD(wParam)) 51 #define SCRL_SCROLLCHILDREN 0x00000001 52 #define SCRL_ERASEBACKGROUND 0x00000002 53 #define SCRL_NOTHUMBTRACKING 0x00000004 54 #if (WINVER >= 0x0500) 55 #define SCRL_SMOOTHSCROLL 0x00000008 56 #endif // (WINVER >= 0x0500) 57 #define SCRL_DISABLENOSCROLLV 0x00000010 58 #define SCRL_DISABLENOSCROLLH 0x00000020 59 #define SCRL_DISABLENOSCROLL (SCRL_DISABLENOSCROLLV | SCRL_DISABLENOSCROLLH) 66 enum { uSCROLL_FLAGS = SW_INVALIDATE };
75 #if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) 77 UINT m_uMsgMouseWheel;
78 #endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) 82 DWORD m_dwExtendedStyle;
86 #if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) 88 #endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) 89 m_zHDelta(0), m_nHWheelChars(3),
90 m_uScrollFlags(0U), m_dwExtendedStyle(0)
103 SetScrollExtendedStyle(SCRL_SCROLLCHILDREN | SCRL_ERASEBACKGROUND);
107 DWORD GetScrollExtendedStyle()
const 109 return m_dwExtendedStyle;
112 DWORD SetScrollExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0)
114 DWORD dwPrevStyle = m_dwExtendedStyle;
116 m_dwExtendedStyle = dwExtendedStyle;
118 m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask);
120 T* pT =
static_cast<T*
>(
this);
122 m_uScrollFlags = pT->uSCROLL_FLAGS | (IsScrollingChildren() ? SW_SCROLLCHILDREN : 0) | (IsErasingBackground() ? SW_ERASE : 0);
123 #if (WINVER >= 0x0500) && !defined(_WIN32_WCE) 124 m_uScrollFlags |= (IsSmoothScroll() ? SW_SMOOTHSCROLL : 0);
125 #endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE) 130 void SetScrollOffset(
int x,
int y, BOOL bRedraw = TRUE)
132 T* pT =
static_cast<T*
>(
this);
133 ATLASSERT(::IsWindow(pT->m_hWnd));
135 pT->AdjustScrollOffset(x, y);
137 int dx = m_ptOffset.x - x;
138 int dy = m_ptOffset.y - y;
144 SCROLLINFO si = {
sizeof(SCROLLINFO) };
146 if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLH) != 0)
147 si.fMask |= SIF_DISABLENOSCROLL;
148 si.nPos = m_ptOffset.x;
149 pT->SetScrollInfo(SB_HORZ, &si, bRedraw);
154 SCROLLINFO si = {
sizeof(SCROLLINFO) };
156 if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLV) != 0)
157 si.fMask |= SIF_DISABLENOSCROLL;
158 si.nPos = m_ptOffset.y;
159 pT->SetScrollInfo(SB_VERT, &si, bRedraw);
163 if(IsScrollingChildren() && (dx != 0 || dy != 0))
165 for(HWND hWndChild = ::GetWindow(pT->m_hWnd, GW_CHILD); hWndChild != NULL; hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT))
168 ::GetWindowRect(hWndChild, &rect);
169 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rect, 1);
170 ::SetWindowPos(hWndChild, NULL, rect.left + dx, rect.top + dy, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);
178 void SetScrollOffset(POINT ptOffset, BOOL bRedraw = TRUE)
180 SetScrollOffset(ptOffset.x, ptOffset.y, bRedraw);
183 void GetScrollOffset(POINT& ptOffset)
const 185 ptOffset = m_ptOffset;
189 void SetScrollSize(
int cx,
int cy, BOOL bRedraw = TRUE,
bool bResetOffset =
true)
191 T* pT =
static_cast<T*
>(
this);
192 ATLASSERT(::IsWindow(pT->m_hWnd));
203 pT->AdjustScrollOffset(x, y);
206 int dx = m_ptOffset.x - x;
207 int dy = m_ptOffset.y - y;
213 SCROLLINFO si = {
sizeof(SCROLLINFO) };
214 si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
215 if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLH) != 0)
216 si.fMask |= SIF_DISABLENOSCROLL;
218 si.nMax = m_sizeAll.cx - 1;
219 si.nPage = m_sizeClient.cx;
220 si.nPos = m_ptOffset.x;
221 pT->SetScrollInfo(SB_HORZ, &si, bRedraw);
226 SCROLLINFO si = {
sizeof(SCROLLINFO) };
227 si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
228 if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLV) != 0)
229 si.fMask |= SIF_DISABLENOSCROLL;
231 si.nMax = m_sizeAll.cy - 1;
232 si.nPage = m_sizeClient.cy;
233 si.nPos = m_ptOffset.y;
234 pT->SetScrollInfo(SB_VERT, &si, bRedraw);
238 if(IsScrollingChildren() && (dx != 0 || dy != 0))
240 for(HWND hWndChild = ::GetWindow(pT->m_hWnd, GW_CHILD); hWndChild != NULL; hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT))
243 ::GetWindowRect(hWndChild, &rect);
244 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rect, 1);
245 ::SetWindowPos(hWndChild, NULL, rect.left + dx, rect.top + dy, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);
256 void SetScrollSize(SIZE size, BOOL bRedraw = TRUE,
bool bResetOffset =
true)
258 SetScrollSize(size.cx, size.cy, bRedraw, bResetOffset);
261 void GetScrollSize(SIZE& sizeWnd)
const 267 void SetScrollLine(
int cxLine,
int cyLine)
269 ATLASSERT(cxLine >= 0 && cyLine >= 0);
270 ATLASSERT(m_sizeAll.cx != 0 && m_sizeAll.cy != 0);
272 m_sizeLine.cx = T::CalcLineOrPage(cxLine, m_sizeAll.cx, 100);
273 m_sizeLine.cy = T::CalcLineOrPage(cyLine, m_sizeAll.cy, 100);
276 void SetScrollLine(SIZE sizeLine)
278 SetScrollLine(sizeLine.cx, sizeLine.cy);
281 void GetScrollLine(SIZE& sizeLine)
const 283 sizeLine = m_sizeLine;
287 void SetScrollPage(
int cxPage,
int cyPage)
289 ATLASSERT(cxPage >= 0 && cyPage >= 0);
290 ATLASSERT(m_sizeAll.cx != 0 && m_sizeAll.cy != 0);
292 m_sizePage.cx = T::CalcLineOrPage(cxPage, m_sizeAll.cx, 10);
293 m_sizePage.cy = T::CalcLineOrPage(cyPage, m_sizeAll.cy, 10);
296 void SetScrollPage(SIZE sizePage)
298 SetScrollPage(sizePage.cx, sizePage.cy);
301 void GetScrollPage(SIZE& sizePage)
const 303 sizePage = m_sizePage;
307 void ScrollLineDown()
309 T* pT =
static_cast<T*
>(
this);
310 ATLASSERT(::IsWindow(pT->m_hWnd));
311 pT->DoScroll(SB_VERT, SB_LINEDOWN, (
int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);
316 T* pT =
static_cast<T*
>(
this);
317 ATLASSERT(::IsWindow(pT->m_hWnd));
318 pT->DoScroll(SB_VERT, SB_LINEUP, (
int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);
321 void ScrollPageDown()
323 T* pT =
static_cast<T*
>(
this);
324 ATLASSERT(::IsWindow(pT->m_hWnd));
325 pT->DoScroll(SB_VERT, SB_PAGEDOWN, (
int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);
330 T* pT =
static_cast<T*
>(
this);
331 ATLASSERT(::IsWindow(pT->m_hWnd));
332 pT->DoScroll(SB_VERT, SB_PAGEUP, (
int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);
337 T* pT =
static_cast<T*
>(
this);
338 ATLASSERT(::IsWindow(pT->m_hWnd));
339 pT->DoScroll(SB_VERT, SB_TOP, (
int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);
344 T* pT =
static_cast<T*
>(
this);
345 ATLASSERT(::IsWindow(pT->m_hWnd));
346 pT->DoScroll(SB_VERT, SB_BOTTOM, (
int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);
349 void ScrollLineRight()
351 T* pT =
static_cast<T*
>(
this);
352 ATLASSERT(::IsWindow(pT->m_hWnd));
353 pT->DoScroll(SB_HORZ, SB_LINEDOWN, (
int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);
356 void ScrollLineLeft()
358 T* pT =
static_cast<T*
>(
this);
359 ATLASSERT(::IsWindow(pT->m_hWnd));
360 pT->DoScroll(SB_HORZ, SB_LINEUP, (
int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);
363 void ScrollPageRight()
365 T* pT =
static_cast<T*
>(
this);
366 ATLASSERT(::IsWindow(pT->m_hWnd));
367 pT->DoScroll(SB_HORZ, SB_PAGEDOWN, (
int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);
370 void ScrollPageLeft()
372 T* pT =
static_cast<T*
>(
this);
373 ATLASSERT(::IsWindow(pT->m_hWnd));
374 pT->DoScroll(SB_HORZ, SB_PAGEUP, (
int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);
379 T* pT =
static_cast<T*
>(
this);
380 ATLASSERT(::IsWindow(pT->m_hWnd));
381 pT->DoScroll(SB_HORZ, SB_TOP, (
int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);
384 void ScrollAllRight()
386 T* pT =
static_cast<T*
>(
this);
387 ATLASSERT(::IsWindow(pT->m_hWnd));
388 pT->DoScroll(SB_HORZ, SB_BOTTOM, (
int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);
392 void ScrollToView(POINT pt)
394 T* pT =
static_cast<T*
>(
this);
395 ATLASSERT(::IsWindow(pT->m_hWnd));
396 RECT rect = { pt.x, pt.y, pt.x, pt.y };
397 pT->ScrollToView(rect);
400 void ScrollToView(RECT& rect)
402 T* pT =
static_cast<T*
>(
this);
403 ATLASSERT(::IsWindow(pT->m_hWnd));
405 RECT rcClient = { 0 };
406 pT->GetClientRect(&rcClient);
408 int x = m_ptOffset.x;
409 if(rect.left < m_ptOffset.x)
411 else if(rect.right > (m_ptOffset.x + rcClient.right))
412 x = rect.right - rcClient.right;
414 int y = m_ptOffset.y;
415 if(rect.top < m_ptOffset.y)
417 else if(rect.bottom > (m_ptOffset.y + rcClient.bottom))
418 y = rect.bottom - rcClient.bottom;
420 SetScrollOffset(x, y);
423 void ScrollToView(HWND hWnd)
425 T* pT =
static_cast<T*
>(
this);
426 ATLASSERT(::IsWindow(pT->m_hWnd));
429 ::GetWindowRect(hWnd, &rect);
430 ::OffsetRect(&rect, m_ptOffset.x, m_ptOffset.y);
431 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rect, 2);
436 MESSAGE_HANDLER(WM_CREATE, OnCreate)
437 MESSAGE_HANDLER(WM_VSCROLL, OnVScroll)
438 MESSAGE_HANDLER(WM_HSCROLL, OnHScroll)
439 MESSAGE_HANDLER(WM_MOUSEWHEEL, OnMouseWheel)
440 #if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) 441 MESSAGE_HANDLER(m_uMsgMouseWheel, OnMouseWheel)
442 #endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) 443 MESSAGE_HANDLER(WM_MOUSEHWHEEL, OnMouseHWheel)
444 MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)
445 MESSAGE_HANDLER(WM_SIZE, OnSize)
446 MESSAGE_HANDLER(WM_PAINT, OnPaint)
448 MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)
449 #endif // !_WIN32_WCE 452 COMMAND_ID_HANDLER(ID_SCROLL_UP, OnScrollUp)
453 COMMAND_ID_HANDLER(ID_SCROLL_DOWN, OnScrollDown)
454 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, OnScrollPageUp)
455 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, OnScrollPageDown)
456 COMMAND_ID_HANDLER(ID_SCROLL_TOP, OnScrollTop)
457 COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, OnScrollBottom)
458 COMMAND_ID_HANDLER(ID_SCROLL_LEFT, OnScrollLeft)
459 COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, OnScrollRight)
460 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, OnScrollPageLeft)
461 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, OnScrollPageRight)
462 COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, OnScrollAllLeft)
463 COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, OnScrollAllRight)
466 LRESULT OnCreate(UINT , WPARAM , LPARAM , BOOL& bHandled)
468 T* pT =
static_cast<T*
>(
this);
469 pT->GetSystemSettings();
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);
513 else if(m_sizeAll.cx > m_sizeClient.cx)
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 pT->DoSize(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
565 LRESULT OnPaint(UINT , WPARAM wParam, LPARAM , BOOL& )
567 T* pT =
static_cast<T*
>(
this);
568 ATLASSERT(::IsWindow(pT->m_hWnd));
572 POINT ptViewportOrg = { 0, 0 };
573 dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y, &ptViewportOrg);
575 dc.SetViewportOrg(ptViewportOrg);
580 dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y);
581 pT->DoPaint(dc.m_hDC);
587 LRESULT OnScrollUp(WORD , WORD , HWND , BOOL& )
593 LRESULT OnScrollDown(WORD , WORD , HWND , BOOL& )
599 LRESULT OnScrollPageUp(WORD , WORD , HWND , BOOL& )
605 LRESULT OnScrollPageDown(WORD , WORD , HWND , BOOL& )
611 LRESULT OnScrollTop(WORD , WORD , HWND , BOOL& )
617 LRESULT OnScrollBottom(WORD , WORD , HWND , BOOL& )
623 LRESULT OnScrollLeft(WORD , WORD , HWND , BOOL& )
629 LRESULT OnScrollRight(WORD , WORD , HWND , BOOL& )
635 LRESULT OnScrollPageLeft(WORD , WORD , HWND , BOOL& )
641 LRESULT OnScrollPageRight(WORD , WORD , HWND , BOOL& )
647 LRESULT OnScrollAllLeft(WORD , WORD , HWND , BOOL& )
653 LRESULT OnScrollAllRight(WORD , WORD , HWND , BOOL& )
667 void DoSize(
int cx,
int cy)
669 m_sizeClient.cx = cx;
670 m_sizeClient.cy = cy;
672 T* pT =
static_cast<T*
>(
this);
676 SCROLLINFO si = {
sizeof(SCROLLINFO) };
677 si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
679 si.nMax = m_sizeAll.cx - 1;
680 if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLH) != 0)
681 si.fMask |= SIF_DISABLENOSCROLL;
682 si.nPage = m_sizeClient.cx;
683 si.nPos = m_ptOffset.x;
684 pT->SetScrollInfo(SB_HORZ, &si, TRUE);
689 SCROLLINFO si = {
sizeof(SCROLLINFO) };
690 si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
692 si.nMax = m_sizeAll.cy - 1;
693 if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLV) != 0)
694 si.fMask |= SIF_DISABLENOSCROLL;
695 si.nPage = m_sizeClient.cy;
696 si.nPos = m_ptOffset.y;
697 pT->SetScrollInfo(SB_VERT, &si, TRUE);
700 int x = m_ptOffset.x;
701 int y = m_ptOffset.y;
702 if(pT->AdjustScrollOffset(x, y))
705 pT->ScrollWindowEx(m_ptOffset.x - x, m_ptOffset.y - y, (m_uScrollFlags & ~SCRL_SCROLLCHILDREN));
706 SetScrollOffset(x, y, FALSE);
710 void DoScroll(
int nType,
int nScrollCode,
int& cxyOffset,
int cxySizeAll,
int cxySizePage,
int cxySizeLine)
712 T* pT =
static_cast<T*
>(
this);
714 pT->GetClientRect(&rect);
715 int cxyClient = (nType == SB_VERT) ? rect.bottom : rect.right;
716 int cxyMax = cxySizeAll - cxyClient;
727 cxyScroll = cxyOffset;
731 cxyScroll = cxyOffset - cxyMax;
735 if(cxyOffset >= cxySizeLine)
737 cxyScroll = cxySizeLine;
738 cxyOffset -= cxySizeLine;
742 cxyScroll = cxyOffset;
747 if(cxyOffset < cxyMax - cxySizeLine)
749 cxyScroll = -cxySizeLine;
750 cxyOffset += cxySizeLine;
754 cxyScroll = cxyOffset - cxyMax;
759 if(cxyOffset >= cxySizePage)
761 cxyScroll = cxySizePage;
762 cxyOffset -= cxySizePage;
766 cxyScroll = cxyOffset;
771 if(cxyOffset < cxyMax - cxySizePage)
773 cxyScroll = -cxySizePage;
774 cxyOffset += cxySizePage;
778 cxyScroll = cxyOffset - cxyMax;
783 if(IsNoThumbTracking())
786 case SB_THUMBPOSITION:
788 SCROLLINFO si = {
sizeof(SCROLLINFO), SIF_TRACKPOS };
789 if(pT->GetScrollInfo(nType, &si))
791 cxyScroll = cxyOffset - si.nTrackPos;
792 cxyOffset = si.nTrackPos;
802 if(bUpdate && cxyScroll != 0)
804 pT->SetScrollPos(nType, cxyOffset, TRUE);
806 pT->ScrollWindowEx(0, cxyScroll, m_uScrollFlags);
808 pT->ScrollWindowEx(cxyScroll, 0, m_uScrollFlags);
812 static int CalcLineOrPage(
int nVal,
int nMax,
int nDiv)
828 bool AdjustScrollOffset(
int& x,
int& y)
833 int cxMax = m_sizeAll.cx - m_sizeClient.cx;
835 x = (cxMax >= 0) ? cxMax : 0;
839 int cyMax = m_sizeAll.cy - m_sizeClient.cy;
841 y = (cyMax >= 0) ? cyMax : 0;
845 return (x != xOld || y != yOld);
848 void GetSystemSettings()
851 #ifndef SPI_GETWHEELSCROLLLINES 852 const UINT SPI_GETWHEELSCROLLLINES = 104;
853 #endif // !SPI_GETWHEELSCROLLLINES 854 ::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &m_nWheelLines, 0);
856 #ifndef SPI_GETWHEELSCROLLCHARS 857 const UINT SPI_GETWHEELSCROLLCHARS = 0x006C;
858 #endif // !SPI_GETWHEELSCROLLCHARS 859 ::SystemParametersInfo(SPI_GETWHEELSCROLLCHARS, 0, &m_nHWheelChars, 0);
861 #if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) 862 if(m_uMsgMouseWheel != 0)
863 m_uMsgMouseWheel = ::RegisterWindowMessage(MSH_MOUSEWHEEL);
865 HWND hWndWheel = FindWindow(MSH_WHEELMODULE_CLASS, MSH_WHEELMODULE_TITLE);
866 if(::IsWindow(hWndWheel))
868 UINT uMsgScrollLines = ::RegisterWindowMessage(MSH_SCROLL_LINES);
869 if(uMsgScrollLines != 0)
870 m_nWheelLines = (int)::SendMessage(hWndWheel, uMsgScrollLines, 0, 0L);
872 #endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) 873 #endif // !_WIN32_WCE 876 bool IsScrollingChildren()
const 878 return (m_dwExtendedStyle & SCRL_SCROLLCHILDREN) != 0;
881 bool IsErasingBackground()
const 883 return (m_dwExtendedStyle & SCRL_ERASEBACKGROUND) != 0;
886 bool IsNoThumbTracking()
const 888 return (m_dwExtendedStyle & SCRL_NOTHUMBTRACKING) != 0;
891 #if (WINVER >= 0x0500) 892 bool IsSmoothScroll()
const 894 return (m_dwExtendedStyle & SCRL_SMOOTHSCROLL) != 0;
896 #endif // (WINVER >= 0x0500) 903 template <
class T,
class TBase = ATL::CWindow,
class TWinTraits = ATL::CControlWinTraits>
907 BOOL SubclassWindow(HWND hWnd)
909 #if (_MSC_VER >= 1300) 910 BOOL bRet = ATL::CWindowImpl< T, TBase, TWinTraits >::SubclassWindow(hWnd);
911 #else // !(_MSC_VER >= 1300) 912 typedef ATL::CWindowImpl< T, TBase, TWinTraits > _baseClass;
913 BOOL bRet = _baseClass::SubclassWindow(hWnd);
914 #endif // !(_MSC_VER >= 1300) 917 T* pT =
static_cast<T*
>(
this);
918 pT->GetSystemSettings();
921 GetClientRect(&rect);
922 pT->DoSize(rect.right, rect.bottom);
932 #if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) 934 #endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) 941 #endif // !_WIN32_WCE 976 ::SetRectEmpty(&m_rectLogAll);
977 m_sizeLogPage.cx = 0;
978 m_sizeLogPage.cy = 0;
979 m_sizeLogLine.cx = 0;
980 m_sizeLogLine.cy = 0;
985 void SetScrollMapMode(
int nMapMode)
987 ATLASSERT(nMapMode >= MM_MIN && nMapMode <= MM_MAX_FIXEDSCALE);
988 m_nMapMode = nMapMode;
991 int GetScrollMapMode()
const 993 ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);
998 void SetScrollOffset(
int x,
int y, BOOL bRedraw = TRUE)
1000 ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);
1001 POINT ptOff = { x, y };
1005 dc.SetMapMode(m_nMapMode);
1011 void SetScrollOffset(POINT ptOffset, BOOL bRedraw = TRUE)
1013 SetScrollOffset(ptOffset.x, ptOffset.y, bRedraw);
1016 void GetScrollOffset(POINT& ptOffset)
const 1018 ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);
1019 ptOffset = m_ptOffset;
1023 dc.SetMapMode(m_nMapMode);
1024 dc.DPtoLP(&ptOffset);
1029 void SetScrollSize(
int xMin,
int yMin,
int xMax,
int yMax, BOOL bRedraw = TRUE,
bool bResetOffset =
true)
1031 ATLASSERT(xMax > xMin && yMax > yMin);
1032 ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);
1034 ::SetRect(&m_rectLogAll, xMin, yMin, xMax, yMax);
1036 SIZE sizeAll = { 0 };
1037 sizeAll.cx = xMax - xMin + 1;
1038 sizeAll.cy = yMax - yMin + 1;
1042 dc.SetMapMode(m_nMapMode);
1043 dc.LPtoDP(&sizeAll);
1046 SetScrollLine(0, 0);
1047 SetScrollPage(0, 0);
1050 void SetScrollSize(RECT& rcScroll, BOOL bRedraw = TRUE,
bool bResetOffset =
true)
1052 SetScrollSize(rcScroll.left, rcScroll.top, rcScroll.right, rcScroll.bottom, bRedraw, bResetOffset);
1055 void SetScrollSize(
int cx,
int cy, BOOL bRedraw = TRUE,
bool bResetOffset =
true)
1057 SetScrollSize(0, 0, cx, cy, bRedraw, bResetOffset);
1060 void SetScrollSize(SIZE size, BOOL bRedraw = TRUE,
bool bResetOffset =
true)
1062 SetScrollSize(0, 0, size.cx, size.cy, bRedraw, bResetOffset);
1065 void GetScrollSize(RECT& rcScroll)
const 1067 ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);
1068 rcScroll = m_rectLogAll;
1072 void SetScrollLine(
int cxLine,
int cyLine)
1074 ATLASSERT(cxLine >= 0 && cyLine >= 0);
1075 ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);
1077 m_sizeLogLine.cx = cxLine;
1078 m_sizeLogLine.cy = cyLine;
1079 SIZE sizeLine = m_sizeLogLine;
1083 dc.SetMapMode(m_nMapMode);
1084 dc.LPtoDP(&sizeLine);
1089 void SetScrollLine(SIZE sizeLine)
1091 SetScrollLine(sizeLine.cx, sizeLine.cy);
1094 void GetScrollLine(SIZE& sizeLine)
const 1096 ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);
1097 sizeLine = m_sizeLogLine;
1101 void SetScrollPage(
int cxPage,
int cyPage)
1103 ATLASSERT(cxPage >= 0 && cyPage >= 0);
1104 ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);
1106 m_sizeLogPage.cx = cxPage;
1107 m_sizeLogPage.cy = cyPage;
1108 SIZE sizePage = m_sizeLogPage;
1112 dc.SetMapMode(m_nMapMode);
1113 dc.LPtoDP(&sizePage);
1118 void SetScrollPage(SIZE sizePage)
1120 SetScrollPage(sizePage.cx, sizePage.cy);
1123 void GetScrollPage(SIZE& sizePage)
const 1125 ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);
1126 sizePage = m_sizeLogPage;
1133 #if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) 1135 #endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) 1139 MESSAGE_HANDLER(WM_PAINT, OnPaint)
1140 MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)
1156 LRESULT OnPaint(UINT , WPARAM wParam, LPARAM , BOOL& )
1158 T* pT =
static_cast<T*
>(
this);
1159 ATLASSERT(::IsWindow(pT->m_hWnd));
1163 int nMapModeSav = dc.GetMapMode();
1164 dc.SetMapMode(m_nMapMode);
1165 POINT ptViewportOrg = { 0, 0 };
1166 if(m_nMapMode == MM_TEXT)
1167 dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y, &ptViewportOrg);
1169 dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y + m_sizeAll.cy, &ptViewportOrg);
1170 POINT ptWindowOrg = { 0, 0 };
1171 dc.SetWindowOrg(m_rectLogAll.left, m_rectLogAll.top, &ptWindowOrg);
1175 dc.SetMapMode(nMapModeSav);
1176 dc.SetViewportOrg(ptViewportOrg);
1177 dc.SetWindowOrg(ptWindowOrg);
1182 dc.SetMapMode(m_nMapMode);
1183 if(m_nMapMode == MM_TEXT)
1184 dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y);
1186 dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y + m_sizeAll.cy);
1187 dc.SetWindowOrg(m_rectLogAll.left, m_rectLogAll.top);
1188 pT->DoPaint(dc.m_hDC);
1194 #endif // !_WIN32_WCE 1202 template <
class T,
class TBase = ATL::CWindow,
class TWinTraits = ATL::CControlWinTraits>
1206 BOOL SubclassWindow(HWND hWnd)
1208 #if (_MSC_VER >= 1300) 1209 BOOL bRet = ATL::CWindowImpl< T, TBase, TWinTraits >::SubclassWindow(hWnd);
1210 #else // !(_MSC_VER >= 1300) 1211 typedef ATL::CWindowImpl< T, TBase, TWinTraits > _baseClass;
1212 BOOL bRet = _baseClass::SubclassWindow(hWnd);
1213 #endif // !(_MSC_VER >= 1300) 1216 T* pT =
static_cast<T*
>(
this);
1217 pT->GetSystemSettings();
1220 GetClientRect(&rect);
1221 pT->DoSize(rect.right, rect.bottom);
1231 #if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) 1233 #endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) 1255 #endif // !_WIN32_WCE 1261 #if defined(__ATLCTRLS_H__) && (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) 1263 template <
class TBase = ATL::CWindow>
1264 class CFSBWindowT :
public TBase,
public CFlatScrollBarImpl<CFSBWindowT< TBase > >
1268 CFSBWindowT(HWND hWnd = NULL) : TBase(hWnd)
1271 CFSBWindowT< TBase >& operator =(HWND hWnd)
1279 int SetScrollPos(
int nBar,
int nPos, BOOL bRedraw = TRUE)
1281 ATLASSERT(::IsWindow(m_hWnd));
1282 return FlatSB_SetScrollPos(nBar, nPos, bRedraw);
1285 BOOL GetScrollInfo(
int nBar, LPSCROLLINFO lpScrollInfo)
1287 ATLASSERT(::IsWindow(m_hWnd));
1288 return FlatSB_GetScrollInfo(nBar, lpScrollInfo);
1291 BOOL SetScrollInfo(
int nBar, LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE)
1293 ATLASSERT(::IsWindow(m_hWnd));
1294 return FlatSB_SetScrollInfo(nBar, lpScrollInfo, bRedraw);
1298 typedef CFSBWindowT<ATL::CWindow> CFSBWindow;
1300 #endif // defined(__ATLCTRLS_H__) && (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) 1317 #define ZSN_ZOOMCHANGED (NM_FIRST - 50) 1323 enum { m_cxyMinZoomRect = 12 };
1341 float m_fZoomScaleMin;
1342 float m_fZoomScaleMax;
1348 bool m_bZoomChildren;
1349 ATL::CSimpleArray<_ChildPlacement> m_arrChildren;
1352 CZoomScrollImpl(): m_fZoomScale(1.0f), m_fZoomScaleMin(0.1f), m_fZoomScaleMax(100.0f), m_fZoomDelta(0.5f),
1353 m_nZoomMode(ZOOMMODE_OFF), m_bTracking(
false), m_bZoomChildren(
false)
1355 m_sizeLogAll.cx = 0;
1356 m_sizeLogAll.cy = 0;
1357 m_sizeLogPage.cx = 0;
1358 m_sizeLogPage.cy = 0;
1359 m_sizeLogLine.cx = 0;
1360 m_sizeLogLine.cy = 0;
1361 ::SetRectEmpty(&m_rcTrack);
1366 void SetScrollSize(
int cxLog,
int cyLog, BOOL bRedraw = TRUE,
bool bResetOffset =
true)
1368 ATLASSERT(cxLog >= 0 && cyLog >= 0);
1371 if((cxLog == 0) && (cyLog == 0))
1377 m_sizeLogAll.cx = cxLog;
1378 m_sizeLogAll.cy = cyLog;
1379 SIZE sizeAll = { 0 };
1380 sizeAll.cx = (int)((
float)m_sizeLogAll.cx * m_fZoomScale);
1381 sizeAll.cy = (int)((
float)m_sizeLogAll.cy * m_fZoomScale);
1386 void SetScrollSize(SIZE sizeLog, BOOL bRedraw = TRUE,
bool bResetOffset =
true)
1388 SetScrollSize(sizeLog.cx, sizeLog.cy, bRedraw, bResetOffset);
1391 void GetScrollSize(SIZE& sizeLog)
const 1393 sizeLog = m_sizeLogAll;
1397 void SetScrollLine(
int cxLogLine,
int cyLogLine)
1399 ATLASSERT(cxLogLine >= 0 && cyLogLine >= 0);
1401 m_sizeLogLine.cx = cxLogLine;
1402 m_sizeLogLine.cy = cyLogLine;
1404 SIZE sizeLine = { 0 };
1405 sizeLine.cx = (int)((
float)m_sizeLogLine.cx * m_fZoomScale);
1406 sizeLine.cy = (int)((
float)m_sizeLogLine.cy * m_fZoomScale);
1410 void SetScrollLine(SIZE sizeLogLine)
1412 SetScrollLine(sizeLogLine.cx, sizeLogLine.cy);
1415 void GetScrollLine(SIZE& sizeLogLine)
const 1417 sizeLogLine = m_sizeLogLine;
1421 void SetScrollPage(
int cxLogPage,
int cyLogPage)
1423 ATLASSERT((cxLogPage >= 0) && (cyLogPage >= 0));
1425 m_sizeLogPage.cx = cxLogPage;
1426 m_sizeLogPage.cy = cyLogPage;
1428 SIZE sizePage = { 0 };
1429 sizePage.cx = (int)((
float)m_sizeLogPage.cx * m_fZoomScale);
1430 sizePage.cy = (int)((
float)m_sizeLogPage.cy * m_fZoomScale);
1435 void SetScrollPage(SIZE sizeLogPage)
1437 SetScrollPage(sizeLogPage.cx, sizeLogPage.cy);
1440 void GetScrollPage(SIZE& sizeLogPage)
const 1442 sizeLogPage = m_sizeLogPage;
1445 void SetZoomScale(
float fZoomScale)
1447 ATLASSERT(fZoomScale > 0.0f);
1448 if(fZoomScale <= 0.0f)
1451 m_fZoomScale = fZoomScale;
1452 if(m_fZoomScale < m_fZoomScaleMin)
1453 m_fZoomScale = m_fZoomScaleMin;
1454 else if(m_fZoomScale > m_fZoomScaleMax)
1455 m_fZoomScale = m_fZoomScaleMax;
1458 float GetZoomScale()
const 1460 return m_fZoomScale;
1463 void SetZoomScaleMin(
float fZoomScaleMin)
1465 ATLASSERT(fZoomScaleMin > 0.0f);
1466 ATLASSERT(fZoomScaleMin <= m_fZoomScaleMax);
1468 m_fZoomScaleMin = fZoomScaleMin;
1471 float GetZoomScaleMin()
const 1473 return m_fZoomScaleMin;
1476 void SetZoomScaleMax(
float fZoomScaleMax)
1478 ATLASSERT(fZoomScaleMax > 0.0f);
1479 ATLASSERT(m_fZoomScaleMin <= fZoomScaleMax);
1481 m_fZoomScaleMax = fZoomScaleMax;
1484 float GetZoomScaleMax()
const 1486 return m_fZoomScaleMax;
1489 void SetZoomDelta(
float fZoomDelta)
1491 ATLASSERT(fZoomDelta >= 0.0f);
1493 if(fZoomDelta >= 0.0f)
1494 m_fZoomDelta = fZoomDelta;
1497 float GetZoomDelta()
const 1499 return m_fZoomDelta;
1502 void SetZoomMode(
int nZoomMode)
1504 m_nZoomMode = nZoomMode;
1507 int GetZoomMode()
const 1512 void SetZoomChildren(
bool bEnable =
true)
1514 T* pT =
static_cast<T*
>(
this);
1515 ATLASSERT(::IsWindow(pT->m_hWnd));
1517 m_bZoomChildren = bEnable;
1519 m_arrChildren.RemoveAll();
1522 for(HWND hWndChild = ::GetWindow(pT->m_hWnd, GW_CHILD); hWndChild != NULL; hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT))
1525 ::GetWindowRect(hWndChild, &rect);
1526 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rect, 2);
1529 cp.hWnd = hWndChild;
1532 cp.cx = rect.right - rect.left;
1533 cp.cy = rect.bottom - rect.top;
1534 m_arrChildren.Add(cp);
1539 bool GetZoomChildren()
const 1541 return m_bZoomChildren;
1544 void Zoom(
int x,
int y,
float fZoomScale)
1546 if(fZoomScale <= 0.0f)
1549 if(fZoomScale < m_fZoomScaleMin)
1550 fZoomScale = m_fZoomScaleMin;
1551 else if(fZoomScale > m_fZoomScaleMax)
1552 fZoomScale = m_fZoomScaleMax;
1554 T* pT =
static_cast<T*
>(
this);
1555 POINT pt = { x, y };
1556 if(!pT->PtInDevRect(pt))
1559 pT->ViewDPtoLP(&pt);
1560 pT->Zoom(fZoomScale,
false);
1561 pT->CenterOnLogicalPoint(pt);
1564 void Zoom(POINT pt,
float fZoomScale)
1566 T* pT =
static_cast<T*
>(
this);
1567 pT->Zoom(pt.x, pt.y, fZoomScale);
1572 T* pT =
static_cast<T*
>(
this);
1574 pT->NormalizeRect(rcZoom);
1575 SIZE size = { rcZoom.right - rcZoom.left, rcZoom.bottom - rcZoom.top };
1576 POINT pt = { rcZoom.left + size.cx / 2, rcZoom.top + size.cy / 2 };
1577 if(size.cx < m_cxyMinZoomRect || size.cy < m_cxyMinZoomRect)
1579 pT->Zoom(pt, m_fZoomScale + m_fZoomDelta);
1583 ATLASSERT((size.cx > 0) && (size.cy > 0));
1585 float fScaleH = (float)(m_sizeClient.cx + 1) / (float)size.cx;
1586 float fScaleV = (
float)(m_sizeClient.cy + 1) / (
float)size.cy;
1587 float fZoomScale = __min(fScaleH, fScaleV) * m_fZoomScale;
1588 pT->Zoom(pt, fZoomScale);
1591 void Zoom(
float fZoomScale,
bool bCenter =
true)
1593 if(fZoomScale <= 0.0f)
1596 if(fZoomScale < m_fZoomScaleMin)
1597 fZoomScale = m_fZoomScaleMin;
1598 else if(fZoomScale > m_fZoomScaleMax)
1599 fZoomScale = m_fZoomScaleMax;
1601 T* pT =
static_cast<T*
>(
this);
1605 RECT rcClient = { 0 };
1606 ::GetClientRect(pT->m_hWnd, &rcClient);
1607 pt.x = rcClient.right / 2;
1608 pt.y = rcClient.bottom / 2;
1609 pT->ViewDPtoLP(&pt);
1613 SIZE sizeAll = { 0 };
1614 sizeAll.cx = (int)((
float)m_sizeLogAll.cx * fZoomScale);
1615 sizeAll.cy = (int)((
float)m_sizeLogAll.cy * fZoomScale);
1621 if(m_bZoomChildren && (m_fZoomScale != fZoomScale))
1623 for(
int i = 0; i < m_arrChildren.GetSize(); i++)
1625 ATLASSERT(::IsWindow(m_arrChildren[i].hWnd));
1627 ::SetWindowPos(m_arrChildren[i].hWnd, NULL,
1628 (
int)((
float)m_arrChildren[i].x * fZoomScale + 0.5f),
1629 (
int)((
float)m_arrChildren[i].y * fZoomScale + 0.5f),
1630 (
int)((
float)m_arrChildren[i].cx * fZoomScale + 0.5f),
1631 (
int)((
float)m_arrChildren[i].cy * fZoomScale + 0.5f),
1632 SWP_NOZORDER | SWP_NOACTIVATE);
1637 m_fZoomScale = fZoomScale;
1640 pT->CenterOnLogicalPoint(pt);
1646 ATLASSERT(m_sizeAll.cx >= 0 && m_sizeAll.cy >= 0);
1647 dc.SetMapMode(MM_ANISOTROPIC);
1648 dc.SetWindowExt(m_sizeLogAll);
1649 dc.SetViewportExt(m_sizeAll);
1650 dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y);
1653 void ViewDPtoLP(LPPOINT lpPoints,
int nCount = 1)
1655 ATLASSERT(lpPoints);
1656 T* pT =
static_cast<T*
>(
this);
1657 ATLASSERT(::IsWindow(pT->m_hWnd));
1660 pT->PrepareDC(dc.m_hDC);
1661 dc.DPtoLP(lpPoints, nCount);
1664 void ViewLPtoDP(LPPOINT lpPoints,
int nCount = 1)
1666 ATLASSERT(lpPoints);
1667 T* pT =
static_cast<T*
>(
this);
1668 ATLASSERT(::IsWindow(pT->m_hWnd));
1671 pT->PrepareDC(dc.m_hDC);
1672 dc.LPtoDP(lpPoints, nCount);
1675 void ClientToDevice(POINT &pt)
1677 pt.x += m_ptOffset.x;
1678 pt.y += m_ptOffset.y;
1681 void DeviceToClient(POINT &pt)
1683 pt.x -= m_ptOffset.x;
1684 pt.y -= m_ptOffset.y;
1687 void CenterOnPoint(POINT pt)
1689 T* pT =
static_cast<T*
>(
this);
1691 pT->GetClientRect(&rect);
1693 int xOfs = pt.x - (rect.right / 2) + m_ptOffset.x;
1700 int xMax = __max((
int)(m_sizeAll.cx - rect.right), 0);
1705 int yOfs = pt.y - (rect.bottom / 2) + m_ptOffset.y;
1712 int yMax = __max((
int)(m_sizeAll.cy - rect.bottom), 0);
1720 void CenterOnLogicalPoint(POINT ptLog)
1722 T* pT =
static_cast<T*
>(
this);
1723 pT->ViewLPtoDP(&ptLog);
1724 pT->DeviceToClient(ptLog);
1725 pT->CenterOnPoint(ptLog);
1728 BOOL PtInDevRect(POINT pt)
1730 RECT rc = { 0, 0, m_sizeAll.cx, m_sizeAll.cy };
1731 ::OffsetRect(&rc, -m_ptOffset.x, -m_ptOffset.y);
1732 return ::PtInRect(&rc, pt);
1735 void NormalizeRect(RECT& rc)
1737 if(rc.left > rc.right)
1744 if(rc.top > rc.bottom)
1752 void DrawTrackRect()
1754 T* pT =
static_cast<T*
>(
this);
1755 const SIZE sizeLines = { 2, 2 };
1756 RECT rc = m_rcTrack;
1757 pT->NormalizeRect(rc);
1758 if(!::IsRectEmpty(&rc))
1760 ::MapWindowPoints(pT->m_hWnd, NULL, (LPPOINT)&rc, 2);
1762 dc.DrawDragRect(&rc, sizeLines, NULL, sizeLines);
1766 void NotifyParentZoomChanged()
1768 T* pT =
static_cast<T*
>(
this);
1769 int nId = pT->GetDlgCtrlID();
1770 NMHDR nmhdr = { pT->m_hWnd, (UINT_PTR)nId, ZSN_ZOOMCHANGED };
1771 ::SendMessage(pT->GetParent(), WM_NOTIFY, (WPARAM)nId, (LPARAM)&nmhdr);
1775 MESSAGE_HANDLER(WM_SETCURSOR, OnSetCursor)
1779 #if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) 1781 #endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) 1785 MESSAGE_HANDLER(WM_PAINT, OnPaint)
1786 MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)
1787 MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown)
1788 MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)
1789 MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp)
1790 MESSAGE_HANDLER(WM_CAPTURECHANGED, OnCaptureChanged)
1806 LRESULT OnPaint(UINT , WPARAM wParam, LPARAM , BOOL& )
1808 T* pT =
static_cast<T*
>(
this);
1809 ATLASSERT(::IsWindow(pT->m_hWnd));
1810 ATLASSERT((m_sizeLogAll.cx >= 0) && (m_sizeLogAll.cy >= 0));
1811 ATLASSERT((m_sizeAll.cx >= 0) && (m_sizeAll.cy >= 0));
1816 int nMapModeSav = dc.GetMapMode();
1817 dc.SetMapMode(MM_ANISOTROPIC);
1818 SIZE szWindowExt = { 0, 0 };
1819 dc.SetWindowExt(m_sizeLogAll, &szWindowExt);
1820 SIZE szViewportExt = { 0, 0 };
1821 dc.SetViewportExt(m_sizeAll, &szViewportExt);
1822 POINT ptViewportOrg = { 0, 0 };
1823 dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y, &ptViewportOrg);
1827 dc.SetMapMode(nMapModeSav);
1828 dc.SetWindowExt(szWindowExt);
1829 dc.SetViewportExt(szViewportExt);
1830 dc.SetViewportOrg(ptViewportOrg);
1835 pT->PrepareDC(dc.m_hDC);
1836 pT->DoPaint(dc.m_hDC);
1842 LRESULT OnLButtonDown(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
1844 if(m_nZoomMode == ZOOMMODE_IN && !m_bTracking)
1846 T* pT =
static_cast<T*
>(
this);
1847 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
1848 if(pT->PtInDevRect(pt))
1852 ::SetRect(&m_rcTrack, pt.x, pt.y, pt.x, pt.y);
1860 LRESULT OnMouseMove(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
1864 T* pT =
static_cast<T*
>(
this);
1865 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
1866 if(pT->PtInDevRect(pt))
1868 pT->DrawTrackRect();
1869 m_rcTrack.right = pt.x;
1870 m_rcTrack.bottom = pt.y;
1871 pT->DrawTrackRect();
1879 LRESULT OnLButtonUp(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
1882 if(m_nZoomMode == ZOOMMODE_OUT)
1884 T* pT =
static_cast<T*
>(
this);
1885 pT->Zoom(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), m_fZoomScale - m_fZoomDelta);
1886 pT->NotifyParentZoomChanged();
1893 LRESULT OnCaptureChanged(UINT , WPARAM , LPARAM , BOOL& bHandled)
1897 m_bTracking =
false;
1898 T* pT =
static_cast<T*
>(
this);
1899 pT->DrawTrackRect();
1900 pT->Zoom(m_rcTrack);
1901 pT->NotifyParentZoomChanged();
1902 ::SetRectEmpty(&m_rcTrack);
1909 LRESULT OnSetCursor(UINT , WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1911 if(LOWORD(lParam) == HTCLIENT && m_nZoomMode != ZOOMMODE_OFF)
1913 T* pT =
static_cast<T*
>(
this);
1914 if((HWND)wParam == pT->m_hWnd)
1916 DWORD dwPos = ::GetMessagePos();
1917 POINT pt = { GET_X_LPARAM(dwPos), GET_Y_LPARAM(dwPos) };
1918 pT->ScreenToClient(&pt);
1919 if(pT->PtInDevRect(pt))
1921 ::SetCursor(::LoadCursor(NULL, IDC_CROSS));
1935 template <
class T,
class TBase = ATL::CWindow,
class TWinTraits = ATL::CControlWinTraits>
1939 BOOL SubclassWindow(HWND hWnd)
1941 #if (_MSC_VER >= 1300) 1942 BOOL bRet = ATL::CWindowImpl< T, TBase, TWinTraits >::SubclassWindow(hWnd);
1943 #else // !(_MSC_VER >= 1300) 1944 typedef ATL::CWindowImpl< T, TBase, TWinTraits > _baseClass;
1945 BOOL bRet = _baseClass::SubclassWindow(hWnd);
1946 #endif // !(_MSC_VER >= 1300) 1949 T* pT =
static_cast<T*
>(
this);
1950 pT->GetSystemSettings();
1953 GetClientRect(&rect);
1954 pT->DoSize(rect.right, rect.bottom);
1965 #if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) 1967 #endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) 1993 #endif // !_WIN32_WCE 1999 template <
class T,
class TBase = ATL::CWindow,
class TWinTraits = ATL::CControlWinTraits>
2003 DECLARE_WND_CLASS_EX(NULL, 0, -1)
2008 ATL::CWindow m_wndClient;
2009 bool m_bAutoSizeClient;
2010 bool m_bDrawEdgeIfEmpty;
2016 SetScrollExtendedStyle(SCRL_SCROLLCHILDREN);
2020 HWND GetClient()
const 2025 HWND SetClient(HWND hWndClient,
bool bClientSizeAsMin =
true)
2027 ATLASSERT(::IsWindow(m_hWnd));
2029 HWND hWndOldClient = m_wndClient;
2030 m_wndClient = hWndClient;
2033 SetScrollSize(1, 1, FALSE);
2035 if(m_wndClient.m_hWnd != NULL)
2037 m_wndClient.SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
2039 if(bClientSizeAsMin)
2042 m_wndClient.GetWindowRect(&rect);
2043 if((rect.right - rect.left) > 0 && (rect.bottom - rect.top) > 0)
2044 SetScrollSize(rect.right - rect.left, rect.bottom - rect.top, FALSE);
2047 T* pT =
static_cast<T*
>(
this);
2052 RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_FRAME | RDW_UPDATENOW | RDW_ALLCHILDREN);
2054 return hWndOldClient;
2059 MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
2060 MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
2061 CHAIN_MSG_MAP(_baseClass)
2062 FORWARD_NOTIFICATIONS()
2064 CHAIN_MSG_MAP_ALT(_baseClass, 1)
2067 LRESULT OnSetFocus(UINT , WPARAM , LPARAM , BOOL& )
2069 if(m_wndClient.m_hWnd != NULL)
2070 m_wndClient.SetFocus();
2075 LRESULT OnEraseBackground(UINT , WPARAM , LPARAM , BOOL& )
2081 void DoSize(
int cx,
int cy)
2083 _baseClass::DoSize(cx, cy);
2085 T* pT =
static_cast<T*
>(
this);
2091 if(!m_bAutoSizeClient || m_wndClient.m_hWnd == NULL)
2093 T* pT =
static_cast<T*
>(
this);
2095 pT->GetContainerRect(rect);
2097 if(m_bDrawEdgeIfEmpty && m_wndClient.m_hWnd == NULL)
2098 dc.DrawEdge(&rect, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
2100 dc.FillRect(&rect, COLOR_APPWORKSPACE);
2104 void ScrollToView(POINT pt)
2109 void ScrollToView(RECT& rect)
2114 void ScrollToView(HWND hWnd)
2116 T* pT =
static_cast<T*
>(
this);
2118 ATLASSERT(::IsWindow(pT->m_hWnd));
2119 ATLASSERT(m_wndClient.IsWindow());
2122 ::GetWindowRect(hWnd, &rect);
2123 ::MapWindowPoints(NULL, m_wndClient.m_hWnd, (LPPOINT)&rect, 2);
2130 ATLASSERT(::IsWindow(m_hWnd));
2132 if(m_bAutoSizeClient && m_wndClient.m_hWnd != NULL)
2134 T* pT =
static_cast<T*
>(
this);
2136 pT->GetContainerRect(rect);
2138 m_wndClient.SetWindowPos(NULL, &rect, SWP_NOZORDER | SWP_NOMOVE);
2146 void GetContainerRect(RECT& rect)
2148 GetClientRect(&rect);
2150 if(rect.right < m_sizeAll.cx)
2151 rect.right = m_sizeAll.cx;
2153 if(rect.bottom < m_sizeAll.cy)
2154 rect.bottom = m_sizeAll.cy;
2161 DECLARE_WND_CLASS_EX(_T(
"WTL_ScrollContainer"), 0, -1)
2166 #endif // __ATLSCRL_H__
Definition: atlgdi.h:1209
Definition: atlgdi.h:3362
Definition: atlgdi.h:3407