Index: third_party/wtl/include/atlwinx.h |
diff --git a/third_party/wtl/include/atlwinx.h b/third_party/wtl/include/atlwinx.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d0f1c4808dccbd0bfc8a768b5116c9e10ff4772d |
--- /dev/null |
+++ b/third_party/wtl/include/atlwinx.h |
@@ -0,0 +1,526 @@ |
+// Windows Template Library - WTL version 8.0 |
+// Copyright (C) Microsoft Corporation. All rights reserved. |
+// |
+// This file is a part of the Windows Template Library. |
+// The use and distribution terms for this software are covered by the |
+// Microsoft Permissive License (Ms-PL) which can be found in the file |
+// Ms-PL.txt at the root of this distribution. |
+ |
+#ifndef __ATLWINX_H__ |
+#define __ATLWINX_H__ |
+ |
+#pragma once |
+ |
+#ifndef __cplusplus |
+ #error ATL requires C++ compilation (use a .cpp suffix) |
+#endif |
+ |
+#ifndef __ATLAPP_H__ |
+ #error atlwinx.h requires atlapp.h to be included first |
+#endif |
+ |
+#if (_ATL_VER >= 0x0700) |
+ #include <atlwin.h> |
+#endif // (_ATL_VER >= 0x0700) |
+ |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+// Classes in this file: |
+// |
+// _U_RECT |
+// _U_MENUorID |
+// _U_STRINGorID |
+ |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+// Command Chaining Macros |
+ |
+#define CHAIN_COMMANDS(theChainClass) \ |
+ if(uMsg == WM_COMMAND) \ |
+ CHAIN_MSG_MAP(theChainClass) |
+ |
+#define CHAIN_COMMANDS_ALT(theChainClass, msgMapID) \ |
+ if(uMsg == WM_COMMAND) \ |
+ CHAIN_MSG_MAP_ALT(theChainClass, msgMapID) |
+ |
+#define CHAIN_COMMANDS_MEMBER(theChainMember) \ |
+ if(uMsg == WM_COMMAND) \ |
+ CHAIN_MSG_MAP_MEMBER(theChainMember) |
+ |
+#define CHAIN_COMMANDS_ALT_MEMBER(theChainMember, msgMapID) \ |
+ if(uMsg == WM_COMMAND) \ |
+ CHAIN_MSG_MAP_ALT_MEMBER(theChainMember, msgMapID) |
+ |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+// Macros for parent message map to selectively reflect control messages |
+ |
+// NOTE: ReflectNotifications is a member of ATL's CWindowImplRoot |
+// (and overridden in 2 cases - CContainedWindowT and CAxHostWindow) |
+// Since we can't modify ATL, we'll provide the needed additions |
+// in a separate function (that is not a member of CWindowImplRoot) |
+ |
+namespace WTL |
+{ |
+ |
+inline LRESULT WtlReflectNotificationsFiltered(HWND hWndParent, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled, |
+ UINT uMsgFilter = WM_NULL, UINT_PTR idFromFilter = 0, HWND hWndChildFilter = NULL) |
+{ |
+ if((uMsgFilter != WM_NULL) && (uMsgFilter != uMsg)) |
+ { |
+ // The notification message doesn't match the filter. |
+ bHandled = FALSE; |
+ return 1; |
+ } |
+ |
+ HWND hWndChild = NULL; |
+ UINT_PTR idFrom = 0; |
+ |
+ switch(uMsg) |
+ { |
+ case WM_COMMAND: |
+ if(lParam != NULL) // not from a menu |
+ { |
+ hWndChild = (HWND)lParam; |
+ idFrom = (UINT_PTR)LOWORD(wParam); |
+ } |
+ break; |
+ case WM_NOTIFY: |
+ hWndChild = ((LPNMHDR)lParam)->hwndFrom; |
+ idFrom = ((LPNMHDR)lParam)->idFrom; |
+ break; |
+#ifndef _WIN32_WCE |
+ case WM_PARENTNOTIFY: |
+ switch(LOWORD(wParam)) |
+ { |
+ case WM_CREATE: |
+ case WM_DESTROY: |
+ hWndChild = (HWND)lParam; |
+ idFrom = (UINT_PTR)HIWORD(wParam); |
+ break; |
+ default: |
+ hWndChild = ::GetDlgItem(hWndParent, HIWORD(wParam)); |
+ idFrom = (UINT_PTR)::GetDlgCtrlID(hWndChild); |
+ break; |
+ } |
+ break; |
+#endif // !_WIN32_WCE |
+ case WM_DRAWITEM: |
+ if(wParam) // not from a menu |
+ { |
+ hWndChild = ((LPDRAWITEMSTRUCT)lParam)->hwndItem; |
+ idFrom = (UINT_PTR)wParam; |
+ } |
+ break; |
+ case WM_MEASUREITEM: |
+ if(wParam) // not from a menu |
+ { |
+ hWndChild = ::GetDlgItem(hWndParent, ((LPMEASUREITEMSTRUCT)lParam)->CtlID); |
+ idFrom = (UINT_PTR)wParam; |
+ } |
+ break; |
+ case WM_COMPAREITEM: |
+ if(wParam) // not from a menu |
+ { |
+ hWndChild = ((LPCOMPAREITEMSTRUCT)lParam)->hwndItem; |
+ idFrom = (UINT_PTR)wParam; |
+ } |
+ break; |
+ case WM_DELETEITEM: |
+ if(wParam) // not from a menu |
+ { |
+ hWndChild = ((LPDELETEITEMSTRUCT)lParam)->hwndItem; |
+ idFrom = (UINT_PTR)wParam; |
+ } |
+ break; |
+ case WM_VKEYTOITEM: |
+ case WM_CHARTOITEM: |
+ case WM_HSCROLL: |
+ case WM_VSCROLL: |
+ hWndChild = (HWND)lParam; |
+ idFrom = (UINT_PTR)::GetDlgCtrlID(hWndChild); |
+ break; |
+ case WM_CTLCOLORBTN: |
+ case WM_CTLCOLORDLG: |
+ case WM_CTLCOLOREDIT: |
+ case WM_CTLCOLORLISTBOX: |
+ case WM_CTLCOLORMSGBOX: |
+ case WM_CTLCOLORSCROLLBAR: |
+ case WM_CTLCOLORSTATIC: |
+ hWndChild = (HWND)lParam; |
+ idFrom = (UINT_PTR)::GetDlgCtrlID(hWndChild); |
+ break; |
+ default: |
+ break; |
+ } |
+ |
+ if((hWndChild == NULL) || |
+ ((hWndChildFilter != NULL) && (hWndChildFilter != hWndChild))) |
+ { |
+ // Either hWndChild isn't valid, or |
+ // hWndChild doesn't match the filter. |
+ bHandled = FALSE; |
+ return 1; |
+ } |
+ |
+ if((idFromFilter != 0) && (idFromFilter != idFrom)) |
+ { |
+ // The dialog control id doesn't match the filter. |
+ bHandled = FALSE; |
+ return 1; |
+ } |
+ |
+ ATLASSERT(::IsWindow(hWndChild)); |
+ LRESULT lResult = ::SendMessage(hWndChild, OCM__BASE + uMsg, wParam, lParam); |
+ if((lResult == 0) && (uMsg >= WM_CTLCOLORMSGBOX) && (uMsg <= WM_CTLCOLORSTATIC)) |
+ { |
+ // Try to prevent problems with WM_CTLCOLOR* messages when |
+ // the message wasn't really handled |
+ bHandled = FALSE; |
+ } |
+ |
+ return lResult; |
+} |
+ |
+}; // namespace WTL |
+ |
+// Try to prevent problems with WM_CTLCOLOR* messages when |
+// the message wasn't really handled |
+#define REFLECT_NOTIFICATIONS_EX() \ |
+{ \ |
+ bHandled = TRUE; \ |
+ lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ |
+ if((lResult == 0) && (uMsg >= WM_CTLCOLORMSGBOX) && (uMsg <= WM_CTLCOLORSTATIC)) \ |
+ bHandled = FALSE; \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+} |
+ |
+#define REFLECT_NOTIFICATIONS_MSG_FILTERED(uMsgFilter) \ |
+ { \ |
+ bHandled = TRUE; \ |
+ lResult = WTL::WtlReflectNotificationsFiltered(m_hWnd, uMsg, wParam, lParam, bHandled, uMsgFilter, 0, NULL); \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+ } |
+ |
+#define REFLECT_NOTIFICATIONS_ID_FILTERED(idFromFilter) \ |
+ { \ |
+ bHandled = TRUE; \ |
+ lResult = WTL::WtlReflectNotificationsFiltered(m_hWnd, uMsg, wParam, lParam, bHandled, WM_NULL, idFromFilter, NULL); \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+ } |
+ |
+#define REFLECT_NOTIFICATIONS_HWND_FILTERED(hWndChildFilter) \ |
+ { \ |
+ bHandled = TRUE; \ |
+ lResult = WTL::WtlReflectNotificationsFiltered(m_hWnd, uMsg, wParam, lParam, bHandled, WM_NULL, 0, hWndChildFilter); \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+ } |
+ |
+#define REFLECT_NOTIFICATIONS_MSG_ID_FILTERED(uMsgFilter, idFromFilter) \ |
+ { \ |
+ bHandled = TRUE; \ |
+ lResult = WTL::WtlReflectNotificationsFiltered(m_hWnd, uMsg, wParam, lParam, bHandled, uMsgFilter, idFromFilter, NULL); \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+ } |
+ |
+#define REFLECT_NOTIFICATIONS_MSG_HWND_FILTERED(uMsgFilter, hWndChildFilter) \ |
+ { \ |
+ bHandled = TRUE; \ |
+ lResult = WTL::WtlReflectNotificationsFiltered(m_hWnd, uMsg, wParam, lParam, bHandled, uMsgFilter, 0, hWndChildFilter); \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+ } |
+ |
+#define REFLECT_COMMAND(id, code) \ |
+ if(uMsg == WM_COMMAND && id == LOWORD(wParam) && code == HIWORD(wParam)) \ |
+ { \ |
+ bHandled = TRUE; \ |
+ lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+ } |
+ |
+#define REFLECT_COMMAND_ID(id) \ |
+ if(uMsg == WM_COMMAND && id == LOWORD(wParam)) \ |
+ { \ |
+ bHandled = TRUE; \ |
+ lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+ } |
+ |
+#define REFLECT_COMMAND_CODE(code) \ |
+ if(uMsg == WM_COMMAND && code == HIWORD(wParam)) \ |
+ { \ |
+ bHandled = TRUE; \ |
+ lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+ } |
+ |
+#define REFLECT_COMMAND_RANGE(idFirst, idLast) \ |
+ if(uMsg == WM_COMMAND && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \ |
+ { \ |
+ bHandled = TRUE; \ |
+ lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+ } |
+ |
+#define REFLECT_COMMAND_RANGE_CODE(idFirst, idLast, code) \ |
+ if(uMsg == WM_COMMAND && code == HIWORD(wParam) && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \ |
+ { \ |
+ bHandled = TRUE; \ |
+ lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+ } |
+ |
+#define REFLECT_NOTIFY(id, cd) \ |
+ if(uMsg == WM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom && cd == ((LPNMHDR)lParam)->code) \ |
+ { \ |
+ bHandled = TRUE; \ |
+ lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+ } |
+ |
+#define REFLECT_NOTIFY_ID(id) \ |
+ if(uMsg == WM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom) \ |
+ { \ |
+ bHandled = TRUE; \ |
+ lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+ } |
+ |
+#define REFLECT_NOTIFY_CODE(cd) \ |
+ if(uMsg == WM_NOTIFY && cd == ((LPNMHDR)lParam)->code) \ |
+ { \ |
+ bHandled = TRUE; \ |
+ lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+ } |
+ |
+#define REFLECT_NOTIFY_RANGE(idFirst, idLast) \ |
+ if(uMsg == WM_NOTIFY && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \ |
+ { \ |
+ bHandled = TRUE; \ |
+ lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+ } |
+ |
+#define REFLECT_NOTIFY_RANGE_CODE(idFirst, idLast, cd) \ |
+ if(uMsg == WM_NOTIFY && cd == ((LPNMHDR)lParam)->code && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \ |
+ { \ |
+ bHandled = TRUE; \ |
+ lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+ } |
+ |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+// Reflected message handler macros for message maps (for ATL 3.0) |
+ |
+#if (_ATL_VER < 0x0700) |
+ |
+#define REFLECTED_COMMAND_HANDLER(id, code, func) \ |
+ if(uMsg == OCM_COMMAND && id == LOWORD(wParam) && code == HIWORD(wParam)) \ |
+ { \ |
+ bHandled = TRUE; \ |
+ lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+ } |
+ |
+#define REFLECTED_COMMAND_ID_HANDLER(id, func) \ |
+ if(uMsg == OCM_COMMAND && id == LOWORD(wParam)) \ |
+ { \ |
+ bHandled = TRUE; \ |
+ lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+ } |
+ |
+#define REFLECTED_COMMAND_CODE_HANDLER(code, func) \ |
+ if(uMsg == OCM_COMMAND && code == HIWORD(wParam)) \ |
+ { \ |
+ bHandled = TRUE; \ |
+ lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+ } |
+ |
+#define REFLECTED_COMMAND_RANGE_HANDLER(idFirst, idLast, func) \ |
+ if(uMsg == OCM_COMMAND && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \ |
+ { \ |
+ bHandled = TRUE; \ |
+ lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+ } |
+ |
+#define REFLECTED_COMMAND_RANGE_CODE_HANDLER(idFirst, idLast, code, func) \ |
+ if(uMsg == OCM_COMMAND && code == HIWORD(wParam) && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \ |
+ { \ |
+ bHandled = TRUE; \ |
+ lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+ } |
+ |
+#define REFLECTED_NOTIFY_HANDLER(id, cd, func) \ |
+ if(uMsg == OCM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom && cd == ((LPNMHDR)lParam)->code) \ |
+ { \ |
+ bHandled = TRUE; \ |
+ lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+ } |
+ |
+#define REFLECTED_NOTIFY_ID_HANDLER(id, func) \ |
+ if(uMsg == OCM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom) \ |
+ { \ |
+ bHandled = TRUE; \ |
+ lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+ } |
+ |
+#define REFLECTED_NOTIFY_CODE_HANDLER(cd, func) \ |
+ if(uMsg == OCM_NOTIFY && cd == ((LPNMHDR)lParam)->code) \ |
+ { \ |
+ bHandled = TRUE; \ |
+ lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+ } |
+ |
+#define REFLECTED_NOTIFY_RANGE_HANDLER(idFirst, idLast, func) \ |
+ if(uMsg == OCM_NOTIFY && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \ |
+ { \ |
+ bHandled = TRUE; \ |
+ lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+ } |
+ |
+#define REFLECTED_NOTIFY_RANGE_CODE_HANDLER(idFirst, idLast, cd, func) \ |
+ if(uMsg == OCM_NOTIFY && cd == ((LPNMHDR)lParam)->code && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \ |
+ { \ |
+ bHandled = TRUE; \ |
+ lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+ } |
+ |
+#endif // (_ATL_VER < 0x0700) |
+ |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+// Dual argument helper classes (for ATL 3.0) |
+ |
+#if (_ATL_VER < 0x0700) |
+ |
+namespace ATL |
+{ |
+ |
+class _U_RECT |
+{ |
+public: |
+ _U_RECT(LPRECT lpRect) : m_lpRect(lpRect) |
+ { } |
+ _U_RECT(RECT& rc) : m_lpRect(&rc) |
+ { } |
+ LPRECT m_lpRect; |
+}; |
+ |
+class _U_MENUorID |
+{ |
+public: |
+ _U_MENUorID(HMENU hMenu) : m_hMenu(hMenu) |
+ { } |
+ _U_MENUorID(UINT nID) : m_hMenu((HMENU)LongToHandle(nID)) |
+ { } |
+ HMENU m_hMenu; |
+}; |
+ |
+class _U_STRINGorID |
+{ |
+public: |
+ _U_STRINGorID(LPCTSTR lpString) : m_lpstr(lpString) |
+ { } |
+ _U_STRINGorID(UINT nID) : m_lpstr(MAKEINTRESOURCE(nID)) |
+ { } |
+ LPCTSTR m_lpstr; |
+}; |
+ |
+}; // namespace ATL |
+ |
+#endif // (_ATL_VER < 0x0700) |
+ |
+ |
+namespace WTL |
+{ |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+// Forward notifications support for message maps (for ATL 3.0) |
+ |
+#if (_ATL_VER < 0x0700) |
+ |
+// forward notifications support |
+#define FORWARD_NOTIFICATIONS() \ |
+ { \ |
+ bHandled = TRUE; \ |
+ lResult = WTL::Atl3ForwardNotifications(m_hWnd, uMsg, wParam, lParam, bHandled); \ |
+ if(bHandled) \ |
+ return TRUE; \ |
+ } |
+ |
+static LRESULT Atl3ForwardNotifications(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) |
+{ |
+ LRESULT lResult = 0; |
+ switch(uMsg) |
+ { |
+ case WM_COMMAND: |
+ case WM_NOTIFY: |
+#ifndef _WIN32_WCE |
+ case WM_PARENTNOTIFY: |
+#endif // !_WIN32_WCE |
+ case WM_DRAWITEM: |
+ case WM_MEASUREITEM: |
+ case WM_COMPAREITEM: |
+ case WM_DELETEITEM: |
+ case WM_VKEYTOITEM: |
+ case WM_CHARTOITEM: |
+ case WM_HSCROLL: |
+ case WM_VSCROLL: |
+ case WM_CTLCOLORBTN: |
+ case WM_CTLCOLORDLG: |
+ case WM_CTLCOLOREDIT: |
+ case WM_CTLCOLORLISTBOX: |
+ case WM_CTLCOLORMSGBOX: |
+ case WM_CTLCOLORSCROLLBAR: |
+ case WM_CTLCOLORSTATIC: |
+ lResult = ::SendMessage(::GetParent(hWnd), uMsg, wParam, lParam); |
+ break; |
+ default: |
+ bHandled = FALSE; |
+ break; |
+ } |
+ return lResult; |
+} |
+ |
+#endif // (_ATL_VER < 0x0700) |
+ |
+}; // namespace WTL |
+ |
+#endif // __ATLWINX_H__ |