- add sources.
[platform/framework/web/crosswalk.git] / src / third_party / wtl / include / atlcrack.h
1 // Windows Template Library - WTL version 8.0
2 // Copyright (C) Microsoft Corporation. All rights reserved.
3 //
4 // This file is a part of the Windows Template Library.
5 // The use and distribution terms for this software are covered by the
6 // Microsoft Permissive License (Ms-PL) which can be found in the file
7 // Ms-PL.txt at the root of this distribution.
8
9 #ifndef __ATLCRACK_H__
10 #define __ATLCRACK_H__
11
12 #pragma once
13
14
15 ///////////////////////////////////////////////////////////////////////////////
16 // Message map macro for cracked handlers
17
18 // Note about message maps with cracked handlers:
19 // For ATL 3.0, a message map using cracked handlers MUST use BEGIN_MSG_MAP_EX.
20 // For ATL 7.0 or higher, you can use BEGIN_MSG_MAP for CWindowImpl/CDialogImpl derived classes,
21 // but must use BEGIN_MSG_MAP_EX for classes that don't derive from CWindowImpl/CDialogImpl.
22
23 #define BEGIN_MSG_MAP_EX(theClass) \
24 public: \
25         BOOL m_bMsgHandled; \
26         /* "handled" management for cracked handlers */ \
27         BOOL IsMsgHandled() const \
28         { \
29                 return m_bMsgHandled; \
30         } \
31         void SetMsgHandled(BOOL bHandled) \
32         { \
33                 m_bMsgHandled = bHandled; \
34         } \
35         BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult, DWORD dwMsgMapID = 0) \
36         { \
37                 BOOL bOldMsgHandled = m_bMsgHandled; \
38                 BOOL bRet = _ProcessWindowMessage(hWnd, uMsg, wParam, lParam, lResult, dwMsgMapID); \
39                 m_bMsgHandled = bOldMsgHandled; \
40                 return bRet; \
41         } \
42         BOOL _ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult, DWORD dwMsgMapID) \
43         { \
44                 BOOL bHandled = TRUE; \
45                 hWnd; \
46                 uMsg; \
47                 wParam; \
48                 lParam; \
49                 lResult; \
50                 bHandled; \
51                 switch(dwMsgMapID) \
52                 { \
53                 case 0:
54
55
56 ///////////////////////////////////////////////////////////////////////////////
57 // Standard Windows message macros
58
59 // int OnCreate(LPCREATESTRUCT lpCreateStruct)
60 #define MSG_WM_CREATE(func) \
61         if (uMsg == WM_CREATE) \
62         { \
63                 SetMsgHandled(TRUE); \
64                 lResult = (LRESULT)func((LPCREATESTRUCT)lParam); \
65                 if(IsMsgHandled()) \
66                         return TRUE; \
67         }
68
69 // BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam)
70 #define MSG_WM_INITDIALOG(func) \
71         if (uMsg == WM_INITDIALOG) \
72         { \
73                 SetMsgHandled(TRUE); \
74                 lResult = (LRESULT)func((HWND)wParam, lParam); \
75                 if(IsMsgHandled()) \
76                         return TRUE; \
77         }
78
79 // BOOL OnCopyData(CWindow wnd, PCOPYDATASTRUCT pCopyDataStruct)
80 #define MSG_WM_COPYDATA(func) \
81         if (uMsg == WM_COPYDATA) \
82         { \
83                 SetMsgHandled(TRUE); \
84                 lResult = (LRESULT)func((HWND)wParam, (PCOPYDATASTRUCT)lParam); \
85                 if(IsMsgHandled()) \
86                         return TRUE; \
87         }
88
89 // void OnDestroy()
90 #define MSG_WM_DESTROY(func) \
91         if (uMsg == WM_DESTROY) \
92         { \
93                 SetMsgHandled(TRUE); \
94                 func(); \
95                 lResult = 0; \
96                 if(IsMsgHandled()) \
97                         return TRUE; \
98         }
99
100 // void OnMove(CPoint ptPos)
101 #define MSG_WM_MOVE(func) \
102         if (uMsg == WM_MOVE) \
103         { \
104                 SetMsgHandled(TRUE); \
105                 func(_WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
106                 lResult = 0; \
107                 if(IsMsgHandled()) \
108                         return TRUE; \
109         }
110
111 // void OnSize(UINT nType, CSize size)
112 #define MSG_WM_SIZE(func) \
113         if (uMsg == WM_SIZE) \
114         { \
115                 SetMsgHandled(TRUE); \
116                 func((UINT)wParam, _WTYPES_NS::CSize(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
117                 lResult = 0; \
118                 if(IsMsgHandled()) \
119                         return TRUE; \
120         }
121
122 // void OnActivate(UINT nState, BOOL bMinimized, CWindow wndOther)
123 #define MSG_WM_ACTIVATE(func) \
124         if (uMsg == WM_ACTIVATE) \
125         { \
126                 SetMsgHandled(TRUE); \
127                 func((UINT)LOWORD(wParam), (BOOL)HIWORD(wParam), (HWND)lParam); \
128                 lResult = 0; \
129                 if(IsMsgHandled()) \
130                         return TRUE; \
131         }
132
133 // void OnSetFocus(CWindow wndOld)
134 #define MSG_WM_SETFOCUS(func) \
135         if (uMsg == WM_SETFOCUS) \
136         { \
137                 SetMsgHandled(TRUE); \
138                 func((HWND)wParam); \
139                 lResult = 0; \
140                 if(IsMsgHandled()) \
141                         return TRUE; \
142         }
143
144 // void OnKillFocus(CWindow wndFocus)
145 #define MSG_WM_KILLFOCUS(func) \
146         if (uMsg == WM_KILLFOCUS) \
147         { \
148                 SetMsgHandled(TRUE); \
149                 func((HWND)wParam); \
150                 lResult = 0; \
151                 if(IsMsgHandled()) \
152                         return TRUE; \
153         }
154
155 // void OnEnable(BOOL bEnable)
156 #define MSG_WM_ENABLE(func) \
157         if (uMsg == WM_ENABLE) \
158         { \
159                 SetMsgHandled(TRUE); \
160                 func((BOOL)wParam); \
161                 lResult = 0; \
162                 if(IsMsgHandled()) \
163                         return TRUE; \
164         }
165
166 // void OnPaint(CDCHandle dc)
167 #define MSG_WM_PAINT(func) \
168         if (uMsg == WM_PAINT) \
169         { \
170                 SetMsgHandled(TRUE); \
171                 func((HDC)wParam); \
172                 lResult = 0; \
173                 if(IsMsgHandled()) \
174                         return TRUE; \
175         }
176
177 // void OnClose()
178 #define MSG_WM_CLOSE(func) \
179         if (uMsg == WM_CLOSE) \
180         { \
181                 SetMsgHandled(TRUE); \
182                 func(); \
183                 lResult = 0; \
184                 if(IsMsgHandled()) \
185                         return TRUE; \
186         }
187
188 // BOOL OnQueryEndSession(UINT nSource, UINT uLogOff)
189 #define MSG_WM_QUERYENDSESSION(func) \
190         if (uMsg == WM_QUERYENDSESSION) \
191         { \
192                 SetMsgHandled(TRUE); \
193                 lResult = (LRESULT)func((UINT)wParam, (UINT)lParam); \
194                 if(IsMsgHandled()) \
195                         return TRUE; \
196         }
197
198 // BOOL OnQueryOpen()
199 #define MSG_WM_QUERYOPEN(func) \
200         if (uMsg == WM_QUERYOPEN) \
201         { \
202                 SetMsgHandled(TRUE); \
203                 lResult = (LRESULT)func(); \
204                 if(IsMsgHandled()) \
205                         return TRUE; \
206         }
207
208 // BOOL OnEraseBkgnd(CDCHandle dc)
209 #define MSG_WM_ERASEBKGND(func) \
210         if (uMsg == WM_ERASEBKGND) \
211         { \
212                 SetMsgHandled(TRUE); \
213                 lResult = (LRESULT)func((HDC)wParam); \
214                 if(IsMsgHandled()) \
215                         return TRUE; \
216         }
217
218 // void OnSysColorChange()
219 #define MSG_WM_SYSCOLORCHANGE(func) \
220         if (uMsg == WM_SYSCOLORCHANGE) \
221         { \
222                 SetMsgHandled(TRUE); \
223                 func(); \
224                 lResult = 0; \
225                 if(IsMsgHandled()) \
226                         return TRUE; \
227         }
228
229 // void OnEndSession(BOOL bEnding, UINT uLogOff)
230 #define MSG_WM_ENDSESSION(func) \
231         if (uMsg == WM_ENDSESSION) \
232         { \
233                 SetMsgHandled(TRUE); \
234                 func((BOOL)wParam, (UINT)lParam); \
235                 lResult = 0; \
236                 if(IsMsgHandled()) \
237                         return TRUE; \
238         }
239
240 // void OnShowWindow(BOOL bShow, UINT nStatus)
241 #define MSG_WM_SHOWWINDOW(func) \
242         if (uMsg == WM_SHOWWINDOW) \
243         { \
244                 SetMsgHandled(TRUE); \
245                 func((BOOL)wParam, (int)lParam); \
246                 lResult = 0; \
247                 if(IsMsgHandled()) \
248                         return TRUE; \
249         }
250
251 // HBRUSH OnCtlColorEdit(CDCHandle dc, CEdit edit)
252 #define MSG_WM_CTLCOLOREDIT(func) \
253         if (uMsg == WM_CTLCOLOREDIT) \
254         { \
255                 SetMsgHandled(TRUE); \
256                 lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \
257                 if(IsMsgHandled()) \
258                         return TRUE; \
259         }
260
261 // HBRUSH OnCtlColorListBox(CDCHandle dc, CListBox listBox)
262 #define MSG_WM_CTLCOLORLISTBOX(func) \
263         if (uMsg == WM_CTLCOLORLISTBOX) \
264         { \
265                 SetMsgHandled(TRUE); \
266                 lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \
267                 if(IsMsgHandled()) \
268                         return TRUE; \
269         }
270
271 // HBRUSH OnCtlColorBtn(CDCHandle dc, CButton button)
272 #define MSG_WM_CTLCOLORBTN(func) \
273         if (uMsg == WM_CTLCOLORBTN) \
274         { \
275                 SetMsgHandled(TRUE); \
276                 lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \
277                 if(IsMsgHandled()) \
278                         return TRUE; \
279         }
280
281 // HBRUSH OnCtlColorDlg(CDCHandle dc, CWindow wnd)
282 #define MSG_WM_CTLCOLORDLG(func) \
283         if (uMsg == WM_CTLCOLORDLG) \
284         { \
285                 SetMsgHandled(TRUE); \
286                 lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \
287                 if(IsMsgHandled()) \
288                         return TRUE; \
289         }
290
291 // HBRUSH OnCtlColorScrollBar(CDCHandle dc, CScrollBar scrollBar)
292 #define MSG_WM_CTLCOLORSCROLLBAR(func) \
293         if (uMsg == WM_CTLCOLORSCROLLBAR) \
294         { \
295                 SetMsgHandled(TRUE); \
296                 lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \
297                 if(IsMsgHandled()) \
298                         return TRUE; \
299         }
300
301 // HBRUSH OnCtlColorStatic(CDCHandle dc, CStatic wndStatic)
302 #define MSG_WM_CTLCOLORSTATIC(func) \
303         if (uMsg == WM_CTLCOLORSTATIC) \
304         { \
305                 SetMsgHandled(TRUE); \
306                 lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \
307                 if(IsMsgHandled()) \
308                         return TRUE; \
309         }
310
311 // void OnSettingChange(UINT uFlags, LPCTSTR lpszSection)
312 #define MSG_WM_SETTINGCHANGE(func) \
313         if (uMsg == WM_SETTINGCHANGE) \
314         { \
315                 SetMsgHandled(TRUE); \
316                 func((UINT)wParam, (LPCTSTR)lParam); \
317                 lResult = 0; \
318                 if(IsMsgHandled()) \
319                         return TRUE; \
320         }
321
322 // void OnDevModeChange(LPCTSTR lpDeviceName)
323 #define MSG_WM_DEVMODECHANGE(func) \
324         if (uMsg == WM_DEVMODECHANGE) \
325         { \
326                 SetMsgHandled(TRUE); \
327                 func((LPCTSTR)lParam); \
328                 lResult = 0; \
329                 if(IsMsgHandled()) \
330                         return TRUE; \
331         }
332
333 // void OnActivateApp(BOOL bActive, DWORD dwThreadID)
334 #define MSG_WM_ACTIVATEAPP(func) \
335         if (uMsg == WM_ACTIVATEAPP) \
336         { \
337                 SetMsgHandled(TRUE); \
338                 func((BOOL)wParam, (DWORD)lParam); \
339                 lResult = 0; \
340                 if(IsMsgHandled()) \
341                         return TRUE; \
342         }
343
344 // void OnFontChange()
345 #define MSG_WM_FONTCHANGE(func) \
346         if (uMsg == WM_FONTCHANGE) \
347         { \
348                 SetMsgHandled(TRUE); \
349                 func(); \
350                 lResult = 0; \
351                 if(IsMsgHandled()) \
352                         return TRUE; \
353         }
354
355 // void OnTimeChange()
356 #define MSG_WM_TIMECHANGE(func) \
357         if (uMsg == WM_TIMECHANGE) \
358         { \
359                 SetMsgHandled(TRUE); \
360                 func(); \
361                 lResult = 0; \
362                 if(IsMsgHandled()) \
363                         return TRUE; \
364         }
365
366 // void OnCancelMode()
367 #define MSG_WM_CANCELMODE(func) \
368         if (uMsg == WM_CANCELMODE) \
369         { \
370                 SetMsgHandled(TRUE); \
371                 func(); \
372                 lResult = 0; \
373                 if(IsMsgHandled()) \
374                         return TRUE; \
375         }
376
377 // BOOL OnSetCursor(CWindow wnd, UINT nHitTest, UINT message)
378 #define MSG_WM_SETCURSOR(func) \
379         if (uMsg == WM_SETCURSOR) \
380         { \
381                 SetMsgHandled(TRUE); \
382                 lResult = (LRESULT)func((HWND)wParam, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam)); \
383                 if(IsMsgHandled()) \
384                         return TRUE; \
385         }
386
387 // int OnMouseActivate(CWindow wndTopLevel, UINT nHitTest, UINT message)
388 #define MSG_WM_MOUSEACTIVATE(func) \
389         if (uMsg == WM_MOUSEACTIVATE) \
390         { \
391                 SetMsgHandled(TRUE); \
392                 lResult = (LRESULT)func((HWND)wParam, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam)); \
393                 if(IsMsgHandled()) \
394                         return TRUE; \
395         }
396
397 // void OnChildActivate()
398 #define MSG_WM_CHILDACTIVATE(func) \
399         if (uMsg == WM_CHILDACTIVATE) \
400         { \
401                 SetMsgHandled(TRUE); \
402                 func(); \
403                 lResult = 0; \
404                 if(IsMsgHandled()) \
405                         return TRUE; \
406         }
407
408 // void OnGetMinMaxInfo(LPMINMAXINFO lpMMI)
409 #define MSG_WM_GETMINMAXINFO(func) \
410         if (uMsg == WM_GETMINMAXINFO) \
411         { \
412                 SetMsgHandled(TRUE); \
413                 func((LPMINMAXINFO)lParam); \
414                 lResult = 0; \
415                 if(IsMsgHandled()) \
416                         return TRUE; \
417         }
418
419 // void OnIconEraseBkgnd(CDCHandle dc)
420 #define MSG_WM_ICONERASEBKGND(func) \
421         if (uMsg == WM_ICONERASEBKGND) \
422         { \
423                 SetMsgHandled(TRUE); \
424                 func((HDC)wParam); \
425                 lResult = 0; \
426                 if(IsMsgHandled()) \
427                         return TRUE; \
428         }
429
430 // void OnSpoolerStatus(UINT nStatus, UINT nJobs)
431 #define MSG_WM_SPOOLERSTATUS(func) \
432         if (uMsg == WM_SPOOLERSTATUS) \
433         { \
434                 SetMsgHandled(TRUE); \
435                 func((UINT)wParam, (UINT)LOWORD(lParam)); \
436                 lResult = 0; \
437                 if(IsMsgHandled()) \
438                         return TRUE; \
439         }
440
441 // void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
442 #define MSG_WM_DRAWITEM(func) \
443         if (uMsg == WM_DRAWITEM) \
444         { \
445                 SetMsgHandled(TRUE); \
446                 func((UINT)wParam, (LPDRAWITEMSTRUCT)lParam); \
447                 lResult = TRUE; \
448                 if(IsMsgHandled()) \
449                         return TRUE; \
450         }
451
452 // void OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
453 #define MSG_WM_MEASUREITEM(func) \
454         if (uMsg == WM_MEASUREITEM) \
455         { \
456                 SetMsgHandled(TRUE); \
457                 func((UINT)wParam, (LPMEASUREITEMSTRUCT)lParam); \
458                 lResult = TRUE; \
459                 if(IsMsgHandled()) \
460                         return TRUE; \
461         }
462
463 // void OnDeleteItem(int nIDCtl, LPDELETEITEMSTRUCT lpDeleteItemStruct)
464 #define MSG_WM_DELETEITEM(func) \
465         if (uMsg == WM_DELETEITEM) \
466         { \
467                 SetMsgHandled(TRUE); \
468                 func((UINT)wParam, (LPDELETEITEMSTRUCT)lParam); \
469                 lResult = TRUE; \
470                 if(IsMsgHandled()) \
471                         return TRUE; \
472         }
473
474 //int OnCharToItem(UINT nChar, UINT nIndex, CListBox listBox)
475 #define MSG_WM_CHARTOITEM(func) \
476         if (uMsg == WM_CHARTOITEM) \
477         { \
478                 SetMsgHandled(TRUE); \
479                 lResult = (LRESULT)func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), (HWND)lParam); \
480                 if(IsMsgHandled()) \
481                         return TRUE; \
482         }
483
484 // int OnVKeyToItem(UINT nKey, UINT nIndex, CListBox listBox)
485 #define MSG_WM_VKEYTOITEM(func) \
486         if (uMsg == WM_VKEYTOITEM) \
487         { \
488                 SetMsgHandled(TRUE); \
489                 lResult = (LRESULT)func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), (HWND)lParam); \
490                 if(IsMsgHandled()) \
491                         return TRUE; \
492         }
493
494 // HCURSOR OnQueryDragIcon()
495 #define MSG_WM_QUERYDRAGICON(func) \
496         if (uMsg == WM_QUERYDRAGICON) \
497         { \
498                 SetMsgHandled(TRUE); \
499                 lResult = (LRESULT)func(); \
500                 if(IsMsgHandled()) \
501                         return TRUE; \
502         }
503
504 // int OnCompareItem(int nIDCtl, LPCOMPAREITEMSTRUCT lpCompareItemStruct)
505 #define MSG_WM_COMPAREITEM(func) \
506         if (uMsg == WM_COMPAREITEM) \
507         { \
508                 SetMsgHandled(TRUE); \
509                 lResult = (LRESULT)func((UINT)wParam, (LPCOMPAREITEMSTRUCT)lParam); \
510                 if(IsMsgHandled()) \
511                         return TRUE; \
512         }
513
514 // void OnCompacting(UINT nCpuTime)
515 #define MSG_WM_COMPACTING(func) \
516         if (uMsg == WM_COMPACTING) \
517         { \
518                 SetMsgHandled(TRUE); \
519                 func((UINT)wParam); \
520                 lResult = 0; \
521                 if(IsMsgHandled()) \
522                         return TRUE; \
523         }
524
525 // BOOL OnNcCreate(LPCREATESTRUCT lpCreateStruct)
526 #define MSG_WM_NCCREATE(func) \
527         if (uMsg == WM_NCCREATE) \
528         { \
529                 SetMsgHandled(TRUE); \
530                 lResult = (LRESULT)func((LPCREATESTRUCT)lParam); \
531                 if(IsMsgHandled()) \
532                         return TRUE; \
533         }
534
535 // void OnNcDestroy()
536 #define MSG_WM_NCDESTROY(func) \
537         if (uMsg == WM_NCDESTROY) \
538         { \
539                 SetMsgHandled(TRUE); \
540                 func(); \
541                 lResult = 0; \
542                 if(IsMsgHandled()) \
543                         return TRUE; \
544         }
545
546 // LRESULT OnNcCalcSize(BOOL bCalcValidRects, LPARAM lParam)
547 #define MSG_WM_NCCALCSIZE(func) \
548         if (uMsg == WM_NCCALCSIZE) \
549         { \
550                 SetMsgHandled(TRUE); \
551                 lResult = func((BOOL)wParam, lParam); \
552                 if(IsMsgHandled()) \
553                         return TRUE; \
554         }
555
556 // UINT OnNcHitTest(CPoint point)
557 #define MSG_WM_NCHITTEST(func) \
558         if (uMsg == WM_NCHITTEST) \
559         { \
560                 SetMsgHandled(TRUE); \
561                 lResult = (LRESULT)func(_WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
562                 if(IsMsgHandled()) \
563                         return TRUE; \
564         }
565
566 // void OnNcPaint(CRgn rgn)
567 #define MSG_WM_NCPAINT(func) \
568         if (uMsg == WM_NCPAINT) \
569         { \
570                 SetMsgHandled(TRUE); \
571                 func((HRGN)wParam); \
572                 lResult = 0; \
573                 if(IsMsgHandled()) \
574                         return TRUE; \
575         }
576
577 // BOOL OnNcActivate(BOOL bActive)
578 #define MSG_WM_NCACTIVATE(func) \
579         if (uMsg == WM_NCACTIVATE) \
580         { \
581                 SetMsgHandled(TRUE); \
582                 lResult = (LRESULT)func((BOOL)wParam); \
583                 if(IsMsgHandled()) \
584                         return TRUE; \
585         }
586
587 // UINT OnGetDlgCode(LPMSG lpMsg)
588 #define MSG_WM_GETDLGCODE(func) \
589         if (uMsg == WM_GETDLGCODE) \
590         { \
591                 SetMsgHandled(TRUE); \
592                 lResult = (LRESULT)func((LPMSG)lParam); \
593                 if(IsMsgHandled()) \
594                         return TRUE; \
595         }
596
597 // void OnNcMouseMove(UINT nHitTest, CPoint point)
598 #define MSG_WM_NCMOUSEMOVE(func) \
599         if (uMsg == WM_NCMOUSEMOVE) \
600         { \
601                 SetMsgHandled(TRUE); \
602                 func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
603                 lResult = 0; \
604                 if(IsMsgHandled()) \
605                         return TRUE; \
606         }
607
608 // void OnNcLButtonDown(UINT nHitTest, CPoint point)
609 #define MSG_WM_NCLBUTTONDOWN(func) \
610         if (uMsg == WM_NCLBUTTONDOWN) \
611         { \
612                 SetMsgHandled(TRUE); \
613                 func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
614                 lResult = 0; \
615                 if(IsMsgHandled()) \
616                         return TRUE; \
617         }
618
619 // void OnNcLButtonUp(UINT nHitTest, CPoint point)
620 #define MSG_WM_NCLBUTTONUP(func) \
621         if (uMsg == WM_NCLBUTTONUP) \
622         { \
623                 SetMsgHandled(TRUE); \
624                 func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
625                 lResult = 0; \
626                 if(IsMsgHandled()) \
627                         return TRUE; \
628         }
629
630 // void OnNcLButtonDblClk(UINT nHitTest, CPoint point)
631 #define MSG_WM_NCLBUTTONDBLCLK(func) \
632         if (uMsg == WM_NCLBUTTONDBLCLK) \
633         { \
634                 SetMsgHandled(TRUE); \
635                 func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
636                 lResult = 0; \
637                 if(IsMsgHandled()) \
638                         return TRUE; \
639         }
640
641 // void OnNcRButtonDown(UINT nHitTest, CPoint point)
642 #define MSG_WM_NCRBUTTONDOWN(func) \
643         if (uMsg == WM_NCRBUTTONDOWN) \
644         { \
645                 SetMsgHandled(TRUE); \
646                 func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
647                 lResult = 0; \
648                 if(IsMsgHandled()) \
649                         return TRUE; \
650         }
651
652 // void OnNcRButtonUp(UINT nHitTest, CPoint point)
653 #define MSG_WM_NCRBUTTONUP(func) \
654         if (uMsg == WM_NCRBUTTONUP) \
655         { \
656                 SetMsgHandled(TRUE); \
657                 func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
658                 lResult = 0; \
659                 if(IsMsgHandled()) \
660                         return TRUE; \
661         }
662
663 // void OnNcRButtonDblClk(UINT nHitTest, CPoint point)
664 #define MSG_WM_NCRBUTTONDBLCLK(func) \
665         if (uMsg == WM_NCRBUTTONDBLCLK) \
666         { \
667                 SetMsgHandled(TRUE); \
668                 func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
669                 lResult = 0; \
670                 if(IsMsgHandled()) \
671                         return TRUE; \
672         }
673
674 // void OnNcMButtonDown(UINT nHitTest, CPoint point)
675 #define MSG_WM_NCMBUTTONDOWN(func) \
676         if (uMsg == WM_NCMBUTTONDOWN) \
677         { \
678                 SetMsgHandled(TRUE); \
679                 func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
680                 lResult = 0; \
681                 if(IsMsgHandled()) \
682                         return TRUE; \
683         }
684
685 // void OnNcMButtonUp(UINT nHitTest, CPoint point)
686 #define MSG_WM_NCMBUTTONUP(func) \
687         if (uMsg == WM_NCMBUTTONUP) \
688         { \
689                 SetMsgHandled(TRUE); \
690                 func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
691                 lResult = 0; \
692                 if(IsMsgHandled()) \
693                         return TRUE; \
694         }
695
696 // void OnNcMButtonDblClk(UINT nHitTest, CPoint point)
697 #define MSG_WM_NCMBUTTONDBLCLK(func) \
698         if (uMsg == WM_NCMBUTTONDBLCLK) \
699         { \
700                 SetMsgHandled(TRUE); \
701                 func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
702                 lResult = 0; \
703                 if(IsMsgHandled()) \
704                         return TRUE; \
705         }
706
707 // void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
708 #define MSG_WM_KEYDOWN(func) \
709         if (uMsg == WM_KEYDOWN) \
710         { \
711                 SetMsgHandled(TRUE); \
712                 func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \
713                 lResult = 0; \
714                 if(IsMsgHandled()) \
715                         return TRUE; \
716         }
717
718 // void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
719 #define MSG_WM_KEYUP(func) \
720         if (uMsg == WM_KEYUP) \
721         { \
722                 SetMsgHandled(TRUE); \
723                 func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \
724                 lResult = 0; \
725                 if(IsMsgHandled()) \
726                         return TRUE; \
727         }
728
729 // void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
730 #define MSG_WM_CHAR(func) \
731         if (uMsg == WM_CHAR) \
732         { \
733                 SetMsgHandled(TRUE); \
734                 func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \
735                 lResult = 0; \
736                 if(IsMsgHandled()) \
737                         return TRUE; \
738         }
739
740 // void OnDeadChar(UINT nChar, UINT nRepCnt, UINT nFlags)
741 #define MSG_WM_DEADCHAR(func) \
742         if (uMsg == WM_DEADCHAR) \
743         { \
744                 SetMsgHandled(TRUE); \
745                 func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \
746                 lResult = 0; \
747                 if(IsMsgHandled()) \
748                         return TRUE; \
749         }
750
751 // void OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
752 #define MSG_WM_SYSKEYDOWN(func) \
753         if (uMsg == WM_SYSKEYDOWN) \
754         { \
755                 SetMsgHandled(TRUE); \
756                 func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \
757                 lResult = 0; \
758                 if(IsMsgHandled()) \
759                         return TRUE; \
760         }
761
762 // void OnSysKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
763 #define MSG_WM_SYSKEYUP(func) \
764         if (uMsg == WM_SYSKEYUP) \
765         { \
766                 SetMsgHandled(TRUE); \
767                 func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \
768                 lResult = 0; \
769                 if(IsMsgHandled()) \
770                         return TRUE; \
771         }
772
773 // void OnSysChar(UINT nChar, UINT nRepCnt, UINT nFlags)
774 #define MSG_WM_SYSCHAR(func) \
775         if (uMsg == WM_SYSCHAR) \
776         { \
777                 SetMsgHandled(TRUE); \
778                 func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \
779                 lResult = 0; \
780                 if(IsMsgHandled()) \
781                         return TRUE; \
782         }
783
784 // void OnSysDeadChar(UINT nChar, UINT nRepCnt, UINT nFlags)
785 #define MSG_WM_SYSDEADCHAR(func) \
786         if (uMsg == WM_SYSDEADCHAR) \
787         { \
788                 SetMsgHandled(TRUE); \
789                 func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \
790                 lResult = 0; \
791                 if(IsMsgHandled()) \
792                         return TRUE; \
793         }
794
795 // void OnSysCommand(UINT nID, LPARAM lParam)
796 #define MSG_WM_SYSCOMMAND(func) \
797         if (uMsg == WM_SYSCOMMAND) \
798         { \
799                 SetMsgHandled(TRUE); \
800                 func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
801                 lResult = 0; \
802                 if(IsMsgHandled()) \
803                         return TRUE; \
804         }
805
806 // void OnTCard(UINT idAction, DWORD dwActionData)
807 #define MSG_WM_TCARD(func) \
808         if (uMsg == WM_TCARD) \
809         { \
810                 SetMsgHandled(TRUE); \
811                 func((UINT)wParam, (DWORD)lParam); \
812                 lResult = 0; \
813                 if(IsMsgHandled()) \
814                         return TRUE; \
815         }
816
817 // void OnTimer(UINT_PTR nIDEvent)
818 #define MSG_WM_TIMER(func) \
819         if (uMsg == WM_TIMER) \
820         { \
821                 SetMsgHandled(TRUE); \
822                 func((UINT_PTR)wParam); \
823                 lResult = 0; \
824                 if(IsMsgHandled()) \
825                         return TRUE; \
826         }
827
828 // void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar pScrollBar)
829 #define MSG_WM_HSCROLL(func) \
830         if (uMsg == WM_HSCROLL) \
831         { \
832                 SetMsgHandled(TRUE); \
833                 func((int)LOWORD(wParam), (short)HIWORD(wParam), (HWND)lParam); \
834                 lResult = 0; \
835                 if(IsMsgHandled()) \
836                         return TRUE; \
837         }
838
839 // void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar pScrollBar)
840 #define MSG_WM_VSCROLL(func) \
841         if (uMsg == WM_VSCROLL) \
842         { \
843                 SetMsgHandled(TRUE); \
844                 func((int)LOWORD(wParam), (short)HIWORD(wParam), (HWND)lParam); \
845                 lResult = 0; \
846                 if(IsMsgHandled()) \
847                         return TRUE; \
848         }
849
850 // void OnInitMenu(CMenu menu)
851 #define MSG_WM_INITMENU(func) \
852         if (uMsg == WM_INITMENU) \
853         { \
854                 SetMsgHandled(TRUE); \
855                 func((HMENU)wParam); \
856                 lResult = 0; \
857                 if(IsMsgHandled()) \
858                         return TRUE; \
859         }
860
861 // void OnInitMenuPopup(CMenu menuPopup, UINT nIndex, BOOL bSysMenu)
862 #define MSG_WM_INITMENUPOPUP(func) \
863         if (uMsg == WM_INITMENUPOPUP) \
864         { \
865                 SetMsgHandled(TRUE); \
866                 func((HMENU)wParam, (UINT)LOWORD(lParam), (BOOL)HIWORD(lParam)); \
867                 lResult = 0; \
868                 if(IsMsgHandled()) \
869                         return TRUE; \
870         }
871
872 // void OnMenuSelect(UINT nItemID, UINT nFlags, CMenu menu)
873 #define MSG_WM_MENUSELECT(func) \
874         if (uMsg == WM_MENUSELECT) \
875         { \
876                 SetMsgHandled(TRUE); \
877                 func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), (HMENU)lParam); \
878                 lResult = 0; \
879                 if(IsMsgHandled()) \
880                         return TRUE; \
881         }
882
883 // LRESULT OnMenuChar(UINT nChar, UINT nFlags, CMenu menu)
884 #define MSG_WM_MENUCHAR(func) \
885         if (uMsg == WM_MENUCHAR) \
886         { \
887                 SetMsgHandled(TRUE); \
888                 lResult = func((TCHAR)LOWORD(wParam), (UINT)HIWORD(wParam), (HMENU)lParam); \
889                 if(IsMsgHandled()) \
890                         return TRUE; \
891         }
892
893 // LRESULT OnNotify(int idCtrl, LPNMHDR pnmh)
894 #define MSG_WM_NOTIFY(func) \
895         if (uMsg == WM_NOTIFY) \
896         { \
897                 SetMsgHandled(TRUE); \
898                 lResult = func((int)wParam, (LPNMHDR)lParam); \
899                 if(IsMsgHandled()) \
900                         return TRUE; \
901         }
902
903 // void OnEnterIdle(UINT nWhy, CWindow wndWho)
904 #define MSG_WM_ENTERIDLE(func) \
905         if (uMsg == WM_ENTERIDLE) \
906         { \
907                 SetMsgHandled(TRUE); \
908                 func((UINT)wParam, (HWND)lParam); \
909                 lResult = 0; \
910                 if(IsMsgHandled()) \
911                         return TRUE; \
912         }
913
914 // void OnMouseMove(UINT nFlags, CPoint point)
915 #define MSG_WM_MOUSEMOVE(func) \
916         if (uMsg == WM_MOUSEMOVE) \
917         { \
918                 SetMsgHandled(TRUE); \
919                 func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
920                 lResult = 0; \
921                 if(IsMsgHandled()) \
922                         return TRUE; \
923         }
924
925 // BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
926 #define MSG_WM_MOUSEWHEEL(func) \
927         if (uMsg == WM_MOUSEWHEEL) \
928         { \
929                 SetMsgHandled(TRUE); \
930                 lResult = (LRESULT)func((UINT)LOWORD(wParam), (short)HIWORD(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
931                 if(IsMsgHandled()) \
932                         return TRUE; \
933         }
934
935 // void OnLButtonDown(UINT nFlags, CPoint point)
936 #define MSG_WM_LBUTTONDOWN(func) \
937         if (uMsg == WM_LBUTTONDOWN) \
938         { \
939                 SetMsgHandled(TRUE); \
940                 func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
941                 lResult = 0; \
942                 if(IsMsgHandled()) \
943                         return TRUE; \
944         }
945
946 // void OnLButtonUp(UINT nFlags, CPoint point)
947 #define MSG_WM_LBUTTONUP(func) \
948         if (uMsg == WM_LBUTTONUP) \
949         { \
950                 SetMsgHandled(TRUE); \
951                 func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
952                 lResult = 0; \
953                 if(IsMsgHandled()) \
954                         return TRUE; \
955         }
956
957 // void OnLButtonDblClk(UINT nFlags, CPoint point)
958 #define MSG_WM_LBUTTONDBLCLK(func) \
959         if (uMsg == WM_LBUTTONDBLCLK) \
960         { \
961                 SetMsgHandled(TRUE); \
962                 func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
963                 lResult = 0; \
964                 if(IsMsgHandled()) \
965                         return TRUE; \
966         }
967
968 // void OnRButtonDown(UINT nFlags, CPoint point)
969 #define MSG_WM_RBUTTONDOWN(func) \
970         if (uMsg == WM_RBUTTONDOWN) \
971         { \
972                 SetMsgHandled(TRUE); \
973                 func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
974                 lResult = 0; \
975                 if(IsMsgHandled()) \
976                         return TRUE; \
977         }
978
979 // void OnRButtonUp(UINT nFlags, CPoint point)
980 #define MSG_WM_RBUTTONUP(func) \
981         if (uMsg == WM_RBUTTONUP) \
982         { \
983                 SetMsgHandled(TRUE); \
984                 func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
985                 lResult = 0; \
986                 if(IsMsgHandled()) \
987                         return TRUE; \
988         }
989
990 // void OnRButtonDblClk(UINT nFlags, CPoint point)
991 #define MSG_WM_RBUTTONDBLCLK(func) \
992         if (uMsg == WM_RBUTTONDBLCLK) \
993         { \
994                 SetMsgHandled(TRUE); \
995                 func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
996                 lResult = 0; \
997                 if(IsMsgHandled()) \
998                         return TRUE; \
999         }
1000
1001 // void OnMButtonDown(UINT nFlags, CPoint point)
1002 #define MSG_WM_MBUTTONDOWN(func) \
1003         if (uMsg == WM_MBUTTONDOWN) \
1004         { \
1005                 SetMsgHandled(TRUE); \
1006                 func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
1007                 lResult = 0; \
1008                 if(IsMsgHandled()) \
1009                         return TRUE; \
1010         }
1011
1012 // void OnMButtonUp(UINT nFlags, CPoint point)
1013 #define MSG_WM_MBUTTONUP(func) \
1014         if (uMsg == WM_MBUTTONUP) \
1015         { \
1016                 SetMsgHandled(TRUE); \
1017                 func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
1018                 lResult = 0; \
1019                 if(IsMsgHandled()) \
1020                         return TRUE; \
1021         }
1022
1023 // void OnMButtonDblClk(UINT nFlags, CPoint point)
1024 #define MSG_WM_MBUTTONDBLCLK(func) \
1025         if (uMsg == WM_MBUTTONDBLCLK) \
1026         { \
1027                 SetMsgHandled(TRUE); \
1028                 func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
1029                 lResult = 0; \
1030                 if(IsMsgHandled()) \
1031                         return TRUE; \
1032         }
1033
1034 // void OnParentNotify(UINT message, UINT nChildID, LPARAM lParam)
1035 #define MSG_WM_PARENTNOTIFY(func) \
1036         if (uMsg == WM_PARENTNOTIFY) \
1037         { \
1038                 SetMsgHandled(TRUE); \
1039                 func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), lParam); \
1040                 lResult = 0; \
1041                 if(IsMsgHandled()) \
1042                         return TRUE; \
1043         }
1044
1045 // void OnMDIActivate(CWindow wndActivate, CWindow wndDeactivate)
1046 #define MSG_WM_MDIACTIVATE(func) \
1047         if (uMsg == WM_MDIACTIVATE) \
1048         { \
1049                 SetMsgHandled(TRUE); \
1050                 func((HWND)wParam, (HWND)lParam); \
1051                 lResult = 0; \
1052                 if(IsMsgHandled()) \
1053                         return TRUE; \
1054         }
1055
1056 // void OnRenderFormat(UINT nFormat)
1057 #define MSG_WM_RENDERFORMAT(func) \
1058         if (uMsg == WM_RENDERFORMAT) \
1059         { \
1060                 SetMsgHandled(TRUE); \
1061                 func((UINT)wParam); \
1062                 lResult = 0; \
1063                 if(IsMsgHandled()) \
1064                         return TRUE; \
1065         }
1066
1067 // void OnRenderAllFormats()
1068 #define MSG_WM_RENDERALLFORMATS(func) \
1069         if (uMsg == WM_RENDERALLFORMATS) \
1070         { \
1071                 SetMsgHandled(TRUE); \
1072                 func(); \
1073                 lResult = 0; \
1074                 if(IsMsgHandled()) \
1075                         return TRUE; \
1076         }
1077
1078 // void OnDestroyClipboard()
1079 #define MSG_WM_DESTROYCLIPBOARD(func) \
1080         if (uMsg == WM_DESTROYCLIPBOARD) \
1081         { \
1082                 SetMsgHandled(TRUE); \
1083                 func(); \
1084                 lResult = 0; \
1085                 if(IsMsgHandled()) \
1086                         return TRUE; \
1087         }
1088
1089 // void OnDrawClipboard()
1090 #define MSG_WM_DRAWCLIPBOARD(func) \
1091         if (uMsg == WM_DRAWCLIPBOARD) \
1092         { \
1093                 SetMsgHandled(TRUE); \
1094                 func(); \
1095                 lResult = 0; \
1096                 if(IsMsgHandled()) \
1097                         return TRUE; \
1098         }
1099
1100 // void OnPaintClipboard(CWindow wndViewer, const LPPAINTSTRUCT lpPaintStruct)
1101 #define MSG_WM_PAINTCLIPBOARD(func) \
1102         if (uMsg == WM_PAINTCLIPBOARD) \
1103         { \
1104                 SetMsgHandled(TRUE); \
1105                 func((HWND)wParam, (const LPPAINTSTRUCT)::GlobalLock((HGLOBAL)lParam)); \
1106                 ::GlobalUnlock((HGLOBAL)lParam); \
1107                 lResult = 0; \
1108                 if(IsMsgHandled()) \
1109                         return TRUE; \
1110         }
1111
1112 // void OnVScrollClipboard(CWindow wndViewer, UINT nSBCode, UINT nPos)
1113 #define MSG_WM_VSCROLLCLIPBOARD(func) \
1114         if (uMsg == WM_VSCROLLCLIPBOARD) \
1115         { \
1116                 SetMsgHandled(TRUE); \
1117                 func((HWND)wParam, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam)); \
1118                 lResult = 0; \
1119                 if(IsMsgHandled()) \
1120                         return TRUE; \
1121         }
1122
1123 // void OnContextMenu(CWindow wnd, CPoint point)
1124 #define MSG_WM_CONTEXTMENU(func) \
1125         if (uMsg == WM_CONTEXTMENU) \
1126         { \
1127                 SetMsgHandled(TRUE); \
1128                 func((HWND)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
1129                 lResult = 0; \
1130                 if(IsMsgHandled()) \
1131                         return TRUE; \
1132         }
1133
1134 // void OnSizeClipboard(CWindow wndViewer, const LPRECT lpRect)
1135 #define MSG_WM_SIZECLIPBOARD(func) \
1136         if (uMsg == WM_SIZECLIPBOARD) \
1137         { \
1138                 SetMsgHandled(TRUE); \
1139                 func((HWND)wParam, (const LPRECT)::GlobalLock((HGLOBAL)lParam)); \
1140                 ::GlobalUnlock((HGLOBAL)lParam); \
1141                 lResult = 0; \
1142                 if(IsMsgHandled()) \
1143                         return TRUE; \
1144         }
1145
1146 // void OnAskCbFormatName(UINT nMaxCount, LPTSTR lpszString)
1147 #define MSG_WM_ASKCBFORMATNAME(func) \
1148         if (uMsg == WM_ASKCBFORMATNAME) \
1149         { \
1150                 SetMsgHandled(TRUE); \
1151                 func((DWORD)wParam, (LPTSTR)lParam); \
1152                 lResult = 0; \
1153                 if(IsMsgHandled()) \
1154                         return TRUE; \
1155         }
1156
1157 // void OnChangeCbChain(CWindow wndRemove, CWindow wndAfter)
1158 #define MSG_WM_CHANGECBCHAIN(func) \
1159         if (uMsg == WM_CHANGECBCHAIN) \
1160         { \
1161                 SetMsgHandled(TRUE); \
1162                 func((HWND)wParam, (HWND)lParam); \
1163                 lResult = 0; \
1164                 if(IsMsgHandled()) \
1165                         return TRUE; \
1166         }
1167
1168 // void OnHScrollClipboard(CWindow wndViewer, UINT nSBCode, UINT nPos)
1169 #define MSG_WM_HSCROLLCLIPBOARD(func) \
1170         if (uMsg == WM_HSCROLLCLIPBOARD) \
1171         { \
1172                 SetMsgHandled(TRUE); \
1173                 func((HWND)wParam, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam)); \
1174                 lResult = 0; \
1175                 if(IsMsgHandled()) \
1176                         return TRUE; \
1177         }
1178
1179 // BOOL OnQueryNewPalette()
1180 #define MSG_WM_QUERYNEWPALETTE(func) \
1181         if (uMsg == WM_QUERYNEWPALETTE) \
1182         { \
1183                 SetMsgHandled(TRUE); \
1184                 lResult = (LRESULT)func(); \
1185                 if(IsMsgHandled()) \
1186                         return TRUE; \
1187         }
1188
1189 // void OnPaletteChanged(CWindow wndFocus)
1190 #define MSG_WM_PALETTECHANGED(func) \
1191         if (uMsg == WM_PALETTECHANGED) \
1192         { \
1193                 SetMsgHandled(TRUE); \
1194                 func((HWND)wParam); \
1195                 lResult = 0; \
1196                 if(IsMsgHandled()) \
1197                         return TRUE; \
1198         }
1199
1200 // void OnPaletteIsChanging(CWindow wndPalChg)
1201 #define MSG_WM_PALETTEISCHANGING(func) \
1202         if (uMsg == WM_PALETTEISCHANGING) \
1203         { \
1204                 SetMsgHandled(TRUE); \
1205                 func((HWND)wParam); \
1206                 lResult = 0; \
1207                 if(IsMsgHandled()) \
1208                         return TRUE; \
1209         }
1210
1211 // void OnDropFiles(HDROP hDropInfo)
1212 #define MSG_WM_DROPFILES(func) \
1213         if (uMsg == WM_DROPFILES) \
1214         { \
1215                 SetMsgHandled(TRUE); \
1216                 func((HDROP)wParam); \
1217                 lResult = 0; \
1218                 if(IsMsgHandled()) \
1219                         return TRUE; \
1220         }
1221
1222 // void OnWindowPosChanging(LPWINDOWPOS lpWndPos)
1223 #define MSG_WM_WINDOWPOSCHANGING(func) \
1224         if (uMsg == WM_WINDOWPOSCHANGING) \
1225         { \
1226                 SetMsgHandled(TRUE); \
1227                 func((LPWINDOWPOS)lParam); \
1228                 lResult = 0; \
1229                 if(IsMsgHandled()) \
1230                         return TRUE; \
1231         }
1232
1233 // void OnWindowPosChanged(LPWINDOWPOS lpWndPos)
1234 #define MSG_WM_WINDOWPOSCHANGED(func) \
1235         if (uMsg == WM_WINDOWPOSCHANGED) \
1236         { \
1237                 SetMsgHandled(TRUE); \
1238                 func((LPWINDOWPOS)lParam); \
1239                 lResult = 0; \
1240                 if(IsMsgHandled()) \
1241                         return TRUE; \
1242         }
1243
1244 // void OnExitMenuLoop(BOOL fIsTrackPopupMenu)
1245 #define MSG_WM_EXITMENULOOP(func) \
1246         if (uMsg == WM_EXITMENULOOP) \
1247         { \
1248                 SetMsgHandled(TRUE); \
1249                 func((BOOL)wParam); \
1250                 lResult = 0; \
1251                 if(IsMsgHandled()) \
1252                         return TRUE; \
1253         }
1254
1255 // void OnEnterMenuLoop(BOOL fIsTrackPopupMenu)
1256 #define MSG_WM_ENTERMENULOOP(func) \
1257         if (uMsg == WM_ENTERMENULOOP) \
1258         { \
1259                 SetMsgHandled(TRUE); \
1260                 func((BOOL)wParam); \
1261                 lResult = 0; \
1262                 if(IsMsgHandled()) \
1263                         return TRUE; \
1264         }
1265
1266 // void OnStyleChanged(int nStyleType, LPSTYLESTRUCT lpStyleStruct)
1267 #define MSG_WM_STYLECHANGED(func) \
1268         if (uMsg == WM_STYLECHANGED) \
1269         { \
1270                 SetMsgHandled(TRUE); \
1271                 func((UINT)wParam, (LPSTYLESTRUCT)lParam); \
1272                 lResult = 0; \
1273                 if(IsMsgHandled()) \
1274                         return TRUE; \
1275         }
1276
1277 // void OnStyleChanging(int nStyleType, LPSTYLESTRUCT lpStyleStruct)
1278 #define MSG_WM_STYLECHANGING(func) \
1279         if (uMsg == WM_STYLECHANGING) \
1280         { \
1281                 SetMsgHandled(TRUE); \
1282                 func((UINT)wParam, (LPSTYLESTRUCT)lParam); \
1283                 lResult = 0; \
1284                 if(IsMsgHandled()) \
1285                         return TRUE; \
1286         }
1287
1288 // void OnSizing(UINT fwSide, LPRECT pRect)
1289 #define MSG_WM_SIZING(func) \
1290         if (uMsg == WM_SIZING) \
1291         { \
1292                 SetMsgHandled(TRUE); \
1293                 func((UINT)wParam, (LPRECT)lParam); \
1294                 lResult = TRUE; \
1295                 if(IsMsgHandled()) \
1296                         return TRUE; \
1297         }
1298
1299 // void OnMoving(UINT fwSide, LPRECT pRect)
1300 #define MSG_WM_MOVING(func) \
1301         if (uMsg == WM_MOVING) \
1302         { \
1303                 SetMsgHandled(TRUE); \
1304                 func((UINT)wParam, (LPRECT)lParam); \
1305                 lResult = TRUE; \
1306                 if(IsMsgHandled()) \
1307                         return TRUE; \
1308         }
1309
1310 // void OnCaptureChanged(CWindow wnd)
1311 #define MSG_WM_CAPTURECHANGED(func) \
1312         if (uMsg == WM_CAPTURECHANGED) \
1313         { \
1314                 SetMsgHandled(TRUE); \
1315                 func((HWND)lParam); \
1316                 lResult = 0; \
1317                 if(IsMsgHandled()) \
1318                         return TRUE; \
1319         }
1320
1321 // BOOL OnDeviceChange(UINT nEventType, DWORD dwData)
1322 #define MSG_WM_DEVICECHANGE(func) \
1323         if (uMsg == WM_DEVICECHANGE) \
1324         { \
1325                 SetMsgHandled(TRUE); \
1326                 lResult = (LRESULT)func((UINT)wParam, (DWORD)lParam); \
1327                 if(IsMsgHandled()) \
1328                         return TRUE; \
1329         }
1330
1331 // void OnCommand(UINT uNotifyCode, int nID, CWindow wndCtl)
1332 #define MSG_WM_COMMAND(func) \
1333         if (uMsg == WM_COMMAND) \
1334         { \
1335                 SetMsgHandled(TRUE); \
1336                 func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \
1337                 lResult = 0; \
1338                 if(IsMsgHandled()) \
1339                         return TRUE; \
1340         }
1341
1342 // void OnDisplayChange(UINT uBitsPerPixel, CSize sizeScreen)
1343 #define MSG_WM_DISPLAYCHANGE(func) \
1344         if (uMsg == WM_DISPLAYCHANGE) \
1345         { \
1346                 SetMsgHandled(TRUE); \
1347                 func((UINT)wParam, _WTYPES_NS::CSize(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
1348                 lResult = 0; \
1349                 if(IsMsgHandled()) \
1350                         return TRUE; \
1351         }
1352
1353 // void OnEnterSizeMove()
1354 #define MSG_WM_ENTERSIZEMOVE(func) \
1355         if (uMsg == WM_ENTERSIZEMOVE) \
1356         { \
1357                 SetMsgHandled(TRUE); \
1358                 func(); \
1359                 lResult = 0; \
1360                 if(IsMsgHandled()) \
1361                         return TRUE; \
1362         }
1363
1364 // void OnExitSizeMove()
1365 #define MSG_WM_EXITSIZEMOVE(func) \
1366         if (uMsg == WM_EXITSIZEMOVE) \
1367         { \
1368                 SetMsgHandled(TRUE); \
1369                 func(); \
1370                 lResult = 0; \
1371                 if(IsMsgHandled()) \
1372                         return TRUE; \
1373         }
1374
1375 // HFONT OnGetFont()
1376 #define MSG_WM_GETFONT(func) \
1377         if (uMsg == WM_GETFONT) \
1378         { \
1379                 SetMsgHandled(TRUE); \
1380                 lResult = (LRESULT)func(); \
1381                 if(IsMsgHandled()) \
1382                         return TRUE; \
1383         }
1384
1385 // LRESULT OnGetHotKey()
1386 #define MSG_WM_GETHOTKEY(func) \
1387         if (uMsg == WM_GETHOTKEY) \
1388         { \
1389                 SetMsgHandled(TRUE); \
1390                 lResult = func(); \
1391                 if(IsMsgHandled()) \
1392                         return TRUE; \
1393         }
1394
1395 // HICON OnGetIcon()
1396 #define MSG_WM_GETICON(func) \
1397         if (uMsg == WM_GETICON) \
1398         { \
1399                 SetMsgHandled(TRUE); \
1400                 lResult = (LRESULT)func((UINT)wParam); \
1401                 if(IsMsgHandled()) \
1402                         return TRUE; \
1403         }
1404
1405 // int OnGetText(int cchTextMax, LPTSTR lpszText)
1406 #define MSG_WM_GETTEXT(func) \
1407         if (uMsg == WM_GETTEXT) \
1408         { \
1409                 SetMsgHandled(TRUE); \
1410                 lResult = (LRESULT)func((int)wParam, (LPTSTR)lParam); \
1411                 if(IsMsgHandled()) \
1412                         return TRUE; \
1413         }
1414
1415 // int OnGetTextLength()
1416 #define MSG_WM_GETTEXTLENGTH(func) \
1417         if (uMsg == WM_GETTEXTLENGTH) \
1418         { \
1419                 SetMsgHandled(TRUE); \
1420                 lResult = (LRESULT)func(); \
1421                 if(IsMsgHandled()) \
1422                         return TRUE; \
1423         }
1424
1425 // void OnHelp(LPHELPINFO lpHelpInfo)
1426 #define MSG_WM_HELP(func) \
1427         if (uMsg == WM_HELP) \
1428         { \
1429                 SetMsgHandled(TRUE); \
1430                 func((LPHELPINFO)lParam); \
1431                 lResult = TRUE; \
1432                 if(IsMsgHandled()) \
1433                         return TRUE; \
1434         }
1435
1436 // void OnHotKey(int nHotKeyID, UINT uModifiers, UINT uVirtKey)
1437 #define MSG_WM_HOTKEY(func) \
1438         if (uMsg == WM_HOTKEY) \
1439         { \
1440                 SetMsgHandled(TRUE); \
1441                 func((int)wParam, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam)); \
1442                 lResult = 0; \
1443                 if(IsMsgHandled()) \
1444                         return TRUE; \
1445         }
1446
1447 // void OnInputLangChange(DWORD dwCharSet, HKL hKbdLayout)
1448 #define MSG_WM_INPUTLANGCHANGE(func) \
1449         if (uMsg == WM_INPUTLANGCHANGE) \
1450         { \
1451                 SetMsgHandled(TRUE); \
1452                 func((DWORD)wParam, (HKL)lParam); \
1453                 lResult = TRUE; \
1454                 if(IsMsgHandled()) \
1455                         return TRUE; \
1456         }
1457
1458 // void OnInputLangChangeRequest(BOOL bSysCharSet, HKL hKbdLayout)
1459 #define MSG_WM_INPUTLANGCHANGEREQUEST(func) \
1460         if (uMsg == WM_INPUTLANGCHANGEREQUEST) \
1461         { \
1462                 SetMsgHandled(TRUE); \
1463                 func((BOOL)wParam, (HKL)lParam); \
1464                 lResult = 0; \
1465                 if(IsMsgHandled()) \
1466                         return TRUE; \
1467         }
1468
1469 // void OnNextDlgCtl(BOOL bHandle, WPARAM wCtlFocus)
1470 #define MSG_WM_NEXTDLGCTL(func) \
1471         if (uMsg == WM_NEXTDLGCTL) \
1472         { \
1473                 SetMsgHandled(TRUE); \
1474                 func((BOOL)LOWORD(lParam), wParam); \
1475                 lResult = 0; \
1476                 if(IsMsgHandled()) \
1477                         return TRUE; \
1478         }
1479
1480 // void OnNextMenu(int nVirtKey, LPMDINEXTMENU lpMdiNextMenu)
1481 #define MSG_WM_NEXTMENU(func) \
1482         if (uMsg == WM_NEXTMENU) \
1483         { \
1484                 SetMsgHandled(TRUE); \
1485                 func((int)wParam, (LPMDINEXTMENU)lParam); \
1486                 lResult = 0; \
1487                 if(IsMsgHandled()) \
1488                         return TRUE; \
1489         }
1490
1491 // int OnNotifyFormat(CWindow wndFrom, int nCommand)
1492 #define MSG_WM_NOTIFYFORMAT(func) \
1493         if (uMsg == WM_NOTIFYFORMAT) \
1494         { \
1495                 SetMsgHandled(TRUE); \
1496                 lResult = (LRESULT)func((HWND)wParam, (int)lParam); \
1497                 if(IsMsgHandled()) \
1498                         return TRUE; \
1499         }
1500
1501 // BOOL OnPowerBroadcast(DWORD dwPowerEvent, DWORD dwData)
1502 #define MSG_WM_POWERBROADCAST(func) \
1503         if (uMsg == WM_POWERBROADCAST) \
1504         { \
1505                 SetMsgHandled(TRUE); \
1506                 lResult = (LRESULT)func((DWORD)wParam, (DWORD)lParam); \
1507                 if(IsMsgHandled()) \
1508                         return TRUE; \
1509         }
1510
1511 // void OnPrint(CDCHandle dc, UINT uFlags)
1512 #define MSG_WM_PRINT(func) \
1513         if (uMsg == WM_PRINT) \
1514         { \
1515                 SetMsgHandled(TRUE); \
1516                 func((HDC)wParam, (UINT)lParam); \
1517                 lResult = 0; \
1518                 if(IsMsgHandled()) \
1519                         return TRUE; \
1520         }
1521
1522 // void OnPrintClient(CDCHandle dc, UINT uFlags)
1523 #define MSG_WM_PRINTCLIENT(func) \
1524         if (uMsg == WM_PRINTCLIENT) \
1525         { \
1526                 SetMsgHandled(TRUE); \
1527                 func((HDC)wParam, (UINT)lParam); \
1528                 lResult = 0; \
1529                 if(IsMsgHandled()) \
1530                         return TRUE; \
1531         }
1532
1533 // void OnRasDialEvent(RASCONNSTATE rasconnstate, DWORD dwError)
1534 #define MSG_WM_RASDIALEVENT(func) \
1535         if (uMsg == WM_RASDIALEVENT) \
1536         { \
1537                 SetMsgHandled(TRUE); \
1538                 func((RASCONNSTATE)wParam, (DWORD)lParam); \
1539                 lResult = TRUE; \
1540                 if(IsMsgHandled()) \
1541                         return TRUE; \
1542         }
1543
1544 // void OnSetFont(CFont font, BOOL bRedraw)
1545 #define MSG_WM_SETFONT(func) \
1546         if (uMsg == WM_SETFONT) \
1547         { \
1548                 SetMsgHandled(TRUE); \
1549                 func((HFONT)wParam, (BOOL)LOWORD(lParam)); \
1550                 lResult = 0; \
1551                 if(IsMsgHandled()) \
1552                         return TRUE; \
1553         }
1554
1555 // int OnSetHotKey(int nVirtKey, UINT uFlags)
1556 #define MSG_WM_SETHOTKEY(func) \
1557         if (uMsg == WM_SETHOTKEY) \
1558         { \
1559                 SetMsgHandled(TRUE); \
1560                 lResult = (LRESULT)func((int)LOBYTE(LOWORD(wParam)), (UINT)HIBYTE(LOWORD(wParam))); \
1561                 if(IsMsgHandled()) \
1562                         return TRUE; \
1563         }
1564
1565 // HICON OnSetIcon(UINT uType, HICON hIcon)
1566 #define MSG_WM_SETICON(func) \
1567         if (uMsg == WM_SETICON) \
1568         { \
1569                 SetMsgHandled(TRUE); \
1570                 lResult = (LRESULT)func((UINT)wParam, (HICON)lParam); \
1571                 if(IsMsgHandled()) \
1572                         return TRUE; \
1573         }
1574
1575 // void OnSetRedraw(BOOL bRedraw)
1576 #define MSG_WM_SETREDRAW(func) \
1577         if (uMsg == WM_SETREDRAW) \
1578         { \
1579                 SetMsgHandled(TRUE); \
1580                 func((BOOL)wParam); \
1581                 lResult = 0; \
1582                 if(IsMsgHandled()) \
1583                         return TRUE; \
1584         }
1585
1586 // int OnSetText(LPCTSTR lpstrText)
1587 #define MSG_WM_SETTEXT(func) \
1588         if (uMsg == WM_SETTEXT) \
1589         { \
1590                 SetMsgHandled(TRUE); \
1591                 lResult = (LRESULT)func((LPCTSTR)lParam); \
1592                 if(IsMsgHandled()) \
1593                         return TRUE; \
1594         }
1595
1596 // void OnUserChanged()
1597 #define MSG_WM_USERCHANGED(func) \
1598         if (uMsg == WM_USERCHANGED) \
1599         { \
1600                 SetMsgHandled(TRUE); \
1601                 func(); \
1602                 lResult = 0; \
1603                 if(IsMsgHandled()) \
1604                         return TRUE; \
1605         }
1606
1607 ///////////////////////////////////////////////////////////////////////////////
1608 // New NT4 & NT5 messages
1609
1610 #if(_WIN32_WINNT >= 0x0400)
1611
1612 // void OnMouseHover(WPARAM wParam, CPoint ptPos)
1613 #define MSG_WM_MOUSEHOVER(func) \
1614         if (uMsg == WM_MOUSEHOVER) \
1615         { \
1616                 SetMsgHandled(TRUE); \
1617                 func(wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
1618                 lResult = 0; \
1619                 if(IsMsgHandled()) \
1620                         return TRUE; \
1621         }
1622
1623 // void OnMouseLeave()
1624 #define MSG_WM_MOUSELEAVE(func) \
1625         if (uMsg == WM_MOUSELEAVE) \
1626         { \
1627                 SetMsgHandled(TRUE); \
1628                 func(); \
1629                 lResult = 0; \
1630                 if(IsMsgHandled()) \
1631                         return TRUE; \
1632         }
1633
1634 #endif /* _WIN32_WINNT >= 0x0400 */
1635
1636 #if(WINVER >= 0x0500)
1637
1638 // void OnMenuRButtonUp(WPARAM wParam, CMenu menu)
1639 #define MSG_WM_MENURBUTTONUP(func) \
1640         if (uMsg == WM_MENURBUTTONUP) \
1641         { \
1642                 SetMsgHandled(TRUE); \
1643                 func(wParam, (HMENU)lParam); \
1644                 lResult = 0; \
1645                 if(IsMsgHandled()) \
1646                         return TRUE; \
1647         }
1648
1649 // LRESULT OnMenuDrag(WPARAM wParam, CMenu menu)
1650 #define MSG_WM_MENUDRAG(func) \
1651         if (uMsg == WM_MENUDRAG) \
1652         { \
1653                 SetMsgHandled(TRUE); \
1654                 lResult = func(wParam, (HMENU)lParam); \
1655                 if(IsMsgHandled()) \
1656                         return TRUE; \
1657         }
1658
1659 // LRESULT OnMenuGetObject(PMENUGETOBJECTINFO info)
1660 #define MSG_WM_MENUGETOBJECT(func) \
1661         if (uMsg == WM_MENUGETOBJECT) \
1662         { \
1663                 SetMsgHandled(TRUE); \
1664                 lResult = func((PMENUGETOBJECTINFO)lParam); \
1665                 if(IsMsgHandled()) \
1666                         return TRUE; \
1667         }
1668
1669 // void OnUnInitMenuPopup(UINT nID, CMenu menu)
1670 #define MSG_WM_UNINITMENUPOPUP(func) \
1671         if (uMsg == WM_UNINITMENUPOPUP) \
1672         { \
1673                 SetMsgHandled(TRUE); \
1674                 func((UINT)HIWORD(lParam), (HMENU)wParam); \
1675                 lResult = 0; \
1676                 if(IsMsgHandled()) \
1677                         return TRUE; \
1678         }
1679
1680 // void OnMenuCommand(WPARAM nIndex, CMenu menu)
1681 #define MSG_WM_MENUCOMMAND(func) \
1682         if (uMsg == WM_MENUCOMMAND) \
1683         { \
1684                 SetMsgHandled(TRUE); \
1685                 func(wParam, (HMENU)lParam); \
1686                 lResult = 0; \
1687                 if(IsMsgHandled()) \
1688                         return TRUE; \
1689         }
1690
1691 #endif /* WINVER >= 0x0500 */
1692
1693 #if(_WIN32_WINNT >= 0x0500)
1694
1695 // BOOL OnAppCommand(CWindow wndFocus, short cmd, WORD uDevice, int dwKeys)
1696 #define MSG_WM_APPCOMMAND(func) \
1697         if (uMsg == WM_APPCOMMAND) \
1698         { \
1699                 SetMsgHandled(TRUE); \
1700                 lResult = (LRESULT)func((HWND)wParam, GET_APPCOMMAND_LPARAM(lParam), GET_DEVICE_LPARAM(lParam), GET_KEYSTATE_LPARAM(lParam)); \
1701                 if(IsMsgHandled()) \
1702                         return TRUE; \
1703         }
1704
1705 // void OnNCXButtonDown(int fwButton, short nHittest, CPoint ptPos)
1706 #define MSG_WM_NCXBUTTONDOWN(func) \
1707         if (uMsg == WM_NCXBUTTONDOWN) \
1708         { \
1709                 SetMsgHandled(TRUE); \
1710                 func(GET_XBUTTON_WPARAM(wParam), GET_NCHITTEST_WPARAM(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
1711                 lResult = 0; \
1712                 if(IsMsgHandled()) \
1713                         return TRUE; \
1714         }
1715
1716 // void OnNCXButtonUp(int fwButton, short nHittest, CPoint ptPos)
1717 #define MSG_WM_NCXBUTTONUP(func) \
1718         if (uMsg == WM_NCXBUTTONUP) \
1719         { \
1720                 SetMsgHandled(TRUE); \
1721                 func(GET_XBUTTON_WPARAM(wParam), GET_NCHITTEST_WPARAM(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
1722                 lResult = 0; \
1723                 if(IsMsgHandled()) \
1724                         return TRUE; \
1725         }
1726
1727 // void OnNCXButtonDblClk(int fwButton, short nHittest, CPoint ptPos)
1728 #define MSG_WM_NCXBUTTONDBLCLK(func) \
1729         if (uMsg == WM_NCXBUTTONDBLCLK) \
1730         { \
1731                 SetMsgHandled(TRUE); \
1732                 func(GET_XBUTTON_WPARAM(wParam), GET_NCHITTEST_WPARAM(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
1733                 lResult = 0; \
1734                 if(IsMsgHandled()) \
1735                         return TRUE; \
1736         }
1737
1738 // void OnXButtonDown(int fwButton, int dwKeys, CPoint ptPos)
1739 #define MSG_WM_XBUTTONDOWN(func) \
1740         if (uMsg == WM_XBUTTONDOWN) \
1741         { \
1742                 SetMsgHandled(TRUE); \
1743                 func(GET_XBUTTON_WPARAM(wParam), GET_KEYSTATE_WPARAM(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
1744                 lResult = 0; \
1745                 if(IsMsgHandled()) \
1746                         return TRUE; \
1747         }
1748
1749 // void OnXButtonUp(int fwButton, int dwKeys, CPoint ptPos)
1750 #define MSG_WM_XBUTTONUP(func) \
1751         if (uMsg == WM_XBUTTONUP) \
1752         { \
1753                 SetMsgHandled(TRUE); \
1754                 func(GET_XBUTTON_WPARAM(wParam), GET_KEYSTATE_WPARAM(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
1755                 lResult = 0; \
1756                 if(IsMsgHandled()) \
1757                         return TRUE; \
1758         }
1759
1760 // void OnXButtonDblClk(int fwButton, int dwKeys, CPoint ptPos)
1761 #define MSG_WM_XBUTTONDBLCLK(func) \
1762         if (uMsg == WM_XBUTTONDBLCLK) \
1763         { \
1764                 SetMsgHandled(TRUE); \
1765                 func(GET_XBUTTON_WPARAM(wParam), GET_KEYSTATE_WPARAM(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \
1766                 lResult = 0; \
1767                 if(IsMsgHandled()) \
1768                         return TRUE; \
1769         }
1770
1771 // void OnChangeUIState(WORD nAction, WORD nState)
1772 #define MSG_WM_CHANGEUISTATE(func) \
1773         if (uMsg == WM_CHANGEUISTATE) \
1774         { \
1775                 SetMsgHandled(TRUE); \
1776                 func(LOWORD(wParam), HIWORD(wParam)); \
1777                 lResult = 0; \
1778                 if(IsMsgHandled()) \
1779                         return TRUE; \
1780         }
1781
1782 // void OnUpdateUIState(WORD nAction, WORD nState)
1783 #define MSG_WM_UPDATEUISTATE(func) \
1784         if (uMsg == WM_UPDATEUISTATE) \
1785         { \
1786                 SetMsgHandled(TRUE); \
1787                 func(LOWORD(wParam), HIWORD(wParam)); \
1788                 lResult = 0; \
1789                 if(IsMsgHandled()) \
1790                         return TRUE; \
1791         }
1792
1793 // LRESULT OnQueryUIState()
1794 #define MSG_WM_QUERYUISTATE(func) \
1795         if (uMsg == WM_QUERYUISTATE) \
1796         { \
1797                 SetMsgHandled(TRUE); \
1798                 lResult = func(); \
1799                 if(IsMsgHandled()) \
1800                         return TRUE; \
1801         }
1802
1803 #endif // (_WIN32_WINNT >= 0x0500)
1804
1805 #if(_WIN32_WINNT >= 0x0501)
1806
1807 // void OnInput(WPARAM RawInputCode, HRAWINPUT hRawInput)
1808 #define MSG_WM_INPUT(func) \
1809         if (uMsg == WM_INPUT) \
1810         { \
1811                 SetMsgHandled(TRUE); \
1812                 func(GET_RAWINPUT_CODE_WPARAM(wParam), (HRAWINPUT)lParam); \
1813                 lResult = 0; \
1814                 if(IsMsgHandled()) \
1815                         return TRUE; \
1816         }
1817
1818 // void OnUniChar(TCHAR nChar, UINT nRepCnt, UINT nFlags)
1819 #define MSG_WM_UNICHAR(func) \
1820         if (uMsg == WM_UNICHAR) \
1821         { \
1822                 SetMsgHandled(TRUE); \
1823                 func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \
1824                 if(IsMsgHandled()) \
1825                 { \
1826                         lResult = (wParam == UNICODE_NOCHAR) ? TRUE : FALSE; \
1827                         return TRUE; \
1828                 } \
1829         }
1830
1831 // void OnWTSSessionChange(WPARAM nStatusCode, PWTSSESSION_NOTIFICATION nSessionID)
1832 #define MSG_WM_WTSSESSION_CHANGE(func) \
1833         if (uMsg == WM_WTSSESSION_CHANGE) \
1834         { \
1835                 SetMsgHandled(TRUE); \
1836                 func(wParam, (PWTSSESSION_NOTIFICATION)lParam); \
1837                 lResult = 0; \
1838                 if(IsMsgHandled()) \
1839                         return TRUE; \
1840         }
1841
1842 // OnThemeChanged()
1843 #define MSG_WM_THEMECHANGED(func) \
1844         if (uMsg == WM_THEMECHANGED) \
1845         { \
1846                 SetMsgHandled(TRUE); \
1847                 func(); \
1848                 lResult = 0; \
1849                 if(IsMsgHandled()) \
1850                         return TRUE; \
1851         }
1852
1853 #endif /* _WIN32_WINNT >= 0x0501 */
1854
1855 ///////////////////////////////////////////////////////////////////////////////
1856 // ATL defined messages
1857
1858 // BOOL OnForwardMsg(LPMSG Msg, DWORD nUserData)
1859 #define MSG_WM_FORWARDMSG(func) \
1860         if (uMsg == WM_FORWARDMSG) \
1861         { \
1862                 SetMsgHandled(TRUE); \
1863                 lResult = (LRESULT)func((LPMSG)lParam, (DWORD)wParam); \
1864                 if(IsMsgHandled()) \
1865                         return TRUE; \
1866         }
1867
1868 ///////////////////////////////////////////////////////////////////////////////
1869 // Dialog specific messages
1870
1871 // LRESULT OnDMGetDefID()
1872 #define MSG_DM_GETDEFID(func) \
1873         if (uMsg == DM_GETDEFID) \
1874         { \
1875                 SetMsgHandled(TRUE); \
1876                 lResult = func(); \
1877                 if(IsMsgHandled()) \
1878                         return TRUE; \
1879         }
1880
1881 // void OnDMSetDefID(UINT DefID)
1882 #define MSG_DM_SETDEFID(func) \
1883         if (uMsg == DM_SETDEFID) \
1884         { \
1885                 SetMsgHandled(TRUE); \
1886                 func((UINT)wParam); \
1887                 lResult = TRUE; \
1888                 if(IsMsgHandled()) \
1889                         return TRUE; \
1890         }
1891
1892 // void OnDMReposition()
1893 #define MSG_DM_REPOSITION(func) \
1894         if (uMsg == DM_REPOSITION) \
1895         { \
1896                 SetMsgHandled(TRUE); \
1897                 func(); \
1898                 lResult = 0; \
1899                 if(IsMsgHandled()) \
1900                         return TRUE; \
1901         }
1902
1903 ///////////////////////////////////////////////////////////////////////////////
1904 // Reflected messages
1905
1906 // void OnReflectedCommand(UINT uNotifyCode, int nID, CWindow wndCtl)
1907 #define MSG_OCM_COMMAND(func) \
1908         if (uMsg == OCM_COMMAND) \
1909         { \
1910                 SetMsgHandled(TRUE); \
1911                 func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \
1912                 lResult = 0; \
1913                 if(IsMsgHandled()) \
1914                         return TRUE; \
1915         }
1916
1917 // LRESULT OnReflectedNotify(int idCtrl, LPNMHDR pnmh)
1918 #define MSG_OCM_NOTIFY(func) \
1919         if (uMsg == OCM_NOTIFY) \
1920         { \
1921                 SetMsgHandled(TRUE); \
1922                 lResult = func((int)wParam, (LPNMHDR)lParam); \
1923                 if(IsMsgHandled()) \
1924                         return TRUE; \
1925         }
1926
1927 // void OnReflectedParentNotify(UINT message, UINT nChildID, LPARAM lParam)
1928 #define MSG_OCM_PARENTNOTIFY(func) \
1929         if (uMsg == OCM_PARENTNOTIFY) \
1930         { \
1931                 SetMsgHandled(TRUE); \
1932                 func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), lParam); \
1933                 lResult = 0; \
1934                 if(IsMsgHandled()) \
1935                         return TRUE; \
1936         }
1937
1938 // void OnReflectedDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
1939 #define MSG_OCM_DRAWITEM(func) \
1940         if (uMsg == OCM_DRAWITEM) \
1941         { \
1942                 SetMsgHandled(TRUE); \
1943                 func((UINT)wParam, (LPDRAWITEMSTRUCT)lParam); \
1944                 lResult = TRUE; \
1945                 if(IsMsgHandled()) \
1946                         return TRUE; \
1947         }
1948
1949 // void OnReflectedMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
1950 #define MSG_OCM_MEASUREITEM(func) \
1951         if (uMsg == OCM_MEASUREITEM) \
1952         { \
1953                 SetMsgHandled(TRUE); \
1954                 func((UINT)wParam, (LPMEASUREITEMSTRUCT)lParam); \
1955                 lResult = TRUE; \
1956                 if(IsMsgHandled()) \
1957                         return TRUE; \
1958         }
1959
1960 // int OnReflectedCompareItem(int nIDCtl, LPCOMPAREITEMSTRUCT lpCompareItemStruct)
1961 #define MSG_OCM_COMPAREITEM(func) \
1962         if (uMsg == OCM_COMPAREITEM) \
1963         { \
1964                 SetMsgHandled(TRUE); \
1965                 lResult = (LRESULT)func((UINT)wParam, (LPCOMPAREITEMSTRUCT)lParam); \
1966                 if(IsMsgHandled()) \
1967                         return TRUE; \
1968         }
1969
1970 // void OnReflectedDeleteItem(int nIDCtl, LPDELETEITEMSTRUCT lpDeleteItemStruct)
1971 #define MSG_OCM_DELETEITEM(func) \
1972         if (uMsg == OCM_DELETEITEM) \
1973         { \
1974                 SetMsgHandled(TRUE); \
1975                 func((UINT)wParam, (LPDELETEITEMSTRUCT)lParam); \
1976                 lResult = TRUE; \
1977                 if(IsMsgHandled()) \
1978                         return TRUE; \
1979         }
1980
1981 // int OnReflectedVKeyToItem(UINT nKey, UINT nIndex, CListBox listBox)
1982 #define MSG_OCM_VKEYTOITEM(func) \
1983         if (uMsg == OCM_VKEYTOITEM) \
1984         { \
1985                 SetMsgHandled(TRUE); \
1986                 lResult = (LRESULT)func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), (HWND)lParam); \
1987                 if(IsMsgHandled()) \
1988                         return TRUE; \
1989         }
1990
1991 //int OnReflectedCharToItem(UINT nChar, UINT nIndex, CListBox listBox)
1992 #define MSG_OCM_CHARTOITEM(func) \
1993         if (uMsg == OCM_CHARTOITEM) \
1994         { \
1995                 SetMsgHandled(TRUE); \
1996                 lResult = (LRESULT)func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), (HWND)lParam); \
1997                 if(IsMsgHandled()) \
1998                         return TRUE; \
1999         }
2000
2001 // void OnReflectedHScroll(UINT nSBCode, UINT nPos, CScrollBar pScrollBar)
2002 #define MSG_OCM_HSCROLL(func) \
2003         if (uMsg == OCM_HSCROLL) \
2004         { \
2005                 SetMsgHandled(TRUE); \
2006                 func((int)LOWORD(wParam), (short)HIWORD(wParam), (HWND)lParam); \
2007                 lResult = 0; \
2008                 if(IsMsgHandled()) \
2009                         return TRUE; \
2010         }
2011
2012 // void OnReflectedVScroll(UINT nSBCode, UINT nPos, CScrollBar pScrollBar)
2013 #define MSG_OCM_VSCROLL(func) \
2014         if (uMsg == OCM_VSCROLL) \
2015         { \
2016                 SetMsgHandled(TRUE); \
2017                 func((int)LOWORD(wParam), (short)HIWORD(wParam), (HWND)lParam); \
2018                 lResult = 0; \
2019                 if(IsMsgHandled()) \
2020                         return TRUE; \
2021         }
2022
2023 // HBRUSH OnReflectedCtlColorEdit(CDCHandle dc, CEdit edit)
2024 #define MSG_OCM_CTLCOLOREDIT(func) \
2025         if (uMsg == OCM_CTLCOLOREDIT) \
2026         { \
2027                 SetMsgHandled(TRUE); \
2028                 lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \
2029                 if(IsMsgHandled()) \
2030                         return TRUE; \
2031         }
2032
2033 // HBRUSH OnReflectedCtlColorListBox(CDCHandle dc, CListBox listBox)
2034 #define MSG_OCM_CTLCOLORLISTBOX(func) \
2035         if (uMsg == OCM_CTLCOLORLISTBOX) \
2036         { \
2037                 SetMsgHandled(TRUE); \
2038                 lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \
2039                 if(IsMsgHandled()) \
2040                         return TRUE; \
2041         }
2042
2043 // HBRUSH OnReflectedCtlColorBtn(CDCHandle dc, CButton button)
2044 #define MSG_OCM_CTLCOLORBTN(func) \
2045         if (uMsg == OCM_CTLCOLORBTN) \
2046         { \
2047                 SetMsgHandled(TRUE); \
2048                 lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \
2049                 if(IsMsgHandled()) \
2050                         return TRUE; \
2051         }
2052
2053 // HBRUSH OnReflectedCtlColorDlg(CDCHandle dc, CWindow wnd)
2054 #define MSG_OCM_CTLCOLORDLG(func) \
2055         if (uMsg == OCM_CTLCOLORDLG) \
2056         { \
2057                 SetMsgHandled(TRUE); \
2058                 lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \
2059                 if(IsMsgHandled()) \
2060                         return TRUE; \
2061         }
2062
2063 // HBRUSH OnReflectedCtlColorScrollBar(CDCHandle dc, CScrollBar scrollBar)
2064 #define MSG_OCM_CTLCOLORSCROLLBAR(func) \
2065         if (uMsg == OCM_CTLCOLORSCROLLBAR) \
2066         { \
2067                 SetMsgHandled(TRUE); \
2068                 lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \
2069                 if(IsMsgHandled()) \
2070                         return TRUE; \
2071         }
2072
2073 // HBRUSH OnReflectedCtlColorStatic(CDCHandle dc, CStatic wndStatic)
2074 #define MSG_OCM_CTLCOLORSTATIC(func) \
2075         if (uMsg == OCM_CTLCOLORSTATIC) \
2076         { \
2077                 SetMsgHandled(TRUE); \
2078                 lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \
2079                 if(IsMsgHandled()) \
2080                         return TRUE; \
2081         }
2082
2083 ///////////////////////////////////////////////////////////////////////////////
2084 // Edit specific messages
2085
2086 // void OnClear()
2087 #define MSG_WM_CLEAR(func) \
2088         if (uMsg == WM_CLEAR) \
2089         { \
2090                 SetMsgHandled(TRUE); \
2091                 func(); \
2092                 lResult = 0; \
2093                 if(IsMsgHandled()) \
2094                         return TRUE; \
2095         }
2096
2097 // void OnCopy()
2098 #define MSG_WM_COPY(func) \
2099         if (uMsg == WM_COPY) \
2100         { \
2101                 SetMsgHandled(TRUE); \
2102                 func(); \
2103                 lResult = 0; \
2104                 if(IsMsgHandled()) \
2105                         return TRUE; \
2106         }
2107
2108 // void OnCut()
2109 #define MSG_WM_CUT(func) \
2110         if (uMsg == WM_CUT) \
2111         { \
2112                 SetMsgHandled(TRUE); \
2113                 func(); \
2114                 lResult = 0; \
2115                 if(IsMsgHandled()) \
2116                         return TRUE; \
2117         }
2118
2119 // void OnPaste()
2120 #define MSG_WM_PASTE(func) \
2121         if (uMsg == WM_PASTE) \
2122         { \
2123                 SetMsgHandled(TRUE); \
2124                 func(); \
2125                 lResult = 0; \
2126                 if(IsMsgHandled()) \
2127                         return TRUE; \
2128         }
2129
2130 // void OnUndo()
2131 #define MSG_WM_UNDO(func) \
2132         if (uMsg == WM_UNDO) \
2133         { \
2134                 SetMsgHandled(TRUE); \
2135                 func(); \
2136                 lResult = 0; \
2137                 if(IsMsgHandled()) \
2138                         return TRUE; \
2139         }
2140
2141 ///////////////////////////////////////////////////////////////////////////////
2142 // Generic message handlers
2143
2144 // LRESULT OnMessageHandlerEX(UINT uMsg, WPARAM wParam, LPARAM lParam)
2145 #define MESSAGE_HANDLER_EX(msg, func) \
2146         if(uMsg == msg) \
2147         { \
2148                 SetMsgHandled(TRUE); \
2149                 lResult = func(uMsg, wParam, lParam); \
2150                 if(IsMsgHandled()) \
2151                         return TRUE; \
2152         }
2153
2154 // LRESULT OnMessageRangeHandlerEX(UINT uMsg, WPARAM wParam, LPARAM lParam)
2155 #define MESSAGE_RANGE_HANDLER_EX(msgFirst, msgLast, func) \
2156         if(uMsg >= msgFirst && uMsg <= msgLast) \
2157         { \
2158                 SetMsgHandled(TRUE); \
2159                 lResult = func(uMsg, wParam, lParam); \
2160                 if(IsMsgHandled()) \
2161                         return TRUE; \
2162         }
2163
2164 ///////////////////////////////////////////////////////////////////////////////
2165 // Commands and notifications
2166
2167 // void OnCommandHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl)
2168 #define COMMAND_HANDLER_EX(id, code, func) \
2169         if (uMsg == WM_COMMAND && code == HIWORD(wParam) && id == LOWORD(wParam)) \
2170         { \
2171                 SetMsgHandled(TRUE); \
2172                 func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \
2173                 lResult = 0; \
2174                 if(IsMsgHandled()) \
2175                         return TRUE; \
2176         }
2177
2178 // void OnCommandIDHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl)
2179 #define COMMAND_ID_HANDLER_EX(id, func) \
2180         if (uMsg == WM_COMMAND && id == LOWORD(wParam)) \
2181         { \
2182                 SetMsgHandled(TRUE); \
2183                 func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \
2184                 lResult = 0; \
2185                 if(IsMsgHandled()) \
2186                         return TRUE; \
2187         }
2188
2189 // void OnCommandCodeHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl)
2190 #define COMMAND_CODE_HANDLER_EX(code, func) \
2191         if (uMsg == WM_COMMAND && code == HIWORD(wParam)) \
2192         { \
2193                 SetMsgHandled(TRUE); \
2194                 func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \
2195                 lResult = 0; \
2196                 if(IsMsgHandled()) \
2197                         return TRUE; \
2198         }
2199
2200 // LRESULT OnNotifyHandlerEX(LPNMHDR pnmh)
2201 #define NOTIFY_HANDLER_EX(id, cd, func) \
2202         if (uMsg == WM_NOTIFY && cd == ((LPNMHDR)lParam)->code && id == ((LPNMHDR)lParam)->idFrom) \
2203         { \
2204                 SetMsgHandled(TRUE); \
2205                 lResult = func((LPNMHDR)lParam); \
2206                 if(IsMsgHandled()) \
2207                         return TRUE; \
2208         }
2209
2210 // LRESULT OnNotifyIDHandlerEX(LPNMHDR pnmh)
2211 #define NOTIFY_ID_HANDLER_EX(id, func) \
2212         if (uMsg == WM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom) \
2213         { \
2214                 SetMsgHandled(TRUE); \
2215                 lResult = func((LPNMHDR)lParam); \
2216                 if(IsMsgHandled()) \
2217                         return TRUE; \
2218         }
2219
2220 // LRESULT OnNotifyCodeHandlerEX(LPNMHDR pnmh)
2221 #define NOTIFY_CODE_HANDLER_EX(cd, func) \
2222         if (uMsg == WM_NOTIFY && cd == ((LPNMHDR)lParam)->code) \
2223         { \
2224                 SetMsgHandled(TRUE); \
2225                 lResult = func((LPNMHDR)lParam); \
2226                 if(IsMsgHandled()) \
2227                         return TRUE; \
2228         }
2229
2230 // void OnCommandRangeHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl)
2231 #define COMMAND_RANGE_HANDLER_EX(idFirst, idLast, func) \
2232         if(uMsg == WM_COMMAND && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \
2233         { \
2234                 SetMsgHandled(TRUE); \
2235                 func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \
2236                 lResult = 0; \
2237                 if(IsMsgHandled()) \
2238                         return TRUE; \
2239         }
2240
2241 // void OnCommandRangeCodeHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl)
2242 #define COMMAND_RANGE_CODE_HANDLER_EX(idFirst, idLast, code, func) \
2243         if(uMsg == WM_COMMAND && code == HIWORD(wParam) && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \
2244         { \
2245                 SetMsgHandled(TRUE); \
2246                 func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \
2247                 lResult = 0; \
2248                 if(IsMsgHandled()) \
2249                         return TRUE; \
2250         }
2251
2252 // LRESULT OnNotifyRangeHandlerEX(LPNMHDR pnmh)
2253 #define NOTIFY_RANGE_HANDLER_EX(idFirst, idLast, func) \
2254         if(uMsg == WM_NOTIFY && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \
2255         { \
2256                 SetMsgHandled(TRUE); \
2257                 lResult = func((LPNMHDR)lParam); \
2258                 if(IsMsgHandled()) \
2259                         return TRUE; \
2260         }
2261
2262 // LRESULT OnNotifyRangeCodeHandlerEX(LPNMHDR pnmh)
2263 #define NOTIFY_RANGE_CODE_HANDLER_EX(idFirst, idLast, cd, func) \
2264         if(uMsg == WM_NOTIFY && cd == ((LPNMHDR)lParam)->code && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \
2265         { \
2266                 SetMsgHandled(TRUE); \
2267                 lResult = func((LPNMHDR)lParam); \
2268                 if(IsMsgHandled()) \
2269                         return TRUE; \
2270         }
2271
2272 // LRESULT OnReflectedCommandHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl)
2273 #define REFLECTED_COMMAND_HANDLER_EX(id, code, func) \
2274         if (uMsg == OCM_COMMAND && code == HIWORD(wParam) && id == LOWORD(wParam)) \
2275         { \
2276                 SetMsgHandled(TRUE); \
2277                 func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \
2278                 lResult = 0; \
2279                 if(IsMsgHandled()) \
2280                         return TRUE; \
2281         }
2282
2283 // LRESULT OnReflectedCommandIDHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl)
2284 #define REFLECTED_COMMAND_ID_HANDLER_EX(id, func) \
2285         if (uMsg == OCM_COMMAND && id == LOWORD(wParam)) \
2286         { \
2287                 SetMsgHandled(TRUE); \
2288                 func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \
2289                 lResult = 0; \
2290                 if(IsMsgHandled()) \
2291                         return TRUE; \
2292         }
2293
2294 // LRESULT OnReflectedCommandCodeHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl)
2295 #define REFLECTED_COMMAND_CODE_HANDLER_EX(code, func) \
2296         if (uMsg == OCM_COMMAND && code == HIWORD(wParam)) \
2297         { \
2298                 SetMsgHandled(TRUE); \
2299                 func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \
2300                 lResult = 0; \
2301                 if(IsMsgHandled()) \
2302                         return TRUE; \
2303         }
2304
2305 // LRESULT OnReflectedNotifyHandlerEX(LPNMHDR pnmh)
2306 #define REFLECTED_NOTIFY_HANDLER_EX(id, cd, func) \
2307         if (uMsg == OCM_NOTIFY && cd == ((LPNMHDR)lParam)->code && id == ((LPNMHDR)lParam)->idFrom) \
2308         { \
2309                 SetMsgHandled(TRUE); \
2310                 lResult = func((LPNMHDR)lParam); \
2311                 if(IsMsgHandled()) \
2312                         return TRUE; \
2313         }
2314
2315 // LRESULT OnReflectedNotifyIDHandlerEX(LPNMHDR pnmh)
2316 #define REFLECTED_NOTIFY_ID_HANDLER_EX(id, func) \
2317         if (uMsg == OCM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom) \
2318         { \
2319                 SetMsgHandled(TRUE); \
2320                 lResult = func((LPNMHDR)lParam); \
2321                 if(IsMsgHandled()) \
2322                         return TRUE; \
2323         }
2324
2325 // LRESULT OnReflectedNotifyCodeHandlerEX(LPNMHDR pnmh)
2326 #define REFLECTED_NOTIFY_CODE_HANDLER_EX(cd, func) \
2327         if (uMsg == OCM_NOTIFY && cd == ((LPNMHDR)lParam)->code) \
2328         { \
2329                 SetMsgHandled(TRUE); \
2330                 lResult = func((LPNMHDR)lParam); \
2331                 if(IsMsgHandled()) \
2332                         return TRUE; \
2333         }
2334
2335 // void OnReflectedCommandRangeHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl)
2336 #define REFLECTED_COMMAND_RANGE_HANDLER_EX(idFirst, idLast, func) \
2337         if(uMsg == OCM_COMMAND && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \
2338         { \
2339                 SetMsgHandled(TRUE); \
2340                 func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \
2341                 lResult = 0; \
2342                 if(IsMsgHandled()) \
2343                         return TRUE; \
2344         }
2345
2346 // void OnReflectedCommandRangeCodeHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl)
2347 #define REFLECTED_COMMAND_RANGE_CODE_HANDLER_EX(idFirst, idLast, code, func) \
2348         if(uMsg == OCM_COMMAND && code == HIWORD(wParam) && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \
2349         { \
2350                 SetMsgHandled(TRUE); \
2351                 func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \
2352                 lResult = 0; \
2353                 if(IsMsgHandled()) \
2354                         return TRUE; \
2355         }
2356
2357 // LRESULT OnReflectedNotifyRangeHandlerEX(LPNMHDR pnmh)
2358 #define REFLECTED_NOTIFY_RANGE_HANDLER_EX(idFirst, idLast, func) \
2359         if(uMsg == OCM_NOTIFY && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \
2360         { \
2361                 SetMsgHandled(TRUE); \
2362                 lResult = func((LPNMHDR)lParam); \
2363                 if(IsMsgHandled()) \
2364                         return TRUE; \
2365         }
2366
2367 // LRESULT OnReflectedNotifyRangeCodeHandlerEX(LPNMHDR pnmh)
2368 #define REFLECTED_NOTIFY_RANGE_CODE_HANDLER_EX(idFirst, idLast, cd, func) \
2369         if(uMsg == OCM_NOTIFY && cd == ((LPNMHDR)lParam)->code && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \
2370         { \
2371                 SetMsgHandled(TRUE); \
2372                 lResult = func((LPNMHDR)lParam); \
2373                 if(IsMsgHandled()) \
2374                         return TRUE; \
2375         }
2376
2377 #endif // __ATLCRACK_H__