annotate foosdk/wtl/Include/atlframe.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 __ATLFRAME_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 #define __ATLFRAME_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 atlframe.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 atlframe.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 // CFrameWindowImpl<T, TBase, TWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 // CMDIWindow
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 // CMDIFrameWindowImpl<T, TBase, TWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 // CMDIChildWindowImpl<T, TBase, TWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 // COwnerDraw<T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 // CUpdateUIBase
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 // CUpdateUI<T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 // CDynamicUpdateUI<T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 // CAutoUpdateUI<T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 // CDialogResize<T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 // CDynamicDialogLayout<T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 // CDoubleBufferImpl<T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 // CDoubleBufferWindowImpl<T, TBase, TWinTraits>
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 // Global functions:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 // AtlCreateSimpleToolBar()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 namespace WTL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 // CFrameWndClassInfo - Manages frame window Windows class information
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 class CFrameWndClassInfo
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 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 enum { cchAutoName = 5 + sizeof(void*) * 2 }; // sizeof(void*) * 2 is the number of digits %p outputs
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 WNDCLASSEX m_wc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 LPCTSTR m_lpszOrigName;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 WNDPROC pWndProc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 LPCTSTR m_lpszCursorID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 BOOL m_bSystemCursor;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 ATOM m_atom;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 TCHAR m_szAutoName[cchAutoName];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 UINT m_uCommonResourceID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 ATOM Register(WNDPROC* pProc)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 if (m_atom == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 CWindowCreateCriticalSectionLock lock;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 if(FAILED(lock.Lock()))
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 ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CFrameWndClassInfo::Register.\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 ATLASSERT(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 }
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 if(m_atom == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 HINSTANCE hInst = ModuleHelper::GetModuleInstance();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 if (m_lpszOrigName != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 ATLASSERT(pProc != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 LPCTSTR lpsz = m_wc.lpszClassName;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 WNDPROC proc = m_wc.lpfnWndProc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 WNDCLASSEX wc = { sizeof(WNDCLASSEX) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 // try process local class first
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 if(!::GetClassInfoEx(ModuleHelper::GetModuleInstance(), m_lpszOrigName, &wc))
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 // try global class
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 if(!::GetClassInfoEx(NULL, m_lpszOrigName, &wc))
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 lock.Unlock();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 return 0;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 m_wc = wc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 pWndProc = m_wc.lpfnWndProc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 m_wc.lpszClassName = lpsz;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 m_wc.lpfnWndProc = proc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 m_wc.hCursor = ::LoadCursor(m_bSystemCursor ? NULL : hInst, m_lpszCursorID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 m_wc.hInstance = hInst;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 m_wc.style &= ~CS_GLOBALCLASS; // we don't register global classes
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 if (m_wc.lpszClassName == NULL)
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 _stprintf_s(m_szAutoName, cchAutoName, _T("ATL:%p"), &m_wc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 m_wc.lpszClassName = m_szAutoName;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 WNDCLASSEX wcTemp = m_wc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 m_atom = (ATOM)::GetClassInfoEx(m_wc.hInstance, m_wc.lpszClassName, &wcTemp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 if (m_atom == 0)
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 if(m_uCommonResourceID != 0) // use it if not zero
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 m_wc.hIcon = (HICON)::LoadImage(ModuleHelper::GetResourceInstance(),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 MAKEINTRESOURCE(m_uCommonResourceID), IMAGE_ICON,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 m_wc.hIconSm = (HICON)::LoadImage(ModuleHelper::GetResourceInstance(),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 MAKEINTRESOURCE(m_uCommonResourceID), IMAGE_ICON,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 m_atom = ::RegisterClassEx(&m_wc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 lock.Unlock();
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 if (m_lpszOrigName != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 ATLASSERT(pProc != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 ATLASSERT(pWndProc != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 *pProc = pWndProc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 return m_atom;
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 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144
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 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 // Macros for declaring frame window WNDCLASS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 #define DECLARE_FRAME_WND_CLASS(WndClassName, uCommonResourceID) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 static WTL::CFrameWndClassInfo& GetWndClassInfo() \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 { \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 static WTL::CFrameWndClassInfo wc = \
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 { sizeof(WNDCLASSEX), 0, StartWindowProc, \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, WndClassName, NULL }, \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \
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 return wc; \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 }
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 #define DECLARE_FRAME_WND_CLASS_EX(WndClassName, uCommonResourceID, style, bkgnd) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 static WTL::CFrameWndClassInfo& GetWndClassInfo() \
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 static WTL::CFrameWndClassInfo wc = \
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 { sizeof(WNDCLASSEX), style, StartWindowProc, \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 0, 0, NULL, NULL, NULL, (HBRUSH)(bkgnd + 1), NULL, WndClassName, NULL }, \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 }; \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 return wc; \
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 #define DECLARE_FRAME_WND_SUPERCLASS(WndClassName, OrigWndClassName, uCommonResourceID) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 static WTL::CFrameWndClassInfo& GetWndClassInfo() \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 { \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 static WTL::CFrameWndClassInfo wc = \
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 { sizeof(WNDCLASSEX), 0, StartWindowProc, \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 0, 0, NULL, NULL, NULL, NULL, NULL, WndClassName, NULL }, \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 OrigWndClassName, NULL, NULL, TRUE, 0, _T(""), uCommonResourceID \
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 return wc; \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 // These are for templated classes
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 #define DECLARE_FRAME_WND_CLASS2(WndClassName, EnclosingClass, uCommonResourceID) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 static WTL::CFrameWndClassInfo& GetWndClassInfo() \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 { \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 static WTL::CFrameWndClassInfo wc = \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 { \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 { sizeof(WNDCLASSEX), 0, EnclosingClass::StartWindowProc, \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, WndClassName, NULL }, \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 }; \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 return wc; \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 #define DECLARE_FRAME_WND_CLASS_EX2(WndClassName, EnclosingClass, uCommonResourceID, style, bkgnd) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 static WTL::CFrameWndClassInfo& GetWndClassInfo() \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 { \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 static WTL::CFrameWndClassInfo wc = \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 { \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 { sizeof(WNDCLASSEX), style, EnclosingClass::StartWindowProc, \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 0, 0, NULL, NULL, NULL, (HBRUSH)(bkgnd + 1), NULL, WndClassName, NULL }, \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \
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 return wc; \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 #define DECLARE_FRAME_WND_SUPERCLASS2(WndClassName, EnclosingClass, OrigWndClassName, uCommonResourceID) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 static WTL::CFrameWndClassInfo& GetWndClassInfo() \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 { \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 static WTL::CFrameWndClassInfo wc = \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 { \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 { sizeof(WNDCLASSEX), 0, EnclosingClass::StartWindowProc, \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 0, 0, NULL, NULL, NULL, NULL, NULL, WndClassName, NULL }, \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 OrigWndClassName, NULL, NULL, TRUE, 0, _T(""), uCommonResourceID \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 }; \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 return wc; \
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
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 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 // CFrameWindowImpl
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 // Client window command chaining macro (only for frame windows)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 #define CHAIN_CLIENT_COMMANDS() \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 if((uMsg == WM_COMMAND) && (this->m_hWndClient != NULL)) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 ::SendMessage(this->m_hWndClient, uMsg, wParam, lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 // standard toolbar styles
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 #define ATL_SIMPLE_TOOLBAR_STYLE \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | TBSTYLE_TOOLTIPS)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 // toolbar in a rebar pane
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 #define ATL_SIMPLE_TOOLBAR_PANE_STYLE \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CCS_NODIVIDER | CCS_NORESIZE | CCS_NOPARENTALIGN | TBSTYLE_TOOLTIPS | TBSTYLE_FLAT)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 // standard rebar styles
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 #define ATL_SIMPLE_REBAR_STYLE \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 (WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | RBS_VARHEIGHT | RBS_BANDBORDERS | RBS_AUTOSIZE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 // rebar without borders
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 #define ATL_SIMPLE_REBAR_NOBORDER_STYLE \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | RBS_VARHEIGHT | RBS_BANDBORDERS | RBS_AUTOSIZE | CCS_NODIVIDER)
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 // command bar support
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 #if !defined(__ATLCTRLW_H__)
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 #define CBRM_GETCMDBAR (WM_USER + 301) // returns command bar HWND
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 #define CBRM_GETMENU (WM_USER + 302) // returns loaded or attached menu
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 #define CBRM_TRACKPOPUPMENU (WM_USER + 303) // displays a popup menu
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 struct _AtlFrameWnd_CmdBarPopupMenu
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 int cbSize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 HMENU hMenu;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 UINT uFlags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 int x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 int y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 LPTPMPARAMS lptpm;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 };
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 #define CBRPOPUPMENU _AtlFrameWnd_CmdBarPopupMenu
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 #endif // !defined(__ATLCTRLW_H__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264
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 template <class TBase = ATL::CWindow, class TWinTraits = ATL::CFrameWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 class ATL_NO_VTABLE CFrameWindowImplBase : public ATL::CWindowImplBaseT< TBase, TWinTraits >
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 typedef CFrameWindowImplBase<TBase, TWinTraits > _thisClass;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 DECLARE_FRAME_WND_CLASS2(NULL, _thisClass, 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 struct _ChevronMenuInfo
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 HMENU hMenu;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 LPNMREBARCHEVRON lpnm;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 bool bCmdBar;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 // Data members
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 HWND m_hWndToolBar;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 HWND m_hWndStatusBar;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 HWND m_hWndClient;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 HACCEL m_hAccel;
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 // Constructor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 CFrameWindowImplBase() :
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 m_hWndToolBar(NULL),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 m_hWndStatusBar(NULL),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 m_hWndClient(NULL),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 m_hAccel(NULL)
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 // Methods
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 HWND Create(HWND hWndParent, ATL::_U_RECT rect, LPCTSTR szWindowName, DWORD dwStyle, DWORD dwExStyle, ATL::_U_MENUorID MenuOrID, ATOM atom, LPVOID lpCreateParam)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 ATLASSERT(this->m_hWnd == NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 // Allocate the thunk structure here, where we can fail gracefully.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 BOOL bRet = this->m_thunk.Init(NULL, NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 if(bRet == FALSE)
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 ::SetLastError(ERROR_OUTOFMEMORY);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 }
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 if(atom == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 return NULL;
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 ModuleHelper::AddCreateWndData(&this->m_thunk.cd, this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 if((MenuOrID.m_hMenu == NULL) && (dwStyle & WS_CHILD))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 MenuOrID.m_hMenu = (HMENU)(UINT_PTR)this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 if(rect.m_lpRect == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 rect.m_lpRect = &TBase::rcDefault;
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 HWND hWnd = ::CreateWindowEx(dwExStyle, MAKEINTATOM(atom), szWindowName,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 dwStyle, rect.m_lpRect->left, rect.m_lpRect->top, rect.m_lpRect->right - rect.m_lpRect->left,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 rect.m_lpRect->bottom - rect.m_lpRect->top, hWndParent, MenuOrID.m_hMenu,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 ModuleHelper::GetModuleInstance(), lpCreateParam);
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 ATLASSERT((hWnd == NULL) || (this->m_hWnd == hWnd));
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 return hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 static HWND CreateSimpleToolBarCtrl(HWND hWndParent, UINT nResourceID, BOOL bInitialSeparator = FALSE,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 HINSTANCE hInst = ModuleHelper::GetResourceInstance();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 HRSRC hRsrc = ::FindResource(hInst, MAKEINTRESOURCE(nResourceID), RT_TOOLBAR);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 if (hRsrc == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 return NULL;
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 HGLOBAL hGlobal = ::LoadResource(hInst, hRsrc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 if (hGlobal == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 _AtlToolBarData* pData = (_AtlToolBarData*)::LockResource(hGlobal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 if (pData == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 ATLASSERT(pData->wVersion == 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 WORD* pItems = pData->items();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 int nItems = pData->wItemCount + (bInitialSeparator ? 1 : 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 ATL::CTempBuffer<TBBUTTON, _WTL_STACK_ALLOC_THRESHOLD> buff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 TBBUTTON* pTBBtn = buff.Allocate(nItems);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 ATLASSERT(pTBBtn != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 if(pTBBtn == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 return NULL;
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 const int cxSeparator = 8;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 // set initial separator (half width)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 if(bInitialSeparator)
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 pTBBtn[0].iBitmap = cxSeparator / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 pTBBtn[0].idCommand = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 pTBBtn[0].fsState = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 pTBBtn[0].fsStyle = BTNS_SEP;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 pTBBtn[0].dwData = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 pTBBtn[0].iString = 0;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 int nBmp = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 for(int i = 0, j = bInitialSeparator ? 1 : 0; i < pData->wItemCount; i++, j++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 if(pItems[i] != 0)
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 pTBBtn[j].iBitmap = nBmp++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 pTBBtn[j].idCommand = pItems[i];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 pTBBtn[j].fsState = TBSTATE_ENABLED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 pTBBtn[j].fsStyle = BTNS_BUTTON;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 pTBBtn[j].dwData = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 pTBBtn[j].iString = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 else
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 pTBBtn[j].iBitmap = cxSeparator;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 pTBBtn[j].idCommand = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 pTBBtn[j].fsState = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 pTBBtn[j].fsStyle = BTNS_SEP;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 pTBBtn[j].dwData = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385 pTBBtn[j].iString = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 }
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 HWND hWnd = ::CreateWindowEx(0, TOOLBARCLASSNAME, NULL, dwStyle, 0, 0, 100, 100, hWndParent, (HMENU)LongToHandle(nID), ModuleHelper::GetModuleInstance(), NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 if(hWnd == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 ATLASSERT(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 return NULL;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 ::SendMessage(hWnd, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 // check if font is taller than our bitmaps
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 CFontHandle font = (HFONT)::SendMessage(hWnd, WM_GETFONT, 0, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 if(font.IsNull())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 font = (HFONT)::GetStockObject(SYSTEM_FONT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 LOGFONT lf = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 font.GetLogFont(lf);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 WORD cyFontHeight = (WORD)abs(lf.lfHeight);
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 WORD bitsPerPixel = AtlGetBitmapResourceBitsPerPixel(nResourceID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 if(bitsPerPixel > 4)
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 COLORREF crMask = CLR_DEFAULT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 if(bitsPerPixel == 32)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 // 32-bit color bitmap with alpha channel (valid for Windows XP and later)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 crMask = CLR_NONE;
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 HIMAGELIST hImageList = ImageList_LoadImage(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(nResourceID), pData->wWidth, 1, crMask, IMAGE_BITMAP, LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 ATLASSERT(hImageList != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 ::SendMessage(hWnd, TB_SETIMAGELIST, 0, (LPARAM)hImageList);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 TBADDBITMAP tbab = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 tbab.hInst = hInst;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 tbab.nID = nResourceID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 ::SendMessage(hWnd, TB_ADDBITMAP, nBmp, (LPARAM)&tbab);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427 ::SendMessage(hWnd, TB_ADDBUTTONS, nItems, (LPARAM)pTBBtn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 ::SendMessage(hWnd, TB_SETBITMAPSIZE, 0, MAKELONG(pData->wWidth, __max(pData->wHeight, cyFontHeight)));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 const int cxyButtonMargin = 7;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 ::SendMessage(hWnd, TB_SETBUTTONSIZE, 0, MAKELONG(pData->wWidth + cxyButtonMargin, __max(pData->wHeight, cyFontHeight) + cxyButtonMargin));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432 return hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 static HWND CreateSimpleReBarCtrl(HWND hWndParent, DWORD dwStyle = ATL_SIMPLE_REBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 // Ensure style combinations for proper rebar painting
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 if(dwStyle & CCS_NODIVIDER && (dwStyle & WS_BORDER))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439 dwStyle &= ~WS_BORDER;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440 else if(!(dwStyle & WS_BORDER) && !(dwStyle & CCS_NODIVIDER))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441 dwStyle |= CCS_NODIVIDER;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443 // Create rebar window
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 HWND hWndReBar = ::CreateWindowEx(0, REBARCLASSNAME, NULL, dwStyle, 0, 0, 100, 100, hWndParent, (HMENU)LongToHandle(nID), ModuleHelper::GetModuleInstance(), NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445 if(hWndReBar == NULL)
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 ATLTRACE2(atlTraceUI, 0, _T("Failed to create rebar.\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448 return NULL;
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 // Initialize and send the REBARINFO structure
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 REBARINFO rbi = { sizeof(REBARINFO), 0 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 if(::SendMessage(hWndReBar, RB_SETBARINFO, 0, (LPARAM)&rbi) == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 ATLTRACE2(atlTraceUI, 0, _T("Failed to initialize rebar.\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456 ::DestroyWindow(hWndReBar);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 return NULL;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460 return hWndReBar;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463 BOOL CreateSimpleReBar(DWORD dwStyle = ATL_SIMPLE_REBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 ATLASSERT(!::IsWindow(m_hWndToolBar));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 m_hWndToolBar = CreateSimpleReBarCtrl(this->m_hWnd, dwStyle, nID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 return (m_hWndToolBar != NULL);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470 static BOOL AddSimpleReBarBandCtrl(HWND hWndReBar, HWND hWndBand, int nID = 0, LPCTSTR lpstrTitle = NULL, BOOL bNewRow = FALSE, int cxWidth = 0, BOOL bFullWidthAlways = FALSE)
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 ATLASSERT(::IsWindow(hWndReBar)); // must be already created
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473 #ifdef _DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 // block - check if this is really a rebar
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 TCHAR lpszClassName[sizeof(REBARCLASSNAME)] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477 ::GetClassName(hWndReBar, lpszClassName, sizeof(REBARCLASSNAME));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 ATLASSERT(lstrcmp(lpszClassName, REBARCLASSNAME) == 0);
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 #endif // _DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 ATLASSERT(::IsWindow(hWndBand)); // must be already created
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 // Get number of buttons on the toolbar
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484 int nBtnCount = (int)::SendMessage(hWndBand, TB_BUTTONCOUNT, 0, 0L);
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 // Set band info structure
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487 REBARBANDINFO rbBand = { RunTimeHelper::SizeOf_REBARBANDINFO() };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488 rbBand.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_STYLE | RBBIM_ID | RBBIM_SIZE | RBBIM_IDEALSIZE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 if(lpstrTitle != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490 rbBand.fMask |= RBBIM_TEXT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 rbBand.fStyle = RBBS_CHILDEDGE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 if(nBtnCount > 0) // add chevron style for toolbar with buttons
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 rbBand.fStyle |= RBBS_USECHEVRON;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494 if(bNewRow)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495 rbBand.fStyle |= RBBS_BREAK;
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 rbBand.lpText = (LPTSTR)lpstrTitle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498 rbBand.hwndChild = hWndBand;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 if(nID == 0) // calc band ID
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500 nID = ATL_IDW_BAND_FIRST + (int)::SendMessage(hWndReBar, RB_GETBANDCOUNT, 0, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501 rbBand.wID = nID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503 // Calculate the size of the band
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504 BOOL bRet = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505 RECT rcTmp = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506 if(nBtnCount > 0)
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 bRet = (BOOL)::SendMessage(hWndBand, TB_GETITEMRECT, nBtnCount - 1, (LPARAM)&rcTmp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510 rbBand.cx = (cxWidth != 0) ? cxWidth : rcTmp.right;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
511 rbBand.cyMinChild = rcTmp.bottom - rcTmp.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
512 if(bFullWidthAlways)
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 rbBand.cxMinChild = rbBand.cx;
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 else if(lpstrTitle == NULL)
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 bRet = (BOOL)::SendMessage(hWndBand, TB_GETITEMRECT, 0, (LPARAM)&rcTmp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
519 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
520 rbBand.cxMinChild = rcTmp.right;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
521 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
522 else
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 rbBand.cxMinChild = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
525 }
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 else // no buttons, either not a toolbar or really has no buttons
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
528 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
529 bRet = ::GetWindowRect(hWndBand, &rcTmp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
530 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
531 rbBand.cx = (cxWidth != 0) ? cxWidth : (rcTmp.right - rcTmp.left);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
532 rbBand.cxMinChild = bFullWidthAlways ? rbBand.cx : 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
533 rbBand.cyMinChild = rcTmp.bottom - rcTmp.top;
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 rbBand.cxIdeal = rbBand.cx;
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 // Add the band
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
539 LRESULT lRes = ::SendMessage(hWndReBar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
540 if(lRes == 0)
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 ATLTRACE2(atlTraceUI, 0, _T("Failed to add a band to the rebar.\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
543 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
544 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
545
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
546 DWORD dwExStyle = (DWORD)::SendMessage(hWndBand, TB_GETEXTENDEDSTYLE, 0, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
547 ::SendMessage(hWndBand, TB_SETEXTENDEDSTYLE, 0, dwExStyle | TBSTYLE_EX_HIDECLIPPEDBUTTONS);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
548
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
549 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
550 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
551
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
552 BOOL AddSimpleReBarBand(HWND hWndBand, LPCTSTR lpstrTitle = NULL, BOOL bNewRow = FALSE, int cxWidth = 0, BOOL bFullWidthAlways = FALSE)
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 ATLASSERT(::IsWindow(m_hWndToolBar)); // must be an existing rebar
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
555 ATLASSERT(::IsWindow(hWndBand)); // must be created
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
556 return AddSimpleReBarBandCtrl(m_hWndToolBar, hWndBand, 0, lpstrTitle, bNewRow, cxWidth, bFullWidthAlways);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
557 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
558
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
559 void SizeSimpleReBarBands()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
560 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
561 ATLASSERT(::IsWindow(m_hWndToolBar)); // must be an existing rebar
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 int nCount = (int)::SendMessage(m_hWndToolBar, RB_GETBANDCOUNT, 0, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
564
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
565 for(int i = 0; i < nCount; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
566 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
567 REBARBANDINFO rbBand = { RunTimeHelper::SizeOf_REBARBANDINFO() };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
568 rbBand.fMask = RBBIM_SIZE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
569 BOOL bRet = (BOOL)::SendMessage(m_hWndToolBar, RB_GETBANDINFO, i, (LPARAM)&rbBand);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
570 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
571 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
572 ::SendMessage(m_hWndToolBar, RB_GETBANDBORDERS, i, (LPARAM)&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
573 rbBand.cx += rect.left + rect.right;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
574 bRet = (BOOL)::SendMessage(m_hWndToolBar, RB_SETBANDINFO, i, (LPARAM)&rbBand);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
575 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
576 }
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
579 BOOL CreateSimpleStatusBar(LPCTSTR lpstrText, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | SBARS_SIZEGRIP, UINT nID = ATL_IDW_STATUS_BAR)
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 ATLASSERT(!::IsWindow(m_hWndStatusBar));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
582 m_hWndStatusBar = ::CreateStatusWindow(dwStyle, lpstrText, this->m_hWnd, nID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
583 return (m_hWndStatusBar != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
584 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
585
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
586 BOOL CreateSimpleStatusBar(UINT nTextID = ATL_IDS_IDLEMESSAGE, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | SBARS_SIZEGRIP, UINT nID = ATL_IDW_STATUS_BAR)
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 const int cchMax = 128; // max text length is 127 for status bars (+1 for null)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
589 TCHAR szText[cchMax] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
590 ::LoadString(ModuleHelper::GetResourceInstance(), nTextID, szText, cchMax);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
591 return CreateSimpleStatusBar(szText, dwStyle, nID);
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 void UpdateLayout(BOOL bResizeBars = TRUE)
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 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
597 this->GetClientRect(&rect);
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 // position bars and offset their dimensions
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
600 UpdateBarsPosition(rect, bResizeBars);
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 // resize client window
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
603 if(m_hWndClient != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
604 ::SetWindowPos(m_hWndClient, NULL, rect.left, rect.top,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
605 rect.right - rect.left, rect.bottom - rect.top,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
606 SWP_NOZORDER | SWP_NOACTIVATE);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
609 void UpdateBarsPosition(RECT& rect, BOOL bResizeBars = TRUE)
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 // resize toolbar
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
612 if((m_hWndToolBar != NULL) && ((DWORD)::GetWindowLong(m_hWndToolBar, GWL_STYLE) & WS_VISIBLE))
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 if(bResizeBars != FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
615 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
616 ::SendMessage(m_hWndToolBar, WM_SIZE, 0, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
617 ::InvalidateRect(m_hWndToolBar, NULL, TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
618 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
619 RECT rectTB = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
620 ::GetWindowRect(m_hWndToolBar, &rectTB);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
621 rect.top += rectTB.bottom - rectTB.top;
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 // resize status bar
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
625 if((m_hWndStatusBar != NULL) && ((DWORD)::GetWindowLong(m_hWndStatusBar, GWL_STYLE) & WS_VISIBLE))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
626 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
627 if(bResizeBars != FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
628 ::SendMessage(m_hWndStatusBar, WM_SIZE, 0, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
629 RECT rectSB = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
630 ::GetWindowRect(m_hWndStatusBar, &rectSB);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
631 rect.bottom -= rectSB.bottom - rectSB.top;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
634
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
635 BOOL PreTranslateMessage(MSG* pMsg)
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 if((m_hAccel != NULL) && ::TranslateAccelerator(this->m_hWnd, m_hAccel, pMsg))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
638 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
639 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
640 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
641
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
642 BEGIN_MSG_MAP(CFrameWindowImplBase)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
643 MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
644 MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
645 MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
646 MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
647 NOTIFY_CODE_HANDLER(TTN_GETDISPINFOA, OnToolTipTextA)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
648 NOTIFY_CODE_HANDLER(TTN_GETDISPINFOW, OnToolTipTextW)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
649 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
650
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
651 LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
652 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
653 if(m_hWndClient != NULL) // view will paint itself instead
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
654 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
655
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
656 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
657 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
658 }
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 LRESULT OnMenuSelect(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
661 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
662 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
663
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
664 if(m_hWndStatusBar == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
665 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
666
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
667 WORD wFlags = HIWORD(wParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
668 if((wFlags == 0xFFFF) && (lParam == NULL)) // menu closing
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 ::SendMessage(m_hWndStatusBar, SB_SIMPLE, FALSE, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
671 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
672 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
673 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
674 const int cchBuff = 256;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
675 TCHAR szBuff[cchBuff] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
676 if(!(wFlags & MF_POPUP))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
677 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
678 WORD wID = LOWORD(wParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
679 // check for special cases
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
680 if((wID >= 0xF000) && (wID < 0xF1F0)) // system menu IDs
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
681 wID = (WORD)(((wID - 0xF000) >> 4) + ATL_IDS_SCFIRST);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
682 else if((wID >= ID_FILE_MRU_FIRST) && (wID <= ID_FILE_MRU_LAST)) // MRU items
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
683 wID = ATL_IDS_MRU_FILE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
684 else if((wID >= ATL_IDM_FIRST_MDICHILD) && (wID <= ATL_IDM_LAST_MDICHILD)) // MDI child windows
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
685 wID = ATL_IDS_MDICHILD;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
686
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
687 int nRet = ::LoadString(ModuleHelper::GetResourceInstance(), wID, szBuff, cchBuff);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
688 for(int i = 0; i < nRet; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
689 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
690 if(szBuff[i] == _T('\n'))
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 szBuff[i] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
693 break;
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 }
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 ::SendMessage(m_hWndStatusBar, SB_SIMPLE, TRUE, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
698 ::SendMessage(m_hWndStatusBar, SB_SETTEXT, (255 | SBT_NOBORDERS), (LPARAM)szBuff);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
699 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
700
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
701 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
702 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
703
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
704 LRESULT OnSetFocus(UINT, WPARAM, LPARAM, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
705 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
706 if(m_hWndClient != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
707 ::SetFocus(m_hWndClient);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
708
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
709 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
710 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
711 }
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 LRESULT OnDestroy(UINT, WPARAM, LPARAM, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
714 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
715 if((this->GetStyle() & (WS_CHILD | WS_POPUP)) == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
716 ::PostQuitMessage(1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
717
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
718 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
719 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
720 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
721
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
722 LRESULT OnToolTipTextA(int idCtrl, LPNMHDR pnmh, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
723 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
724 LPNMTTDISPINFOA pDispInfo = (LPNMTTDISPINFOA)pnmh;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
725 if((idCtrl != 0) && !(pDispInfo->uFlags & TTF_IDISHWND))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
726 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
727 const int cchBuff = 256;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
728 char szBuff[cchBuff] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
729 int nRet = ::LoadStringA(ModuleHelper::GetResourceInstance(), idCtrl, szBuff, cchBuff);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
730 for(int i = 0; i < nRet; i++)
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 if(szBuff[i] == '\n')
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
733 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
734 ATL::Checked::strncpy_s(pDispInfo->szText, _countof(pDispInfo->szText), &szBuff[i + 1], _TRUNCATE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
735 break;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
738 if(nRet > 0) // string was loaded, save it
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
739 pDispInfo->uFlags |= TTF_DI_SETITEM;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
740 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
741
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
742 return 0;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
745 LRESULT OnToolTipTextW(int idCtrl, LPNMHDR pnmh, BOOL& /*bHandled*/)
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 LPNMTTDISPINFOW pDispInfo = (LPNMTTDISPINFOW)pnmh;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
748 if((idCtrl != 0) && !(pDispInfo->uFlags & TTF_IDISHWND))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
749 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
750 const int cchBuff = 256;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
751 wchar_t szBuff[cchBuff] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
752 int nRet = ::LoadStringW(ModuleHelper::GetResourceInstance(), idCtrl, szBuff, cchBuff);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
753 for(int i = 0; i < nRet; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
754 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
755 if(szBuff[i] == L'\n')
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
756 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
757 ATL::Checked::wcsncpy_s(pDispInfo->szText, _countof(pDispInfo->szText), &szBuff[i + 1], _TRUNCATE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
758 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
759 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
760 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
761 if(nRet > 0) // string was loaded, save it
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
762 pDispInfo->uFlags |= TTF_DI_SETITEM;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
763 }
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 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
766 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
767
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
768 // Implementation - chevron menu support
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
769 bool PrepareChevronMenu(_ChevronMenuInfo& cmi)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
770 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
771 // get rebar and toolbar
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
772 REBARBANDINFO rbbi = { RunTimeHelper::SizeOf_REBARBANDINFO() };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
773 rbbi.fMask = RBBIM_CHILD;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
774 BOOL bRet = (BOOL)::SendMessage(cmi.lpnm->hdr.hwndFrom, RB_GETBANDINFO, cmi.lpnm->uBand, (LPARAM)&rbbi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
775 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
776
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
777 // assume the band is a toolbar
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
778 ATL::CWindow wnd = rbbi.hwndChild;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
779 int nCount = (int)wnd.SendMessage(TB_BUTTONCOUNT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
780 if(nCount <= 0) // probably not a toolbar
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
781 return false;
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 // check if it's a command bar
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
784 CMenuHandle menuCmdBar = (HMENU)wnd.SendMessage(CBRM_GETMENU);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
785 cmi.bCmdBar = (menuCmdBar.m_hMenu != NULL);
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 // build a menu from hidden items
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
788 CMenuHandle menu;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
789 bRet = menu.CreatePopupMenu();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
790 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
791 RECT rcClient = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
792 bRet = wnd.GetClientRect(&rcClient);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
793 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
794 for(int i = 0; i < nCount; i++)
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 TBBUTTON tbb = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
797 bRet = (BOOL)wnd.SendMessage(TB_GETBUTTON, i, (LPARAM)&tbb);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
798 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
799 // skip hidden buttons
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
800 if((tbb.fsState & TBSTATE_HIDDEN) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
801 continue;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
802 RECT rcButton = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
803 bRet = (BOOL)wnd.SendMessage(TB_GETITEMRECT, i, (LPARAM)&rcButton);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
804 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
805 bool bEnabled = ((tbb.fsState & TBSTATE_ENABLED) != 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
806 if((rcButton.right > rcClient.right) || (rcButton.bottom > rcClient.bottom))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
807 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
808 if(tbb.fsStyle & BTNS_SEP)
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 if(menu.GetMenuItemCount() > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
811 menu.AppendMenu(MF_SEPARATOR);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
812 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
813 else if(cmi.bCmdBar)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
814 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
815 const int cchBuff = 200;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
816 TCHAR szBuff[cchBuff] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
817 CMenuItemInfo mii;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
818 mii.fMask = MIIM_TYPE | MIIM_SUBMENU;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
819 mii.dwTypeData = szBuff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
820 mii.cch = cchBuff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
821 bRet = menuCmdBar.GetMenuItemInfo(i, TRUE, &mii);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
822 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
823 // Note: CmdBar currently supports only drop-down items
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
824 ATLASSERT(::IsMenu(mii.hSubMenu));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
825 bRet = menu.AppendMenu(MF_STRING | MF_POPUP | (bEnabled ? MF_ENABLED : MF_GRAYED), (UINT_PTR)mii.hSubMenu, mii.dwTypeData);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
826 ATLASSERT(bRet);
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 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
829 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
830 // get button's text
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
831 const int cchBuff = 200;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
832 TCHAR szBuff[cchBuff] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
833 LPCTSTR lpstrText = szBuff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
834 TBBUTTONINFO tbbi = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
835 tbbi.cbSize = sizeof(TBBUTTONINFO);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
836 tbbi.dwMask = TBIF_TEXT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
837 tbbi.pszText = szBuff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
838 tbbi.cchText = cchBuff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
839 if((wnd.SendMessage(TB_GETBUTTONINFO, tbb.idCommand, (LPARAM)&tbbi) == -1) || (szBuff[0] == 0))
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 // no text for this button, try a resource string
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
842 lpstrText = _T("");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
843 int nRet = ::LoadString(ModuleHelper::GetResourceInstance(), tbb.idCommand, szBuff, cchBuff);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
844 for(int n = 0; n < nRet; n++)
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 if(szBuff[n] == _T('\n'))
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 lpstrText = &szBuff[n + 1];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
849 break;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
853 bRet = menu.AppendMenu(MF_STRING | (bEnabled ? MF_ENABLED : MF_GRAYED), tbb.idCommand, lpstrText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
854 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
855 }
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
858
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
859 if(menu.GetMenuItemCount() == 0) // no hidden buttons after all
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
860 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
861 menu.DestroyMenu();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
862 ::MessageBeep((UINT)-1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
863 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
864 }
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 cmi.hMenu = menu;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
867 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
868 }
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 void DisplayChevronMenu(_ChevronMenuInfo& cmi)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
871 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
872 // convert chevron rect to screen coordinates
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
873 ATL::CWindow wndFrom = cmi.lpnm->hdr.hwndFrom;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
874 POINT pt = { cmi.lpnm->rc.left, cmi.lpnm->rc.bottom };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
875 wndFrom.MapWindowPoints(NULL, &pt, 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
876 RECT rc = cmi.lpnm->rc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
877 wndFrom.MapWindowPoints(NULL, &rc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
878 // set up flags and rect
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
879 UINT uMenuFlags = TPM_LEFTBUTTON | TPM_VERTICAL | TPM_LEFTALIGN | TPM_TOPALIGN | TPM_VERPOSANIMATION;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
880 TPMPARAMS TPMParams = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
881 TPMParams.cbSize = sizeof(TPMPARAMS);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
882 TPMParams.rcExclude = rc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
883 // check if this window has a command bar
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
884 HWND hWndCmdBar = (HWND)::SendMessage(this->m_hWnd, CBRM_GETCMDBAR, 0, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
885 if(::IsWindow(hWndCmdBar))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
886 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
887 CBRPOPUPMENU CBRPopupMenu = { sizeof(CBRPOPUPMENU), cmi.hMenu, uMenuFlags, pt.x, pt.y, &TPMParams };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
888 ::SendMessage(hWndCmdBar, CBRM_TRACKPOPUPMENU, 0, (LPARAM)&CBRPopupMenu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
889 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
890 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
891 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
892 CMenuHandle menu = cmi.hMenu;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
893 menu.TrackPopupMenuEx(uMenuFlags, pt.x, pt.y, this->m_hWnd, &TPMParams);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
894 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
895 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
896
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
897 void CleanupChevronMenu(_ChevronMenuInfo& cmi)
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 CMenuHandle menu = cmi.hMenu;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
900 // if menu is from a command bar, detach submenus so they are not destroyed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
901 if(cmi.bCmdBar)
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 for(int i = menu.GetMenuItemCount() - 1; i >=0; i--)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
904 menu.RemoveMenu(i, MF_BYPOSITION);
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 // destroy menu
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
907 menu.DestroyMenu();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
908 // convert chevron rect to screen coordinates
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
909 ATL::CWindow wndFrom = cmi.lpnm->hdr.hwndFrom;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
910 RECT rc = cmi.lpnm->rc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
911 wndFrom.MapWindowPoints(NULL, &rc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
912 // eat next message if click is on the same button
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
913 MSG msg = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
914 if(::PeekMessage(&msg, this->m_hWnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_NOREMOVE) && ::PtInRect(&rc, msg.pt))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
915 ::PeekMessage(&msg, this->m_hWnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_REMOVE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
916 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
917 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
918
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
919
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
920 template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CFrameWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
921 class ATL_NO_VTABLE CFrameWindowImpl : public CFrameWindowImplBase< TBase, TWinTraits >
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
922 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
923 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
924 HWND Create(HWND hWndParent = NULL, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
925 DWORD dwStyle = 0, DWORD dwExStyle = 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
926 HMENU hMenu = NULL, LPVOID lpCreateParam = NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
927 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
928 ATOM atom = T::GetWndClassInfo().Register(&this->m_pfnSuperWindowProc);
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 dwStyle = T::GetWndStyle(dwStyle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
931 dwExStyle = T::GetWndExStyle(dwExStyle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
932
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
933 if(rect.m_lpRect == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
934 rect.m_lpRect = &TBase::rcDefault;
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 return CFrameWindowImplBase< TBase, TWinTraits >::Create(hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, hMenu, atom, lpCreateParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
937 }
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 HWND CreateEx(HWND hWndParent = NULL, ATL::_U_RECT rect = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, LPVOID lpCreateParam = NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
940 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
941 const int cchName = 256;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
942 TCHAR szWindowName[cchName] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
943 ::LoadString(ModuleHelper::GetResourceInstance(), T::GetWndClassInfo().m_uCommonResourceID, szWindowName, cchName);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
944 HMENU hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
945
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
946 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
947 HWND hWnd = pT->Create(hWndParent, rect, szWindowName, dwStyle, dwExStyle, hMenu, lpCreateParam);
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 if(hWnd != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
950 this->m_hAccel = ::LoadAccelerators(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID));
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 return hWnd;
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 BOOL CreateSimpleToolBar(UINT nResourceID = 0, DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)
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 if(nResourceID == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
958 nResourceID = T::GetWndClassInfo().m_uCommonResourceID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
959 ATLASSERT(!::IsWindow(this->m_hWndToolBar));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
960 this->m_hWndToolBar = T::CreateSimpleToolBarCtrl(this->m_hWnd, nResourceID, TRUE, dwStyle, nID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
961 return (this->m_hWndToolBar != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
962 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
963
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
964 // message map and handlers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
965 typedef CFrameWindowImplBase< TBase, TWinTraits > _baseClass;
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 BEGIN_MSG_MAP(CFrameWindowImpl)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
968 MESSAGE_HANDLER(WM_SIZE, OnSize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
969 #ifndef _ATL_NO_REBAR_SUPPORT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
970 NOTIFY_CODE_HANDLER(RBN_AUTOSIZE, OnReBarAutoSize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
971 NOTIFY_CODE_HANDLER(RBN_CHEVRONPUSHED, OnChevronPushed)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
972 #endif // !_ATL_NO_REBAR_SUPPORT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
973 CHAIN_MSG_MAP(_baseClass)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
974 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
975
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
976 LRESULT OnSize(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
977 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
978 if(wParam != SIZE_MINIMIZED)
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 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
981 pT->UpdateLayout();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
982 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
983 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
984 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
985 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
986
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
987 #ifndef _ATL_NO_REBAR_SUPPORT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
988 LRESULT OnReBarAutoSize(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
989 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
990 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
991 pT->UpdateLayout(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
992 return 0;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
995 LRESULT OnChevronPushed(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
996 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
997 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
998 typename CFrameWindowImplBase< TBase, TWinTraits >::_ChevronMenuInfo cmi = { NULL, (LPNMREBARCHEVRON)pnmh, false };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
999 if(!pT->PrepareChevronMenu(cmi))
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 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1002 return 1;
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 // display a popup menu with hidden items
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1005 pT->DisplayChevronMenu(cmi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1006 // cleanup
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1007 pT->CleanupChevronMenu(cmi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1008 return 0;
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 #endif // !_ATL_NO_REBAR_SUPPORT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1011 };
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1014 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1015 // AtlCreateSimpleToolBar - helper for creating simple toolbars
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1016
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1017 inline HWND AtlCreateSimpleToolBar(HWND hWndParent, UINT nResourceID, BOOL bInitialSeparator = FALSE,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1018 DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1019 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1020 return CFrameWindowImplBase<>::CreateSimpleToolBarCtrl(hWndParent, nResourceID, bInitialSeparator, dwStyle, nID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1021 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1022
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1023
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 // CMDIWindow
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 #ifndef _WTL_MDIWINDOWMENU_TEXT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1028 #define _WTL_MDIWINDOWMENU_TEXT _T("&Window")
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1029 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1030
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1031 class CMDIWindow : public ATL::CWindow
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 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1034 // Data members
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1035 HWND m_hWndMDIClient;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1036 HMENU m_hMenu;
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 // Constructors
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1039 CMDIWindow(HWND hWnd = NULL) : ATL::CWindow(hWnd), m_hWndMDIClient(NULL), m_hMenu(NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1040 { }
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 CMDIWindow& operator =(HWND hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1043 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1044 m_hWnd = hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1045 return *this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1046 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1047
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1048 // Operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1049 HWND MDIGetActive(BOOL* lpbMaximized = NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1050 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1051 ATLASSERT(::IsWindow(m_hWndMDIClient));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1052 return (HWND)::SendMessage(m_hWndMDIClient, WM_MDIGETACTIVE, 0, (LPARAM)lpbMaximized);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1055 void MDIActivate(HWND hWndChildToActivate)
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 ATLASSERT(::IsWindow(m_hWndMDIClient));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1058 ATLASSERT(::IsWindow(hWndChildToActivate));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1059 ::SendMessage(m_hWndMDIClient, WM_MDIACTIVATE, (WPARAM)hWndChildToActivate, 0);
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 MDINext(HWND hWndChild, BOOL bPrevious = FALSE)
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(::IsWindow(m_hWndMDIClient));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1065 ATLASSERT((hWndChild == NULL) || ::IsWindow(hWndChild));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1066 ::SendMessage(m_hWndMDIClient, WM_MDINEXT, (WPARAM)hWndChild, (LPARAM)bPrevious);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1069 void MDIMaximize(HWND hWndChildToMaximize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1070 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1071 ATLASSERT(::IsWindow(m_hWndMDIClient));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1072 ATLASSERT(::IsWindow(hWndChildToMaximize));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1073 ::SendMessage(m_hWndMDIClient, WM_MDIMAXIMIZE, (WPARAM)hWndChildToMaximize, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1074 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1075
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1076 void MDIRestore(HWND hWndChildToRestore)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1077 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1078 ATLASSERT(::IsWindow(m_hWndMDIClient));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1079 ATLASSERT(::IsWindow(hWndChildToRestore));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1080 ::SendMessage(m_hWndMDIClient, WM_MDIRESTORE, (WPARAM)hWndChildToRestore, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1081 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1082
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1083 void MDIDestroy(HWND hWndChildToDestroy)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1084 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1085 ATLASSERT(::IsWindow(m_hWndMDIClient));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1086 ATLASSERT(::IsWindow(hWndChildToDestroy));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1087 ::SendMessage(m_hWndMDIClient, WM_MDIDESTROY, (WPARAM)hWndChildToDestroy, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1088 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1089
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1090 BOOL MDICascade(UINT uFlags = 0)
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 ATLASSERT(::IsWindow(m_hWndMDIClient));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1093 return (BOOL)::SendMessage(m_hWndMDIClient, WM_MDICASCADE, (WPARAM)uFlags, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1094 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1095
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1096 BOOL MDITile(UINT uFlags = MDITILE_HORIZONTAL)
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 ATLASSERT(::IsWindow(m_hWndMDIClient));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1099 return (BOOL)::SendMessage(m_hWndMDIClient, WM_MDITILE, (WPARAM)uFlags, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1100 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1101
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1102 void MDIIconArrange()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1103 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1104 ATLASSERT(::IsWindow(m_hWndMDIClient));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1105 ::SendMessage(m_hWndMDIClient, WM_MDIICONARRANGE, 0, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1106 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1107
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1108 HMENU MDISetMenu(HMENU hMenuFrame, HMENU hMenuWindow)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1109 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1110 ATLASSERT(::IsWindow(m_hWndMDIClient));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1111 return (HMENU)::SendMessage(m_hWndMDIClient, WM_MDISETMENU, (WPARAM)hMenuFrame, (LPARAM)hMenuWindow);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1112 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1113
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1114 HMENU MDIRefreshMenu()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1115 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1116 ATLASSERT(::IsWindow(m_hWndMDIClient));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1117 return (HMENU)::SendMessage(m_hWndMDIClient, WM_MDIREFRESHMENU, 0, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1118 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1119
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1120 // Additional operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1121 static HMENU GetStandardWindowMenu(HMENU hMenu)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1122 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1123 int nCount = ::GetMenuItemCount(hMenu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1124 if(nCount == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1125 return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1126 int nLen = ::GetMenuString(hMenu, nCount - 2, NULL, 0, MF_BYPOSITION);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1127 if(nLen == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1128 return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1129 ATL::CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1130 LPTSTR lpszText = buff.Allocate(nLen + 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1131 if(lpszText == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1132 return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1133 if(::GetMenuString(hMenu, nCount - 2, lpszText, nLen + 1, MF_BYPOSITION) != nLen)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1134 return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1135 if(lstrcmp(lpszText, _WTL_MDIWINDOWMENU_TEXT) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1136 return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1137 return ::GetSubMenu(hMenu, nCount - 2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1138 }
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 void SetMDIFrameMenu()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1141 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1142 HMENU hWindowMenu = GetStandardWindowMenu(m_hMenu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1143 MDISetMenu(m_hMenu, hWindowMenu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1144 MDIRefreshMenu();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1145 ::DrawMenuBar(GetMDIFrame());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1146 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1147
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1148 HWND GetMDIFrame() const
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 return ::GetParent(m_hWndMDIClient);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1151 }
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1155 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1156 // CMDIFrameWindowImpl
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1157
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1158 // MDI child command chaining macro (only for MDI frame windows)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1159 #define CHAIN_MDI_CHILD_COMMANDS() \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1160 if(uMsg == WM_COMMAND) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1161 { \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1162 HWND hWndChild = this->MDIGetActive(); \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1163 if(hWndChild != NULL) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1164 ::SendMessage(hWndChild, uMsg, wParam, lParam); \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1165 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1166
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1167 template <class T, class TBase = CMDIWindow, class TWinTraits = ATL::CFrameWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1168 class ATL_NO_VTABLE CMDIFrameWindowImpl : public CFrameWindowImplBase<TBase, TWinTraits >
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1169 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1170 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1171 HWND Create(HWND hWndParent = NULL, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1172 DWORD dwStyle = 0, DWORD dwExStyle = 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1173 HMENU hMenu = NULL, LPVOID lpCreateParam = NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1174 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1175 this->m_hMenu = hMenu;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1176 ATOM atom = T::GetWndClassInfo().Register(&this->m_pfnSuperWindowProc);
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 dwStyle = T::GetWndStyle(dwStyle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1179 dwExStyle = T::GetWndExStyle(dwExStyle);
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 if(rect.m_lpRect == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1182 rect.m_lpRect = &TBase::rcDefault;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1183
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1184 return CFrameWindowImplBase<TBase, TWinTraits >::Create(hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, hMenu, atom, lpCreateParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1185 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1186
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1187 HWND CreateEx(HWND hWndParent = NULL, ATL::_U_RECT rect = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, LPVOID lpCreateParam = NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1188 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1189 const int cchName = 256;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1190 TCHAR szWindowName[cchName] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1191 ::LoadString(ModuleHelper::GetResourceInstance(), T::GetWndClassInfo().m_uCommonResourceID, szWindowName, cchName);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1192 HMENU hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1193
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1194 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1195 HWND hWnd = pT->Create(hWndParent, rect, szWindowName, dwStyle, dwExStyle, hMenu, lpCreateParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1196
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1197 if(hWnd != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1198 this->m_hAccel = ::LoadAccelerators(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1199
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1200 return hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1201 }
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 BOOL CreateSimpleToolBar(UINT nResourceID = 0, DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1204 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1205 ATLASSERT(!::IsWindow(this->m_hWndToolBar));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1206 if(nResourceID == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1207 nResourceID = T::GetWndClassInfo().m_uCommonResourceID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1208 this->m_hWndToolBar = T::CreateSimpleToolBarCtrl(this->m_hWnd, nResourceID, TRUE, dwStyle, nID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1209 return (this->m_hWndToolBar != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1210 }
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 virtual WNDPROC GetWindowProc()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1213 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1214 return MDIFrameWindowProc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1215 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1216
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1217 static LRESULT CALLBACK MDIFrameWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
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 CMDIFrameWindowImpl< T, TBase, TWinTraits >* pThis = (CMDIFrameWindowImpl< T, TBase, TWinTraits >*)hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1220 // set a ptr to this message and save the old value
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1221 ATL::_ATL_MSG msg(pThis->m_hWnd, uMsg, wParam, lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1222 const ATL::_ATL_MSG* pOldMsg = pThis->m_pCurrentMsg;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1223 pThis->m_pCurrentMsg = &msg;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1224 // pass to the message map to process
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1225 LRESULT lRes = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1226 BOOL bRet = pThis->ProcessWindowMessage(pThis->m_hWnd, uMsg, wParam, lParam, lRes, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1227 // restore saved value for the current message
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1228 ATLASSERT(pThis->m_pCurrentMsg == &msg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1229 pThis->m_pCurrentMsg = pOldMsg;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1230 // do the default processing if message was not handled
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1231 if(!bRet)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1232 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1233 if(uMsg != WM_NCDESTROY)
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 lRes = pThis->DefWindowProc(uMsg, wParam, lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1236 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1237 else
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 // unsubclass, if needed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1240 LONG_PTR pfnWndProc = ::GetWindowLongPtr(pThis->m_hWnd, GWLP_WNDPROC);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1241 lRes = pThis->DefWindowProc(uMsg, wParam, lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1242 if((pThis->m_pfnSuperWindowProc != ::DefWindowProc) && (::GetWindowLongPtr(pThis->m_hWnd, GWLP_WNDPROC) == pfnWndProc))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1243 ::SetWindowLongPtr(pThis->m_hWnd, GWLP_WNDPROC, (LONG_PTR)pThis->m_pfnSuperWindowProc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1244 // mark window as destryed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1245 pThis->m_dwState |= ATL::CWindowImplRoot< TBase >::WINSTATE_DESTROYED;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1248 if((pThis->m_dwState & ATL::CWindowImplRoot< TBase >::WINSTATE_DESTROYED) && (pThis->m_pCurrentMsg == NULL))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1249 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1250 // clear out window handle
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1251 HWND hWndThis = pThis->m_hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1252 pThis->m_hWnd = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1253 pThis->m_dwState &= ~ATL::CWindowImplRoot< TBase >::WINSTATE_DESTROYED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1254 // clean up after window is destroyed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1255 pThis->OnFinalMessage(hWndThis);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1256 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1257 return lRes;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1258 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1259
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1260 // Overriden to call DefWindowProc which uses DefFrameProc
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1261 LRESULT DefWindowProc()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1262 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1263 const ATL::_ATL_MSG* pMsg = this->m_pCurrentMsg;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1264 LRESULT lRes = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1265 if (pMsg != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1266 lRes = DefWindowProc(pMsg->message, pMsg->wParam, pMsg->lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1267 return lRes;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1268 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1269
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1270 LRESULT DefWindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1271 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1272 return ::DefFrameProc(this->m_hWnd, this->m_hWndMDIClient, uMsg, wParam, lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1273 }
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 BOOL PreTranslateMessage(MSG* pMsg)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1276 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1277 if(CFrameWindowImplBase<TBase, TWinTraits>::PreTranslateMessage(pMsg))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1278 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1279 return ::TranslateMDISysAccel(this->m_hWndMDIClient, pMsg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1280 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1281
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1282 HWND CreateMDIClient(HMENU hWindowMenu = NULL, UINT nID = ATL_IDW_CLIENT, UINT nFirstChildID = ATL_IDM_FIRST_MDICHILD)
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 DWORD dwStyle = WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | MDIS_ALLCHILDSTYLES;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1285 DWORD dwExStyle = WS_EX_CLIENTEDGE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1286
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1287 CLIENTCREATESTRUCT ccs = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1288 ccs.hWindowMenu = hWindowMenu;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1289 ccs.idFirstChild = nFirstChildID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1290
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1291 if((this->GetStyle() & (WS_HSCROLL | WS_VSCROLL)) != 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 // parent MDI frame's scroll styles move to the MDICLIENT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1294 dwStyle |= (this->GetStyle() & (WS_HSCROLL | WS_VSCROLL));
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 // fast way to turn off the scrollbar bits (without a resize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1297 this->ModifyStyle(WS_HSCROLL | WS_VSCROLL, 0, SWP_NOREDRAW | SWP_FRAMECHANGED);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1298 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1299
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1300 // Create MDICLIENT window
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1301 this->m_hWndClient = ::CreateWindowEx(dwExStyle, _T("MDIClient"), NULL,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1302 dwStyle, 0, 0, 1, 1, this->m_hWnd, (HMENU)LongToHandle(nID),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1303 ModuleHelper::GetModuleInstance(), (LPVOID)&ccs);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1304 if (this->m_hWndClient == NULL)
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 ATLTRACE2(atlTraceUI, 0, _T("MDI Frame failed to create MDICLIENT.\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1307 return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1308 }
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 // Move it to the top of z-order
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1311 ::BringWindowToTop(this->m_hWndClient);
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 // set as MDI client window
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1314 this->m_hWndMDIClient = this->m_hWndClient;
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 // update to proper size
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1317 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1318 pT->UpdateLayout();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1319
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1320 return this->m_hWndClient;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1321 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1322
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1323 typedef CFrameWindowImplBase<TBase, TWinTraits > _baseClass;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1324
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1325 BEGIN_MSG_MAP(CMDIFrameWindowImpl)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1326 MESSAGE_HANDLER(WM_SIZE, OnSize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1327 MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1328 MESSAGE_HANDLER(WM_MDISETMENU, OnMDISetMenu)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1329 #ifndef _ATL_NO_REBAR_SUPPORT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1330 NOTIFY_CODE_HANDLER(RBN_AUTOSIZE, OnReBarAutoSize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1331 NOTIFY_CODE_HANDLER(RBN_CHEVRONPUSHED, OnChevronPushed)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1332 #endif // !_ATL_NO_REBAR_SUPPORT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1333 CHAIN_MSG_MAP(_baseClass)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1334 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1335
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1336 LRESULT OnSize(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1337 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1338 if(wParam != SIZE_MINIMIZED)
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 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1341 pT->UpdateLayout();
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 // message must be handled, otherwise DefFrameProc would resize the client again
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1344 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1345 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1346
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1347 LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1348 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1349 // don't allow CFrameWindowImplBase to handle this one
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1350 return DefWindowProc(uMsg, wParam, lParam);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1353 LRESULT OnMDISetMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
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 this->SetMDIFrameMenu();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1356 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1357 }
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 #ifndef _ATL_NO_REBAR_SUPPORT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1360 LRESULT OnReBarAutoSize(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)
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 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1363 pT->UpdateLayout(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1364 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1365 }
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 LRESULT OnChevronPushed(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1368 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1369 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1370 typename CFrameWindowImplBase<TBase, TWinTraits >::_ChevronMenuInfo cmi = { NULL, (LPNMREBARCHEVRON)pnmh, false };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1371 if(!pT->PrepareChevronMenu(cmi))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1372 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1373 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1374 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1375 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1376 // display a popup menu with hidden items
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1377 pT->DisplayChevronMenu(cmi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1378 // cleanup
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1379 pT->CleanupChevronMenu(cmi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1380 return 0;
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 #endif // !_ATL_NO_REBAR_SUPPORT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1383 };
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1386 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1387 // CMDIChildWindowImpl
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1388
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1389 template <class T, class TBase = CMDIWindow, class TWinTraits = ATL::CMDIChildWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1390 class ATL_NO_VTABLE CMDIChildWindowImpl : public CFrameWindowImplBase<TBase, TWinTraits >
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1391 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1392 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1393 HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1394 DWORD dwStyle = 0, DWORD dwExStyle = 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1395 UINT nMenuID = 0, LPVOID lpCreateParam = NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1396 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1397 ATOM atom = T::GetWndClassInfo().Register(&this->m_pfnSuperWindowProc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1398
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1399 if(nMenuID != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1400 this->m_hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(nMenuID));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1401
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1402 dwStyle = T::GetWndStyle(dwStyle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1403 dwExStyle = T::GetWndExStyle(dwExStyle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1404
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1405 dwExStyle |= WS_EX_MDICHILD; // force this one
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1406 this->m_pfnSuperWindowProc = ::DefMDIChildProc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1407 this->m_hWndMDIClient = hWndParent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1408 ATLASSERT(::IsWindow(this->m_hWndMDIClient));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1409
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1410 if(rect.m_lpRect == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1411 rect.m_lpRect = &TBase::rcDefault;
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 the currently active MDI child is maximized, we want to create this one maximized too
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1414 ATL::CWindow wndParent = hWndParent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1415 BOOL bMaximized = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1416 wndParent.SendMessage(WM_MDIGETACTIVE, 0, (LPARAM)&bMaximized);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1417 if(bMaximized)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1418 wndParent.SetRedraw(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1419
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1420 HWND hWnd = CFrameWindowImplBase<TBase, TWinTraits >::Create(hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, (UINT)0U, atom, lpCreateParam);
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 if(bMaximized)
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 // Maximize and redraw everything
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1425 if(hWnd != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1426 this->MDIMaximize(hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1427 wndParent.SetRedraw(TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1428 wndParent.RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1429 ::SetFocus(this->GetMDIFrame()); // focus will be set back to this window
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 else if((hWnd != NULL) && ::IsWindowVisible(this->m_hWnd) && !::IsChild(hWnd, ::GetFocus()))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1432 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1433 ::SetFocus(hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1434 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1435
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1436 return hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1437 }
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 HWND CreateEx(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR lpcstrWindowName = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, LPVOID lpCreateParam = NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1440 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1441 const int cchName = 256;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1442 TCHAR szWindowName[cchName] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1443 if(lpcstrWindowName == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1444 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1445 ::LoadString(ModuleHelper::GetResourceInstance(), T::GetWndClassInfo().m_uCommonResourceID, szWindowName, cchName);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1446 lpcstrWindowName = szWindowName;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1449 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1450 HWND hWnd = pT->Create(hWndParent, rect, lpcstrWindowName, dwStyle, dwExStyle, T::GetWndClassInfo().m_uCommonResourceID, lpCreateParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1451
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1452 if(hWnd != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1453 this->m_hAccel = ::LoadAccelerators(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1454
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1455 return hWnd;
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 BOOL CreateSimpleToolBar(UINT nResourceID = 0, DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1459 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1460 ATLASSERT(!::IsWindow(this->m_hWndToolBar));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1461 if(nResourceID == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1462 nResourceID = T::GetWndClassInfo().m_uCommonResourceID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1463 this->m_hWndToolBar = T::CreateSimpleToolBarCtrl(this->m_hWnd, nResourceID, TRUE, dwStyle, nID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1464 return (this->m_hWndToolBar != NULL);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1467 BOOL UpdateClientEdge(LPRECT lpRect = NULL)
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 // only adjust for active MDI child window
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1470 HWND hWndChild = this->MDIGetActive();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1471 if((hWndChild != NULL) && (hWndChild != this->m_hWnd))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1472 return FALSE;
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 // need to adjust the client edge style as max/restore happens
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1475 DWORD dwStyle = ::GetWindowLong(this->m_hWndMDIClient, GWL_EXSTYLE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1476 DWORD dwNewStyle = dwStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1477 if((hWndChild != NULL) && ((this->GetExStyle() & WS_EX_CLIENTEDGE) == 0) && ((this->GetStyle() & WS_MAXIMIZE) != 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1478 dwNewStyle &= ~(WS_EX_CLIENTEDGE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1479 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1480 dwNewStyle |= WS_EX_CLIENTEDGE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1481
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1482 if(dwStyle != dwNewStyle)
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 // SetWindowPos will not move invalid bits
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1485 ::RedrawWindow(this->m_hWndMDIClient, NULL, NULL,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1486 RDW_INVALIDATE | RDW_ALLCHILDREN);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1487 // remove/add WS_EX_CLIENTEDGE to MDI client area
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1488 ::SetWindowLong(this->m_hWndMDIClient, GWL_EXSTYLE, dwNewStyle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1489 ::SetWindowPos(this->m_hWndMDIClient, NULL, 0, 0, 0, 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1490 SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE |
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1491 SWP_NOZORDER | SWP_NOCOPYBITS);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1492
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1493 // return new client area
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1494 if (lpRect != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1495 ::GetClientRect(this->m_hWndMDIClient, lpRect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1496
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1497 return TRUE;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1500 return FALSE;
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 typedef CFrameWindowImplBase<TBase, TWinTraits > _baseClass;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1504 BEGIN_MSG_MAP(CMDIChildWindowImpl)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1505 MESSAGE_HANDLER(WM_SIZE, OnSize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1506 MESSAGE_HANDLER(WM_WINDOWPOSCHANGED, OnWindowPosChanged)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1507 MESSAGE_HANDLER(WM_MOUSEACTIVATE, OnMouseActivate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1508 MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1509 MESSAGE_HANDLER(WM_MDIACTIVATE, OnMDIActivate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1510 MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1511 #ifndef _ATL_NO_REBAR_SUPPORT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1512 NOTIFY_CODE_HANDLER(RBN_AUTOSIZE, OnReBarAutoSize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1513 NOTIFY_CODE_HANDLER(RBN_CHEVRONPUSHED, OnChevronPushed)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1514 #endif // !_ATL_NO_REBAR_SUPPORT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1515 CHAIN_MSG_MAP(_baseClass)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1516 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1517
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1518 LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1519 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1520 this->DefWindowProc(uMsg, wParam, lParam); // needed for MDI children
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1521 if(wParam != SIZE_MINIMIZED)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1522 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1523 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1524 pT->UpdateLayout();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1525 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1526 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1527 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1528
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1529 LRESULT OnWindowPosChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
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 // update MDI client edge and adjust MDI child rect
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1532 LPWINDOWPOS lpWndPos = (LPWINDOWPOS)lParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1533
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1534 if(!(lpWndPos->flags & SWP_NOSIZE))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1535 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1536 RECT rectClient = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1537 if(UpdateClientEdge(&rectClient) && ((this->GetStyle() & WS_MAXIMIZE) != 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1538 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1539 ::AdjustWindowRectEx(&rectClient, this->GetStyle(), FALSE, this->GetExStyle());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1540 lpWndPos->x = rectClient.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1541 lpWndPos->y = rectClient.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1542 lpWndPos->cx = rectClient.right - rectClient.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1543 lpWndPos->cy = rectClient.bottom - rectClient.top;
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 }
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 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1548 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1549 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1550
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1551 LRESULT OnMouseActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1552 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1553 LRESULT lRes = this->DefWindowProc(uMsg, wParam, lParam);
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 // Activate this MDI window if needed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1556 if((lRes == MA_ACTIVATE) || (lRes == MA_ACTIVATEANDEAT))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1557 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1558 if(this->MDIGetActive() != this->m_hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1559 this->MDIActivate(this->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1560 }
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 return lRes;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1563 }
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 LRESULT OnMenuSelect(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1566 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1567 return ::SendMessage(this->GetMDIFrame(), uMsg, wParam, lParam);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1570 LRESULT OnMDIActivate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1571 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1572 if(((HWND)lParam == this->m_hWnd) && (this->m_hMenu != NULL))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1573 this->SetMDIFrameMenu();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1574 else if((HWND)lParam == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1575 ::SendMessage(this->GetMDIFrame(), WM_MDISETMENU, 0, 0);
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 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1578 return 1;
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 LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1582 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1583 if(this->m_hMenu != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1584 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1585 ::DestroyMenu(this->m_hMenu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1586 this->m_hMenu = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1587 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1588 UpdateClientEdge();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1589 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1590 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1591 }
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 #ifndef _ATL_NO_REBAR_SUPPORT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1594 LRESULT OnReBarAutoSize(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1595 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1596 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1597 pT->UpdateLayout(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1598 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1599 }
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 LRESULT OnChevronPushed(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1602 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1603 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1604 typename CFrameWindowImplBase<TBase, TWinTraits >::_ChevronMenuInfo cmi = { NULL, (LPNMREBARCHEVRON)pnmh, false };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1605 if(!pT->PrepareChevronMenu(cmi))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1606 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1607 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1608 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1609 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1610 // display a popup menu with hidden items
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1611 pT->DisplayChevronMenu(cmi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1612 // cleanup
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1613 pT->CleanupChevronMenu(cmi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1614 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1615 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1616 #endif // !_ATL_NO_REBAR_SUPPORT
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
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 // COwnerDraw - MI class for owner-draw support
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1622
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1623 template <class T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1624 class COwnerDraw
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1625 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1626 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1627 // Message map and handlers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1628 BEGIN_MSG_MAP(COwnerDraw< T >)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1629 MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1630 MESSAGE_HANDLER(WM_MEASUREITEM, OnMeasureItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1631 MESSAGE_HANDLER(WM_COMPAREITEM, OnCompareItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1632 MESSAGE_HANDLER(WM_DELETEITEM, OnDeleteItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1633 ALT_MSG_MAP(1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1634 MESSAGE_HANDLER(OCM_DRAWITEM, OnDrawItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1635 MESSAGE_HANDLER(OCM_MEASUREITEM, OnMeasureItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1636 MESSAGE_HANDLER(OCM_COMPAREITEM, OnCompareItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1637 MESSAGE_HANDLER(OCM_DELETEITEM, OnDeleteItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1638 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1639
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1640 LRESULT OnDrawItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
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 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1643 pT->SetMsgHandled(TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1644 pT->DrawItem((LPDRAWITEMSTRUCT)lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1645 bHandled = pT->IsMsgHandled();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1646 return (LRESULT)TRUE;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1649 LRESULT OnMeasureItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1650 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1651 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1652 pT->SetMsgHandled(TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1653 pT->MeasureItem((LPMEASUREITEMSTRUCT)lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1654 bHandled = pT->IsMsgHandled();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1655 return (LRESULT)TRUE;
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 LRESULT OnCompareItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
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->SetMsgHandled(TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1662 bHandled = pT->IsMsgHandled();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1663 return (LRESULT)pT->CompareItem((LPCOMPAREITEMSTRUCT)lParam);
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 LRESULT OnDeleteItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
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 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1669 pT->SetMsgHandled(TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1670 pT->DeleteItem((LPDELETEITEMSTRUCT)lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1671 bHandled = pT->IsMsgHandled();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1672 return (LRESULT)TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1673 }
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 // Overrideables
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1676 void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1677 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1678 // must be implemented
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1679 ATLASSERT(FALSE);
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 void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
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 if(lpMeasureItemStruct->CtlType != ODT_MENU)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1685 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1686 // return default height for a system font
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1687 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1688 HWND hWnd = pT->GetDlgItem(lpMeasureItemStruct->CtlID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1689 CClientDC dc(hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1690 TEXTMETRIC tm = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1691 dc.GetTextMetrics(&tm);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1692
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1693 lpMeasureItemStruct->itemHeight = tm.tmHeight;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1694 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1695 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1696 lpMeasureItemStruct->itemHeight = ::GetSystemMetrics(SM_CYMENU);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1699 int CompareItem(LPCOMPAREITEMSTRUCT /*lpCompareItemStruct*/)
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 // all items are equal
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1702 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1703 }
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 void DeleteItem(LPDELETEITEMSTRUCT /*lpDeleteItemStruct*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1706 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1707 // default - nothing
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1708 }
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
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 // Update UI macros
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1714
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1715 // these build the Update UI map inside a class definition
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1716 #define BEGIN_UPDATE_UI_MAP(thisClass) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1717 static const CUpdateUIBase::_AtlUpdateUIMap* GetUpdateUIMap() \
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 static const CUpdateUIBase::_AtlUpdateUIMap theMap[] = \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1720 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1721
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1722 #define UPDATE_ELEMENT(nID, wType) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1723 { nID, wType },
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1724
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1725 #define END_UPDATE_UI_MAP() \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1726 { (WORD)-1, 0 } \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1727 }; \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1728 return theMap; \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1729 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1730
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1731 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1732 // CUpdateUI - manages UI elements updating
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1733
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1734 class CUpdateUIBase
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1735 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1736 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1737 // constants
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1738 enum
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1739 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1740 // UI element type
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1741 UPDUI_MENUPOPUP = 0x0001,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1742 UPDUI_MENUBAR = 0x0002,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1743 UPDUI_CHILDWINDOW = 0x0004,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1744 UPDUI_TOOLBAR = 0x0008,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1745 UPDUI_STATUSBAR = 0x0010,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1746 // state
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1747 UPDUI_ENABLED = 0x0000,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1748 UPDUI_DISABLED = 0x0100,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1749 UPDUI_CHECKED = 0x0200,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1750 UPDUI_CHECKED2 = 0x0400,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1751 UPDUI_RADIO = 0x0800,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1752 UPDUI_DEFAULT = 0x1000,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1753 UPDUI_TEXT = 0x2000,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1754 // internal state
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1755 UPDUI_CLEARDEFAULT = 0x4000,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1756 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1757
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1758 // element data
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1759 struct _AtlUpdateUIElement
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1760 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1761 HWND m_hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1762 WORD m_wType;
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 bool operator ==(const _AtlUpdateUIElement& e) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1765 { return ((m_hWnd == e.m_hWnd) && (m_wType == e.m_wType)); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1766 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1767
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1768 // map data
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1769 struct _AtlUpdateUIMap
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1770 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1771 WORD m_nID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1772 WORD m_wType;
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 bool operator ==(const _AtlUpdateUIMap& e) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1775 { return ((m_nID == e.m_nID) && (m_wType == e.m_wType)); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1776 };
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 // instance data
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1779 #pragma warning(push)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1780 #pragma warning(disable: 4201) // nameless unions are part of C++
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 struct _AtlUpdateUIData
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1783 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1784 WORD m_wState;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1785 union
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1786 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1787 void* m_lpData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1788 LPTSTR m_lpstrText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1789 struct
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1790 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1791 WORD m_nIDFirst;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1792 WORD m_nIDLast;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1793 };
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1796 bool operator ==(const _AtlUpdateUIData& e) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1797 { return ((m_wState == e.m_wState) && (m_lpData == e.m_lpData)); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1798 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1799
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1800 #pragma warning(pop)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1801
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1802 ATL::CSimpleArray<_AtlUpdateUIElement> m_UIElements; // elements data
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1803 const _AtlUpdateUIMap* m_pUIMap; // static UI data
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1804 _AtlUpdateUIData* m_pUIData; // instance UI data
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1805 WORD m_wDirtyType; // global dirty flag
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 bool m_bBlockAccelerators;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1808
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1809
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1810 // Constructor, destructor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1811 CUpdateUIBase() : m_pUIMap(NULL), m_pUIData(NULL), m_wDirtyType(0), m_bBlockAccelerators(false)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1812 { }
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 ~CUpdateUIBase()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1815 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1816 if((m_pUIMap != NULL) && (m_pUIData != NULL))
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 const _AtlUpdateUIMap* pUIMap = m_pUIMap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1819 _AtlUpdateUIData* pUIData = m_pUIData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1820 while(pUIMap->m_nID != (WORD)-1)
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 if(pUIData->m_wState & UPDUI_TEXT)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1823 delete [] pUIData->m_lpstrText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1824 pUIMap++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1825 pUIData++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1826 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1827 delete [] m_pUIData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1828 }
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1831 // Check for disabled commands
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1832 bool UIGetBlockAccelerators() const
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 return m_bBlockAccelerators;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1835 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1836
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1837 bool UISetBlockAccelerators(bool bBlock)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1838 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1839 bool bOld = m_bBlockAccelerators;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1840 m_bBlockAccelerators = bBlock;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1841 return bOld;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1844 // Add elements
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1845 BOOL UIAddMenuBar(HWND hWnd) // menu bar (main menu)
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 if(hWnd == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1848 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1849 _AtlUpdateUIElement e;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1850 e.m_hWnd = hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1851 e.m_wType = UPDUI_MENUBAR;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1852 return m_UIElements.Add(e);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1855 BOOL UIAddToolBar(HWND hWnd) // toolbar
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1856 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1857 if(hWnd == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1858 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1859 _AtlUpdateUIElement e;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1860 e.m_hWnd = hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1861 e.m_wType = UPDUI_TOOLBAR;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1862 return m_UIElements.Add(e);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1863 }
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 BOOL UIAddStatusBar(HWND hWnd) // status bar
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 if(hWnd == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1868 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1869 _AtlUpdateUIElement e;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1870 e.m_hWnd = hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1871 e.m_wType = UPDUI_STATUSBAR;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1872 return m_UIElements.Add(e);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1873 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1874
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1875 BOOL UIAddChildWindowContainer(HWND hWnd) // child window
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1876 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1877 if(hWnd == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1878 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1879 _AtlUpdateUIElement e;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1880 e.m_hWnd = hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1881 e.m_wType = UPDUI_CHILDWINDOW;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1882 return m_UIElements.Add(e);
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 // Message map for popup menu updates and accelerator blocking
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1886 BEGIN_MSG_MAP(CUpdateUIBase)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1887 MESSAGE_HANDLER(WM_INITMENUPOPUP, OnInitMenuPopup)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1888 MESSAGE_HANDLER(WM_COMMAND, OnCommand)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1889 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1890
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1891 LRESULT OnInitMenuPopup(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1892 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1893 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1894 HMENU hMenu = (HMENU)wParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1895 if(hMenu == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1896 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1897 _AtlUpdateUIData* pUIData = m_pUIData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1898 if(pUIData == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1899 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1900 const _AtlUpdateUIMap* pMap = m_pUIMap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1901 while(pMap->m_nID != (WORD)-1)
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 if(pMap->m_wType & UPDUI_MENUPOPUP)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1904 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1905 UIUpdateMenuBarElement(pMap->m_nID, pUIData, hMenu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1906
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1907 if((pUIData->m_wState & UPDUI_RADIO) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1908 ::CheckMenuRadioItem(hMenu, pUIData->m_nIDFirst, pUIData->m_nIDLast, pMap->m_nID, MF_BYCOMMAND);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1909 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1910 pMap++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1911 pUIData++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1912 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1913 return 0;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1916 LRESULT OnCommand(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
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 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1919 if(m_bBlockAccelerators && (HIWORD(wParam) == 1)) // accelerators only
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1920 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1921 int nID = LOWORD(wParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1922 if((UIGetState(nID) & UPDUI_DISABLED) == UPDUI_DISABLED)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1923 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1924 ATLTRACE2(atlTraceUI, 0, _T("CUpdateUIBase::OnCommand - blocked disabled command 0x%4.4X\n"), nID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1925 bHandled = TRUE; // eat the command, UI item is disabled
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1926 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1927 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1928 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1929 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1930
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1931 // methods for setting UI element state
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1932 BOOL UIEnable(int nID, BOOL bEnable, BOOL bForceUpdate = FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1933 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1934 const _AtlUpdateUIMap* pMap = m_pUIMap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1935 _AtlUpdateUIData* pUIData = m_pUIData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1936 if(pUIData == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1937 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1938
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1939 for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1940 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1941 if(nID == (int)pMap->m_nID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1942 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1943 if(bEnable)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1944 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1945 if(pUIData->m_wState & UPDUI_DISABLED)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1946 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1947 pUIData->m_wState |= pMap->m_wType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1948 pUIData->m_wState &= ~UPDUI_DISABLED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1949 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1950 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1951 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1952 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1953 if(!(pUIData->m_wState & UPDUI_DISABLED))
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 pUIData->m_wState |= pMap->m_wType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1956 pUIData->m_wState |= UPDUI_DISABLED;
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 }
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 if(bForceUpdate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1961 pUIData->m_wState |= pMap->m_wType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1962 if(pUIData->m_wState & pMap->m_wType)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1963 m_wDirtyType |= pMap->m_wType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1964
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1965 break; // found
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1966 }
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1969 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1970 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1971
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1972 BOOL UISetCheck(int nID, int nCheck, BOOL bForceUpdate = FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1973 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1974 const _AtlUpdateUIMap* pMap = m_pUIMap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1975 _AtlUpdateUIData* pUIData = m_pUIData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1976 if(pUIData == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1977 return FALSE;
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 for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1980 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1981 if(nID == (int)pMap->m_nID)
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 switch(nCheck)
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 case 0:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1986 if((pUIData->m_wState & UPDUI_CHECKED) || (pUIData->m_wState & UPDUI_CHECKED2))
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 pUIData->m_wState |= pMap->m_wType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1989 pUIData->m_wState &= ~(UPDUI_CHECKED | UPDUI_CHECKED2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1990 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1991 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1992 case 1:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1993 if(!(pUIData->m_wState & UPDUI_CHECKED))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1994 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1995 pUIData->m_wState |= pMap->m_wType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1996 pUIData->m_wState &= ~UPDUI_CHECKED2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1997 pUIData->m_wState |= UPDUI_CHECKED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1998 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1999 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2000 case 2:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2001 if(!(pUIData->m_wState & UPDUI_CHECKED2))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2002 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2003 pUIData->m_wState |= pMap->m_wType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2004 pUIData->m_wState &= ~UPDUI_CHECKED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2005 pUIData->m_wState |= UPDUI_CHECKED2;
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 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2008 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2009
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2010 if(bForceUpdate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2011 pUIData->m_wState |= pMap->m_wType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2012 if(pUIData->m_wState & pMap->m_wType)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2013 m_wDirtyType |= pMap->m_wType;
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 break; // found
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2019 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2020 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2021
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2022 // variant that supports bool (checked/not-checked, no intermediate state)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2023 BOOL UISetCheck(int nID, bool bCheck, BOOL bForceUpdate = FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2024 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2025 return UISetCheck(nID, bCheck ? 1 : 0, bForceUpdate);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2026 }
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 BOOL UISetRadio(int nID, BOOL bRadio, BOOL bForceUpdate = FALSE)
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 const _AtlUpdateUIMap* pMap = m_pUIMap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2031 _AtlUpdateUIData* pUIData = m_pUIData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2032 if(pUIData == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2033 return FALSE;
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 for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2036 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2037 if(nID == (int)pMap->m_nID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2038 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2039 if(bRadio)
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 if(!(pUIData->m_wState & UPDUI_RADIO))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2042 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2043 pUIData->m_wState |= pMap->m_wType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2044 pUIData->m_wState |= UPDUI_RADIO;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2047 else
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 if(pUIData->m_wState & UPDUI_RADIO)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2050 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2051 pUIData->m_wState |= pMap->m_wType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2052 pUIData->m_wState &= ~UPDUI_RADIO;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2055
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2056 if(bForceUpdate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2057 pUIData->m_wState |= pMap->m_wType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2058 if(pUIData->m_wState & pMap->m_wType)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2059 m_wDirtyType |= pMap->m_wType;
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 break; // found
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 return TRUE;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2068 // for menu items
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2069 BOOL UISetRadioMenuItem(int nID, int nIDFirst, int nIDLast, BOOL bForceUpdate = FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2070 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2071 const _AtlUpdateUIMap* pMap = m_pUIMap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2072 _AtlUpdateUIData* pUIData = m_pUIData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2073 if(pUIData == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2074 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2075
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2076 for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2077 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2078 if(nID == (int)pMap->m_nID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2079 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2080 pUIData->m_wState |= pMap->m_wType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2081 pUIData->m_wState |= UPDUI_RADIO;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2082 pUIData->m_nIDFirst = (WORD)nIDFirst;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2083 pUIData->m_nIDLast = (WORD)nIDLast;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2084
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2085 if(bForceUpdate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2086 pUIData->m_wState |= pMap->m_wType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2087 if(pUIData->m_wState & pMap->m_wType)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2088 m_wDirtyType |= pMap->m_wType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2089 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2090 else if((pMap->m_nID >= nIDFirst) && (pMap->m_nID <= nIDLast))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2091 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2092 if(pUIData->m_wState & UPDUI_RADIO)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2093 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2094 pUIData->m_wState &= ~pMap->m_wType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2095 pUIData->m_wState &= ~UPDUI_RADIO;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2096 pUIData->m_nIDFirst = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2097 pUIData->m_nIDLast = 0;
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 }
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 if(pMap->m_nID == nIDLast)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2102 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2103 }
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 return TRUE;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2108 BOOL UISetText(int nID, LPCTSTR lpstrText, BOOL bForceUpdate = FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2109 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2110 const _AtlUpdateUIMap* pMap = m_pUIMap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2111 _AtlUpdateUIData* pUIData = m_pUIData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2112 if(pUIData == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2113 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2114 if(lpstrText == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2115 lpstrText = _T("");
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 for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)
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 if(nID == (int)pMap->m_nID)
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 if((pUIData->m_lpstrText == NULL) || lstrcmp(pUIData->m_lpstrText, lpstrText))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2122 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2123 delete [] pUIData->m_lpstrText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2124 pUIData->m_lpstrText = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2125 int nStrLen = lstrlen(lpstrText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2126 ATLTRY(pUIData->m_lpstrText = new TCHAR[nStrLen + 1]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2127 if(pUIData->m_lpstrText == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2128 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2129 ATLTRACE2(atlTraceUI, 0, _T("UISetText - memory allocation failed\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2130 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2131 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2132 ATL::Checked::tcscpy_s(pUIData->m_lpstrText, nStrLen + 1, lpstrText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2133 pUIData->m_wState |= (UPDUI_TEXT | pMap->m_wType);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2134 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2135
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2136 if(bForceUpdate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2137 pUIData->m_wState |= (UPDUI_TEXT | pMap->m_wType);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2138 if(pUIData->m_wState & pMap->m_wType)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2139 m_wDirtyType |= pMap->m_wType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2140
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2141 break; // found
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2142 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2143 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2144
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2145 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2146 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2147
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2148 BOOL UISetDefault(int nID, BOOL bDefault, BOOL bForceUpdate = FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2149 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2150 const _AtlUpdateUIMap* pMap = m_pUIMap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2151 _AtlUpdateUIData* pUIData = m_pUIData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2152 if(pUIData == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2153 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2154
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2155 for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2156 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2157 if(nID == (int)pMap->m_nID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2158 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2159 if(bDefault)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2160 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2161 if((pUIData->m_wState & UPDUI_DEFAULT) == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2162 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2163 pUIData->m_wState |= pMap->m_wType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2164 pUIData->m_wState |= UPDUI_DEFAULT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2165 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2166 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2167 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2168 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2169 if((pUIData->m_wState & UPDUI_DEFAULT) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2170 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2171 pUIData->m_wState |= pMap->m_wType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2172 pUIData->m_wState &= ~UPDUI_DEFAULT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2173 pUIData->m_wState |= UPDUI_CLEARDEFAULT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2174 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2175 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2176
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2177 if(bForceUpdate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2178 pUIData->m_wState |= pMap->m_wType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2179 if(pUIData->m_wState & pMap->m_wType)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2180 m_wDirtyType |= pMap->m_wType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2181
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2182 break; // found
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2183 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2184 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2185
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2186 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2187 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2188
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2189 // methods for complete state set/get
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2190 BOOL UISetState(int nID, DWORD dwState)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2191 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2192 const _AtlUpdateUIMap* pMap = m_pUIMap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2193 _AtlUpdateUIData* pUIData = m_pUIData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2194 if(pUIData == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2195 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2196 for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2197 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2198 if(nID == (int)pMap->m_nID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2199 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2200 pUIData->m_wState = (WORD)(dwState | pMap->m_wType);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2201 m_wDirtyType |= pMap->m_wType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2202 break; // found
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2203 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2204 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2205 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2206 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2207
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2208 DWORD UIGetState(int nID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2209 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2210 const _AtlUpdateUIMap* pMap = m_pUIMap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2211 _AtlUpdateUIData* pUIData = m_pUIData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2212 if(pUIData == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2213 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2214 for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2215 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2216 if(nID == (int)pMap->m_nID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2217 return pUIData->m_wState;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2218 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2219 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2220 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2221
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2222 // methods for updating UI
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2223 BOOL UIUpdateMenuBar(BOOL bForceUpdate = FALSE, BOOL bMainMenu = FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2224 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2225 if(!(m_wDirtyType & UPDUI_MENUBAR) && !bForceUpdate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2226 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2227
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2228 const _AtlUpdateUIMap* pMap = m_pUIMap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2229 _AtlUpdateUIData* pUIData = m_pUIData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2230 if(pUIData == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2231 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2232
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2233 while(pMap->m_nID != (WORD)-1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2234 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2235 for(int i = 0; i < m_UIElements.GetSize(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2236 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2237 if(m_UIElements[i].m_wType == UPDUI_MENUBAR)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2238 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2239 HMENU hMenu = ::GetMenu(m_UIElements[i].m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2240 if((hMenu != NULL) && (pUIData->m_wState & UPDUI_MENUBAR) && (pMap->m_wType & UPDUI_MENUBAR))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2241 UIUpdateMenuBarElement(pMap->m_nID, pUIData, hMenu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2242 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2243 if(bMainMenu)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2244 ::DrawMenuBar(m_UIElements[i].m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2245 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2246 pMap++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2247 pUIData->m_wState &= ~UPDUI_MENUBAR;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2248 if(pUIData->m_wState & UPDUI_TEXT)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2249 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2250 delete [] pUIData->m_lpstrText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2251 pUIData->m_lpstrText = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2252 pUIData->m_wState &= ~UPDUI_TEXT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2253 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2254 pUIData++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2255 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2256
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2257 m_wDirtyType &= ~UPDUI_MENUBAR;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2258 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2259 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2260
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2261 BOOL UIUpdateToolBar(BOOL bForceUpdate = FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2262 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2263 if(!(m_wDirtyType & UPDUI_TOOLBAR) && !bForceUpdate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2264 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2265
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2266 const _AtlUpdateUIMap* pMap = m_pUIMap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2267 _AtlUpdateUIData* pUIData = m_pUIData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2268 if(pUIData == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2269 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2270
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2271 while(pMap->m_nID != (WORD)-1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2272 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2273 for(int i = 0; i < m_UIElements.GetSize(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2274 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2275 if(m_UIElements[i].m_wType == UPDUI_TOOLBAR)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2276 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2277 if((pUIData->m_wState & UPDUI_TOOLBAR) && (pMap->m_wType & UPDUI_TOOLBAR))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2278 UIUpdateToolBarElement(pMap->m_nID, pUIData, m_UIElements[i].m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2279 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2280 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2281 pMap++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2282 pUIData->m_wState &= ~UPDUI_TOOLBAR;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2283 pUIData++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2284 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2285
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2286 m_wDirtyType &= ~UPDUI_TOOLBAR;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2287 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2288 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2289
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2290 BOOL UIUpdateStatusBar(BOOL bForceUpdate = FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2291 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2292 if(!(m_wDirtyType & UPDUI_STATUSBAR) && !bForceUpdate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2293 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2294
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2295 const _AtlUpdateUIMap* pMap = m_pUIMap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2296 _AtlUpdateUIData* pUIData = m_pUIData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2297 if(pUIData == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2298 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2299
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2300 while(pMap->m_nID != (WORD)-1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2301 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2302 for(int i = 0; i < m_UIElements.GetSize(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2303 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2304 if(m_UIElements[i].m_wType == UPDUI_STATUSBAR)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2305 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2306 if((pUIData->m_wState & UPDUI_STATUSBAR) && (pMap->m_wType & UPDUI_STATUSBAR))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2307 UIUpdateStatusBarElement(pMap->m_nID, pUIData, m_UIElements[i].m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2308 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2309 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2310 pMap++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2311 pUIData->m_wState &= ~UPDUI_STATUSBAR;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2312 if(pUIData->m_wState & UPDUI_TEXT)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2313 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2314 delete [] pUIData->m_lpstrText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2315 pUIData->m_lpstrText = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2316 pUIData->m_wState &= ~UPDUI_TEXT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2317 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2318 pUIData++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2319 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2320
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2321 m_wDirtyType &= ~UPDUI_STATUSBAR;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2322 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2323 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2324
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2325 BOOL UIUpdateChildWindows(BOOL bForceUpdate = FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2326 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2327 if(!(m_wDirtyType & UPDUI_CHILDWINDOW) && !bForceUpdate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2328 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2329
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2330 const _AtlUpdateUIMap* pMap = m_pUIMap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2331 _AtlUpdateUIData* pUIData = m_pUIData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2332 if(pUIData == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2333 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2334
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2335 while(pMap->m_nID != (WORD)-1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2336 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2337 for(int i = 0; i < m_UIElements.GetSize(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2338 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2339 if(m_UIElements[i].m_wType == UPDUI_CHILDWINDOW)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2340 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2341 if((pUIData->m_wState & UPDUI_CHILDWINDOW) && (pMap->m_wType & UPDUI_CHILDWINDOW))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2342 UIUpdateChildWindow(pMap->m_nID, pUIData, m_UIElements[i].m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2343 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2344 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2345 pMap++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2346 pUIData->m_wState &= ~UPDUI_CHILDWINDOW;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2347 if(pUIData->m_wState & UPDUI_TEXT)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2348 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2349 delete [] pUIData->m_lpstrText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2350 pUIData->m_lpstrText = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2351 pUIData->m_wState &= ~UPDUI_TEXT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2352 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2353 pUIData++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2354 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2355
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2356 m_wDirtyType &= ~UPDUI_CHILDWINDOW;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2357 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2358 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2359
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2360 // internal element specific methods
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2361 static void UIUpdateMenuBarElement(int nID, _AtlUpdateUIData* pUIData, HMENU hMenu)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2362 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2363 if((pUIData->m_wState & UPDUI_CLEARDEFAULT) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2364 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2365 ::SetMenuDefaultItem(hMenu, (UINT)-1, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2366 pUIData->m_wState &= ~UPDUI_CLEARDEFAULT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2367 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2368
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2369 CMenuItemInfo mii;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2370 mii.fMask = MIIM_STATE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2371 mii.wID = nID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2372
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2373 if((pUIData->m_wState & UPDUI_DISABLED) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2374 mii.fState |= MFS_DISABLED | MFS_GRAYED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2375 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2376 mii.fState |= MFS_ENABLED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2377
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2378 if((pUIData->m_wState & UPDUI_CHECKED) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2379 mii.fState |= MFS_CHECKED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2380 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2381 mii.fState |= MFS_UNCHECKED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2382
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2383 if((pUIData->m_wState & UPDUI_DEFAULT) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2384 mii.fState |= MFS_DEFAULT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2385
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2386 if((pUIData->m_wState & UPDUI_TEXT) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2387 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2388 CMenuItemInfo miiNow;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2389 miiNow.fMask = MIIM_TYPE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2390 miiNow.wID = nID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2391 if(::GetMenuItemInfo(hMenu, nID, FALSE, &miiNow))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2392 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2393 mii.fMask |= MIIM_TYPE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2394 // MFT_BITMAP and MFT_SEPARATOR don't go together with MFT_STRING
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2395 mii.fType |= (miiNow.fType & ~(MFT_BITMAP | MFT_SEPARATOR)) | MFT_STRING;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2396 mii.dwTypeData = pUIData->m_lpstrText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2397 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2398 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2399
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2400 ::SetMenuItemInfo(hMenu, nID, FALSE, &mii);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2401 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2402
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2403 static void UIUpdateToolBarElement(int nID, _AtlUpdateUIData* pUIData, HWND hWndToolBar)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2404 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2405 // Note: only handles enabled/disabled, checked state, and radio (press)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2406 ::SendMessage(hWndToolBar, TB_ENABLEBUTTON, nID, (LPARAM)(pUIData->m_wState & UPDUI_DISABLED) ? FALSE : TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2407 ::SendMessage(hWndToolBar, TB_CHECKBUTTON, nID, (LPARAM)(pUIData->m_wState & UPDUI_CHECKED) ? TRUE : FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2408 ::SendMessage(hWndToolBar, TB_INDETERMINATE, nID, (LPARAM)(pUIData->m_wState & UPDUI_CHECKED2) ? TRUE : FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2409 ::SendMessage(hWndToolBar, TB_PRESSBUTTON, nID, (LPARAM)(pUIData->m_wState & UPDUI_RADIO) ? TRUE : FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2410 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2411
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2412 static void UIUpdateStatusBarElement(int nID, _AtlUpdateUIData* pUIData, HWND hWndStatusBar)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2413 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2414 // Note: only handles text
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2415 if(pUIData->m_wState & UPDUI_TEXT)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2416 ::SendMessage(hWndStatusBar, SB_SETTEXT, nID, (LPARAM)pUIData->m_lpstrText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2417 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2418
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2419 static void UIUpdateChildWindow(int nID, _AtlUpdateUIData* pUIData, HWND hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2420 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2421 HWND hChild = ::GetDlgItem(hWnd, nID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2422
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2423 ::EnableWindow(hChild, (pUIData->m_wState & UPDUI_DISABLED) ? FALSE : TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2424 // for check and radio, assume that window is a button
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2425 int nCheck = BST_UNCHECKED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2426 if((pUIData->m_wState & UPDUI_CHECKED) || (pUIData->m_wState & UPDUI_RADIO))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2427 nCheck = BST_CHECKED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2428 else if(pUIData->m_wState & UPDUI_CHECKED2)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2429 nCheck = BST_INDETERMINATE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2430 ::SendMessage(hChild, BM_SETCHECK, nCheck, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2431 if(pUIData->m_wState & UPDUI_DEFAULT)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2432 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2433 DWORD dwRet = (DWORD)::SendMessage(hWnd, DM_GETDEFID, 0, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2434 if(HIWORD(dwRet) == DC_HASDEFID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2435 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2436 HWND hOldDef = ::GetDlgItem(hWnd, (int)(short)LOWORD(dwRet));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2437 // remove BS_DEFPUSHBUTTON
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2438 ::SendMessage(hOldDef, BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2439 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2440 ::SendMessage(hWnd, DM_SETDEFID, nID, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2441 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2442 if(pUIData->m_wState & UPDUI_TEXT)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2443 ::SetWindowText(hChild, pUIData->m_lpstrText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2444 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2445 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2446
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2447 template <class T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2448 class CUpdateUI : public CUpdateUIBase
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2449 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2450 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2451 CUpdateUI()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2452 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2453 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2454 (void)pT; // avoid level 4 warning
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2455 const _AtlUpdateUIMap* pMap = pT->GetUpdateUIMap();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2456 m_pUIMap = pMap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2457 ATLASSERT(m_pUIMap != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2458 int nCount = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2459 for( ; pMap->m_nID != (WORD)-1; nCount++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2460 pMap++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2461
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2462 // check for duplicates (debug only)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2463 #ifdef _DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2464 for(int i = 0; i < nCount; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2465 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2466 for(int j = 0; j < nCount; j++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2467 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2468 // shouldn't have duplicates in the update UI map
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2469 if(i != j)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2470 ATLASSERT(m_pUIMap[j].m_nID != m_pUIMap[i].m_nID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2471 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2472 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2473 #endif // _DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2474
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2475 ATLTRY(m_pUIData = new _AtlUpdateUIData[nCount]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2476 ATLASSERT(m_pUIData != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2477
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2478 if(m_pUIData != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2479 memset(m_pUIData, 0, sizeof(_AtlUpdateUIData) * nCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2480 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2481 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2482
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2483
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2484 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2485 // CDynamicUpdateUI - allows update elements to dynamically added and removed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2486 // in addition to a static update UI map
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2487
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2488 template <class T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2489 class CDynamicUpdateUI : public CUpdateUIBase
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2490 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2491 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2492 // Data members
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2493 ATL::CSimpleArray<_AtlUpdateUIMap> m_arrUIMap; // copy of the static UI data
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2494 ATL::CSimpleArray<_AtlUpdateUIData> m_arrUIData; // instance UI data
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2495
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2496 // Constructor/destructor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2497 CDynamicUpdateUI()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2498 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2499 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2500 (void)pT; // avoid level 4 warning
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2501 const _AtlUpdateUIMap* pMap = pT->GetUpdateUIMap();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2502 ATLASSERT(pMap != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2503
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2504 for(;;)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2505 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2506 BOOL bRet = m_arrUIMap.Add(*(_AtlUpdateUIMap*)pMap);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2507 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2508
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2509 if(bRet != FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2510 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2511 _AtlUpdateUIData data = { 0, NULL };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2512 bRet = m_arrUIData.Add(data);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2513 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2514 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2515
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2516 if(pMap->m_nID == (WORD)-1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2517 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2518
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2519 pMap++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2520 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2521
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2522 ATLASSERT(m_arrUIMap.GetSize() == m_arrUIData.GetSize());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2523
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2524 #ifdef _DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2525 // check for duplicates (debug only)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2526 for(int i = 0; i < m_arrUIMap.GetSize(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2527 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2528 for(int j = 0; j < m_arrUIMap.GetSize(); j++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2529 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2530 // shouldn't have duplicates in the update UI map
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2531 if(i != j)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2532 ATLASSERT(m_arrUIMap[j].m_nID != m_arrUIMap[i].m_nID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2533 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2534 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2535 #endif // _DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2536
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2537 // Set internal data pointers to point to the new data arrays
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2538 m_pUIMap = m_arrUIMap.m_aT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2539 m_pUIData = m_arrUIData.m_aT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2540 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2541
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2542 ~CDynamicUpdateUI()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2543 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2544 for(int i = 0; i < m_arrUIData.GetSize(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2545 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2546 if((m_arrUIData[i].m_wState & UPDUI_TEXT) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2547 delete [] m_arrUIData[i].m_lpstrText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2548 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2549
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2550 // Reset internal data pointers (memory will be released by CSimpleArray d-tor)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2551 m_pUIMap = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2552 m_pUIData = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2553 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2554
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2555 // Methods for dynamically adding and removing update elements
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2556 bool UIAddUpdateElement(WORD nID, WORD wType)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2557 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2558 // check for duplicates
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2559 for(int i = 0; i < m_arrUIMap.GetSize(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2560 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2561 // shouldn't have duplicates in the update UI map
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2562 ATLASSERT(m_arrUIMap[i].m_nID != nID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2563 if(m_arrUIMap[i].m_nID == nID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2564 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2565 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2566
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2567 bool bRetVal = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2568
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2569 // Add new end element
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2570 _AtlUpdateUIMap uumEnd = { (WORD)-1, 0 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2571 BOOL bRet = m_arrUIMap.Add(uumEnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2572 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2573
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2574 if(bRet != FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2575 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2576 _AtlUpdateUIData uud = { 0, NULL };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2577 bRet = m_arrUIData.Add(uud);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2578 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2579
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2580 // Set new data to the previous end element
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2581 if(bRet != FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2582 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2583 int nSize = m_arrUIMap.GetSize();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2584 _AtlUpdateUIMap uum = { nID, wType };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2585 m_arrUIMap.SetAtIndex(nSize - 2, uum);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2586 m_arrUIData.SetAtIndex(nSize - 2, uud);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2587
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2588 // Set internal data pointers again, just in case that memory moved
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2589 m_pUIMap = m_arrUIMap.m_aT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2590 m_pUIData = m_arrUIData.m_aT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2591
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2592 bRetVal = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2593 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2594 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2595
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2596 return bRetVal;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2597 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2598
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2599 bool UIRemoveUpdateElement(WORD nID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2600 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2601 bool bRetVal = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2602
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2603 for(int i = 0; i < m_arrUIMap.GetSize(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2604 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2605 if(m_arrUIMap[i].m_nID == nID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2606 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2607 if((m_arrUIData[i].m_wState & UPDUI_TEXT) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2608 delete [] m_arrUIData[i].m_lpstrText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2609
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2610 BOOL bRet = m_arrUIMap.RemoveAt(i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2611 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2612 bRet = m_arrUIData.RemoveAt(i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2613 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2614
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2615 bRetVal = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2616 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2617 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2618 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2619
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2620 return bRetVal;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2621 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2622 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2623
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2624
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2625 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2626 // CAutoUpdateUI : Automatic mapping of UI elements
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2627
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2628 template <class T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2629 class CAutoUpdateUI : public CDynamicUpdateUI<T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2630 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2631 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2632 LPCTSTR UIGetText(int nID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2633 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2634 for(int i = 0; i < this->m_arrUIMap.GetSize(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2635 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2636 if(this->m_arrUIMap[i].m_nID == nID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2637 return this->m_arrUIData[i].m_lpstrText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2638 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2639
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2640 return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2641 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2642
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2643 // Element
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2644 template <WORD t_wType>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2645 bool UIAddElement(UINT nID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2646 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2647 // check for existing UI map element
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2648 for(int i = 0; i < this->m_arrUIMap.GetSize(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2649 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2650 if(this->m_arrUIMap[i].m_nID == nID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2651 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2652 // set requested type
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2653 this->m_arrUIMap[i].m_wType |= t_wType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2654 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2655 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2656 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2657
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2658 // Add element to UI map with requested type
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2659 return this->UIAddUpdateElement((WORD)nID, t_wType);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2660 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2661
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2662 template <WORD t_wType>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2663 bool UIRemoveElement(UINT nID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2664 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2665 for(int i = 0; i < this->m_arrUIMap.GetSize(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2666 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2667 if(this->m_arrUIMap[i].m_nID == nID) // matching UI map element
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2668 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2669 WORD wType = this->m_arrUIMap[i].m_wType & ~t_wType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2670 if (wType != 0) // has other types
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2671 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2672 this->m_arrUIMap[i].m_wType = wType; // keep other types
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2673 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2674 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2675 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2676 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2677 return this->UIRemoveUpdateElement((WORD)nID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2678 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2679 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2680 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2681
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2682 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2683 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2684
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2685 // Menu
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2686 bool UIAddMenu(HMENU hMenu, bool bSetText = false)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2687 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2688 ATLASSERT(::IsMenu(hMenu));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2689 MENUITEMINFO mii = {sizeof(MENUITEMINFO), MIIM_TYPE | MIIM_ID | MIIM_SUBMENU};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2690
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2691 // Complete the UI map
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2692 for (INT uItem = 0; CMenuHandle(hMenu).GetMenuItemInfo(uItem, TRUE, &mii); uItem++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2693 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2694 if(mii.hSubMenu)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2695 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2696 // Add submenu to UI map
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2697 UIAddMenu(mii.hSubMenu, bSetText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2698 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2699 else if (mii.wID != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2700 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2701 // Add element to UI map
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2702 UIAddElement<CDynamicUpdateUI<T>::UPDUI_MENUPOPUP>(mii.wID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2703 if (bSetText)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2704 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2705 TCHAR sText[64] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2706 if (GetMenuString(hMenu, uItem, sText, 64, MF_BYPOSITION))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2707 this->UISetText(mii.wID, sText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2708 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2709 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2710 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2711
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2712 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2713 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2714
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2715 bool UIAddMenu(UINT uID, bool bSetText = false)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2716 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2717 CMenu menu;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2718 ATLVERIFY(menu.LoadMenu(uID));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2719 return UIAddMenu(menu, bSetText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2720 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2721
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2722 // ToolBar
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2723 bool UIAddToolBar(HWND hWndToolBar)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2724 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2725 ATLASSERT(::IsWindow(hWndToolBar));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2726 TBBUTTONINFO tbbi = { sizeof(TBBUTTONINFO), TBIF_COMMAND | TBIF_STYLE | TBIF_BYINDEX };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2727
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2728 // Add toolbar buttons
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2729 for (int uItem = 0; ::SendMessage(hWndToolBar, TB_GETBUTTONINFO, uItem, (LPARAM)&tbbi) != -1; uItem++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2730 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2731 if (tbbi.fsStyle ^ BTNS_SEP)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2732 UIAddElement<CDynamicUpdateUI<T>::UPDUI_TOOLBAR>(tbbi.idCommand);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2733 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2734
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2735 // Add embedded controls if any
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2736 if (::GetWindow(hWndToolBar, GW_CHILD))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2737 UIAddChildWindowContainer(hWndToolBar);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2738
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2739 return (CUpdateUIBase::UIAddToolBar(hWndToolBar) != FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2740 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2741
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2742 // Container
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2743 bool UIAddChildWindowContainer(HWND hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2744 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2745 ATLASSERT(::IsWindow(hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2746
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2747 // Add children controls if any
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2748 for (ATL::CWindow wCtl = ::GetWindow(hWnd, GW_CHILD); wCtl.IsWindow(); wCtl = wCtl.GetWindow(GW_HWNDNEXT))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2749 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2750 int id = wCtl.GetDlgCtrlID();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2751 if(id != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2752 UIAddElement<CDynamicUpdateUI<T>::UPDUI_CHILDWINDOW>(id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2753 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2754
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2755 return (CUpdateUIBase::UIAddChildWindowContainer(hWnd) != FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2756 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2757
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2758 // StatusBar
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2759 BOOL UIUpdateStatusBar(BOOL bForceUpdate = FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2760 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2761 if(!(this->m_wDirtyType & CDynamicUpdateUI<T>::UPDUI_STATUSBAR) && !bForceUpdate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2762 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2763
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2764 for(int i = 0; i < this->m_arrUIMap.GetSize(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2765 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2766 for(int e = 0; e < this->m_UIElements.GetSize(); e++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2767 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2768 if((this->m_UIElements[e].m_wType == CDynamicUpdateUI<T>::UPDUI_STATUSBAR) &&
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2769 (this->m_arrUIMap[i].m_wType & CDynamicUpdateUI<T>::UPDUI_STATUSBAR) &&
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2770 (this->m_arrUIData[i].m_wState & CDynamicUpdateUI<T>::UPDUI_STATUSBAR))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2771 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2772 this->UIUpdateStatusBarElement(this->m_arrUIMap[i].m_nID, &this->m_arrUIData[i], this->m_UIElements[e].m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2773 this->m_arrUIData[i].m_wState &= ~CDynamicUpdateUI<T>::UPDUI_STATUSBAR;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2774 if(this->m_arrUIData[i].m_wState & CDynamicUpdateUI<T>::UPDUI_TEXT)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2775 this->m_arrUIData[i].m_wState &= ~CDynamicUpdateUI<T>::UPDUI_TEXT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2776 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2777 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2778 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2779
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2780 this->m_wDirtyType &= ~CDynamicUpdateUI<T>::UPDUI_STATUSBAR;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2781 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2782 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2783
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2784 bool UIAddStatusBar(HWND hWndStatusBar, INT nPanes = 1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2785 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2786 ATLASSERT(::IsWindow(hWndStatusBar));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2787
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2788 // Add StatusBar panes
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2789 for (int iPane = 0; iPane < nPanes; iPane++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2790 UIAddElement<CDynamicUpdateUI<T>::UPDUI_STATUSBAR>(ID_DEFAULT_PANE + iPane);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2791
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2792 return (CUpdateUIBase::UIAddStatusBar(hWndStatusBar) != FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2793 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2794
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2795 // UI Map used if derived class has none
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2796 BEGIN_UPDATE_UI_MAP(CAutoUpdateUI)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2797 END_UPDATE_UI_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2798 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2799
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2800
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2801 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2802 // CDialogResize - provides support for resizing dialog controls
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2803 // (works for any window that has child controls)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2804
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2805 // Put CDialogResize in the list of base classes for a dialog (or even plain window),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2806 // then implement DLGRESIZE map by specifying controls and groups of control
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2807 // and using DLSZ_* values to specify how are they supposed to be resized.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2808 //
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2809 // Notes:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2810 // - Resizeable border (WS_THICKFRAME style) should be set in the dialog template
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2811 // for top level dialogs (popup or overlapped), so that users can resize the dialog.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2812 // - Some flags cannot be combined; for instance DLSZ_CENTER_X overrides DLSZ_SIZE_X,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2813 // DLSZ_SIZE_X overrides DLSZ_MOVE_X. X and Y flags can be combined.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2814 // - Order of controls is important - group controls are resized and moved based
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2815 // on the position of the previous control in a group.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2816
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2817 // dialog resize map macros
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2818 struct _AtlDlgResizeMap
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2819 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2820 int m_nCtlID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2821 DWORD m_dwResizeFlags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2822 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2823
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2824 #define BEGIN_DLGRESIZE_MAP(thisClass) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2825 static const WTL::_AtlDlgResizeMap* GetDlgResizeMap() \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2826 { \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2827 static const WTL::_AtlDlgResizeMap theMap[] = \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2828 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2829
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2830 #define END_DLGRESIZE_MAP() \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2831 { -1, 0 }, \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2832 }; \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2833 return theMap; \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2834 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2835
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2836 #define DLGRESIZE_CONTROL(id, flags) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2837 { id, flags },
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2838
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2839 #define BEGIN_DLGRESIZE_GROUP() \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2840 { -1, _DLSZ_BEGIN_GROUP },
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2841
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2842 #define END_DLGRESIZE_GROUP() \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2843 { -1, _DLSZ_END_GROUP },
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2844
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2845
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2846 template <class T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2847 class CDialogResize
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2848 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2849 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2850 // Data declarations and members
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2851 enum
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2852 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2853 DLSZ_SIZE_X = 0x00000001,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2854 DLSZ_SIZE_Y = 0x00000002,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2855 DLSZ_MOVE_X = 0x00000004,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2856 DLSZ_MOVE_Y = 0x00000008,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2857 DLSZ_REPAINT = 0x00000010,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2858 DLSZ_CENTER_X = 0x00000020,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2859 DLSZ_CENTER_Y = 0x00000040,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2860
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2861 // internal use only
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2862 _DLSZ_BEGIN_GROUP = 0x00001000,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2863 _DLSZ_END_GROUP = 0x00002000,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2864 _DLSZ_GRIPPER = 0x00004000
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2865 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2866
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2867 struct _AtlDlgResizeData
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2868 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2869 int m_nCtlID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2870 DWORD m_dwResizeFlags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2871 RECT m_rect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2872
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2873 int GetGroupCount() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2874 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2875 return (int)LOBYTE(HIWORD(m_dwResizeFlags));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2876 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2877
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2878 void SetGroupCount(int nCount)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2879 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2880 ATLASSERT((nCount > 0) && (nCount < 256));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2881 DWORD dwCount = (DWORD)MAKELONG(0, MAKEWORD(nCount, 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2882 m_dwResizeFlags &= 0xFF00FFFF;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2883 m_dwResizeFlags |= dwCount;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2884 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2885
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2886 bool operator ==(const _AtlDlgResizeData& r) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2887 { return ((m_nCtlID == r.m_nCtlID) && (m_dwResizeFlags == r.m_dwResizeFlags)); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2888 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2889
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2890 ATL::CSimpleArray<_AtlDlgResizeData> m_arrData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2891 SIZE m_sizeDialog;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2892 POINT m_ptMinTrackSize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2893 bool m_bGripper;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2894
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2895
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2896 // Constructor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2897 CDialogResize() : m_bGripper(false)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2898 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2899 m_sizeDialog.cx = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2900 m_sizeDialog.cy = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2901 m_ptMinTrackSize.x = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2902 m_ptMinTrackSize.y = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2903 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2904
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2905 // Operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2906 void DlgResize_Init(bool bAddGripper = true, bool bUseMinTrackSize = true, DWORD dwForceStyle = WS_CLIPCHILDREN)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2907 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2908 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2909 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2910
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2911 DWORD dwStyle = pT->GetStyle();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2912
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2913 #ifdef _DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2914 // Debug only: Check if top level dialogs have a resizeable border.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2915 if(((dwStyle & WS_CHILD) == 0) && ((dwStyle & WS_THICKFRAME) == 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2916 ATLTRACE2(atlTraceUI, 0, _T("DlgResize_Init - warning: top level dialog without the WS_THICKFRAME style - user cannot resize it\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2917 #endif // _DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2918
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2919 // Force specified styles (default WS_CLIPCHILDREN reduces flicker)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2920 if((dwStyle & dwForceStyle) != dwForceStyle)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2921 pT->ModifyStyle(0, dwForceStyle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2922
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2923 // Adding this style removes an empty icon that dialogs with WS_THICKFRAME have.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2924 // Setting icon to NULL is required when XP themes are active.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2925 // Note: This will not prevent adding an icon for the dialog using SetIcon()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2926 if((dwStyle & WS_CHILD) == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2927 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2928 pT->ModifyStyleEx(0, WS_EX_DLGMODALFRAME);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2929 if(pT->GetIcon(FALSE) == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2930 pT->SetIcon(NULL, FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2931 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2932
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2933 // Cleanup in case of multiple initialization
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2934 // block: first check for the gripper control, destroy it if needed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2935 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2936 ATL::CWindow wndGripper = pT->GetDlgItem(ATL_IDW_STATUS_BAR);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2937 if(wndGripper.IsWindow() && (m_arrData.GetSize() > 0) && (m_arrData[0].m_dwResizeFlags & _DLSZ_GRIPPER) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2938 wndGripper.DestroyWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2939 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2940 // clear out everything else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2941 m_arrData.RemoveAll();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2942 m_sizeDialog.cx = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2943 m_sizeDialog.cy = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2944 m_ptMinTrackSize.x = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2945 m_ptMinTrackSize.y = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2946
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2947 // Get initial dialog client size
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2948 RECT rectDlg = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2949 pT->GetClientRect(&rectDlg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2950 m_sizeDialog.cx = rectDlg.right;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2951 m_sizeDialog.cy = rectDlg.bottom;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2952
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2953 // Create gripper if requested
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2954 m_bGripper = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2955 if(bAddGripper)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2956 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2957 // shouldn't exist already
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2958 ATLASSERT(!pT->GetDlgItem(ATL_IDW_STATUS_BAR).IsWindow());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2959 if(!pT->GetDlgItem(ATL_IDW_STATUS_BAR).IsWindow())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2960 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2961 ATL::CWindow wndGripper;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2962 wndGripper.Create(_T("SCROLLBAR"), pT->m_hWnd, rectDlg, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | SBS_SIZEBOX | SBS_SIZEGRIP | SBS_SIZEBOXBOTTOMRIGHTALIGN, 0, ATL_IDW_STATUS_BAR);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2963 ATLASSERT(wndGripper.IsWindow());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2964 if(wndGripper.IsWindow())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2965 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2966 m_bGripper = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2967 RECT rectCtl = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2968 wndGripper.GetWindowRect(&rectCtl);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2969 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rectCtl, 2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2970 _AtlDlgResizeData data = { ATL_IDW_STATUS_BAR, DLSZ_MOVE_X | DLSZ_MOVE_Y | DLSZ_REPAINT | _DLSZ_GRIPPER, { rectCtl.left, rectCtl.top, rectCtl.right, rectCtl.bottom } };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2971 m_arrData.Add(data);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2972 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2973 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2974 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2975
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2976 // Get min track position if requested
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2977 if(bUseMinTrackSize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2978 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2979 if((dwStyle & WS_CHILD) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2980 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2981 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2982 pT->GetClientRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2983 m_ptMinTrackSize.x = rect.right - rect.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2984 m_ptMinTrackSize.y = rect.bottom - rect.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2985 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2986 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2987 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2988 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2989 pT->GetWindowRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2990 m_ptMinTrackSize.x = rect.right - rect.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2991 m_ptMinTrackSize.y = rect.bottom - rect.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2992 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2993 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2994
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2995 // Walk the map and initialize data
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2996 const _AtlDlgResizeMap* pMap = pT->GetDlgResizeMap();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2997 ATLASSERT(pMap != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2998 int nGroupStart = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2999 for(int nCount = 1; !((pMap->m_nCtlID == -1) && (pMap->m_dwResizeFlags == 0)); nCount++, pMap++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3000 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3001 if(pMap->m_nCtlID == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3002 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3003 switch(pMap->m_dwResizeFlags)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3004 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3005 case _DLSZ_BEGIN_GROUP:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3006 ATLASSERT(nGroupStart == -1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3007 nGroupStart = m_arrData.GetSize();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3008 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3009 case _DLSZ_END_GROUP:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3010 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3011 ATLASSERT(nGroupStart != -1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3012 int nGroupCount = m_arrData.GetSize() - nGroupStart;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3013 m_arrData[nGroupStart].SetGroupCount(nGroupCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3014 nGroupStart = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3015 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3016 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3017 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3018 ATLASSERT(FALSE && _T("Invalid DLGRESIZE Map Entry"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3019 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3020 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3021 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3022 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3023 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3024 // this ID conflicts with the default gripper one
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3025 ATLASSERT(m_bGripper ? (pMap->m_nCtlID != ATL_IDW_STATUS_BAR) : TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3026
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3027 ATL::CWindow ctl = pT->GetDlgItem(pMap->m_nCtlID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3028 ATLASSERT(ctl.IsWindow());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3029 RECT rectCtl = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3030 ctl.GetWindowRect(&rectCtl);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3031 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rectCtl, 2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3032
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3033 DWORD dwGroupFlag = ((nGroupStart != -1) && (m_arrData.GetSize() == nGroupStart)) ? _DLSZ_BEGIN_GROUP : 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3034 _AtlDlgResizeData data = { pMap->m_nCtlID, pMap->m_dwResizeFlags | dwGroupFlag, { rectCtl.left, rectCtl.top, rectCtl.right, rectCtl.bottom } };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3035 m_arrData.Add(data);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3036 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3037 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3038 ATLASSERT((nGroupStart == -1) && _T("No End Group Entry in the DLGRESIZE Map"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3039 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3040
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3041 void DlgResize_UpdateLayout(int cxWidth, int cyHeight)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3042 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3043 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3044 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3045
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3046 // Restrict minimum size if requested
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3047 if(((pT->GetStyle() & WS_CHILD) != 0) && (m_ptMinTrackSize.x != -1) && (m_ptMinTrackSize.y != -1))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3048 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3049 if(cxWidth < m_ptMinTrackSize.x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3050 cxWidth = m_ptMinTrackSize.x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3051 if(cyHeight < m_ptMinTrackSize.y)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3052 cyHeight = m_ptMinTrackSize.y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3053 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3054
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3055 BOOL bVisible = pT->IsWindowVisible();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3056 if(bVisible)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3057 pT->SetRedraw(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3058
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3059 for(int i = 0; i < m_arrData.GetSize(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3060 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3061 if((m_arrData[i].m_dwResizeFlags & _DLSZ_BEGIN_GROUP) != 0) // start of a group
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3062 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3063 int nGroupCount = m_arrData[i].GetGroupCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3064 ATLASSERT((nGroupCount > 0) && ((i + nGroupCount - 1) < m_arrData.GetSize()));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3065 RECT rectGroup = m_arrData[i].m_rect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3066
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3067 int j = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3068 for(j = 1; j < nGroupCount; j++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3069 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3070 rectGroup.left = __min(rectGroup.left, m_arrData[i + j].m_rect.left);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3071 rectGroup.top = __min(rectGroup.top, m_arrData[i + j].m_rect.top);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3072 rectGroup.right = __max(rectGroup.right, m_arrData[i + j].m_rect.right);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3073 rectGroup.bottom = __max(rectGroup.bottom, m_arrData[i + j].m_rect.bottom);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3074 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3075
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3076 for(j = 0; j < nGroupCount; j++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3077 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3078 _AtlDlgResizeData* pDataPrev = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3079 if(j > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3080 pDataPrev = &(m_arrData[i + j - 1]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3081 pT->DlgResize_PositionControl(cxWidth, cyHeight, rectGroup, m_arrData[i + j], true, pDataPrev);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3082 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3083
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3084 i += nGroupCount - 1; // increment to skip all group controls
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3085 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3086 else // one control entry
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3087 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3088 RECT rectGroup = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3089 pT->DlgResize_PositionControl(cxWidth, cyHeight, rectGroup, m_arrData[i], false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3090 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3091 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3092
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3093 if(bVisible)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3094 pT->SetRedraw(TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3095
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3096 pT->RedrawWindow(NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3097 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3098
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3099 // Message map and handlers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3100 BEGIN_MSG_MAP(CDialogResize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3101 MESSAGE_HANDLER(WM_SIZE, OnSize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3102 MESSAGE_HANDLER(WM_GETMINMAXINFO, OnGetMinMaxInfo)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3103 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3104
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3105 LRESULT OnSize(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3106 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3107 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3108 if(m_bGripper)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3109 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3110 ATL::CWindow wndGripper = pT->GetDlgItem(ATL_IDW_STATUS_BAR);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3111 if(wParam == SIZE_MAXIMIZED)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3112 wndGripper.ShowWindow(SW_HIDE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3113 else if(wParam == SIZE_RESTORED)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3114 wndGripper.ShowWindow(SW_SHOW);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3115 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3116 if(wParam != SIZE_MINIMIZED)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3117 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3118 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3119 pT->DlgResize_UpdateLayout(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3120 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3121 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3122 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3123
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3124 LRESULT OnGetMinMaxInfo(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3125 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3126 if((m_ptMinTrackSize.x != -1) && (m_ptMinTrackSize.y != -1))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3127 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3128 LPMINMAXINFO lpMMI = (LPMINMAXINFO)lParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3129 lpMMI->ptMinTrackSize = m_ptMinTrackSize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3130 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3131 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3132 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3133
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3134 // Implementation
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3135 bool DlgResize_PositionControl(int cxWidth, int cyHeight, RECT& rectGroup, _AtlDlgResizeData& data, bool bGroup,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3136 _AtlDlgResizeData* pDataPrev = NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3137 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3138 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3139 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3140 ATL::CWindow ctl;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3141 RECT rectCtl = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3142
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3143 ctl = pT->GetDlgItem(data.m_nCtlID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3144 if(!ctl.GetWindowRect(&rectCtl))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3145 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3146 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rectCtl, 2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3147
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3148 if(bGroup)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3149 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3150 if((data.m_dwResizeFlags & DLSZ_CENTER_X) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3151 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3152 int cxRight = rectGroup.right + cxWidth - m_sizeDialog.cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3153 int cxCtl = data.m_rect.right - data.m_rect.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3154 rectCtl.left = rectGroup.left + (cxRight - rectGroup.left - cxCtl) / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3155 rectCtl.right = rectCtl.left + cxCtl;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3156 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3157 else if((data.m_dwResizeFlags & (DLSZ_SIZE_X | DLSZ_MOVE_X)) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3158 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3159 rectCtl.left = rectGroup.left + ::MulDiv(data.m_rect.left - rectGroup.left, rectGroup.right - rectGroup.left + (cxWidth - m_sizeDialog.cx), rectGroup.right - rectGroup.left);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3160
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3161 if((data.m_dwResizeFlags & DLSZ_SIZE_X) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3162 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3163 rectCtl.right = rectGroup.left + ::MulDiv(data.m_rect.right - rectGroup.left, rectGroup.right - rectGroup.left + (cxWidth - m_sizeDialog.cx), rectGroup.right - rectGroup.left);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3164
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3165 if(pDataPrev != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3166 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3167 ATL::CWindow ctlPrev = pT->GetDlgItem(pDataPrev->m_nCtlID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3168 RECT rcPrev = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3169 ctlPrev.GetWindowRect(&rcPrev);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3170 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rcPrev, 2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3171 int dxAdjust = (rectCtl.left - rcPrev.right) - (data.m_rect.left - pDataPrev->m_rect.right);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3172 rcPrev.right += dxAdjust;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3173 ctlPrev.SetWindowPos(NULL, &rcPrev, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3174 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3175 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3176 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3177 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3178 rectCtl.right = rectCtl.left + (data.m_rect.right - data.m_rect.left);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3179 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3180 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3181
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3182 if((data.m_dwResizeFlags & DLSZ_CENTER_Y) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3183 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3184 int cyBottom = rectGroup.bottom + cyHeight - m_sizeDialog.cy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3185 int cyCtl = data.m_rect.bottom - data.m_rect.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3186 rectCtl.top = rectGroup.top + (cyBottom - rectGroup.top - cyCtl) / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3187 rectCtl.bottom = rectCtl.top + cyCtl;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3188 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3189 else if((data.m_dwResizeFlags & (DLSZ_SIZE_Y | DLSZ_MOVE_Y)) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3190 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3191 rectCtl.top = rectGroup.top + ::MulDiv(data.m_rect.top - rectGroup.top, rectGroup.bottom - rectGroup.top + (cyHeight - m_sizeDialog.cy), rectGroup.bottom - rectGroup.top);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3192
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3193 if((data.m_dwResizeFlags & DLSZ_SIZE_Y) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3194 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3195 rectCtl.bottom = rectGroup.top + ::MulDiv(data.m_rect.bottom - rectGroup.top, rectGroup.bottom - rectGroup.top + (cyHeight - m_sizeDialog.cy), rectGroup.bottom - rectGroup.top);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3196
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3197 if(pDataPrev != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3198 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3199 ATL::CWindow ctlPrev = pT->GetDlgItem(pDataPrev->m_nCtlID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3200 RECT rcPrev = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3201 ctlPrev.GetWindowRect(&rcPrev);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3202 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rcPrev, 2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3203 int dxAdjust = (rectCtl.top - rcPrev.bottom) - (data.m_rect.top - pDataPrev->m_rect.bottom);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3204 rcPrev.bottom += dxAdjust;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3205 ctlPrev.SetWindowPos(NULL, &rcPrev, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3206 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3207 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3208 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3209 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3210 rectCtl.bottom = rectCtl.top + (data.m_rect.bottom - data.m_rect.top);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3211 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3212 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3213 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3214 else // no group
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3215 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3216 if((data.m_dwResizeFlags & DLSZ_CENTER_X) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3217 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3218 int cxCtl = data.m_rect.right - data.m_rect.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3219 rectCtl.left = (cxWidth - cxCtl) / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3220 rectCtl.right = rectCtl.left + cxCtl;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3221 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3222 else if((data.m_dwResizeFlags & (DLSZ_SIZE_X | DLSZ_MOVE_X)) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3223 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3224 rectCtl.right = data.m_rect.right + (cxWidth - m_sizeDialog.cx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3225
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3226 if((data.m_dwResizeFlags & DLSZ_MOVE_X) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3227 rectCtl.left = rectCtl.right - (data.m_rect.right - data.m_rect.left);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3228 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3229
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3230 if((data.m_dwResizeFlags & DLSZ_CENTER_Y) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3231 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3232 int cyCtl = data.m_rect.bottom - data.m_rect.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3233 rectCtl.top = (cyHeight - cyCtl) / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3234 rectCtl.bottom = rectCtl.top + cyCtl;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3235 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3236 else if((data.m_dwResizeFlags & (DLSZ_SIZE_Y | DLSZ_MOVE_Y)) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3237 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3238 rectCtl.bottom = data.m_rect.bottom + (cyHeight - m_sizeDialog.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3239
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3240 if((data.m_dwResizeFlags & DLSZ_MOVE_Y) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3241 rectCtl.top = rectCtl.bottom - (data.m_rect.bottom - data.m_rect.top);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3242 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3243 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3244
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3245 if((data.m_dwResizeFlags & DLSZ_REPAINT) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3246 ctl.Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3247
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3248 if((data.m_dwResizeFlags & (DLSZ_SIZE_X | DLSZ_SIZE_Y | DLSZ_MOVE_X | DLSZ_MOVE_Y | DLSZ_REPAINT | DLSZ_CENTER_X | DLSZ_CENTER_Y)) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3249 ctl.SetWindowPos(NULL, &rectCtl, SWP_NOZORDER | SWP_NOACTIVATE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3250
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3251 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3252 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3253 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3254
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3255
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3256 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3257 // CDynamicDialogLayout - support for dialog dynamic layout resource info
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3258 // (AFX_DIALOG_LAYOUT) in VS2015 and higher
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3259
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3260 #if (_MSC_VER >= 1900)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3261
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3262 template<class T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3263 class CDynamicDialogLayout
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3264 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3265 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3266 // Data declarations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3267 struct _AtlDynamicLayoutData
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3268 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3269 HWND m_hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3270 char m_nMoveRatioX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3271 char m_nMoveRatioY;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3272 char m_nSizeRatioX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3273 char m_nSizeRatioY;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3274 RECT m_rcInit;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3275 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3276
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3277 // Data members
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3278 ATL::CSimpleArray<_AtlDynamicLayoutData> m_arrLayoutData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3279 SIZE m_szParentInit;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3280 POINT m_ptMinTrackSize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3281 bool m_bGripper;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3282
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3283 // Constructor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3284 CDynamicDialogLayout() : m_bGripper(false)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3285 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3286 m_szParentInit.cx = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3287 m_szParentInit.cy = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3288 m_ptMinTrackSize.x = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3289 m_ptMinTrackSize.y = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3290 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3291
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3292 // Methods
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3293 void InitDynamicLayout(bool bAddGripper = true, bool bMinTrackSize = true)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3294 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3295 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3296 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3297
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3298 // Cleanup in case of multiple initialization
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3299 // block: first check for the gripper control, destroy it if needed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3300 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3301 ATL::CWindow wndGripper = pT->GetDlgItem(ATL_IDW_STATUS_BAR);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3302 if(wndGripper.IsWindow() != FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3303 wndGripper.DestroyWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3304 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3305 // clear out everything else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3306 m_arrLayoutData.RemoveAll();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3307 m_ptMinTrackSize.x = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3308 m_ptMinTrackSize.y = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3309 m_szParentInit.cx = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3310 m_szParentInit.cy = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3311 m_bGripper = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3312
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3313 CResource rcLayout;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3314 if(rcLayout.Load(_T("AFX_DIALOG_LAYOUT"), pT->IDD))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3315 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3316 int nCount = rcLayout.GetSize() / sizeof(WORD);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3317 if(nCount > 1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3318 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3319 RECT rcParent = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3320 pT->GetWindowRect(&rcParent);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3321 m_szParentInit.cx = rcParent.right - rcParent.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3322 m_szParentInit.cy = rcParent.bottom - rcParent.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3323
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3324 WORD* pnData = (WORD*)rcLayout.Lock();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3325 WORD wVersion = *pnData; // AFX_DIALOG_LAYOUT version
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3326 ATLASSERT(wVersion == 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3327 if(wVersion == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3328 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3329 pnData++; // skip version
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3330 ATL::CWindow wndChild = pT->GetWindow(GW_CHILD);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3331 for(int i = 0; (i < nCount) && (wndChild.m_hWnd != NULL); i += 4)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3332 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3333 char nMoveRatioX = _GetDataPct(pnData[i]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3334 char nMoveRatioY = _GetDataPct(pnData[i + 1]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3335 char nSizeRatioX = _GetDataPct(pnData[i + 2]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3336 char nSizeRatioY = _GetDataPct(pnData[i + 3]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3337
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3338 bool bValid = ((nMoveRatioX != -1) && (nMoveRatioY != -1) && (nSizeRatioX != -1) && (nSizeRatioY != -1));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3339 bool bAction = ((nMoveRatioX != 0) || (nMoveRatioY != 0) || (nSizeRatioX != 0) || (nSizeRatioY != 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3340 if(bValid && bAction)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3341 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3342 _AtlDynamicLayoutData LayoutData = { wndChild.m_hWnd, nMoveRatioX, nMoveRatioY, nSizeRatioX, nSizeRatioY };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3343 wndChild.GetWindowRect(&LayoutData.m_rcInit);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3344 pT->ScreenToClient(&LayoutData.m_rcInit);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3345 m_arrLayoutData.Add(LayoutData);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3346 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3347
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3348 wndChild = wndChild.GetWindow(GW_HWNDNEXT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3349 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3350 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3351
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3352 rcLayout.Release();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3353 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3354 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3355
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3356 if(bAddGripper)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3357 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3358 RECT rcDialog = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3359 pT->GetClientRect(&rcDialog);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3360
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3361 ATL::CWindow wndGripper = pT->GetDlgItem(ATL_IDW_STATUS_BAR);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3362 if(wndGripper.m_hWnd != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3363 wndGripper.DestroyWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3364
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3365 wndGripper.Create(_T("SCROLLBAR"), pT->m_hWnd, rcDialog, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | SBS_SIZEBOX | SBS_SIZEGRIP | SBS_SIZEBOXBOTTOMRIGHTALIGN, 0, ATL_IDW_STATUS_BAR);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3366 ATLASSERT(wndGripper.m_hWnd != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3367 if(wndGripper.m_hWnd != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3368 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3369 m_bGripper = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3370 _AtlDynamicLayoutData LayoutData = { wndGripper.m_hWnd, 100, 100, 0, 0 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3371 wndGripper.GetWindowRect(&LayoutData.m_rcInit);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3372 pT->ScreenToClient(&LayoutData.m_rcInit);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3373 m_arrLayoutData.Add(LayoutData);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3374 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3375 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3376
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3377 if(bMinTrackSize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3378 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3379 RECT rcMinTrack = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3380 if((pT->GetStyle() & WS_CHILD) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3381 pT->GetClientRect(&rcMinTrack);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3382 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3383 pT->GetWindowRect(&rcMinTrack);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3384
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3385 m_ptMinTrackSize.x = rcMinTrack.right - rcMinTrack.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3386 m_ptMinTrackSize.y = rcMinTrack.bottom - rcMinTrack.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3387 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3388 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3389
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3390 void UpdateDynamicLayout()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3391 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3392 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3393 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3394
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3395 int nCount = m_arrLayoutData.GetSize();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3396 if(nCount == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3397 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3398
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3399 RECT rcParent = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3400 pT->GetWindowRect(&rcParent);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3401
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3402 int nDeltaWidth = rcParent.right - rcParent.left - m_szParentInit.cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3403 int nDeltaHeight = rcParent.bottom - rcParent.top - m_szParentInit.cy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3404
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3405 HDWP hDwp = ::BeginDeferWindowPos(nCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3406
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3407 for(int i = 0; i < nCount; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3408 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3409 _AtlDynamicLayoutData& LayoutData = m_arrLayoutData[i];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3410
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3411 ATLASSERT(::IsWindow(LayoutData.m_hWnd) != FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3412
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3413 int nID = ::GetDlgCtrlID(LayoutData.m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3414 UINT nFlags = (SWP_NOMOVE | SWP_NOSIZE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3415 RECT rcItem = LayoutData.m_rcInit;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3416
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3417 if(((nID == ATL_IDW_STATUS_BAR) || (nDeltaWidth >= 0)) && (LayoutData.m_nMoveRatioX != 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3418 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3419 rcItem.left += ::MulDiv(nDeltaWidth, LayoutData.m_nMoveRatioX, 100);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3420 rcItem.right += ::MulDiv(nDeltaWidth, LayoutData.m_nMoveRatioX, 100);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3421 nFlags &= ~SWP_NOMOVE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3422 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3423
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3424 if(((nID == ATL_IDW_STATUS_BAR) || (nDeltaHeight >= 0)) && (LayoutData.m_nMoveRatioY != 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3425 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3426 rcItem.top += ::MulDiv(nDeltaHeight, LayoutData.m_nMoveRatioY, 100);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3427 rcItem.bottom += ::MulDiv(nDeltaHeight, LayoutData.m_nMoveRatioY, 100);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3428 nFlags &= ~SWP_NOMOVE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3429 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3430
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3431 if((nDeltaWidth >= 0) && (LayoutData.m_nSizeRatioX != 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3432 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3433 rcItem.right += ::MulDiv(nDeltaWidth, LayoutData.m_nSizeRatioX, 100);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3434 nFlags &= ~SWP_NOSIZE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3435 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3436
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3437 if((nDeltaHeight >= 0) && (LayoutData.m_nSizeRatioY != 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3438 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3439 rcItem.bottom += ::MulDiv(nDeltaHeight, LayoutData.m_nSizeRatioY, 100);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3440 nFlags &= ~SWP_NOSIZE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3441 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3442
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3443 if(nFlags != (SWP_NOMOVE | SWP_NOSIZE))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3444 ::DeferWindowPos(hDwp, LayoutData.m_hWnd, NULL, rcItem.left, rcItem.top, rcItem.right - rcItem.left, rcItem.bottom - rcItem.top, nFlags | SWP_NOZORDER | SWP_NOREPOSITION | SWP_NOACTIVATE | SWP_NOCOPYBITS);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3445 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3446
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3447 ::EndDeferWindowPos(hDwp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3448 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3449
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3450 // Message map and handlers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3451 BEGIN_MSG_MAP(CDynamicDialogLayout)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3452 MESSAGE_HANDLER(WM_SIZE, OnSize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3453 MESSAGE_HANDLER(WM_GETMINMAXINFO, OnGetMinMaxInfo)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3454 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3455
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3456 LRESULT OnSize(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3457 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3458 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3459
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3460 if(m_bGripper)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3461 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3462 ATL::CWindow wndGripper = pT->GetDlgItem(ATL_IDW_STATUS_BAR);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3463 if(wndGripper.m_hWnd != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3464 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3465 if(wParam == SIZE_MAXIMIZED)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3466 wndGripper.ShowWindow(SW_HIDE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3467 else if(wParam == SIZE_RESTORED)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3468 wndGripper.ShowWindow(SW_SHOW);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3469 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3470 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3471
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3472 if(wParam != SIZE_MINIMIZED)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3473 pT->UpdateDynamicLayout();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3474
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3475 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3476 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3477
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3478 LRESULT OnGetMinMaxInfo(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3479 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3480 if((m_ptMinTrackSize.x != -1) && (m_ptMinTrackSize.y != -1))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3481 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3482 LPMINMAXINFO lpMMI = (LPMINMAXINFO)lParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3483 lpMMI->ptMinTrackSize = m_ptMinTrackSize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3484 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3485
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3486 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3487 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3488
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3489 // Implementation
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3490 char _GetDataPct(WORD wResData)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3491 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3492 ATLASSERT((wResData >= 0) && (wResData <= 100));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3493 char nPct = (char)LOBYTE(wResData);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3494 if((nPct < 0) || (nPct > 100))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3495 nPct = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3496
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3497 return nPct;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3498 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3499 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3500
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3501 #endif // (_MSC_VER >= 1900)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3502
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3503
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3504 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3505 // CDoubleBufferImpl - Provides double-buffer painting support to any window
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3506
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3507 template <class T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3508 class CDoubleBufferImpl
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3509 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3510 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3511 // Overrideables
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3512 void DoPaint(CDCHandle /*dc*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3513 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3514 // must be implemented in a derived class
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3515 ATLASSERT(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3516 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3517
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3518 // Message map and handlers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3519 BEGIN_MSG_MAP(CDoubleBufferImpl)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3520 MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3521 MESSAGE_HANDLER(WM_PAINT, OnPaint)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3522 MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3523 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3524
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3525 LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3526 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3527 return 1; // no background painting needed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3528 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3529
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3530 LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3531 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3532 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3533 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3534
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3535 if(wParam != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3536 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3537 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3538 pT->GetClientRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3539 CMemoryDC dcMem((HDC)wParam, rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3540 pT->DoPaint(dcMem.m_hDC);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3541 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3542 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3543 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3544 CPaintDC dc(pT->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3545 CMemoryDC dcMem(dc.m_hDC, dc.m_ps.rcPaint);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3546 pT->DoPaint(dcMem.m_hDC);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3547 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3548
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3549 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3550 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3551 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3552
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3553
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3554 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3555 // CDoubleBufferWindowImpl - Implements a double-buffer painting window
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3556
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3557 template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3558 class ATL_NO_VTABLE CDoubleBufferWindowImpl : public ATL::CWindowImpl< T, TBase, TWinTraits >, public CDoubleBufferImpl< T >
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3559 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3560 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3561 BEGIN_MSG_MAP(CDoubleBufferWindowImpl)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3562 CHAIN_MSG_MAP(CDoubleBufferImpl< T >)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3563 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3564 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3565
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3566
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3567 // command bar support
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3568 #if !defined(__ATLCTRLW_H__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3569 #undef CBRM_GETMENU
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3570 #undef CBRM_TRACKPOPUPMENU
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3571 #undef CBRM_GETCMDBAR
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3572 #undef CBRPOPUPMENU
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3573 #endif // !defined(__ATLCTRLW_H__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3574
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3575 } // namespace WTL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3576
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3577 #endif // __ATLFRAME_H__