]> git.sesse.net Git - casparcg/blob - WTL80/include/atlwinx.h
2.0.2: INFO TEMPLATE works on both compressed and uncompressed templates.
[casparcg] / WTL80 / include / atlwinx.h
1 // Windows Template Library - WTL version 8.0\r
2 // Copyright (C) Microsoft Corporation. All rights reserved.\r
3 //\r
4 // This file is a part of the Windows Template Library.\r
5 // The use and distribution terms for this software are covered by the\r
6 // Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)\r
7 // which can be found in the file CPL.TXT at the root of this distribution.\r
8 // By using this software in any fashion, you are agreeing to be bound by\r
9 // the terms of this license. You must not remove this notice, or\r
10 // any other, from this software.\r
11 \r
12 #ifndef __ATLWINX_H__\r
13 #define __ATLWINX_H__\r
14 \r
15 #pragma once\r
16 \r
17 #ifndef __cplusplus\r
18         #error ATL requires C++ compilation (use a .cpp suffix)\r
19 #endif\r
20 \r
21 #ifndef __ATLAPP_H__\r
22         #error atlwinx.h requires atlapp.h to be included first\r
23 #endif\r
24 \r
25 #if (_ATL_VER >= 0x0700)\r
26   #include <atlwin.h>\r
27 #endif // (_ATL_VER >= 0x0700)\r
28 \r
29 \r
30 ///////////////////////////////////////////////////////////////////////////////\r
31 // Classes in this file:\r
32 //\r
33 // _U_RECT\r
34 // _U_MENUorID\r
35 // _U_STRINGorID\r
36 \r
37 \r
38 ///////////////////////////////////////////////////////////////////////////////\r
39 // Command Chaining Macros\r
40 \r
41 #define CHAIN_COMMANDS(theChainClass) \\r
42         if(uMsg == WM_COMMAND) \\r
43                 CHAIN_MSG_MAP(theChainClass)\r
44 \r
45 #define CHAIN_COMMANDS_ALT(theChainClass, msgMapID) \\r
46         if(uMsg == WM_COMMAND) \\r
47                 CHAIN_MSG_MAP_ALT(theChainClass, msgMapID)\r
48 \r
49 #define CHAIN_COMMANDS_MEMBER(theChainMember) \\r
50         if(uMsg == WM_COMMAND) \\r
51                 CHAIN_MSG_MAP_MEMBER(theChainMember)\r
52 \r
53 #define CHAIN_COMMANDS_ALT_MEMBER(theChainMember, msgMapID) \\r
54         if(uMsg == WM_COMMAND) \\r
55                 CHAIN_MSG_MAP_ALT_MEMBER(theChainMember, msgMapID)\r
56 \r
57 \r
58 ///////////////////////////////////////////////////////////////////////////////\r
59 // Macros for parent message map to selectively reflect control messages\r
60 \r
61 // NOTE: ReflectNotifications is a member of ATL's CWindowImplRoot\r
62 //  (and overridden in 2 cases - CContainedWindowT and CAxHostWindow)\r
63 //  Since we can't modify ATL, we'll provide the needed additions\r
64 //  in a separate function (that is not a member of CWindowImplRoot)\r
65 \r
66 namespace WTL\r
67 {\r
68 \r
69 inline LRESULT WtlReflectNotificationsFiltered(HWND hWndParent, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled,\r
70                                                UINT uMsgFilter = WM_NULL, UINT_PTR idFromFilter = 0, HWND hWndChildFilter = NULL)\r
71 {\r
72         if((uMsgFilter != WM_NULL) && (uMsgFilter != uMsg))\r
73         {\r
74                 // The notification message doesn't match the filter.\r
75                 bHandled = FALSE;\r
76                 return 1;\r
77         }\r
78 \r
79         HWND hWndChild = NULL;\r
80         UINT_PTR idFrom = 0;\r
81 \r
82         switch(uMsg)\r
83         {\r
84         case WM_COMMAND:\r
85                 if(lParam != NULL)      // not from a menu\r
86                 {\r
87                         hWndChild = (HWND)lParam;\r
88                         idFrom = (UINT_PTR)LOWORD(wParam);\r
89                 }\r
90                 break;\r
91         case WM_NOTIFY:\r
92                 hWndChild = ((LPNMHDR)lParam)->hwndFrom;\r
93                 idFrom = ((LPNMHDR)lParam)->idFrom;\r
94                 break;\r
95 #ifndef _WIN32_WCE\r
96         case WM_PARENTNOTIFY:\r
97                 switch(LOWORD(wParam))\r
98                 {\r
99                 case WM_CREATE:\r
100                 case WM_DESTROY:\r
101                         hWndChild = (HWND)lParam;\r
102                         idFrom = (UINT_PTR)HIWORD(wParam);\r
103                         break;\r
104                 default:\r
105                         hWndChild = ::GetDlgItem(hWndParent, HIWORD(wParam));\r
106                         idFrom = (UINT_PTR)::GetDlgCtrlID(hWndChild);\r
107                         break;\r
108                 }\r
109                 break;\r
110 #endif // !_WIN32_WCE\r
111         case WM_DRAWITEM:\r
112                 if(wParam)      // not from a menu\r
113                 {\r
114                         hWndChild = ((LPDRAWITEMSTRUCT)lParam)->hwndItem;\r
115                         idFrom = (UINT_PTR)wParam;\r
116                 }\r
117                 break;\r
118         case WM_MEASUREITEM:\r
119                 if(wParam)      // not from a menu\r
120                 {\r
121                         hWndChild = ::GetDlgItem(hWndParent, ((LPMEASUREITEMSTRUCT)lParam)->CtlID);\r
122                         idFrom = (UINT_PTR)wParam;\r
123                 }\r
124                 break;\r
125         case WM_COMPAREITEM:\r
126                 if(wParam)      // not from a menu\r
127                 {\r
128                         hWndChild = ((LPCOMPAREITEMSTRUCT)lParam)->hwndItem;\r
129                         idFrom = (UINT_PTR)wParam;\r
130                 }\r
131                 break;\r
132         case WM_DELETEITEM:\r
133                 if(wParam)      // not from a menu\r
134                 {\r
135                         hWndChild = ((LPDELETEITEMSTRUCT)lParam)->hwndItem;\r
136                         idFrom = (UINT_PTR)wParam;\r
137                 }\r
138                 break;\r
139         case WM_VKEYTOITEM:\r
140         case WM_CHARTOITEM:\r
141         case WM_HSCROLL:\r
142         case WM_VSCROLL:\r
143                 hWndChild = (HWND)lParam;\r
144                 idFrom = (UINT_PTR)::GetDlgCtrlID(hWndChild);\r
145                 break;\r
146         case WM_CTLCOLORBTN:\r
147         case WM_CTLCOLORDLG:\r
148         case WM_CTLCOLOREDIT:\r
149         case WM_CTLCOLORLISTBOX:\r
150         case WM_CTLCOLORMSGBOX:\r
151         case WM_CTLCOLORSCROLLBAR:\r
152         case WM_CTLCOLORSTATIC:\r
153                 hWndChild = (HWND)lParam;\r
154                 idFrom = (UINT_PTR)::GetDlgCtrlID(hWndChild);\r
155                 break;\r
156         default:\r
157                 break;\r
158         }\r
159 \r
160         if((hWndChild == NULL) ||\r
161                 ((hWndChildFilter != NULL) && (hWndChildFilter != hWndChild)))\r
162         {\r
163                 // Either hWndChild isn't valid, or\r
164                 // hWndChild doesn't match the filter.\r
165                 bHandled = FALSE;\r
166                 return 1;\r
167         }\r
168 \r
169         if((idFromFilter != 0) && (idFromFilter != idFrom))\r
170         {\r
171                 // The dialog control id doesn't match the filter.\r
172                 bHandled = FALSE;\r
173                 return 1;\r
174         }\r
175 \r
176         ATLASSERT(::IsWindow(hWndChild));\r
177         LRESULT lResult = ::SendMessage(hWndChild, OCM__BASE + uMsg, wParam, lParam);\r
178         if((lResult == 0) && (uMsg >= WM_CTLCOLORMSGBOX) && (uMsg <= WM_CTLCOLORSTATIC))\r
179         {\r
180                 // Try to prevent problems with WM_CTLCOLOR* messages when\r
181                 // the message wasn't really handled\r
182                 bHandled = FALSE;\r
183         }\r
184 \r
185         return lResult;\r
186 }\r
187 \r
188 }; // namespace WTL\r
189 \r
190 // Try to prevent problems with WM_CTLCOLOR* messages when\r
191 // the message wasn't really handled\r
192 #define REFLECT_NOTIFICATIONS_EX() \\r
193 { \\r
194         bHandled = TRUE; \\r
195         lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \\r
196         if((lResult == 0) && (uMsg >= WM_CTLCOLORMSGBOX) && (uMsg <= WM_CTLCOLORSTATIC)) \\r
197                 bHandled = FALSE; \\r
198         if(bHandled) \\r
199                 return TRUE; \\r
200 }\r
201 \r
202 #define REFLECT_NOTIFICATIONS_MSG_FILTERED(uMsgFilter) \\r
203         { \\r
204                 bHandled = TRUE; \\r
205                 lResult = WTL::WtlReflectNotificationsFiltered(m_hWnd, uMsg, wParam, lParam, bHandled, uMsgFilter, 0, NULL); \\r
206                 if(bHandled) \\r
207                         return TRUE; \\r
208         }\r
209 \r
210 #define REFLECT_NOTIFICATIONS_ID_FILTERED(idFromFilter) \\r
211         { \\r
212                 bHandled = TRUE; \\r
213                 lResult = WTL::WtlReflectNotificationsFiltered(m_hWnd, uMsg, wParam, lParam, bHandled, WM_NULL, idFromFilter, NULL); \\r
214                 if(bHandled) \\r
215                         return TRUE; \\r
216         }\r
217 \r
218 #define REFLECT_NOTIFICATIONS_HWND_FILTERED(hWndChildFilter) \\r
219         { \\r
220                 bHandled = TRUE; \\r
221                 lResult = WTL::WtlReflectNotificationsFiltered(m_hWnd, uMsg, wParam, lParam, bHandled, WM_NULL, 0, hWndChildFilter); \\r
222                 if(bHandled) \\r
223                         return TRUE; \\r
224         }\r
225 \r
226 #define REFLECT_NOTIFICATIONS_MSG_ID_FILTERED(uMsgFilter, idFromFilter) \\r
227         { \\r
228                 bHandled = TRUE; \\r
229                 lResult = WTL::WtlReflectNotificationsFiltered(m_hWnd, uMsg, wParam, lParam, bHandled, uMsgFilter, idFromFilter, NULL); \\r
230                 if(bHandled) \\r
231                         return TRUE; \\r
232         }\r
233 \r
234 #define REFLECT_NOTIFICATIONS_MSG_HWND_FILTERED(uMsgFilter, hWndChildFilter) \\r
235         { \\r
236                 bHandled = TRUE; \\r
237                 lResult = WTL::WtlReflectNotificationsFiltered(m_hWnd, uMsg, wParam, lParam, bHandled, uMsgFilter, 0, hWndChildFilter); \\r
238                 if(bHandled) \\r
239                         return TRUE; \\r
240         }\r
241 \r
242 #define REFLECT_COMMAND(id, code) \\r
243         if(uMsg == WM_COMMAND && id == LOWORD(wParam) && code == HIWORD(wParam)) \\r
244         { \\r
245                 bHandled = TRUE; \\r
246                 lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \\r
247                 if(bHandled) \\r
248                         return TRUE; \\r
249         }\r
250 \r
251 #define REFLECT_COMMAND_ID(id) \\r
252         if(uMsg == WM_COMMAND && id == LOWORD(wParam)) \\r
253         { \\r
254                 bHandled = TRUE; \\r
255                 lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \\r
256                 if(bHandled) \\r
257                         return TRUE; \\r
258         }\r
259 \r
260 #define REFLECT_COMMAND_CODE(code) \\r
261         if(uMsg == WM_COMMAND && code == HIWORD(wParam)) \\r
262         { \\r
263                 bHandled = TRUE; \\r
264                 lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \\r
265                 if(bHandled) \\r
266                         return TRUE; \\r
267         }\r
268 \r
269 #define REFLECT_COMMAND_RANGE(idFirst, idLast) \\r
270         if(uMsg == WM_COMMAND && LOWORD(wParam) >= idFirst  && LOWORD(wParam) <= idLast) \\r
271         { \\r
272                 bHandled = TRUE; \\r
273                 lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \\r
274                 if(bHandled) \\r
275                         return TRUE; \\r
276         }\r
277 \r
278 #define REFLECT_COMMAND_RANGE_CODE(idFirst, idLast, code) \\r
279         if(uMsg == WM_COMMAND && code == HIWORD(wParam) && LOWORD(wParam) >= idFirst  && LOWORD(wParam) <= idLast) \\r
280         { \\r
281                 bHandled = TRUE; \\r
282                 lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \\r
283                 if(bHandled) \\r
284                         return TRUE; \\r
285         }\r
286 \r
287 #define REFLECT_NOTIFY(id, cd) \\r
288         if(uMsg == WM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom && cd == ((LPNMHDR)lParam)->code) \\r
289         { \\r
290                 bHandled = TRUE; \\r
291                 lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \\r
292                 if(bHandled) \\r
293                         return TRUE; \\r
294         }\r
295 \r
296 #define REFLECT_NOTIFY_ID(id) \\r
297         if(uMsg == WM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom) \\r
298         { \\r
299                 bHandled = TRUE; \\r
300                 lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \\r
301                 if(bHandled) \\r
302                         return TRUE; \\r
303         }\r
304 \r
305 #define REFLECT_NOTIFY_CODE(cd) \\r
306         if(uMsg == WM_NOTIFY && cd == ((LPNMHDR)lParam)->code) \\r
307         { \\r
308                 bHandled = TRUE; \\r
309                 lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \\r
310                 if(bHandled) \\r
311                         return TRUE; \\r
312         }\r
313 \r
314 #define REFLECT_NOTIFY_RANGE(idFirst, idLast) \\r
315         if(uMsg == WM_NOTIFY && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \\r
316         { \\r
317                 bHandled = TRUE; \\r
318                 lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \\r
319                 if(bHandled) \\r
320                         return TRUE; \\r
321         }\r
322 \r
323 #define REFLECT_NOTIFY_RANGE_CODE(idFirst, idLast, cd) \\r
324         if(uMsg == WM_NOTIFY && cd == ((LPNMHDR)lParam)->code && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \\r
325         { \\r
326                 bHandled = TRUE; \\r
327                 lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \\r
328                 if(bHandled) \\r
329                         return TRUE; \\r
330         }\r
331 \r
332 \r
333 ///////////////////////////////////////////////////////////////////////////////\r
334 // Reflected message handler macros for message maps (for ATL 3.0)\r
335 \r
336 #if (_ATL_VER < 0x0700)\r
337 \r
338 #define REFLECTED_COMMAND_HANDLER(id, code, func) \\r
339         if(uMsg == OCM_COMMAND && id == LOWORD(wParam) && code == HIWORD(wParam)) \\r
340         { \\r
341                 bHandled = TRUE; \\r
342                 lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \\r
343                 if(bHandled) \\r
344                         return TRUE; \\r
345         }\r
346 \r
347 #define REFLECTED_COMMAND_ID_HANDLER(id, func) \\r
348         if(uMsg == OCM_COMMAND && id == LOWORD(wParam)) \\r
349         { \\r
350                 bHandled = TRUE; \\r
351                 lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \\r
352                 if(bHandled) \\r
353                         return TRUE; \\r
354         }\r
355 \r
356 #define REFLECTED_COMMAND_CODE_HANDLER(code, func) \\r
357         if(uMsg == OCM_COMMAND && code == HIWORD(wParam)) \\r
358         { \\r
359                 bHandled = TRUE; \\r
360                 lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \\r
361                 if(bHandled) \\r
362                         return TRUE; \\r
363         }\r
364 \r
365 #define REFLECTED_COMMAND_RANGE_HANDLER(idFirst, idLast, func) \\r
366         if(uMsg == OCM_COMMAND && LOWORD(wParam) >= idFirst  && LOWORD(wParam) <= idLast) \\r
367         { \\r
368                 bHandled = TRUE; \\r
369                 lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \\r
370                 if(bHandled) \\r
371                         return TRUE; \\r
372         }\r
373 \r
374 #define REFLECTED_COMMAND_RANGE_CODE_HANDLER(idFirst, idLast, code, func) \\r
375         if(uMsg == OCM_COMMAND && code == HIWORD(wParam) && LOWORD(wParam) >= idFirst  && LOWORD(wParam) <= idLast) \\r
376         { \\r
377                 bHandled = TRUE; \\r
378                 lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \\r
379                 if(bHandled) \\r
380                         return TRUE; \\r
381         }\r
382 \r
383 #define REFLECTED_NOTIFY_HANDLER(id, cd, func) \\r
384         if(uMsg == OCM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom && cd == ((LPNMHDR)lParam)->code) \\r
385         { \\r
386                 bHandled = TRUE; \\r
387                 lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \\r
388                 if(bHandled) \\r
389                         return TRUE; \\r
390         }\r
391 \r
392 #define REFLECTED_NOTIFY_ID_HANDLER(id, func) \\r
393         if(uMsg == OCM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom) \\r
394         { \\r
395                 bHandled = TRUE; \\r
396                 lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \\r
397                 if(bHandled) \\r
398                         return TRUE; \\r
399         }\r
400 \r
401 #define REFLECTED_NOTIFY_CODE_HANDLER(cd, func) \\r
402         if(uMsg == OCM_NOTIFY && cd == ((LPNMHDR)lParam)->code) \\r
403         { \\r
404                 bHandled = TRUE; \\r
405                 lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \\r
406                 if(bHandled) \\r
407                         return TRUE; \\r
408         }\r
409 \r
410 #define REFLECTED_NOTIFY_RANGE_HANDLER(idFirst, idLast, func) \\r
411         if(uMsg == OCM_NOTIFY && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \\r
412         { \\r
413                 bHandled = TRUE; \\r
414                 lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \\r
415                 if(bHandled) \\r
416                         return TRUE; \\r
417         }\r
418 \r
419 #define REFLECTED_NOTIFY_RANGE_CODE_HANDLER(idFirst, idLast, cd, func) \\r
420         if(uMsg == OCM_NOTIFY && cd == ((LPNMHDR)lParam)->code && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \\r
421         { \\r
422                 bHandled = TRUE; \\r
423                 lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \\r
424                 if(bHandled) \\r
425                         return TRUE; \\r
426         }\r
427 \r
428 #endif // (_ATL_VER < 0x0700)\r
429 \r
430 \r
431 ///////////////////////////////////////////////////////////////////////////////\r
432 // Dual argument helper classes (for ATL 3.0)\r
433 \r
434 #if (_ATL_VER < 0x0700)\r
435 \r
436 namespace ATL\r
437 {\r
438 \r
439 class _U_RECT\r
440 {\r
441 public:\r
442         _U_RECT(LPRECT lpRect) : m_lpRect(lpRect)\r
443         { }\r
444         _U_RECT(RECT& rc) : m_lpRect(&rc)\r
445         { }\r
446         LPRECT m_lpRect;\r
447 };\r
448 \r
449 class _U_MENUorID\r
450 {\r
451 public:\r
452         _U_MENUorID(HMENU hMenu) : m_hMenu(hMenu)\r
453         { }\r
454         _U_MENUorID(UINT nID) : m_hMenu((HMENU)LongToHandle(nID))\r
455         { }\r
456         HMENU m_hMenu;\r
457 };\r
458 \r
459 class _U_STRINGorID\r
460 {\r
461 public:\r
462         _U_STRINGorID(LPCTSTR lpString) : m_lpstr(lpString)\r
463         { }\r
464         _U_STRINGorID(UINT nID) : m_lpstr(MAKEINTRESOURCE(nID))\r
465         { }\r
466         LPCTSTR m_lpstr;\r
467 };\r
468 \r
469 }; // namespace ATL\r
470 \r
471 #endif // (_ATL_VER < 0x0700)\r
472 \r
473 \r
474 namespace WTL\r
475 {\r
476 \r
477 ///////////////////////////////////////////////////////////////////////////////\r
478 // Forward notifications support for message maps (for ATL 3.0)\r
479 \r
480 #if (_ATL_VER < 0x0700)\r
481 \r
482 // forward notifications support\r
483 #define FORWARD_NOTIFICATIONS() \\r
484         { \\r
485                 bHandled = TRUE; \\r
486                 lResult = WTL::Atl3ForwardNotifications(m_hWnd, uMsg, wParam, lParam, bHandled); \\r
487                 if(bHandled) \\r
488                         return TRUE; \\r
489         }\r
490 \r
491 static LRESULT Atl3ForwardNotifications(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
492 {\r
493         LRESULT lResult = 0;\r
494         switch(uMsg)\r
495         {\r
496         case WM_COMMAND:\r
497         case WM_NOTIFY:\r
498 #ifndef _WIN32_WCE\r
499         case WM_PARENTNOTIFY:\r
500 #endif // !_WIN32_WCE\r
501         case WM_DRAWITEM:\r
502         case WM_MEASUREITEM:\r
503         case WM_COMPAREITEM:\r
504         case WM_DELETEITEM:\r
505         case WM_VKEYTOITEM:\r
506         case WM_CHARTOITEM:\r
507         case WM_HSCROLL:\r
508         case WM_VSCROLL:\r
509         case WM_CTLCOLORBTN:\r
510         case WM_CTLCOLORDLG:\r
511         case WM_CTLCOLOREDIT:\r
512         case WM_CTLCOLORLISTBOX:\r
513         case WM_CTLCOLORMSGBOX:\r
514         case WM_CTLCOLORSCROLLBAR:\r
515         case WM_CTLCOLORSTATIC:\r
516                 lResult = ::SendMessage(::GetParent(hWnd), uMsg, wParam, lParam);\r
517                 break;\r
518         default:\r
519                 bHandled = FALSE;\r
520                 break;\r
521         }\r
522         return lResult;\r
523 }\r
524 \r
525 #endif // (_ATL_VER < 0x0700)\r
526 \r
527 }; // namespace WTL\r
528 \r
529 #endif // __ATLWINX_H__\r