annotate foosdk/wtl/Include/atlscrl.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 // Windows Template Library - WTL version 10.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 // Copyright (C) Microsoft Corporation, WTL Team. All rights reserved.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 //
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 // This file is a part of the Windows Template Library.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 // The use and distribution terms for this software are covered by the
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 // Microsoft Public License (http://opensource.org/licenses/MS-PL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 // which can be found in the file MS-PL.txt at the root folder.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 #ifndef __ATLSCRL_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 #define __ATLSCRL_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 #ifndef __ATLAPP_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 #error atlscrl.h requires atlapp.h to be included first
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 #ifndef __ATLWIN_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 #error atlscrl.h requires atlwin.h to be included first
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 // Classes in this file:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 //
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 // CScrollImpl<T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 // CScrollWindowImpl<T, TBase, TWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 // CMapScrollImpl<T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 // CMapScrollWindowImpl<T, TBase, TWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 // CFSBWindowT<TBase>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 // CZoomScrollImpl<T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 // CZoomScrollWindowImpl<T, TBase, TWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 // CScrollContainerImpl<T, TBase, TWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 // CScrollContainer
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 namespace WTL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 // CScrollImpl - Provides scrolling support to any window
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 // Scroll extended styles
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 #define SCRL_SCROLLCHILDREN 0x00000001
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 #define SCRL_ERASEBACKGROUND 0x00000002
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 #define SCRL_NOTHUMBTRACKING 0x00000004
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 #define SCRL_SMOOTHSCROLL 0x00000008
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 #define SCRL_DISABLENOSCROLLV 0x00000010
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 #define SCRL_DISABLENOSCROLLH 0x00000020
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 #define SCRL_DISABLENOSCROLL (SCRL_DISABLENOSCROLLV | SCRL_DISABLENOSCROLLH)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 template <class T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 class CScrollImpl
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 enum { uSCROLL_FLAGS = SW_INVALIDATE };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 POINT m_ptOffset;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 SIZE m_sizeAll;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 SIZE m_sizeLine;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 SIZE m_sizePage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 SIZE m_sizeClient;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 int m_zDelta; // current wheel value
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 int m_nWheelLines; // number of lines to scroll on wheel
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 int m_zHDelta; // current horizontal wheel value
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 int m_nHWheelChars; // number of chars to scroll on horizontal wheel
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 UINT m_uScrollFlags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 DWORD m_dwExtendedStyle; // scroll specific extended styles
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 // Constructor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 CScrollImpl() : m_zDelta(0), m_nWheelLines(3),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 m_zHDelta(0), m_nHWheelChars(3),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 m_uScrollFlags(0U), m_dwExtendedStyle(0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 m_ptOffset.x = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 m_ptOffset.y = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 m_sizeAll.cx = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 m_sizeAll.cy = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 m_sizePage.cx = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 m_sizePage.cy = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 m_sizeLine.cx = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 m_sizeLine.cy = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 m_sizeClient.cx = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 m_sizeClient.cy = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 SetScrollExtendedStyle(SCRL_SCROLLCHILDREN | SCRL_ERASEBACKGROUND);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 // Attributes & Operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 DWORD GetScrollExtendedStyle() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 return m_dwExtendedStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 DWORD SetScrollExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 DWORD dwPrevStyle = m_dwExtendedStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 if(dwMask == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 m_dwExtendedStyle = dwExtendedStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 // cache scroll flags
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 (void)pT; // avoid level 4 warning
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 m_uScrollFlags = pT->uSCROLL_FLAGS | (IsScrollingChildren() ? SW_SCROLLCHILDREN : 0) | (IsErasingBackground() ? SW_ERASE : 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 m_uScrollFlags |= (IsSmoothScroll() ? SW_SMOOTHSCROLL : 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 return dwPrevStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 // offset operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 void SetScrollOffset(int x, int y, BOOL bRedraw = TRUE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 pT->AdjustScrollOffset(x, y);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 int dx = m_ptOffset.x - x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 int dy = m_ptOffset.y - y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 m_ptOffset.x = x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 m_ptOffset.y = y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 // block: set horizontal scroll bar
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 SCROLLINFO si = { sizeof(SCROLLINFO) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 si.fMask = SIF_POS;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLH) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 si.fMask |= SIF_DISABLENOSCROLL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 si.nPos = m_ptOffset.x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 pT->SetScrollInfo(SB_HORZ, &si, bRedraw);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 // block: set vertical scroll bar
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 SCROLLINFO si = { sizeof(SCROLLINFO) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 si.fMask = SIF_POS;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLV) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 si.fMask |= SIF_DISABLENOSCROLL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 si.nPos = m_ptOffset.y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 pT->SetScrollInfo(SB_VERT, &si, bRedraw);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 // Move all children if needed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 if(IsScrollingChildren() && ((dx != 0) || (dy != 0)))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 for(HWND hWndChild = ::GetWindow(pT->m_hWnd, GW_CHILD); hWndChild != NULL; hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 ::GetWindowRect(hWndChild, &rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rect, 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 ::SetWindowPos(hWndChild, NULL, rect.left + dx, rect.top + dy, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 if(bRedraw)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 pT->Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 void SetScrollOffset(POINT ptOffset, BOOL bRedraw = TRUE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 SetScrollOffset(ptOffset.x, ptOffset.y, bRedraw);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 void GetScrollOffset(POINT& ptOffset) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 ptOffset = m_ptOffset;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 // size operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 void SetScrollSize(int cx, int cy, BOOL bRedraw = TRUE, bool bResetOffset = true)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 m_sizeAll.cx = cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 m_sizeAll.cy = cy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 int x = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 int y = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 if(!bResetOffset)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 x = m_ptOffset.x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 y = m_ptOffset.y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 pT->AdjustScrollOffset(x, y);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 int dx = m_ptOffset.x - x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 int dy = m_ptOffset.y - y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 m_ptOffset.x = x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 m_ptOffset.y = y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 // block: set horizontal scroll bar
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 SCROLLINFO si = { sizeof(SCROLLINFO) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLH) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 si.fMask |= SIF_DISABLENOSCROLL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 si.nMin = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 si.nMax = m_sizeAll.cx - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 si.nPage = m_sizeClient.cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 si.nPos = m_ptOffset.x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 pT->SetScrollInfo(SB_HORZ, &si, bRedraw);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 // block: set vertical scroll bar
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 SCROLLINFO si = { sizeof(SCROLLINFO) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLV) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 si.fMask |= SIF_DISABLENOSCROLL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 si.nMin = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 si.nMax = m_sizeAll.cy - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 si.nPage = m_sizeClient.cy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 si.nPos = m_ptOffset.y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 pT->SetScrollInfo(SB_VERT, &si, bRedraw);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 // Move all children if needed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 if(IsScrollingChildren() && ((dx != 0) || (dy != 0)))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 for(HWND hWndChild = ::GetWindow(pT->m_hWnd, GW_CHILD); hWndChild != NULL; hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 ::GetWindowRect(hWndChild, &rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rect, 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 ::SetWindowPos(hWndChild, NULL, rect.left + dx, rect.top + dy, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 SetScrollLine(0, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 SetScrollPage(0, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 if(bRedraw)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 pT->Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 void SetScrollSize(SIZE size, BOOL bRedraw = TRUE, bool bResetOffset = true)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 SetScrollSize(size.cx, size.cy, bRedraw, bResetOffset);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 void GetScrollSize(SIZE& sizeWnd) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 sizeWnd = m_sizeAll;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 // line operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 void SetScrollLine(int cxLine, int cyLine)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 ATLASSERT((cxLine >= 0) && (cyLine >= 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 ATLASSERT((m_sizeAll.cx != 0) && (m_sizeAll.cy != 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 m_sizeLine.cx = T::CalcLineOrPage(cxLine, m_sizeAll.cx, 100);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 m_sizeLine.cy = T::CalcLineOrPage(cyLine, m_sizeAll.cy, 100);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 void SetScrollLine(SIZE sizeLine)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 SetScrollLine(sizeLine.cx, sizeLine.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 void GetScrollLine(SIZE& sizeLine) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 sizeLine = m_sizeLine;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 // page operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 void SetScrollPage(int cxPage, int cyPage)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 ATLASSERT((cxPage >= 0) && (cyPage >= 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 ATLASSERT((m_sizeAll.cx != 0) && (m_sizeAll.cy != 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 m_sizePage.cx = T::CalcLineOrPage(cxPage, m_sizeAll.cx, 10);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 m_sizePage.cy = T::CalcLineOrPage(cyPage, m_sizeAll.cy, 10);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 void SetScrollPage(SIZE sizePage)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 SetScrollPage(sizePage.cx, sizePage.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 void GetScrollPage(SIZE& sizePage) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 sizePage = m_sizePage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 // commands
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 void ScrollLineDown()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 pT->DoScroll(SB_VERT, SB_LINEDOWN, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 void ScrollLineUp()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 pT->DoScroll(SB_VERT, SB_LINEUP, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 void ScrollPageDown()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 pT->DoScroll(SB_VERT, SB_PAGEDOWN, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 void ScrollPageUp()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 pT->DoScroll(SB_VERT, SB_PAGEUP, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 void ScrollTop()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 pT->DoScroll(SB_VERT, SB_TOP, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 void ScrollBottom()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 pT->DoScroll(SB_VERT, SB_BOTTOM, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 void ScrollLineRight()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 pT->DoScroll(SB_HORZ, SB_LINEDOWN, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 void ScrollLineLeft()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 pT->DoScroll(SB_HORZ, SB_LINEUP, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 void ScrollPageRight()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 pT->DoScroll(SB_HORZ, SB_PAGEDOWN, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 void ScrollPageLeft()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 pT->DoScroll(SB_HORZ, SB_PAGEUP, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 void ScrollAllLeft()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 pT->DoScroll(SB_HORZ, SB_TOP, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 void ScrollAllRight()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 pT->DoScroll(SB_HORZ, SB_BOTTOM, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 // scroll to make point/view/window visible
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 void ScrollToView(POINT pt)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 RECT rect = { pt.x, pt.y, pt.x, pt.y };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 pT->ScrollToView(rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 void ScrollToView(RECT& rect)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 RECT rcClient = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 pT->GetClientRect(&rcClient);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 int x = m_ptOffset.x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 if(rect.left < m_ptOffset.x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 x = rect.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 else if(rect.right > (m_ptOffset.x + rcClient.right))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 x = rect.right - rcClient.right;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 int y = m_ptOffset.y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 if(rect.top < m_ptOffset.y)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 y = rect.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 else if(rect.bottom > (m_ptOffset.y + rcClient.bottom))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 y = rect.bottom - rcClient.bottom;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 SetScrollOffset(x, y);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 void ScrollToView(HWND hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 ::GetWindowRect(hWnd, &rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 ::OffsetRect(&rect, m_ptOffset.x, m_ptOffset.y);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rect, 2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 ScrollToView(rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 BEGIN_MSG_MAP(CScrollImpl)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 MESSAGE_HANDLER(WM_CREATE, OnCreate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 MESSAGE_HANDLER(WM_VSCROLL, OnVScroll)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 MESSAGE_HANDLER(WM_HSCROLL, OnHScroll)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 MESSAGE_HANDLER(WM_MOUSEWHEEL, OnMouseWheel)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 MESSAGE_HANDLER(WM_MOUSEHWHEEL, OnMouseHWheel)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 MESSAGE_HANDLER(WM_SIZE, OnSize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 MESSAGE_HANDLER(WM_PAINT, OnPaint)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425 MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426 // standard scroll commands
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427 ALT_MSG_MAP(1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 COMMAND_ID_HANDLER(ID_SCROLL_UP, OnScrollUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 COMMAND_ID_HANDLER(ID_SCROLL_DOWN, OnScrollDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, OnScrollPageUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, OnScrollPageDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432 COMMAND_ID_HANDLER(ID_SCROLL_TOP, OnScrollTop)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, OnScrollBottom)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 COMMAND_ID_HANDLER(ID_SCROLL_LEFT, OnScrollLeft)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, OnScrollRight)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, OnScrollPageLeft)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, OnScrollPageRight)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, OnScrollAllLeft)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439 COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, OnScrollAllRight)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442 LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445 pT->GetSystemSettings();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
449 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
450
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451 LRESULT OnVScroll(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 pT->DoScroll(SB_VERT, (int)(short)LOWORD(wParam), (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459 LRESULT OnHScroll(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463 pT->DoScroll(SB_HORZ, (int)(short)LOWORD(wParam), (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 LRESULT OnMouseWheel(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472 int zDelta = (int)GET_WHEEL_DELTA_WPARAM(wParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473 int nScrollCode = (m_nWheelLines == WHEEL_PAGESCROLL) ? ((zDelta > 0) ? SB_PAGEUP : SB_PAGEDOWN) : ((zDelta > 0) ? SB_LINEUP : SB_LINEDOWN);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 m_zDelta += zDelta; // cumulative
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475 int zTotal = (m_nWheelLines == WHEEL_PAGESCROLL) ? abs(m_zDelta) : abs(m_zDelta) * m_nWheelLines;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 if(m_sizeAll.cy > m_sizeClient.cy)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 for(int i = 0; i < zTotal; i += WHEEL_DELTA)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480 pT->DoScroll(SB_VERT, nScrollCode, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 pT->UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
482 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
483 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484 else if(m_sizeAll.cx > m_sizeClient.cx) // can't scroll vertically, scroll horizontally
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 for(int i = 0; i < zTotal; i += WHEEL_DELTA)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488 pT->DoScroll(SB_HORZ, nScrollCode, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 pT->UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 m_zDelta %= WHEEL_DELTA;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
497 LRESULT OnMouseHWheel(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502 int zDelta = (int)GET_WHEEL_DELTA_WPARAM(wParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503 int nScrollCode = (m_nHWheelChars == WHEEL_PAGESCROLL) ? ((zDelta > 0) ? SB_PAGERIGHT : SB_PAGELEFT) : ((zDelta > 0) ? SB_LINERIGHT : SB_LINELEFT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504 m_zHDelta += zDelta; // cumulative
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505 int zTotal = (m_nHWheelChars == WHEEL_PAGESCROLL) ? abs(m_zHDelta) : abs(m_zHDelta) * m_nHWheelChars;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506 if(m_sizeAll.cx > m_sizeClient.cx)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508 for(int i = 0; i < zTotal; i += WHEEL_DELTA)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510 pT->DoScroll(SB_HORZ, nScrollCode, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
511 pT->UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
512 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
513 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
514 m_zHDelta %= WHEEL_DELTA;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
515
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
516 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
517 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
518
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
519 LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
520 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
521 GetSystemSettings();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
522 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
523 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
524
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
525 LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
526 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
527 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
528 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
529
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
530 pT->DoSize(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
531
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
532 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
533 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
534 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
535
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
536 LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
537 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
538 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
539 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
540 if(wParam != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
541 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
542 CDCHandle dc = (HDC)wParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
543 POINT ptViewportOrg = { 0, 0 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
544 dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y, &ptViewportOrg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
545 pT->DoPaint(dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
546 dc.SetViewportOrg(ptViewportOrg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
547 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
548 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
549 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
550 CPaintDC dc(pT->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
551 dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
552 pT->DoPaint(dc.m_hDC);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
553 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
554 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
555 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
556
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
557 // scrolling handlers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
558 LRESULT OnScrollUp(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
559 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
560 ScrollLineUp();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
561 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
562 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
563
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
564 LRESULT OnScrollDown(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
565 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
566 ScrollLineDown();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
567 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
568 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
569
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
570 LRESULT OnScrollPageUp(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
571 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
572 ScrollPageUp();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
573 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
574 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
575
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
576 LRESULT OnScrollPageDown(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
577 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
578 ScrollPageDown();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
579 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
580 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
581
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
582 LRESULT OnScrollTop(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
583 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
584 ScrollTop();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
585 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
586 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
587
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
588 LRESULT OnScrollBottom(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
589 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
590 ScrollBottom();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
591 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
592 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
593
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
594 LRESULT OnScrollLeft(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
595 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
596 ScrollLineLeft();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
597 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
598 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
599
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
600 LRESULT OnScrollRight(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
601 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
602 ScrollLineRight();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
603 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
604 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
605
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
606 LRESULT OnScrollPageLeft(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
607 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
608 ScrollPageLeft();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
609 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
610 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
611
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
612 LRESULT OnScrollPageRight(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
613 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
614 ScrollPageRight();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
615 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
616 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
617
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
618 LRESULT OnScrollAllLeft(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
619 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
620 ScrollAllLeft();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
621 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
622 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
623
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
624 LRESULT OnScrollAllRight(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
625 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
626 ScrollAllRight();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
627 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
628 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
629
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
630 // Overrideables
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
631 void DoPaint(CDCHandle /*dc*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
632 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
633 // must be implemented in a derived class
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
634 ATLASSERT(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
635 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
636
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
637 // Implementation
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
638 void DoSize(int cx, int cy)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
639 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
640 m_sizeClient.cx = cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
641 m_sizeClient.cy = cy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
642
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
643 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
644
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
645 // block: set horizontal scroll bar
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
646 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
647 SCROLLINFO si = { sizeof(SCROLLINFO) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
648 si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
649 si.nMin = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
650 si.nMax = m_sizeAll.cx - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
651 if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLH) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
652 si.fMask |= SIF_DISABLENOSCROLL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
653 si.nPage = m_sizeClient.cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
654 si.nPos = m_ptOffset.x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
655 pT->SetScrollInfo(SB_HORZ, &si, TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
656 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
657
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
658 // block: set vertical scroll bar
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
659 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
660 SCROLLINFO si = { sizeof(SCROLLINFO) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
661 si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
662 si.nMin = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
663 si.nMax = m_sizeAll.cy - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
664 if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLV) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
665 si.fMask |= SIF_DISABLENOSCROLL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
666 si.nPage = m_sizeClient.cy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
667 si.nPos = m_ptOffset.y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
668 pT->SetScrollInfo(SB_VERT, &si, TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
669 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
670
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
671 int x = m_ptOffset.x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
672 int y = m_ptOffset.y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
673 if(pT->AdjustScrollOffset(x, y))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
674 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
675 // Children will be moved in SetScrollOffset, if needed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
676 pT->ScrollWindowEx(m_ptOffset.x - x, m_ptOffset.y - y, (m_uScrollFlags & ~SCRL_SCROLLCHILDREN));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
677 SetScrollOffset(x, y, FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
678 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
679 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
680
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
681 void DoScroll(int nType, int nScrollCode, int& cxyOffset, int cxySizeAll, int cxySizePage, int cxySizeLine)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
682 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
683 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
684 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
685 pT->GetClientRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
686 int cxyClient = (nType == SB_VERT) ? rect.bottom : rect.right;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
687 int cxyMax = cxySizeAll - cxyClient;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
688
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
689 if(cxyMax < 0) // can't scroll, client area is bigger
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
690 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
691
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
692 bool bUpdate = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
693 int cxyScroll = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
694
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
695 switch(nScrollCode)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
696 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
697 case SB_TOP: // top or all left
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
698 cxyScroll = cxyOffset;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
699 cxyOffset = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
700 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
701 case SB_BOTTOM: // bottom or all right
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
702 cxyScroll = cxyOffset - cxyMax;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
703 cxyOffset = cxyMax;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
704 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
705 case SB_LINEUP: // line up or line left
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
706 if(cxyOffset >= cxySizeLine)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
707 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
708 cxyScroll = cxySizeLine;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
709 cxyOffset -= cxySizeLine;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
710 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
711 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
712 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
713 cxyScroll = cxyOffset;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
714 cxyOffset = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
715 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
716 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
717 case SB_LINEDOWN: // line down or line right
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
718 if(cxyOffset < cxyMax - cxySizeLine)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
719 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
720 cxyScroll = -cxySizeLine;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
721 cxyOffset += cxySizeLine;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
722 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
723 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
724 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
725 cxyScroll = cxyOffset - cxyMax;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
726 cxyOffset = cxyMax;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
727 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
728 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
729 case SB_PAGEUP: // page up or page left
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
730 if(cxyOffset >= cxySizePage)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
731 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
732 cxyScroll = cxySizePage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
733 cxyOffset -= cxySizePage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
734 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
735 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
736 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
737 cxyScroll = cxyOffset;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
738 cxyOffset = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
739 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
740 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
741 case SB_PAGEDOWN: // page down or page right
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
742 if(cxyOffset < cxyMax - cxySizePage)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
743 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
744 cxyScroll = -cxySizePage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
745 cxyOffset += cxySizePage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
746 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
747 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
748 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
749 cxyScroll = cxyOffset - cxyMax;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
750 cxyOffset = cxyMax;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
751 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
752 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
753 case SB_THUMBTRACK:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
754 if(IsNoThumbTracking())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
755 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
756 // else fall through
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
757 case SB_THUMBPOSITION:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
758 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
759 SCROLLINFO si = { sizeof(SCROLLINFO), SIF_TRACKPOS };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
760 if(pT->GetScrollInfo(nType, &si))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
761 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
762 cxyScroll = cxyOffset - si.nTrackPos;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
763 cxyOffset = si.nTrackPos;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
764 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
765 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
766 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
767 case SB_ENDSCROLL:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
768 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
769 bUpdate = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
770 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
771 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
772
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
773 if(bUpdate && (cxyScroll != 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
774 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
775 pT->SetScrollPos(nType, cxyOffset, TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
776 if(nType == SB_VERT)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
777 pT->ScrollWindowEx(0, cxyScroll, m_uScrollFlags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
778 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
779 pT->ScrollWindowEx(cxyScroll, 0, m_uScrollFlags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
780 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
781 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
782
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
783 static int CalcLineOrPage(int nVal, int nMax, int nDiv)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
784 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
785 if(nVal == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
786 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
787 nVal = nMax / nDiv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
788 if(nVal < 1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
789 nVal = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
790 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
791 else if(nVal > nMax)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
792 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
793 nVal = nMax;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
794 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
795
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
796 return nVal;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
797 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
798
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
799 bool AdjustScrollOffset(int& x, int& y)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
800 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
801 int xOld = x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
802 int yOld = y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
803
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
804 int cxMax = m_sizeAll.cx - m_sizeClient.cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
805 if(x > cxMax)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
806 x = (cxMax >= 0) ? cxMax : 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
807 else if(x < 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
808 x = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
809
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
810 int cyMax = m_sizeAll.cy - m_sizeClient.cy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
811 if(y > cyMax)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
812 y = (cyMax >= 0) ? cyMax : 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
813 else if(y < 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
814 y = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
815
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
816 return ((x != xOld) || (y != yOld));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
817 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
818
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
819 void GetSystemSettings()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
820 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
821 ::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &m_nWheelLines, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
822
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
823 #ifndef SPI_GETWHEELSCROLLCHARS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
824 const UINT SPI_GETWHEELSCROLLCHARS = 0x006C;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
825 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
826 ::SystemParametersInfo(SPI_GETWHEELSCROLLCHARS, 0, &m_nHWheelChars, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
827 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
828
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
829 bool IsScrollingChildren() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
830 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
831 return (m_dwExtendedStyle & SCRL_SCROLLCHILDREN) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
832 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
833
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
834 bool IsErasingBackground() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
835 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
836 return (m_dwExtendedStyle & SCRL_ERASEBACKGROUND) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
837 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
838
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
839 bool IsNoThumbTracking() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
840 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
841 return (m_dwExtendedStyle & SCRL_NOTHUMBTRACKING) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
842 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
843
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
844 bool IsSmoothScroll() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
845 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
846 return (m_dwExtendedStyle & SCRL_SMOOTHSCROLL) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
847 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
848 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
849
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
850
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
851 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
852 // CScrollWindowImpl - Implements a scrollable window
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
853
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
854 template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
855 class ATL_NO_VTABLE CScrollWindowImpl : public ATL::CWindowImpl<T, TBase, TWinTraits>, public CScrollImpl< T >
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
856 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
857 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
858 BOOL SubclassWindow(HWND hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
859 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
860 BOOL bRet = ATL::CWindowImpl< T, TBase, TWinTraits >::SubclassWindow(hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
861 if(bRet != FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
862 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
863 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
864 pT->GetSystemSettings();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
865
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
866 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
867 this->GetClientRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
868 pT->DoSize(rect.right, rect.bottom);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
869 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
870
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
871 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
872 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
873
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
874 BEGIN_MSG_MAP(CScrollWindowImpl)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
875 MESSAGE_HANDLER(WM_VSCROLL, CScrollImpl< T >::OnVScroll)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
876 MESSAGE_HANDLER(WM_HSCROLL, CScrollImpl< T >::OnHScroll)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
877 MESSAGE_HANDLER(WM_MOUSEWHEEL, CScrollImpl< T >::OnMouseWheel)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
878 MESSAGE_HANDLER(WM_MOUSEHWHEEL, CScrollImpl< T >::OnMouseHWheel)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
879 MESSAGE_HANDLER(WM_SETTINGCHANGE, CScrollImpl< T >::OnSettingChange)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
880 MESSAGE_HANDLER(WM_SIZE, CScrollImpl< T >::OnSize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
881 MESSAGE_HANDLER(WM_PAINT, CScrollImpl< T >::OnPaint)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
882 MESSAGE_HANDLER(WM_PRINTCLIENT, CScrollImpl< T >::OnPaint)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
883 ALT_MSG_MAP(1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
884 COMMAND_ID_HANDLER(ID_SCROLL_UP, CScrollImpl< T >::OnScrollUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
885 COMMAND_ID_HANDLER(ID_SCROLL_DOWN, CScrollImpl< T >::OnScrollDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
886 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, CScrollImpl< T >::OnScrollPageUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
887 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, CScrollImpl< T >::OnScrollPageDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
888 COMMAND_ID_HANDLER(ID_SCROLL_TOP, CScrollImpl< T >::OnScrollTop)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
889 COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, CScrollImpl< T >::OnScrollBottom)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
890 COMMAND_ID_HANDLER(ID_SCROLL_LEFT, CScrollImpl< T >::OnScrollLeft)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
891 COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, CScrollImpl< T >::OnScrollRight)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
892 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, CScrollImpl< T >::OnScrollPageLeft)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
893 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, CScrollImpl< T >::OnScrollPageRight)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
894 COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, CScrollImpl< T >::OnScrollAllLeft)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
895 COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, CScrollImpl< T >::OnScrollAllRight)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
896 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
897 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
898
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
899
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
900 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
901 // CMapScrollImpl - Provides mapping and scrolling support to any window
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
902
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
903 template <class T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
904 class CMapScrollImpl : public CScrollImpl< T >
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
905 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
906 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
907 int m_nMapMode;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
908 RECT m_rectLogAll;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
909 SIZE m_sizeLogLine;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
910 SIZE m_sizeLogPage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
911
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
912 // Constructor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
913 CMapScrollImpl() : m_nMapMode(MM_TEXT)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
914 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
915 ::SetRectEmpty(&m_rectLogAll);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
916 m_sizeLogPage.cx = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
917 m_sizeLogPage.cy = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
918 m_sizeLogLine.cx = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
919 m_sizeLogLine.cy = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
920 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
921
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
922 // Attributes & Operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
923 // mapping mode operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
924 void SetScrollMapMode(int nMapMode)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
925 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
926 ATLASSERT((nMapMode >= MM_MIN) && (nMapMode <= MM_MAX_FIXEDSCALE));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
927 m_nMapMode = nMapMode;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
928 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
929
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
930 int GetScrollMapMode() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
931 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
932 ATLASSERT((m_nMapMode >= MM_MIN) && (m_nMapMode <= MM_MAX_FIXEDSCALE));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
933 return m_nMapMode;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
934 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
935
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
936 // offset operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
937 void SetScrollOffset(int x, int y, BOOL bRedraw = TRUE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
938 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
939 ATLASSERT((m_nMapMode >= MM_MIN) && (m_nMapMode <= MM_MAX_FIXEDSCALE));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
940 POINT ptOff = { x, y };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
941 // block: convert logical to device units
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
942 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
943 CWindowDC dc(NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
944 dc.SetMapMode(m_nMapMode);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
945 dc.LPtoDP(&ptOff);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
946 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
947 CScrollImpl< T >::SetScrollOffset(ptOff, bRedraw);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
948 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
949
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
950 void SetScrollOffset(POINT ptOffset, BOOL bRedraw = TRUE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
951 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
952 SetScrollOffset(ptOffset.x, ptOffset.y, bRedraw);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
953 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
954
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
955 void GetScrollOffset(POINT& ptOffset) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
956 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
957 ATLASSERT((m_nMapMode >= MM_MIN) && (m_nMapMode <= MM_MAX_FIXEDSCALE));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
958 ptOffset = this->m_ptOffset;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
959 // block: convert device to logical units
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
960 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
961 CWindowDC dc(NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
962 dc.SetMapMode(m_nMapMode);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
963 dc.DPtoLP(&ptOffset);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
964 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
965 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
966
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
967 // size operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
968 void SetScrollSize(int xMin, int yMin, int xMax, int yMax, BOOL bRedraw = TRUE, bool bResetOffset = true)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
969 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
970 ATLASSERT((xMax > xMin) && (yMax > yMin));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
971 ATLASSERT((m_nMapMode >= MM_MIN) && (m_nMapMode <= MM_MAX_FIXEDSCALE));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
972
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
973 ::SetRect(&m_rectLogAll, xMin, yMin, xMax, yMax);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
974
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
975 SIZE sizeAll = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
976 sizeAll.cx = xMax - xMin + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
977 sizeAll.cy = yMax - yMin + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
978 // block: convert logical to device units
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
979 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
980 CWindowDC dc(NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
981 dc.SetMapMode(m_nMapMode);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
982 dc.LPtoDP(&sizeAll);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
983 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
984 CScrollImpl< T >::SetScrollSize(sizeAll, bRedraw, bResetOffset);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
985 SetScrollLine(0, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
986 SetScrollPage(0, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
987 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
988
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
989 void SetScrollSize(RECT& rcScroll, BOOL bRedraw = TRUE, bool bResetOffset = true)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
990 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
991 SetScrollSize(rcScroll.left, rcScroll.top, rcScroll.right, rcScroll.bottom, bRedraw, bResetOffset);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
992 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
993
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
994 void SetScrollSize(int cx, int cy, BOOL bRedraw = TRUE, bool bResetOffset = true)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
995 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
996 SetScrollSize(0, 0, cx, cy, bRedraw, bResetOffset);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
997 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
998
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
999 void SetScrollSize(SIZE size, BOOL bRedraw = TRUE, bool bResetOffset = true)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1000 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1001 SetScrollSize(0, 0, size.cx, size.cy, bRedraw, bResetOffset);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1002 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1003
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1004 void GetScrollSize(RECT& rcScroll) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1005 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1006 ATLASSERT((m_nMapMode >= MM_MIN) && (m_nMapMode <= MM_MAX_FIXEDSCALE));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1007 rcScroll = m_rectLogAll;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1008 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1009
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1010 // line operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1011 void SetScrollLine(int cxLine, int cyLine)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1012 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1013 ATLASSERT((cxLine >= 0) && (cyLine >= 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1014 ATLASSERT((m_nMapMode >= MM_MIN) && (m_nMapMode <= MM_MAX_FIXEDSCALE));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1015
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1016 m_sizeLogLine.cx = cxLine;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1017 m_sizeLogLine.cy = cyLine;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1018 SIZE sizeLine = m_sizeLogLine;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1019 // block: convert logical to device units
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1020 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1021 CWindowDC dc(NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1022 dc.SetMapMode(m_nMapMode);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1023 dc.LPtoDP(&sizeLine);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1024 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1025 CScrollImpl< T >::SetScrollLine(sizeLine);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1026 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1027
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1028 void SetScrollLine(SIZE sizeLine)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1029 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1030 SetScrollLine(sizeLine.cx, sizeLine.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1031 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1032
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1033 void GetScrollLine(SIZE& sizeLine) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1034 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1035 ATLASSERT((m_nMapMode >= MM_MIN) && (m_nMapMode <= MM_MAX_FIXEDSCALE));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1036 sizeLine = m_sizeLogLine;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1037 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1038
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1039 // page operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1040 void SetScrollPage(int cxPage, int cyPage)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1041 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1042 ATLASSERT((cxPage >= 0) && (cyPage >= 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1043 ATLASSERT((m_nMapMode >= MM_MIN) && (m_nMapMode <= MM_MAX_FIXEDSCALE));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1044
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1045 m_sizeLogPage.cx = cxPage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1046 m_sizeLogPage.cy = cyPage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1047 SIZE sizePage = m_sizeLogPage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1048 // block: convert logical to device units
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1049 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1050 CWindowDC dc(NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1051 dc.SetMapMode(m_nMapMode);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1052 dc.LPtoDP(&sizePage);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1053 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1054 CScrollImpl< T >::SetScrollPage(sizePage);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1055 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1056
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1057 void SetScrollPage(SIZE sizePage)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1058 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1059 SetScrollPage(sizePage.cx, sizePage.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1060 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1061
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1062 void GetScrollPage(SIZE& sizePage) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1063 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1064 ATLASSERT((m_nMapMode >= MM_MIN) && (m_nMapMode <= MM_MAX_FIXEDSCALE));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1065 sizePage = m_sizeLogPage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1066 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1067
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1068 BEGIN_MSG_MAP(CMapScrollImpl)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1069 MESSAGE_HANDLER(WM_VSCROLL, CScrollImpl< T >::OnVScroll)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1070 MESSAGE_HANDLER(WM_HSCROLL, CScrollImpl< T >::OnHScroll)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1071 MESSAGE_HANDLER(WM_MOUSEWHEEL, CScrollImpl< T >::OnMouseWheel)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1072 MESSAGE_HANDLER(WM_MOUSEHWHEEL, CScrollImpl< T >::OnMouseHWheel)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1073 MESSAGE_HANDLER(WM_SETTINGCHANGE, CScrollImpl< T >::OnSettingChange)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1074 MESSAGE_HANDLER(WM_SIZE, CScrollImpl< T >::OnSize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1075 MESSAGE_HANDLER(WM_PAINT, OnPaint)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1076 MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1077 ALT_MSG_MAP(1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1078 COMMAND_ID_HANDLER(ID_SCROLL_UP, CScrollImpl< T >::OnScrollUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1079 COMMAND_ID_HANDLER(ID_SCROLL_DOWN, CScrollImpl< T >::OnScrollDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1080 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, CScrollImpl< T >::OnScrollPageUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1081 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, CScrollImpl< T >::OnScrollPageDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1082 COMMAND_ID_HANDLER(ID_SCROLL_TOP, CScrollImpl< T >::OnScrollTop)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1083 COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, CScrollImpl< T >::OnScrollBottom)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1084 COMMAND_ID_HANDLER(ID_SCROLL_LEFT, CScrollImpl< T >::OnScrollLeft)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1085 COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, CScrollImpl< T >::OnScrollRight)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1086 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, CScrollImpl< T >::OnScrollPageLeft)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1087 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, CScrollImpl< T >::OnScrollPageRight)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1088 COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, CScrollImpl< T >::OnScrollAllLeft)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1089 COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, CScrollImpl< T >::OnScrollAllRight)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1090 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1091
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1092 LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1093 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1094 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1095 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1096 if(wParam != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1097 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1098 CDCHandle dc = (HDC)wParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1099 int nMapModeSav = dc.GetMapMode();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1100 dc.SetMapMode(m_nMapMode);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1101 POINT ptViewportOrg = { 0, 0 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1102 if(m_nMapMode == MM_TEXT)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1103 dc.SetViewportOrg(-this->m_ptOffset.x, -this->m_ptOffset.y, &ptViewportOrg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1104 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1105 dc.SetViewportOrg(-this->m_ptOffset.x, -this->m_ptOffset.y + this->m_sizeAll.cy, &ptViewportOrg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1106 POINT ptWindowOrg = { 0, 0 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1107 dc.SetWindowOrg(m_rectLogAll.left, m_rectLogAll.top, &ptWindowOrg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1108
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1109 pT->DoPaint(dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1110
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1111 dc.SetMapMode(nMapModeSav);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1112 dc.SetViewportOrg(ptViewportOrg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1113 dc.SetWindowOrg(ptWindowOrg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1114 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1115 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1116 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1117 CPaintDC dc(pT->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1118 dc.SetMapMode(m_nMapMode);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1119 if(m_nMapMode == MM_TEXT)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1120 dc.SetViewportOrg(-this->m_ptOffset.x, -this->m_ptOffset.y);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1121 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1122 dc.SetViewportOrg(-this->m_ptOffset.x, -this->m_ptOffset.y + this->m_sizeAll.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1123 dc.SetWindowOrg(m_rectLogAll.left, m_rectLogAll.top);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1124 pT->DoPaint(dc.m_hDC);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1125 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1126 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1127 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1128 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1129
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1130
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1131 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1132 // CMapScrollWindowImpl - Implements scrolling window with mapping
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1133
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1134 template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1135 class ATL_NO_VTABLE CMapScrollWindowImpl : public ATL::CWindowImpl< T, TBase, TWinTraits >, public CMapScrollImpl< T >
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1136 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1137 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1138 BOOL SubclassWindow(HWND hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1139 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1140 BOOL bRet = ATL::CWindowImpl< T, TBase, TWinTraits >::SubclassWindow(hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1141 if(bRet != FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1142 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1143 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1144 pT->GetSystemSettings();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1145
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1146 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1147 this->GetClientRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1148 pT->DoSize(rect.right, rect.bottom);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1149 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1150
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1151 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1152 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1153
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1154 BEGIN_MSG_MAP(CMapScrollWindowImpl)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1155 MESSAGE_HANDLER(WM_VSCROLL, CScrollImpl< T >::OnVScroll)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1156 MESSAGE_HANDLER(WM_HSCROLL, CScrollImpl< T >::OnHScroll)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1157 MESSAGE_HANDLER(WM_MOUSEWHEEL, CScrollImpl< T >::OnMouseWheel)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1158 MESSAGE_HANDLER(WM_MOUSEHWHEEL, CScrollImpl< T >::OnMouseHWheel)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1159 MESSAGE_HANDLER(WM_SETTINGCHANGE, CScrollImpl< T >::OnSettingChange)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1160 MESSAGE_HANDLER(WM_SIZE, CScrollImpl< T >::OnSize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1161 MESSAGE_HANDLER(WM_PAINT, CMapScrollImpl< T >::OnPaint)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1162 MESSAGE_HANDLER(WM_PRINTCLIENT, CMapScrollImpl< T >::OnPaint)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1163 ALT_MSG_MAP(1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1164 COMMAND_ID_HANDLER(ID_SCROLL_UP, CScrollImpl< T >::OnScrollUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1165 COMMAND_ID_HANDLER(ID_SCROLL_DOWN, CScrollImpl< T >::OnScrollDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1166 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, CScrollImpl< T >::OnScrollPageUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1167 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, CScrollImpl< T >::OnScrollPageDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1168 COMMAND_ID_HANDLER(ID_SCROLL_TOP, CScrollImpl< T >::OnScrollTop)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1169 COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, CScrollImpl< T >::OnScrollBottom)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1170 COMMAND_ID_HANDLER(ID_SCROLL_LEFT, CScrollImpl< T >::OnScrollLeft)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1171 COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, CScrollImpl< T >::OnScrollRight)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1172 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, CScrollImpl< T >::OnScrollPageLeft)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1173 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, CScrollImpl< T >::OnScrollPageRight)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1174 COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, CScrollImpl< T >::OnScrollAllLeft)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1175 COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, CScrollImpl< T >::OnScrollAllRight)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1176 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1177 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1178
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1179
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1180 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1181 // CFSBWindow - Use as a base instead of CWindow to get flat scroll bar support
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1182
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1183 #ifdef __ATLCTRLS_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1184
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1185 template <class TBase = ATL::CWindow>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1186 class CFSBWindowT : public TBase, public CFlatScrollBarImpl<CFSBWindowT< TBase > >
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1187 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1188 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1189 // Constructors
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1190 CFSBWindowT(HWND hWnd = NULL) : TBase(hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1191 { }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1192
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1193 CFSBWindowT< TBase >& operator =(HWND hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1194 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1195 this->m_hWnd = hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1196 return *this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1197 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1198
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1199 // CWindow overrides that use flat scroll bar API
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1200 // (only those methods that are used by scroll window classes)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1201 int SetScrollPos(int nBar, int nPos, BOOL bRedraw = TRUE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1202 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1203 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1204 return this->FlatSB_SetScrollPos(nBar, nPos, bRedraw);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1205 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1206
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1207 BOOL GetScrollInfo(int nBar, LPSCROLLINFO lpScrollInfo)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1208 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1209 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1210 return this->FlatSB_GetScrollInfo(nBar, lpScrollInfo);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1211 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1212
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1213 BOOL SetScrollInfo(int nBar, LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1214 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1215 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1216 return this->FlatSB_SetScrollInfo(nBar, lpScrollInfo, bRedraw);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1217 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1218 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1219
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1220 typedef CFSBWindowT<ATL::CWindow> CFSBWindow;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1221
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1222 #endif // __ATLCTRLS_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1223
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1224
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1225 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1226 // CZoomScrollImpl - Provides zooming and scrolling support to any window
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1227
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1228 // The zoom modes that can be set with the SetZoomMode method
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1229 enum
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1230 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1231 ZOOMMODE_OFF,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1232 ZOOMMODE_IN, // If left mouse button is clicked or dragged, zoom in on point clicked or rectangle dragged.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1233 ZOOMMODE_OUT // If left mouse button clicked, zoom out on point clicked.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1234 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1235
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1236 // Notification to parent that zoom scale changed as a result of user mouse action.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1237 #define ZSN_ZOOMCHANGED (NM_FIRST - 50)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1238
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1239 template <class T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1240 class CZoomScrollImpl : public CScrollImpl< T >
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1241 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1242 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1243 enum { m_cxyMinZoomRect = 12 }; // min rect size to zoom in on rect.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1244
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1245 struct _ChildPlacement
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1246 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1247 HWND hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1248 int x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1249 int y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1250 int cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1251 int cy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1252
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1253 bool operator ==(const _ChildPlacement& cp) const { return (memcmp(this, &cp, sizeof(_ChildPlacement)) == 0); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1254 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1255
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1256 // Data members
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1257 SIZE m_sizeLogAll;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1258 SIZE m_sizeLogLine;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1259 SIZE m_sizeLogPage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1260 float m_fZoomScale;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1261 float m_fZoomScaleMin;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1262 float m_fZoomScaleMax;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1263 float m_fZoomDelta; // Used in ZOOMMODE_IN and ZOOMMODE_OUT on left-button click.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1264 int m_nZoomMode;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1265 RECT m_rcTrack;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1266 bool m_bTracking;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1267
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1268 bool m_bZoomChildren;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1269 ATL::CSimpleArray<_ChildPlacement> m_arrChildren;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1270
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1271 // Constructor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1272 CZoomScrollImpl(): m_fZoomScale(1.0f), m_fZoomScaleMin(0.1f), m_fZoomScaleMax(100.0f), m_fZoomDelta(0.5f),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1273 m_nZoomMode(ZOOMMODE_OFF), m_bTracking(false), m_bZoomChildren(false)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1274 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1275 m_sizeLogAll.cx = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1276 m_sizeLogAll.cy = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1277 m_sizeLogPage.cx = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1278 m_sizeLogPage.cy = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1279 m_sizeLogLine.cx = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1280 m_sizeLogLine.cy = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1281 ::SetRectEmpty(&m_rcTrack);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1282 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1283
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1284 // Attributes & Operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1285 // size operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1286 void SetScrollSize(int cxLog, int cyLog, BOOL bRedraw = TRUE, bool bResetOffset = true)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1287 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1288 ATLASSERT((cxLog >= 0) && (cyLog >= 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1289
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1290 // Set up the defaults
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1291 if((cxLog == 0) && (cyLog == 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1292 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1293 cxLog = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1294 cyLog = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1295 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1296
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1297 m_sizeLogAll.cx = cxLog;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1298 m_sizeLogAll.cy = cyLog;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1299 SIZE sizeAll = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1300 sizeAll.cx = (int)((float)m_sizeLogAll.cx * m_fZoomScale);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1301 sizeAll.cy = (int)((float)m_sizeLogAll.cy * m_fZoomScale);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1302
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1303 CScrollImpl< T >::SetScrollSize(sizeAll, bRedraw, bResetOffset);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1304 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1305
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1306 void SetScrollSize(SIZE sizeLog, BOOL bRedraw = TRUE, bool bResetOffset = true)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1307 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1308 SetScrollSize(sizeLog.cx, sizeLog.cy, bRedraw, bResetOffset);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1309 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1310
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1311 void GetScrollSize(SIZE& sizeLog) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1312 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1313 sizeLog = m_sizeLogAll;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1314 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1315
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1316 // line operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1317 void SetScrollLine(int cxLogLine, int cyLogLine)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1318 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1319 ATLASSERT((cxLogLine >= 0) && (cyLogLine >= 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1320
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1321 m_sizeLogLine.cx = cxLogLine;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1322 m_sizeLogLine.cy = cyLogLine;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1323
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1324 SIZE sizeLine = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1325 sizeLine.cx = (int)((float)m_sizeLogLine.cx * m_fZoomScale);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1326 sizeLine.cy = (int)((float)m_sizeLogLine.cy * m_fZoomScale);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1327 CScrollImpl< T >::SetScrollLine(sizeLine);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1328 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1329
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1330 void SetScrollLine(SIZE sizeLogLine)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1331 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1332 SetScrollLine(sizeLogLine.cx, sizeLogLine.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1333 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1334
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1335 void GetScrollLine(SIZE& sizeLogLine) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1336 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1337 sizeLogLine = m_sizeLogLine;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1338 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1339
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1340 // page operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1341 void SetScrollPage(int cxLogPage, int cyLogPage)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1342 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1343 ATLASSERT((cxLogPage >= 0) && (cyLogPage >= 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1344
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1345 m_sizeLogPage.cx = cxLogPage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1346 m_sizeLogPage.cy = cyLogPage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1347
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1348 SIZE sizePage = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1349 sizePage.cx = (int)((float)m_sizeLogPage.cx * m_fZoomScale);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1350 sizePage.cy = (int)((float)m_sizeLogPage.cy * m_fZoomScale);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1351
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1352 CScrollImpl< T >::SetScrollPage(sizePage);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1353 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1354
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1355 void SetScrollPage(SIZE sizeLogPage)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1356 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1357 SetScrollPage(sizeLogPage.cx, sizeLogPage.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1358 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1359
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1360 void GetScrollPage(SIZE& sizeLogPage) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1361 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1362 sizeLogPage = m_sizeLogPage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1363 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1364
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1365 void SetZoomScale(float fZoomScale)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1366 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1367 ATLASSERT(fZoomScale > 0.0f);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1368 if(fZoomScale <= 0.0f)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1369 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1370
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1371 m_fZoomScale = fZoomScale;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1372 if(m_fZoomScale < m_fZoomScaleMin)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1373 m_fZoomScale = m_fZoomScaleMin;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1374 else if(m_fZoomScale > m_fZoomScaleMax)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1375 m_fZoomScale = m_fZoomScaleMax;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1376 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1377
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1378 float GetZoomScale() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1379 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1380 return m_fZoomScale;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1381 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1382
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1383 void SetZoomScaleMin(float fZoomScaleMin)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1384 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1385 ATLASSERT(fZoomScaleMin > 0.0f);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1386 ATLASSERT(fZoomScaleMin <= m_fZoomScaleMax);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1387
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1388 m_fZoomScaleMin = fZoomScaleMin;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1389 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1390
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1391 float GetZoomScaleMin() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1392 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1393 return m_fZoomScaleMin;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1394 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1395
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1396 void SetZoomScaleMax(float fZoomScaleMax)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1397 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1398 ATLASSERT(fZoomScaleMax > 0.0f);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1399 ATLASSERT(m_fZoomScaleMin <= fZoomScaleMax);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1400
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1401 m_fZoomScaleMax = fZoomScaleMax;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1402 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1403
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1404 float GetZoomScaleMax() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1405 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1406 return m_fZoomScaleMax;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1407 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1408
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1409 void SetZoomDelta(float fZoomDelta)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1410 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1411 ATLASSERT(fZoomDelta >= 0.0f);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1412
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1413 if(fZoomDelta >= 0.0f)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1414 m_fZoomDelta = fZoomDelta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1415 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1416
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1417 float GetZoomDelta() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1418 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1419 return m_fZoomDelta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1420 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1421
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1422 void SetZoomMode(int nZoomMode)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1423 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1424 m_nZoomMode = nZoomMode;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1425 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1426
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1427 int GetZoomMode() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1428 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1429 return m_nZoomMode;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1430 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1431
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1432 void SetZoomChildren(bool bEnable = true)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1433 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1434 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1435 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1436
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1437 m_bZoomChildren = bEnable;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1438
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1439 m_arrChildren.RemoveAll();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1440 if(m_bZoomChildren)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1441 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1442 for(HWND hWndChild = ::GetWindow(pT->m_hWnd, GW_CHILD); hWndChild != NULL; hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1443 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1444 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1445 ::GetWindowRect(hWndChild, &rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1446 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rect, 2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1447
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1448 _ChildPlacement cp = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1449 cp.hWnd = hWndChild;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1450 cp.x = rect.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1451 cp.y = rect.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1452 cp.cx = rect.right - rect.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1453 cp.cy = rect.bottom - rect.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1454 m_arrChildren.Add(cp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1455 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1456 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1457 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1458
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1459 bool GetZoomChildren() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1460 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1461 return m_bZoomChildren;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1462 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1463
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1464 void Zoom(int x, int y, float fZoomScale)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1465 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1466 if(fZoomScale <= 0.0f)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1467 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1468
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1469 if(fZoomScale < m_fZoomScaleMin)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1470 fZoomScale = m_fZoomScaleMin;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1471 else if(fZoomScale > m_fZoomScaleMax)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1472 fZoomScale = m_fZoomScaleMax;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1473
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1474 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1475 POINT pt = { x, y };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1476 if(!pT->PtInDevRect(pt))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1477 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1478
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1479 pT->ViewDPtoLP(&pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1480 pT->Zoom(fZoomScale, false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1481 pT->CenterOnLogicalPoint(pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1482 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1483
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1484 void Zoom(POINT pt, float fZoomScale)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1485 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1486 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1487 pT->Zoom(pt.x, pt.y, fZoomScale);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1488 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1489
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1490 void Zoom(RECT& rc)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1491 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1492 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1493 RECT rcZoom = rc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1494 pT->NormalizeRect(rcZoom);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1495 SIZE size = { rcZoom.right - rcZoom.left, rcZoom.bottom - rcZoom.top };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1496 POINT pt = { rcZoom.left + size.cx / 2, rcZoom.top + size.cy / 2 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1497 if((size.cx < m_cxyMinZoomRect) || (size.cy < m_cxyMinZoomRect))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1498 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1499 pT->Zoom(pt, m_fZoomScale + m_fZoomDelta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1500 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1501 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1502
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1503 ATLASSERT((size.cx > 0) && (size.cy > 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1504
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1505 float fScaleH = (float)(this->m_sizeClient.cx + 1) / (float)size.cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1506 float fScaleV = (float)(this->m_sizeClient.cy + 1) / (float)size.cy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1507 float fZoomScale = __min(fScaleH, fScaleV) * m_fZoomScale;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1508 pT->Zoom(pt, fZoomScale);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1509 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1510
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1511 void Zoom(float fZoomScale, bool bCenter = true)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1512 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1513 if(fZoomScale <= 0.0f)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1514 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1515
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1516 if(fZoomScale < m_fZoomScaleMin)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1517 fZoomScale = m_fZoomScaleMin;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1518 else if(fZoomScale > m_fZoomScaleMax)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1519 fZoomScale = m_fZoomScaleMax;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1520
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1521 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1522 POINT pt = { 0, 0 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1523 if(bCenter)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1524 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1525 RECT rcClient = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1526 ::GetClientRect(pT->m_hWnd, &rcClient);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1527 pt.x = rcClient.right / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1528 pt.y = rcClient.bottom / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1529 pT->ViewDPtoLP(&pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1530 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1531
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1532 // Modify the Viewport extent
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1533 SIZE sizeAll = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1534 sizeAll.cx = (int)((float)m_sizeLogAll.cx * fZoomScale);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1535 sizeAll.cy = (int)((float)m_sizeLogAll.cy * fZoomScale);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1536
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1537 // Update scroll bars and window
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1538 CScrollImpl< T >::SetScrollSize(sizeAll);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1539
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1540 // Zoom all children if needed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1541 if(m_bZoomChildren && (m_fZoomScale != fZoomScale))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1542 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1543 for(int i = 0; i < m_arrChildren.GetSize(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1544 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1545 ATLASSERT(::IsWindow(m_arrChildren[i].hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1546
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1547 ::SetWindowPos(m_arrChildren[i].hWnd, NULL,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1548 (int)((float)m_arrChildren[i].x * fZoomScale + 0.5f),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1549 (int)((float)m_arrChildren[i].y * fZoomScale + 0.5f),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1550 (int)((float)m_arrChildren[i].cx * fZoomScale + 0.5f),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1551 (int)((float)m_arrChildren[i].cy * fZoomScale + 0.5f),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1552 SWP_NOZORDER | SWP_NOACTIVATE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1553 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1554 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1555
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1556 // Set new zoom scale
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1557 m_fZoomScale = fZoomScale;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1558
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1559 if(bCenter)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1560 pT->CenterOnLogicalPoint(pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1561 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1562
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1563 void ZoomIn(bool bCenter = true)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1564 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1565 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1566 pT->Zoom(m_fZoomScale + m_fZoomDelta, bCenter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1567 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1568
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1569 void ZoomOut(bool bCenter = true)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1570 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1571 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1572 pT->Zoom(m_fZoomScale - m_fZoomDelta, bCenter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1573 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1574
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1575 void ZoomDefault(bool bCenter = true)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1576 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1577 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1578 pT->Zoom(1.0f, bCenter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1579 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1580
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1581 // Helper functions
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1582 void PrepareDC(CDCHandle dc)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1583 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1584 ATLASSERT((this->m_sizeAll.cx >= 0) && (this->m_sizeAll.cy >= 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1585 dc.SetMapMode(MM_ANISOTROPIC);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1586 dc.SetWindowExt(this->m_sizeLogAll);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1587 dc.SetViewportExt(this->m_sizeAll);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1588 dc.SetViewportOrg(-this->m_ptOffset.x, -this->m_ptOffset.y);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1589 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1590
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1591 void ViewDPtoLP(LPPOINT lpPoints, int nCount = 1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1592 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1593 ATLASSERT(lpPoints);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1594 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1595 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1596
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1597 CWindowDC dc(pT->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1598 pT->PrepareDC(dc.m_hDC);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1599 dc.DPtoLP(lpPoints, nCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1600 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1601
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1602 void ViewLPtoDP(LPPOINT lpPoints, int nCount = 1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1603 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1604 ATLASSERT(lpPoints);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1605 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1606 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1607
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1608 CWindowDC dc(pT->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1609 pT->PrepareDC(dc.m_hDC);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1610 dc.LPtoDP(lpPoints, nCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1611 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1612
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1613 void ClientToDevice(POINT &pt)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1614 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1615 pt.x += this->m_ptOffset.x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1616 pt.y += this->m_ptOffset.y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1617 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1618
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1619 void DeviceToClient(POINT &pt)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1620 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1621 pt.x -= this->m_ptOffset.x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1622 pt.y -= this->m_ptOffset.y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1623 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1624
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1625 void CenterOnPoint(POINT pt)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1626 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1627 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1628 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1629 pT->GetClientRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1630
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1631 int xOfs = pt.x - (rect.right / 2) + this->m_ptOffset.x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1632 if(xOfs < 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1633 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1634 xOfs = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1635 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1636 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1637 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1638 int xMax = __max((int)(this->m_sizeAll.cx - rect.right), 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1639 if(xOfs > xMax)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1640 xOfs = xMax;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1641 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1642
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1643 int yOfs = pt.y - (rect.bottom / 2) + this->m_ptOffset.y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1644 if(yOfs < 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1645 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1646 yOfs = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1647 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1648 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1649 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1650 int yMax = __max((int)(this->m_sizeAll.cy - rect.bottom), 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1651 if(yOfs > yMax)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1652 yOfs = yMax;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1653 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1654
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1655 CScrollImpl< T >::SetScrollOffset(xOfs, yOfs);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1656 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1657
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1658 void CenterOnLogicalPoint(POINT ptLog)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1659 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1660 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1661 pT->ViewLPtoDP(&ptLog);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1662 pT->DeviceToClient(ptLog);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1663 pT->CenterOnPoint(ptLog);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1664 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1665
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1666 BOOL PtInDevRect(POINT pt)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1667 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1668 RECT rc = { 0, 0, this->m_sizeAll.cx, this->m_sizeAll.cy };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1669 ::OffsetRect(&rc, -this->m_ptOffset.x, -this->m_ptOffset.y);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1670 return ::PtInRect(&rc, pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1671 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1672
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1673 void NormalizeRect(RECT& rc)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1674 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1675 if(rc.left > rc.right)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1676 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1677 int r = rc.right;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1678 rc.right = rc.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1679 rc.left = r;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1680 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1681
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1682 if(rc.top > rc.bottom)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1683 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1684 int b = rc.bottom;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1685 rc.bottom = rc.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1686 rc.top = b;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1687 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1688 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1689
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1690 void DrawTrackRect()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1691 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1692 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1693 const SIZE sizeLines = { 2, 2 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1694 RECT rc = m_rcTrack;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1695 pT->NormalizeRect(rc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1696 if(!::IsRectEmpty(&rc))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1697 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1698 CClientDC dc(pT->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1699 dc.DrawDragRect(&rc, sizeLines, NULL, sizeLines);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1700 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1701 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1702
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1703 void NotifyParentZoomChanged()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1704 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1705 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1706 int nId = pT->GetDlgCtrlID();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1707 NMHDR nmhdr = { pT->m_hWnd, (UINT_PTR)nId, ZSN_ZOOMCHANGED };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1708 ::SendMessage(pT->GetParent(), WM_NOTIFY, (WPARAM)nId, (LPARAM)&nmhdr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1709 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1710
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1711 void DoWheelZoom(int zDelta)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1712 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1713 float fZoomScale = m_fZoomScale + ((zDelta > 0) ? m_fZoomDelta : -m_fZoomDelta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1714 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1715 pT->Zoom(fZoomScale);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1716 pT->NotifyParentZoomChanged();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1717 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1718
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1719 BEGIN_MSG_MAP(CZoomScrollImpl)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1720 MESSAGE_HANDLER(WM_SETCURSOR, OnSetCursor)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1721 MESSAGE_HANDLER(WM_VSCROLL, CScrollImpl< T >::OnVScroll)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1722 MESSAGE_HANDLER(WM_HSCROLL, CScrollImpl< T >::OnHScroll)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1723 MESSAGE_HANDLER(WM_MOUSEWHEEL, OnMouseWheel)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1724 MESSAGE_HANDLER(WM_MOUSEHWHEEL, CScrollImpl< T >::OnMouseHWheel)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1725 MESSAGE_HANDLER(WM_SETTINGCHANGE, CScrollImpl< T >::OnSettingChange)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1726 MESSAGE_HANDLER(WM_SIZE, CScrollImpl< T >::OnSize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1727 MESSAGE_HANDLER(WM_PAINT, OnPaint)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1728 MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1729 MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1730 MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1731 MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1732 MESSAGE_HANDLER(WM_CAPTURECHANGED, OnCaptureChanged)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1733 ALT_MSG_MAP(1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1734 COMMAND_ID_HANDLER(ID_SCROLL_UP, CScrollImpl< T >::OnScrollUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1735 COMMAND_ID_HANDLER(ID_SCROLL_DOWN, CScrollImpl< T >::OnScrollDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1736 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, CScrollImpl< T >::OnScrollPageUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1737 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, CScrollImpl< T >::OnScrollPageDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1738 COMMAND_ID_HANDLER(ID_SCROLL_TOP, CScrollImpl< T >::OnScrollTop)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1739 COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, CScrollImpl< T >::OnScrollBottom)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1740 COMMAND_ID_HANDLER(ID_SCROLL_LEFT, CScrollImpl< T >::OnScrollLeft)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1741 COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, CScrollImpl< T >::OnScrollRight)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1742 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, CScrollImpl< T >::OnScrollPageLeft)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1743 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, CScrollImpl< T >::OnScrollPageRight)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1744 COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, CScrollImpl< T >::OnScrollAllLeft)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1745 COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, CScrollImpl< T >::OnScrollAllRight)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1746 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1747
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1748 LRESULT OnSetCursor(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1749 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1750 if((LOWORD(lParam) == HTCLIENT) && (m_nZoomMode != ZOOMMODE_OFF))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1751 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1752 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1753 if((HWND)wParam == pT->m_hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1754 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1755 DWORD dwPos = ::GetMessagePos();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1756 POINT pt = { GET_X_LPARAM(dwPos), GET_Y_LPARAM(dwPos) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1757 pT->ScreenToClient(&pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1758 if(pT->PtInDevRect(pt))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1759 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1760 ::SetCursor(::LoadCursor(NULL, IDC_CROSS));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1761 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1762 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1763 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1764 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1765
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1766 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1767 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1768 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1769
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1770 LRESULT OnMouseWheel(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1771 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1772 if((GET_KEYSTATE_WPARAM(wParam) & MK_CONTROL) != 0) // handle zoom if Ctrl is pressed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1773 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1774 int zDelta = (int)GET_WHEEL_DELTA_WPARAM(wParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1775 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1776 pT->DoWheelZoom(zDelta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1777 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1778 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1779 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1780 CScrollImpl< T >::OnMouseWheel(uMsg, wParam, lParam, bHandled);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1781 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1782
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1783 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1784 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1785
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1786 LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1787 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1788 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1789 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1790 ATLASSERT((m_sizeLogAll.cx >= 0) && (m_sizeLogAll.cy >= 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1791 ATLASSERT((this->m_sizeAll.cx >= 0) && (this->m_sizeAll.cy >= 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1792
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1793 if(wParam != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1794 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1795 CDCHandle dc = (HDC)wParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1796 int nMapModeSav = dc.GetMapMode();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1797 dc.SetMapMode(MM_ANISOTROPIC);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1798 SIZE szWindowExt = { 0, 0 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1799 dc.SetWindowExt(m_sizeLogAll, &szWindowExt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1800 SIZE szViewportExt = { 0, 0 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1801 dc.SetViewportExt(this->m_sizeAll, &szViewportExt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1802 POINT ptViewportOrg = { 0, 0 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1803 dc.SetViewportOrg(-this->m_ptOffset.x, -this->m_ptOffset.y, &ptViewportOrg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1804
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1805 pT->DoPaint(dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1806
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1807 dc.SetMapMode(nMapModeSav);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1808 dc.SetWindowExt(szWindowExt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1809 dc.SetViewportExt(szViewportExt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1810 dc.SetViewportOrg(ptViewportOrg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1811 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1812 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1813 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1814 CPaintDC dc(pT->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1815 pT->PrepareDC(dc.m_hDC);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1816 pT->DoPaint(dc.m_hDC);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1817 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1818
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1819 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1820 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1821
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1822 LRESULT OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1823 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1824 if((m_nZoomMode == ZOOMMODE_IN) && !m_bTracking)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1825 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1826 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1827 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1828 if(pT->PtInDevRect(pt))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1829 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1830 pT->SetCapture();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1831 m_bTracking = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1832 ::SetRect(&m_rcTrack, pt.x, pt.y, pt.x, pt.y);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1833
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1834 RECT rcClip;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1835 pT->GetClientRect(&rcClip);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1836 if((this->m_ptOffset.x == 0) && (this->m_ptOffset.y == 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1837 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1838 if(rcClip.right > this->m_sizeAll.cx)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1839 rcClip.right = this->m_sizeAll.cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1840 if(rcClip.bottom > this->m_sizeAll.cy)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1841 rcClip.bottom = this->m_sizeAll.cy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1842 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1843 ::MapWindowPoints(pT->m_hWnd, NULL, (LPPOINT)&rcClip, 2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1844 ::ClipCursor(&rcClip);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1845 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1846 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1847
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1848 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1849 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1850 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1851
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1852 LRESULT OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1853 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1854 if(m_bTracking)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1855 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1856 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1857 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1858 if(pT->PtInDevRect(pt))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1859 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1860 pT->DrawTrackRect();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1861 m_rcTrack.right = pt.x + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1862 m_rcTrack.bottom = pt.y + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1863 pT->DrawTrackRect();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1864 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1865 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1866
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1867 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1868 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1869 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1870
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1871 LRESULT OnLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1872 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1873 ::ReleaseCapture();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1874 if(m_nZoomMode == ZOOMMODE_OUT)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1875 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1876 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1877 pT->Zoom(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), m_fZoomScale - m_fZoomDelta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1878 pT->NotifyParentZoomChanged();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1879 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1880
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1881 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1882 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1883 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1884
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1885 LRESULT OnCaptureChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1886 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1887 if(m_bTracking)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1888 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1889 m_bTracking = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1890 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1891 pT->DrawTrackRect();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1892 pT->Zoom(m_rcTrack);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1893 pT->NotifyParentZoomChanged();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1894 ::SetRectEmpty(&m_rcTrack);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1895 ::ClipCursor(NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1896 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1897
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1898 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1899 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1900 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1901 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1902
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1903 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1904 // CZoomScrollWindowImpl - Implements scrolling window with zooming
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1905
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1906 template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1907 class ATL_NO_VTABLE CZoomScrollWindowImpl : public ATL::CWindowImpl< T, TBase, TWinTraits >, public CZoomScrollImpl< T >
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1908 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1909 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1910 BOOL SubclassWindow(HWND hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1911 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1912 BOOL bRet = ATL::CWindowImpl< T, TBase, TWinTraits >::SubclassWindow(hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1913 if(bRet != FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1914 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1915 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1916 pT->GetSystemSettings();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1917
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1918 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1919 this->GetClientRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1920 pT->DoSize(rect.right, rect.bottom);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1921 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1922
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1923 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1924 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1925
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1926 BEGIN_MSG_MAP(CZoomScrollWindowImpl)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1927 MESSAGE_HANDLER(WM_SETCURSOR, CZoomScrollImpl< T >::OnSetCursor)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1928 MESSAGE_HANDLER(WM_VSCROLL, CScrollImpl< T >::OnVScroll)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1929 MESSAGE_HANDLER(WM_HSCROLL, CScrollImpl< T >::OnHScroll)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1930 MESSAGE_HANDLER(WM_MOUSEWHEEL, CZoomScrollImpl< T >::OnMouseWheel)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1931 MESSAGE_HANDLER(WM_MOUSEHWHEEL, CScrollImpl< T >::OnMouseHWheel)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1932 MESSAGE_HANDLER(WM_SETTINGCHANGE, CScrollImpl< T >::OnSettingChange)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1933 MESSAGE_HANDLER(WM_SIZE, CScrollImpl< T >::OnSize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1934 MESSAGE_HANDLER(WM_PAINT, CZoomScrollImpl< T >::OnPaint)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1935 MESSAGE_HANDLER(WM_PRINTCLIENT, CZoomScrollImpl< T >::OnPaint)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1936 MESSAGE_HANDLER(WM_LBUTTONDOWN, CZoomScrollImpl< T >::OnLButtonDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1937 MESSAGE_HANDLER(WM_MOUSEMOVE, CZoomScrollImpl< T >::OnMouseMove)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1938 MESSAGE_HANDLER(WM_LBUTTONUP, CZoomScrollImpl< T >::OnLButtonUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1939 MESSAGE_HANDLER(WM_CAPTURECHANGED, CZoomScrollImpl< T >::OnCaptureChanged)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1940 ALT_MSG_MAP(1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1941 COMMAND_ID_HANDLER(ID_SCROLL_UP, CScrollImpl< T >::OnScrollUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1942 COMMAND_ID_HANDLER(ID_SCROLL_DOWN, CScrollImpl< T >::OnScrollDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1943 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, CScrollImpl< T >::OnScrollPageUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1944 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, CScrollImpl< T >::OnScrollPageDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1945 COMMAND_ID_HANDLER(ID_SCROLL_TOP, CScrollImpl< T >::OnScrollTop)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1946 COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, CScrollImpl< T >::OnScrollBottom)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1947 COMMAND_ID_HANDLER(ID_SCROLL_LEFT, CScrollImpl< T >::OnScrollLeft)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1948 COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, CScrollImpl< T >::OnScrollRight)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1949 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, CScrollImpl< T >::OnScrollPageLeft)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1950 COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, CScrollImpl< T >::OnScrollPageRight)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1951 COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, CScrollImpl< T >::OnScrollAllLeft)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1952 COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, CScrollImpl< T >::OnScrollAllRight)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1953 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1954 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1955
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1956
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1957 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1958 // CScrollContainer
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1959
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1960 template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1961 class ATL_NO_VTABLE CScrollContainerImpl : public CScrollWindowImpl< T, TBase, TWinTraits >
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1962 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1963 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1964 DECLARE_WND_CLASS_EX2(NULL, T, 0, -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1965
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1966 typedef CScrollWindowImpl< T, TBase, TWinTraits > _baseClass;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1967
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1968 // Data members
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1969 ATL::CWindow m_wndClient;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1970 bool m_bAutoSizeClient;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1971 bool m_bDrawEdgeIfEmpty;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1972
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1973 // Constructor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1974 CScrollContainerImpl() : m_bAutoSizeClient(true), m_bDrawEdgeIfEmpty(false)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1975 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1976 // Set CScrollWindowImpl extended style
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1977 this->SetScrollExtendedStyle(SCRL_SCROLLCHILDREN);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1978 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1979
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1980 // Attributes
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1981 HWND GetClient() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1982 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1983 return m_wndClient;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1984 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1985
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1986 HWND SetClient(HWND hWndClient, bool bClientSizeAsMin = true)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1987 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1988 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1989
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1990 HWND hWndOldClient = m_wndClient;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1991 m_wndClient = hWndClient;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1992
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1993 this->SetRedraw(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1994 this->SetScrollSize(1, 1, FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1995
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1996 if(m_wndClient.m_hWnd != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1997 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1998 m_wndClient.SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1999
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2000 if(bClientSizeAsMin)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2001 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2002 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2003 m_wndClient.GetWindowRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2004 if(((rect.right - rect.left) > 0) && ((rect.bottom - rect.top) > 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2005 this->SetScrollSize(rect.right - rect.left, rect.bottom - rect.top, FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2006 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2007
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2008 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2009 pT->UpdateLayout();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2010 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2011
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2012 this->SetRedraw(TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2013 this->RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_FRAME | RDW_UPDATENOW | RDW_ALLCHILDREN);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2014
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2015 return hWndOldClient;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2016 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2017
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2018 // Message map and handlers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2019 BEGIN_MSG_MAP(CScrollContainerImpl)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2020 MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2021 MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2022 CHAIN_MSG_MAP(_baseClass)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2023 FORWARD_NOTIFICATIONS()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2024 ALT_MSG_MAP(1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2025 CHAIN_MSG_MAP_ALT(_baseClass, 1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2026 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2027
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2028 LRESULT OnSetFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2029 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2030 if(m_wndClient.m_hWnd != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2031 m_wndClient.SetFocus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2032
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2033 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2034 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2035
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2036 LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2037 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2038 return 1; // no background needed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2039 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2040
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2041 // Overrides for CScrollWindowImpl
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2042 void DoSize(int cx, int cy)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2043 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2044 _baseClass::DoSize(cx, cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2045
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2046 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2047 pT->UpdateLayout();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2048 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2049
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2050 void DoPaint(CDCHandle dc)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2051 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2052 if(!m_bAutoSizeClient || (m_wndClient.m_hWnd == NULL))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2053 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2054 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2055 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2056 pT->GetContainerRect(rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2057
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2058 if(m_bDrawEdgeIfEmpty && (m_wndClient.m_hWnd == NULL))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2059 dc.DrawEdge(&rect, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2060
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2061 dc.FillRect(&rect, COLOR_APPWORKSPACE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2062 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2063 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2064
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2065 void ScrollToView(POINT pt)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2066 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2067 CScrollWindowImpl< T, TBase, TWinTraits >::ScrollToView(pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2068 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2069
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2070 void ScrollToView(RECT& rect)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2071 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2072 CScrollWindowImpl< T, TBase, TWinTraits >::ScrollToView(rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2073 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2074
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2075 void ScrollToView(HWND hWnd) // client window coordinates
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2076 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2077 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2078 (void)pT; // avoid level 4 warning
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2079 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2080 ATLASSERT(m_wndClient.IsWindow());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2081
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2082 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2083 ::GetWindowRect(hWnd, &rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2084 ::MapWindowPoints(NULL, m_wndClient.m_hWnd, (LPPOINT)&rect, 2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2085 ScrollToView(rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2086 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2087
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2088 // Implementation - overrideable methods
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2089 void UpdateLayout()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2090 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2091 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2092
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2093 if(m_bAutoSizeClient && (m_wndClient.m_hWnd != NULL))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2094 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2095 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2096 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2097 pT->GetContainerRect(rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2098
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2099 m_wndClient.SetWindowPos(NULL, &rect, SWP_NOZORDER | SWP_NOMOVE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2100 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2101 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2102 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2103 this->Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2104 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2105 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2106
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2107 void GetContainerRect(RECT& rect)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2108 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2109 this->GetClientRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2110
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2111 if(rect.right < this->m_sizeAll.cx)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2112 rect.right = this->m_sizeAll.cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2113
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2114 if(rect.bottom < this->m_sizeAll.cy)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2115 rect.bottom = this->m_sizeAll.cy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2116 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2117 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2118
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2119 class CScrollContainer : public CScrollContainerImpl<CScrollContainer>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2120 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2121 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2122 DECLARE_WND_CLASS_EX(_T("WTL_ScrollContainer"), 0, -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2123 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2124
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2125 } // namespace WTL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2126
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2127 #endif // __ATLSCRL_H__