Index: third_party/wtl/include/atluser.h |
diff --git a/third_party/wtl/include/atluser.h b/third_party/wtl/include/atluser.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2df3b4d302010704687b52425c9f23cb0c8d8017 |
--- /dev/null |
+++ b/third_party/wtl/include/atluser.h |
@@ -0,0 +1,1159 @@ |
+// 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 __ATLUSER_H__ |
+#define __ATLUSER_H__ |
+ |
+#pragma once |
+ |
+#ifndef __cplusplus |
+ #error ATL requires C++ compilation (use a .cpp suffix) |
+#endif |
+ |
+#ifndef __ATLAPP_H__ |
+ #error atluser.h requires atlapp.h to be included first |
+#endif |
+ |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+// Classes in this file: |
+// |
+// CMenuItemInfo |
+// CMenuT<t_bManaged> |
+// CAcceleratorT<t_bManaged> |
+// CIconT<t_bManaged> |
+// CCursorT<t_bManaged> |
+// CResource |
+// |
+// Global functions: |
+// AtlMessageBox() |
+ |
+ |
+namespace WTL |
+{ |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+// AtlMessageBox - accepts both memory and resource based strings |
+ |
+inline int AtlMessageBox(HWND hWndOwner, ATL::_U_STRINGorID message, ATL::_U_STRINGorID title = (LPCTSTR)NULL, UINT uType = MB_OK | MB_ICONINFORMATION) |
+{ |
+ ATLASSERT(hWndOwner == NULL || ::IsWindow(hWndOwner)); |
+ |
+ LPTSTR lpstrMessage = NULL; |
+ if(IS_INTRESOURCE(message.m_lpstr)) |
+ { |
+ for(int nLen = 256; ; nLen *= 2) |
+ { |
+ ATLTRY(lpstrMessage = new TCHAR[nLen]); |
+ if(lpstrMessage == NULL) |
+ { |
+ ATLASSERT(FALSE); |
+ return 0; |
+ } |
+ int nRes = ::LoadString(ModuleHelper::GetResourceInstance(), LOWORD(message.m_lpstr), lpstrMessage, nLen); |
+ if(nRes < nLen - 1) |
+ break; |
+ delete [] lpstrMessage; |
+ lpstrMessage = NULL; |
+ } |
+ |
+ message.m_lpstr = lpstrMessage; |
+ } |
+ |
+ LPTSTR lpstrTitle = NULL; |
+ if(IS_INTRESOURCE(title.m_lpstr) && LOWORD(title.m_lpstr) != 0) |
+ { |
+ for(int nLen = 256; ; nLen *= 2) |
+ { |
+ ATLTRY(lpstrTitle = new TCHAR[nLen]); |
+ if(lpstrTitle == NULL) |
+ { |
+ ATLASSERT(FALSE); |
+ return 0; |
+ } |
+ int nRes = ::LoadString(ModuleHelper::GetResourceInstance(), LOWORD(title.m_lpstr), lpstrTitle, nLen); |
+ if(nRes < nLen - 1) |
+ break; |
+ delete [] lpstrTitle; |
+ lpstrTitle = NULL; |
+ } |
+ |
+ title.m_lpstr = lpstrTitle; |
+ } |
+ |
+ int nRet = ::MessageBox(hWndOwner, message.m_lpstr, title.m_lpstr, uType); |
+ |
+ delete [] lpstrMessage; |
+ delete [] lpstrTitle; |
+ |
+ return nRet; |
+} |
+ |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+// CMenu |
+ |
+#if (WINVER >= 0x0500) |
+ #ifndef MII_SIZEOF_STRUCT |
+ #define MII_SIZEOF_STRUCT(structname, member) (((int)((LPBYTE)(&((structname*)0)->member) - ((LPBYTE)((structname*)0)))) + sizeof(((structname*)0)->member)) |
+ #endif |
+ #define MENUITEMINFO_SIZE_VERSION_400A MII_SIZEOF_STRUCT(MENUITEMINFOA, cch) |
+ #define MENUITEMINFO_SIZE_VERSION_400W MII_SIZEOF_STRUCT(MENUITEMINFOW, cch) |
+ #ifdef UNICODE |
+ #define MENUITEMINFO_SIZE_VERSION_400 MENUITEMINFO_SIZE_VERSION_400W |
+ #else |
+ #define MENUITEMINFO_SIZE_VERSION_400 MENUITEMINFO_SIZE_VERSION_400A |
+ #endif // !UNICODE |
+#endif // (WINVER >= 0x0500) |
+ |
+class CMenuItemInfo : public MENUITEMINFO |
+{ |
+public: |
+ CMenuItemInfo() |
+ { |
+ memset(this, 0, sizeof(MENUITEMINFO)); |
+ cbSize = sizeof(MENUITEMINFO); |
+#if (WINVER >= 0x0500) |
+ // adjust struct size if running on older version of Windows |
+ if(AtlIsOldWindows()) |
+ { |
+ ATLASSERT(cbSize > MENUITEMINFO_SIZE_VERSION_400); // must be |
+ cbSize = MENUITEMINFO_SIZE_VERSION_400; |
+ } |
+#endif // (WINVER >= 0x0500) |
+ } |
+}; |
+ |
+ |
+// forward declarations |
+template <bool t_bManaged> class CMenuT; |
+typedef CMenuT<false> CMenuHandle; |
+typedef CMenuT<true> CMenu; |
+ |
+ |
+template <bool t_bManaged> |
+class CMenuT |
+{ |
+public: |
+// Data members |
+ HMENU m_hMenu; |
+ |
+// Constructor/destructor/operators |
+ CMenuT(HMENU hMenu = NULL) : m_hMenu(hMenu) |
+ { } |
+ |
+ ~CMenuT() |
+ { |
+ if(t_bManaged && m_hMenu != NULL) |
+ DestroyMenu(); |
+ } |
+ |
+ CMenuT<t_bManaged>& operator =(HMENU hMenu) |
+ { |
+ Attach(hMenu); |
+ return *this; |
+ } |
+ |
+ void Attach(HMENU hMenuNew) |
+ { |
+ ATLASSERT(::IsMenu(hMenuNew)); |
+ if(t_bManaged && m_hMenu != NULL && m_hMenu != hMenuNew) |
+ ::DestroyMenu(m_hMenu); |
+ m_hMenu = hMenuNew; |
+ } |
+ |
+ HMENU Detach() |
+ { |
+ HMENU hMenu = m_hMenu; |
+ m_hMenu = NULL; |
+ return hMenu; |
+ } |
+ |
+ operator HMENU() const { return m_hMenu; } |
+ |
+ bool IsNull() const { return (m_hMenu == NULL); } |
+ |
+ BOOL IsMenu() const |
+ { |
+ return ::IsMenu(m_hMenu); |
+ } |
+ |
+// Create/destroy methods |
+ BOOL CreateMenu() |
+ { |
+ ATLASSERT(m_hMenu == NULL); |
+ m_hMenu = ::CreateMenu(); |
+ return (m_hMenu != NULL) ? TRUE : FALSE; |
+ } |
+ |
+ BOOL CreatePopupMenu() |
+ { |
+ ATLASSERT(m_hMenu == NULL); |
+ m_hMenu = ::CreatePopupMenu(); |
+ return (m_hMenu != NULL) ? TRUE : FALSE; |
+ } |
+ |
+ BOOL LoadMenu(ATL::_U_STRINGorID menu) |
+ { |
+ ATLASSERT(m_hMenu == NULL); |
+ m_hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), menu.m_lpstr); |
+ return (m_hMenu != NULL) ? TRUE : FALSE; |
+ } |
+ |
+#ifndef _WIN32_WCE |
+ BOOL LoadMenuIndirect(const void* lpMenuTemplate) |
+ { |
+ ATLASSERT(m_hMenu == NULL); |
+ m_hMenu = ::LoadMenuIndirect(lpMenuTemplate); |
+ return (m_hMenu != NULL) ? TRUE : FALSE; |
+ } |
+#endif // !_WIN32_WCE |
+ |
+ BOOL DestroyMenu() |
+ { |
+ if (m_hMenu == NULL) |
+ return FALSE; |
+ BOOL bRet = ::DestroyMenu(m_hMenu); |
+ if(bRet) |
+ m_hMenu = NULL; |
+ return bRet; |
+ } |
+ |
+// Menu Operations |
+ BOOL DeleteMenu(UINT nPosition, UINT nFlags) |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return ::DeleteMenu(m_hMenu, nPosition, nFlags); |
+ } |
+ |
+ BOOL TrackPopupMenu(UINT nFlags, int x, int y, HWND hWnd, LPCRECT lpRect = NULL) |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+#ifndef _WIN32_WCE |
+#if (WINVER >= 0x0500) |
+ x = _FixTrackMenuPopupX(x, y); |
+#endif // !(WINVER >= 0x0500) |
+ return ::TrackPopupMenu(m_hMenu, nFlags, x, y, 0, hWnd, lpRect); |
+#else // CE specific |
+ lpRect; |
+ return ::TrackPopupMenuEx(m_hMenu, nFlags, x, y, hWnd, NULL); |
+#endif // _WIN32_WCE |
+ } |
+ |
+ BOOL TrackPopupMenuEx(UINT uFlags, int x, int y, HWND hWnd, LPTPMPARAMS lptpm = NULL) |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+#if (WINVER >= 0x0500) && !defined(_WIN32_WCE) |
+ x = _FixTrackMenuPopupX(x, y); |
+#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE) |
+ return ::TrackPopupMenuEx(m_hMenu, uFlags, x, y, hWnd, lptpm); |
+ } |
+ |
+#if (WINVER >= 0x0500) && !defined(_WIN32_WCE) |
+ // helper that fixes popup menu X position when it's off-screen |
+ static int _FixTrackMenuPopupX(int x, int y) |
+ { |
+ POINT pt = { x, y }; |
+ HMONITOR hMonitor = ::MonitorFromPoint(pt, MONITOR_DEFAULTTONULL); |
+ if(hMonitor == NULL) |
+ { |
+ HMONITOR hMonitorNear = ::MonitorFromPoint(pt, MONITOR_DEFAULTTONEAREST); |
+ if(hMonitorNear != NULL) |
+ { |
+ MONITORINFO mi = { 0 }; |
+ mi.cbSize = sizeof(MONITORINFO); |
+ if(::GetMonitorInfo(hMonitorNear, &mi) != FALSE) |
+ { |
+ if(x < mi.rcWork.left) |
+ x = mi.rcWork.left; |
+ else if(x > mi.rcWork.right) |
+ x = mi.rcWork.right; |
+ } |
+ } |
+ } |
+ |
+ return x; |
+ } |
+ |
+ BOOL GetMenuInfo(LPMENUINFO lpMenuInfo) const |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return ::GetMenuInfo(m_hMenu, lpMenuInfo); |
+ } |
+ |
+ BOOL SetMenuInfo(LPCMENUINFO lpMenuInfo) |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return ::SetMenuInfo(m_hMenu, lpMenuInfo); |
+ } |
+#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE) |
+ |
+// Menu Item Operations |
+ BOOL AppendMenu(UINT nFlags, UINT_PTR nIDNewItem = 0, LPCTSTR lpszNewItem = NULL) |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return ::AppendMenu(m_hMenu, nFlags, nIDNewItem, lpszNewItem); |
+ } |
+ |
+ BOOL AppendMenu(UINT nFlags, HMENU hSubMenu, LPCTSTR lpszNewItem) |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ ATLASSERT(::IsMenu(hSubMenu)); |
+ return ::AppendMenu(m_hMenu, nFlags | MF_POPUP, (UINT_PTR)hSubMenu, lpszNewItem); |
+ } |
+ |
+#ifndef _WIN32_WCE |
+ BOOL AppendMenu(UINT nFlags, UINT_PTR nIDNewItem, HBITMAP hBmp) |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return ::AppendMenu(m_hMenu, nFlags | MF_BITMAP, nIDNewItem, (LPCTSTR)hBmp); |
+ } |
+ |
+ BOOL AppendMenu(UINT nFlags, HMENU hSubMenu, HBITMAP hBmp) |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ ATLASSERT(::IsMenu(hSubMenu)); |
+ return ::AppendMenu(m_hMenu, nFlags | (MF_BITMAP | MF_POPUP), (UINT_PTR)hSubMenu, (LPCTSTR)hBmp); |
+ } |
+#endif // !_WIN32_WCE |
+ |
+ UINT CheckMenuItem(UINT nIDCheckItem, UINT nCheck) |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return (UINT)::CheckMenuItem(m_hMenu, nIDCheckItem, nCheck); |
+ } |
+ |
+ UINT EnableMenuItem(UINT nIDEnableItem, UINT nEnable) |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return ::EnableMenuItem(m_hMenu, nIDEnableItem, nEnable); |
+ } |
+ |
+#ifndef _WIN32_WCE |
+ BOOL HiliteMenuItem(HWND hWnd, UINT uIDHiliteItem, UINT uHilite) |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return ::HiliteMenuItem(hWnd, m_hMenu, uIDHiliteItem, uHilite); |
+ } |
+ |
+ int GetMenuItemCount() const |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return ::GetMenuItemCount(m_hMenu); |
+ } |
+ |
+ UINT GetMenuItemID(int nPos) const |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return ::GetMenuItemID(m_hMenu, nPos); |
+ } |
+ |
+ UINT GetMenuState(UINT nID, UINT nFlags) const |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return ::GetMenuState(m_hMenu, nID, nFlags); |
+ } |
+ |
+ int GetMenuString(UINT nIDItem, LPTSTR lpString, int nMaxCount, UINT nFlags) const |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return ::GetMenuString(m_hMenu, nIDItem, lpString, nMaxCount, nFlags); |
+ } |
+ |
+ int GetMenuStringLen(UINT nIDItem, UINT nFlags) const |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return ::GetMenuString(m_hMenu, nIDItem, NULL, 0, nFlags); |
+ } |
+ |
+#ifndef _ATL_NO_COM |
+ BOOL GetMenuString(UINT nIDItem, BSTR& bstrText, UINT nFlags) const |
+ { |
+ USES_CONVERSION; |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ ATLASSERT(bstrText == NULL); |
+ |
+ int nLen = GetMenuStringLen(nIDItem, nFlags); |
+ if(nLen == 0) |
+ { |
+ bstrText = ::SysAllocString(OLESTR("")); |
+ return (bstrText != NULL) ? TRUE : FALSE; |
+ } |
+ |
+ nLen++; // increment to include terminating NULL char |
+ CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff; |
+ LPTSTR lpszText = buff.Allocate(nLen); |
+ if(lpszText == NULL) |
+ return FALSE; |
+ |
+ if(!GetMenuString(nIDItem, lpszText, nLen, nFlags)) |
+ return FALSE; |
+ |
+ bstrText = ::SysAllocString(T2OLE(lpszText)); |
+ return (bstrText != NULL) ? TRUE : FALSE; |
+ } |
+#endif // !_ATL_NO_COM |
+#endif // !_WIN32_WCE |
+ |
+#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) |
+ int GetMenuString(UINT nIDItem, _CSTRING_NS::CString& strText, UINT nFlags) const |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ |
+ int nLen = GetMenuStringLen(nIDItem, nFlags); |
+ if(nLen == 0) |
+ return 0; |
+ |
+ nLen++; // increment to include terminating NULL char |
+ LPTSTR lpstr = strText.GetBufferSetLength(nLen); |
+ if(lpstr == NULL) |
+ return 0; |
+ int nRet = GetMenuString(nIDItem, lpstr, nLen, nFlags); |
+ strText.ReleaseBuffer(); |
+ return nRet; |
+ } |
+#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) |
+ |
+ CMenuHandle GetSubMenu(int nPos) const |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return CMenuHandle(::GetSubMenu(m_hMenu, nPos)); |
+ } |
+ |
+ BOOL InsertMenu(UINT nPosition, UINT nFlags, UINT_PTR nIDNewItem = 0, LPCTSTR lpszNewItem = NULL) |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return ::InsertMenu(m_hMenu, nPosition, nFlags, nIDNewItem, lpszNewItem); |
+ } |
+ |
+ BOOL InsertMenu(UINT nPosition, UINT nFlags, HMENU hSubMenu, LPCTSTR lpszNewItem) |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ ATLASSERT(::IsMenu(hSubMenu)); |
+ return ::InsertMenu(m_hMenu, nPosition, nFlags | MF_POPUP, (UINT_PTR)hSubMenu, lpszNewItem); |
+ } |
+ |
+#ifndef _WIN32_WCE |
+ BOOL InsertMenu(UINT nPosition, UINT nFlags, UINT_PTR nIDNewItem, HBITMAP hBmp) |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return ::InsertMenu(m_hMenu, nPosition, nFlags | MF_BITMAP, nIDNewItem, (LPCTSTR)hBmp); |
+ } |
+ |
+ BOOL InsertMenu(UINT nPosition, UINT nFlags, HMENU hSubMenu, HBITMAP hBmp) |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ ATLASSERT(::IsMenu(hSubMenu)); |
+ return ::InsertMenu(m_hMenu, nPosition, nFlags | (MF_BITMAP | MF_POPUP), (UINT_PTR)hSubMenu, (LPCTSTR)hBmp); |
+ } |
+ |
+ BOOL ModifyMenu(UINT nPosition, UINT nFlags, UINT_PTR nIDNewItem = 0, LPCTSTR lpszNewItem = NULL) |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return ::ModifyMenu(m_hMenu, nPosition, nFlags, nIDNewItem, lpszNewItem); |
+ } |
+ |
+ BOOL ModifyMenu(UINT nPosition, UINT nFlags, HMENU hSubMenu, LPCTSTR lpszNewItem) |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ ATLASSERT(::IsMenu(hSubMenu)); |
+ return ::ModifyMenu(m_hMenu, nPosition, nFlags | MF_POPUP, (UINT_PTR)hSubMenu, lpszNewItem); |
+ } |
+ |
+ BOOL ModifyMenu(UINT nPosition, UINT nFlags, UINT_PTR nIDNewItem, HBITMAP hBmp) |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return ::ModifyMenu(m_hMenu, nPosition, nFlags | MF_BITMAP, nIDNewItem, (LPCTSTR)hBmp); |
+ } |
+ |
+ BOOL ModifyMenu(UINT nPosition, UINT nFlags, HMENU hSubMenu, HBITMAP hBmp) |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ ATLASSERT(::IsMenu(hSubMenu)); |
+ return ::ModifyMenu(m_hMenu, nPosition, nFlags | (MF_BITMAP | MF_POPUP), (UINT_PTR)hSubMenu, (LPCTSTR)hBmp); |
+ } |
+#endif // !_WIN32_WCE |
+ |
+ BOOL RemoveMenu(UINT nPosition, UINT nFlags) |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return ::RemoveMenu(m_hMenu, nPosition, nFlags); |
+ } |
+ |
+#ifndef _WIN32_WCE |
+ BOOL SetMenuItemBitmaps(UINT nPosition, UINT nFlags, HBITMAP hBmpUnchecked, HBITMAP hBmpChecked) |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return ::SetMenuItemBitmaps(m_hMenu, nPosition, nFlags, hBmpUnchecked, hBmpChecked); |
+ } |
+#endif // !_WIN32_WCE |
+ |
+ BOOL CheckMenuRadioItem(UINT nIDFirst, UINT nIDLast, UINT nIDItem, UINT nFlags) |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return ::CheckMenuRadioItem(m_hMenu, nIDFirst, nIDLast, nIDItem, nFlags); |
+ } |
+ |
+ BOOL GetMenuItemInfo(UINT uItem, BOOL bByPosition, LPMENUITEMINFO lpmii) const |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return (BOOL)::GetMenuItemInfo(m_hMenu, uItem, bByPosition, lpmii); |
+ } |
+ |
+ BOOL SetMenuItemInfo(UINT uItem, BOOL bByPosition, LPMENUITEMINFO lpmii) |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return (BOOL)::SetMenuItemInfo(m_hMenu, uItem, bByPosition, lpmii); |
+ } |
+ |
+#ifndef _WIN32_WCE |
+ BOOL InsertMenuItem(UINT uItem, BOOL bByPosition, LPMENUITEMINFO lpmii) |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return (BOOL)::InsertMenuItem(m_hMenu, uItem, bByPosition, lpmii); |
+ } |
+ |
+ UINT GetMenuDefaultItem(BOOL bByPosition = FALSE, UINT uFlags = 0U) const |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return ::GetMenuDefaultItem(m_hMenu, (UINT)bByPosition, uFlags); |
+ } |
+ |
+ BOOL SetMenuDefaultItem(UINT uItem = (UINT)-1, BOOL bByPosition = FALSE) |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return ::SetMenuDefaultItem(m_hMenu, uItem, (UINT)bByPosition); |
+ } |
+ |
+ BOOL GetMenuItemRect(HWND hWnd, UINT uItem, LPRECT lprcItem) const |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return ::GetMenuItemRect(hWnd, m_hMenu, uItem, lprcItem); |
+ } |
+ |
+ int MenuItemFromPoint(HWND hWnd, POINT point) const |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return ::MenuItemFromPoint(hWnd, m_hMenu, point); |
+ } |
+ |
+// Context Help Functions |
+ BOOL SetMenuContextHelpId(DWORD dwContextHelpId) |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return ::SetMenuContextHelpId(m_hMenu, dwContextHelpId); |
+ } |
+ |
+ DWORD GetMenuContextHelpId() const |
+ { |
+ ATLASSERT(::IsMenu(m_hMenu)); |
+ return ::GetMenuContextHelpId(m_hMenu); |
+ } |
+#endif // !_WIN32_WCE |
+}; |
+ |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+// CAccelerator |
+ |
+template <bool t_bManaged> |
+class CAcceleratorT |
+{ |
+public: |
+ HACCEL m_hAccel; |
+ |
+// Constructor/destructor/operators |
+ CAcceleratorT(HACCEL hAccel = NULL) : m_hAccel(hAccel) |
+ { } |
+ |
+ ~CAcceleratorT() |
+ { |
+ if(t_bManaged && m_hAccel != NULL) |
+ ::DestroyAcceleratorTable(m_hAccel); |
+ } |
+ |
+ CAcceleratorT<t_bManaged>& operator =(HACCEL hAccel) |
+ { |
+ Attach(hAccel); |
+ return *this; |
+ } |
+ |
+ void Attach(HACCEL hAccel) |
+ { |
+ if(t_bManaged && m_hAccel != NULL) |
+ ::DestroyAcceleratorTable(m_hAccel); |
+ m_hAccel = hAccel; |
+ } |
+ |
+ HACCEL Detach() |
+ { |
+ HACCEL hAccel = m_hAccel; |
+ m_hAccel = NULL; |
+ return hAccel; |
+ } |
+ |
+ operator HACCEL() const { return m_hAccel; } |
+ |
+ bool IsNull() const { return m_hAccel == NULL; } |
+ |
+// Create/destroy methods |
+ HACCEL LoadAccelerators(ATL::_U_STRINGorID accel) |
+ { |
+ ATLASSERT(m_hAccel == NULL); |
+ m_hAccel = ::LoadAccelerators(ModuleHelper::GetResourceInstance(), accel.m_lpstr); |
+ return m_hAccel; |
+ } |
+ |
+ HACCEL CreateAcceleratorTable(LPACCEL pAccel, int cEntries) |
+ { |
+ ATLASSERT(m_hAccel == NULL); |
+ ATLASSERT(pAccel != NULL); |
+ m_hAccel = ::CreateAcceleratorTable(pAccel, cEntries); |
+ return m_hAccel; |
+ } |
+ |
+ void DestroyObject() |
+ { |
+ if(m_hAccel != NULL) |
+ { |
+ ::DestroyAcceleratorTable(m_hAccel); |
+ m_hAccel = NULL; |
+ } |
+ } |
+ |
+// Operations |
+#ifndef _WIN32_WCE |
+ int CopyAcceleratorTable(LPACCEL lpAccelDst, int cEntries) |
+ { |
+ ATLASSERT(m_hAccel != NULL); |
+ ATLASSERT(lpAccelDst != NULL); |
+ return ::CopyAcceleratorTable(m_hAccel, lpAccelDst, cEntries); |
+ } |
+ |
+ int GetEntriesCount() const |
+ { |
+ ATLASSERT(m_hAccel != NULL); |
+ return ::CopyAcceleratorTable(m_hAccel, NULL, 0); |
+ } |
+#endif // !_WIN32_WCE |
+ |
+ BOOL TranslateAccelerator(HWND hWnd, LPMSG pMsg) |
+ { |
+ ATLASSERT(m_hAccel != NULL); |
+ ATLASSERT(::IsWindow(hWnd)); |
+ ATLASSERT(pMsg != NULL); |
+ return ::TranslateAccelerator(hWnd, m_hAccel, pMsg); |
+ } |
+}; |
+ |
+typedef CAcceleratorT<false> CAcceleratorHandle; |
+typedef CAcceleratorT<true> CAccelerator; |
+ |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+// CIcon |
+ |
+template <bool t_bManaged> |
+class CIconT |
+{ |
+public: |
+ HICON m_hIcon; |
+ |
+// Constructor/destructor/operators |
+ CIconT(HICON hIcon = NULL) : m_hIcon(hIcon) |
+ { } |
+ |
+ ~CIconT() |
+ { |
+ if(t_bManaged && m_hIcon != NULL) |
+ ::DestroyIcon(m_hIcon); |
+ } |
+ |
+ CIconT<t_bManaged>& operator =(HICON hIcon) |
+ { |
+ Attach(hIcon); |
+ return *this; |
+ } |
+ |
+ void Attach(HICON hIcon) |
+ { |
+ if(t_bManaged && m_hIcon != NULL) |
+ ::DestroyIcon(m_hIcon); |
+ m_hIcon = hIcon; |
+ } |
+ |
+ HICON Detach() |
+ { |
+ HICON hIcon = m_hIcon; |
+ m_hIcon = NULL; |
+ return hIcon; |
+ } |
+ |
+ operator HICON() const { return m_hIcon; } |
+ |
+ bool IsNull() const { return m_hIcon == NULL; } |
+ |
+// Create/destroy methods |
+ HICON LoadIcon(ATL::_U_STRINGorID icon) |
+ { |
+ ATLASSERT(m_hIcon == NULL); |
+ m_hIcon = ::LoadIcon(ModuleHelper::GetResourceInstance(), icon.m_lpstr); |
+ return m_hIcon; |
+ } |
+ |
+ HICON LoadIcon(ATL::_U_STRINGorID icon, int cxDesired, int cyDesired, UINT fuLoad = 0) |
+ { |
+ ATLASSERT(m_hIcon == NULL); |
+ m_hIcon = (HICON) ::LoadImage(ModuleHelper::GetResourceInstance(), icon.m_lpstr, IMAGE_ICON, cxDesired, cyDesired, fuLoad); |
+ return m_hIcon; |
+ } |
+ |
+#ifndef _WIN32_WCE |
+ HICON LoadOEMIcon(LPCTSTR lpstrIconName) |
+ { |
+ ATLASSERT(m_hIcon == NULL); |
+ ATLASSERT(IsOEMIcon(lpstrIconName)); |
+ m_hIcon = ::LoadIcon(NULL, lpstrIconName); |
+ return m_hIcon; |
+ } |
+ |
+ HICON CreateIcon(int nWidth, int nHeight, BYTE cPlanes, BYTE cBitsPixel, CONST BYTE* lpbANDbits, CONST BYTE *lpbXORbits) |
+ { |
+ ATLASSERT(m_hIcon == NULL); |
+ ATLASSERT(lpbANDbits != NULL); |
+ ATLASSERT(lpbXORbits != NULL); |
+ m_hIcon = ::CreateIcon(ModuleHelper::GetResourceInstance(), nWidth, nHeight, cPlanes, cBitsPixel, lpbANDbits, lpbXORbits); |
+ return m_hIcon; |
+ } |
+ |
+ HICON CreateIconFromResource(PBYTE pBits, DWORD dwResSize, DWORD dwVersion = 0x00030000) |
+ { |
+ ATLASSERT(m_hIcon == NULL); |
+ ATLASSERT(pBits != NULL); |
+ m_hIcon = ::CreateIconFromResource(pBits, dwResSize, TRUE, dwVersion); |
+ return m_hIcon; |
+ } |
+ |
+ HICON CreateIconFromResourceEx(PBYTE pbBits, DWORD cbBits, DWORD dwVersion = 0x00030000, int cxDesired = 0, int cyDesired = 0, UINT uFlags = LR_DEFAULTCOLOR) |
+ { |
+ ATLASSERT(m_hIcon == NULL); |
+ ATLASSERT(pbBits != NULL); |
+ ATLASSERT(cbBits > 0); |
+ m_hIcon = ::CreateIconFromResourceEx(pbBits, cbBits, TRUE, dwVersion, cxDesired, cyDesired, uFlags); |
+ return m_hIcon; |
+ } |
+#endif // !_WIN32_WCE |
+ |
+ HICON CreateIconIndirect(PICONINFO pIconInfo) |
+ { |
+ ATLASSERT(m_hIcon == NULL); |
+ ATLASSERT(pIconInfo != NULL); |
+ m_hIcon = ::CreateIconIndirect(pIconInfo); |
+ return m_hIcon; |
+ } |
+ |
+#ifndef _WIN32_WCE |
+ HICON ExtractIcon(LPCTSTR lpszExeFileName, UINT nIconIndex) |
+ { |
+ ATLASSERT(m_hIcon == NULL); |
+ ATLASSERT(lpszExeFileName != NULL); |
+ m_hIcon = ::ExtractIcon(ModuleHelper::GetModuleInstance(), lpszExeFileName, nIconIndex); |
+ return m_hIcon; |
+ } |
+ |
+ HICON ExtractAssociatedIcon(HINSTANCE hInst, LPTSTR lpIconPath, LPWORD lpiIcon) |
+ { |
+ ATLASSERT(m_hIcon == NULL); |
+ ATLASSERT(lpIconPath != NULL); |
+ ATLASSERT(lpiIcon != NULL); |
+ m_hIcon = ::ExtractAssociatedIcon(hInst, lpIconPath, lpiIcon); |
+ return m_hIcon; |
+ } |
+#endif // !_WIN32_WCE |
+ |
+ BOOL DestroyIcon() |
+ { |
+ ATLASSERT(m_hIcon != NULL); |
+ BOOL bRet = ::DestroyIcon(m_hIcon); |
+ if(bRet != FALSE) |
+ m_hIcon = NULL; |
+ return bRet; |
+ } |
+ |
+// Operations |
+#ifndef _WIN32_WCE |
+ HICON CopyIcon() |
+ { |
+ ATLASSERT(m_hIcon != NULL); |
+ return ::CopyIcon(m_hIcon); |
+ } |
+ |
+ HICON DuplicateIcon() |
+ { |
+ ATLASSERT(m_hIcon != NULL); |
+ return ::DuplicateIcon(NULL, m_hIcon); |
+ } |
+#endif // !_WIN32_WCE |
+ |
+ BOOL DrawIcon(HDC hDC, int x, int y) |
+ { |
+ ATLASSERT(m_hIcon != NULL); |
+#ifndef _WIN32_WCE |
+ return ::DrawIcon(hDC, x, y, m_hIcon); |
+#else // CE specific |
+ return ::DrawIconEx(hDC, x, y, m_hIcon, 0, 0, 0, NULL, DI_NORMAL); |
+#endif // _WIN32_WCE |
+ } |
+ |
+ BOOL DrawIcon(HDC hDC, POINT pt) |
+ { |
+ ATLASSERT(m_hIcon != NULL); |
+#ifndef _WIN32_WCE |
+ return ::DrawIcon(hDC, pt.x, pt.y, m_hIcon); |
+#else // CE specific |
+ return ::DrawIconEx(hDC, pt.x, pt.y, m_hIcon, 0, 0, 0, NULL, DI_NORMAL); |
+#endif // _WIN32_WCE |
+ } |
+ |
+ BOOL DrawIconEx(HDC hDC, int x, int y, int cxWidth, int cyWidth, UINT uStepIfAniCur = 0, HBRUSH hbrFlickerFreeDraw = NULL, UINT uFlags = DI_NORMAL) |
+ { |
+ ATLASSERT(m_hIcon != NULL); |
+ return ::DrawIconEx(hDC, x, y, m_hIcon, cxWidth, cyWidth, uStepIfAniCur, hbrFlickerFreeDraw, uFlags); |
+ } |
+ |
+ BOOL DrawIconEx(HDC hDC, POINT pt, SIZE size, UINT uStepIfAniCur = 0, HBRUSH hbrFlickerFreeDraw = NULL, UINT uFlags = DI_NORMAL) |
+ { |
+ ATLASSERT(m_hIcon != NULL); |
+ return ::DrawIconEx(hDC, pt.x, pt.y, m_hIcon, size.cx, size.cy, uStepIfAniCur, hbrFlickerFreeDraw, uFlags); |
+ } |
+ |
+#ifndef _WIN32_WCE |
+ BOOL GetIconInfo(PICONINFO pIconInfo) const |
+ { |
+ ATLASSERT(m_hIcon != NULL); |
+ ATLASSERT(pIconInfo != NULL); |
+ return ::GetIconInfo(m_hIcon, pIconInfo); |
+ } |
+ |
+#if (_WIN32_WINNT >= 0x0600) |
+ BOOL GetIconInfoEx(PICONINFOEX pIconInfo) const |
+ { |
+ ATLASSERT(m_hIcon != NULL); |
+ ATLASSERT(pIconInfo != NULL); |
+ return ::GetIconInfoEx(m_hIcon, pIconInfo); |
+ } |
+#endif // (_WIN32_WINNT >= 0x0600) |
+ |
+#if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) |
+ HRESULT LoadIconMetric(ATL::_U_STRINGorID icon, int lims) |
+ { |
+ ATLASSERT(m_hIcon == NULL); |
+ USES_CONVERSION; |
+ return ::LoadIconMetric(ModuleHelper::GetResourceInstance(), T2CW(icon.m_lpstr), lims, &m_hIcon); |
+ } |
+ |
+ HRESULT LoadIconWithScaleDown(ATL::_U_STRINGorID icon, int cx, int cy) |
+ { |
+ ATLASSERT(m_hIcon == NULL); |
+ USES_CONVERSION; |
+ return ::LoadIconWithScaleDown(ModuleHelper::GetResourceInstance(), T2CW(icon.m_lpstr), cx, cy, &m_hIcon); |
+ } |
+ |
+ HRESULT LoadOEMIconMetric(LPCTSTR lpstrIconName, int lims) |
+ { |
+ ATLASSERT(m_hIcon == NULL); |
+ ATLASSERT(IsOEMIcon(lpstrIconName)); |
+ return ::LoadIconMetric(NULL, (LPCWSTR)lpstrIconName, lims, &m_hIcon); |
+ } |
+ |
+ HRESULT LoadOEMIconWithScaleDown(LPCTSTR lpstrIconName, int cx, int cy) |
+ { |
+ ATLASSERT(m_hIcon == NULL); |
+ ATLASSERT(IsOEMIcon(lpstrIconName)); |
+ USES_CONVERSION; |
+ return ::LoadIconWithScaleDown(NULL, (LPCWSTR)lpstrIconName, cx, cy, &m_hIcon); |
+ } |
+#endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) |
+#endif // !_WIN32_WCE |
+ |
+ // Helper |
+#ifndef _WIN32_WCE |
+ static bool IsOEMIcon(LPCTSTR lpstrIconName) |
+ { |
+#if (WINVER >= 0x0600) |
+ return (lpstrIconName == IDI_APPLICATION || lpstrIconName == IDI_ASTERISK || lpstrIconName == IDI_EXCLAMATION || |
+ lpstrIconName == IDI_HAND || lpstrIconName == IDI_QUESTION || lpstrIconName == IDI_WINLOGO || |
+ lpstrIconName == IDI_SHIELD); |
+#else // !(WINVER >= 0x0600) |
+ return (lpstrIconName == IDI_APPLICATION || lpstrIconName == IDI_ASTERISK || lpstrIconName == IDI_EXCLAMATION || |
+ lpstrIconName == IDI_HAND || lpstrIconName == IDI_QUESTION || lpstrIconName == IDI_WINLOGO); |
+#endif // !(WINVER >= 0x0600) |
+ } |
+#endif // !_WIN32_WCE |
+}; |
+ |
+typedef CIconT<false> CIconHandle; |
+typedef CIconT<true> CIcon; |
+ |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+// CCursor |
+ |
+// protect template member from a winuser.h macro |
+#ifdef CopyCursor |
+ #undef CopyCursor |
+#endif |
+ |
+template <bool t_bManaged> |
+class CCursorT |
+{ |
+public: |
+ HCURSOR m_hCursor; |
+ |
+// Constructor/destructor/operators |
+ CCursorT(HCURSOR hCursor = NULL) : m_hCursor(hCursor) |
+ { } |
+ |
+ ~CCursorT() |
+ { |
+ if(t_bManaged && m_hCursor != NULL) |
+ DestroyCursor(); |
+ } |
+ |
+ CCursorT<t_bManaged>& operator =(HCURSOR hCursor) |
+ { |
+ Attach(hCursor); |
+ return *this; |
+ } |
+ |
+ void Attach(HCURSOR hCursor) |
+ { |
+ if(t_bManaged && m_hCursor != NULL) |
+ DestroyCursor(); |
+ m_hCursor = hCursor; |
+ } |
+ |
+ HCURSOR Detach() |
+ { |
+ HCURSOR hCursor = m_hCursor; |
+ m_hCursor = NULL; |
+ return hCursor; |
+ } |
+ |
+ operator HCURSOR() const { return m_hCursor; } |
+ |
+ bool IsNull() const { return m_hCursor == NULL; } |
+ |
+// Create/destroy methods |
+ HCURSOR LoadCursor(ATL::_U_STRINGorID cursor) |
+ { |
+ ATLASSERT(m_hCursor == NULL); |
+ m_hCursor = ::LoadCursor(ModuleHelper::GetResourceInstance(), cursor.m_lpstr); |
+ return m_hCursor; |
+ } |
+ |
+ HCURSOR LoadSysCursor(LPCTSTR lpstrCursorName) |
+ { |
+ ATLASSERT(m_hCursor == NULL); |
+#if (WINVER >= 0x0500) |
+ ATLASSERT(lpstrCursorName == IDC_ARROW || lpstrCursorName == IDC_IBEAM || lpstrCursorName == IDC_WAIT || |
+ lpstrCursorName == IDC_CROSS || lpstrCursorName == IDC_UPARROW || lpstrCursorName == IDC_SIZE || |
+ lpstrCursorName == IDC_ICON || lpstrCursorName == IDC_SIZENWSE || lpstrCursorName == IDC_SIZENESW || |
+ lpstrCursorName == IDC_SIZEWE || lpstrCursorName == IDC_SIZENS || lpstrCursorName == IDC_SIZEALL || |
+ lpstrCursorName == IDC_NO || lpstrCursorName == IDC_APPSTARTING || lpstrCursorName == IDC_HELP || |
+ lpstrCursorName == IDC_HAND); |
+#else // !(WINVER >= 0x0500) |
+ ATLASSERT(lpstrCursorName == IDC_ARROW || lpstrCursorName == IDC_IBEAM || lpstrCursorName == IDC_WAIT || |
+ lpstrCursorName == IDC_CROSS || lpstrCursorName == IDC_UPARROW || lpstrCursorName == IDC_SIZE || |
+ lpstrCursorName == IDC_ICON || lpstrCursorName == IDC_SIZENWSE || lpstrCursorName == IDC_SIZENESW || |
+ lpstrCursorName == IDC_SIZEWE || lpstrCursorName == IDC_SIZENS || lpstrCursorName == IDC_SIZEALL || |
+ lpstrCursorName == IDC_NO || lpstrCursorName == IDC_APPSTARTING || lpstrCursorName == IDC_HELP); |
+#endif // !(WINVER >= 0x0500) |
+ m_hCursor = ::LoadCursor(NULL, lpstrCursorName); |
+ return m_hCursor; |
+ } |
+ |
+ // deprecated |
+ HCURSOR LoadOEMCursor(LPCTSTR lpstrCursorName) |
+ { |
+ return LoadSysCursor(lpstrCursorName); |
+ } |
+ |
+ HCURSOR LoadCursor(ATL::_U_STRINGorID cursor, int cxDesired, int cyDesired, UINT fuLoad = 0) |
+ { |
+ ATLASSERT(m_hCursor == NULL); |
+ m_hCursor = (HCURSOR) ::LoadImage(ModuleHelper::GetResourceInstance(), cursor.m_lpstr, IMAGE_CURSOR, cxDesired, cyDesired, fuLoad); |
+ return m_hCursor; |
+ } |
+ |
+#ifndef _WIN32_WCE |
+ HCURSOR LoadCursorFromFile(LPCTSTR pstrFilename) |
+ { |
+ ATLASSERT(m_hCursor == NULL); |
+ ATLASSERT(pstrFilename != NULL); |
+ m_hCursor = ::LoadCursorFromFile(pstrFilename); |
+ return m_hCursor; |
+ } |
+#endif // !_WIN32_WCE |
+ |
+#if !defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP))) |
+ HCURSOR CreateCursor(int xHotSpot, int yHotSpot, int nWidth, int nHeight, CONST VOID *pvANDPlane, CONST VOID *pvXORPlane) |
+ { |
+ ATLASSERT(m_hCursor == NULL); |
+ m_hCursor = ::CreateCursor(ModuleHelper::GetResourceInstance(), xHotSpot, yHotSpot, nWidth, nHeight, pvANDPlane, pvXORPlane); |
+ return m_hCursor; |
+ } |
+#endif // !defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP))) |
+ |
+#ifndef _WIN32_WCE |
+ HCURSOR CreateCursorFromResource(PBYTE pBits, DWORD dwResSize, DWORD dwVersion = 0x00030000) |
+ { |
+ ATLASSERT(m_hCursor == NULL); |
+ ATLASSERT(pBits != NULL); |
+ m_hCursor = (HCURSOR)::CreateIconFromResource(pBits, dwResSize, FALSE, dwVersion); |
+ return m_hCursor; |
+ } |
+ |
+ HCURSOR CreateCursorFromResourceEx(PBYTE pbBits, DWORD cbBits, DWORD dwVersion = 0x00030000, int cxDesired = 0, int cyDesired = 0, UINT uFlags = LR_DEFAULTCOLOR) |
+ { |
+ ATLASSERT(m_hCursor == NULL); |
+ ATLASSERT(pbBits != NULL); |
+ ATLASSERT(cbBits > 0); |
+ m_hCursor = (HCURSOR)::CreateIconFromResourceEx(pbBits, cbBits, FALSE, dwVersion, cxDesired, cyDesired, uFlags); |
+ return m_hCursor; |
+ } |
+#endif // !_WIN32_WCE |
+ |
+ BOOL DestroyCursor() |
+ { |
+ ATLASSERT(m_hCursor != NULL); |
+#if !defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP))) |
+ BOOL bRet = ::DestroyCursor(m_hCursor); |
+ if(bRet != FALSE) |
+ m_hCursor = NULL; |
+ return bRet; |
+#else // !(!defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)))) |
+ ATLTRACE2(atlTraceUI, 0, _T("Warning: This version of Windows CE does not have ::DestroyCursor()\n")); |
+ return FALSE; |
+#endif // !(!defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)))) |
+ } |
+ |
+// Operations |
+#ifndef _WIN32_WCE |
+ HCURSOR CopyCursor() |
+ { |
+ ATLASSERT(m_hCursor != NULL); |
+ return (HCURSOR)::CopyIcon((HICON)m_hCursor); |
+ } |
+#endif // !_WIN32_WCE |
+ |
+#if (WINVER >= 0x0500) && !defined(_WIN32_WCE) |
+ BOOL GetCursorInfo(LPCURSORINFO pCursorInfo) |
+ { |
+ ATLASSERT(m_hCursor != NULL); |
+ ATLASSERT(pCursorInfo != NULL); |
+ return ::GetCursorInfo(pCursorInfo); |
+ } |
+#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE) |
+}; |
+ |
+typedef CCursorT<false> CCursorHandle; |
+typedef CCursorT<true> CCursor; |
+ |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+// CResource - Wraps a generic Windows resource. |
+// Use it with custom resource types other than the |
+// standard RT_CURSOR, RT_BITMAP, etc. |
+ |
+class CResource |
+{ |
+public: |
+ HGLOBAL m_hGlobal; |
+ HRSRC m_hResource; |
+ |
+// Constructor/destructor |
+ CResource() : m_hGlobal(NULL), m_hResource(NULL) |
+ { } |
+ |
+ ~CResource() |
+ { |
+ Release(); |
+ } |
+ |
+// Load methods |
+ bool Load(ATL::_U_STRINGorID Type, ATL::_U_STRINGorID ID) |
+ { |
+ ATLASSERT(m_hResource == NULL); |
+ ATLASSERT(m_hGlobal == NULL); |
+ |
+ m_hResource = ::FindResource(ModuleHelper::GetResourceInstance(), ID.m_lpstr, Type.m_lpstr); |
+ if(m_hResource == NULL) |
+ return false; |
+ |
+ m_hGlobal = ::LoadResource(ModuleHelper::GetResourceInstance(), m_hResource); |
+ if(m_hGlobal == NULL) |
+ { |
+ m_hResource = NULL; |
+ return false; |
+ } |
+ |
+ return true; |
+ } |
+ |
+#ifndef _WIN32_WCE |
+ bool LoadEx(ATL::_U_STRINGorID Type, ATL::_U_STRINGorID ID, WORD wLanguage) |
+ { |
+ ATLASSERT(m_hResource == NULL); |
+ ATLASSERT(m_hGlobal == NULL); |
+ |
+ m_hResource = ::FindResourceEx(ModuleHelper::GetResourceInstance(), ID.m_lpstr, Type.m_lpstr, wLanguage); |
+ if(m_hResource == NULL) |
+ return false; |
+ |
+ m_hGlobal = ::LoadResource(ModuleHelper::GetResourceInstance(), m_hResource); |
+ if(m_hGlobal == NULL) |
+ { |
+ m_hResource = NULL; |
+ return false; |
+ } |
+ |
+ return true; |
+ } |
+#endif // !_WIN32_WCE |
+ |
+// Misc. operations |
+ DWORD GetSize() const |
+ { |
+ ATLASSERT(m_hResource != NULL); |
+ return ::SizeofResource(ModuleHelper::GetResourceInstance(), m_hResource); |
+ } |
+ |
+ LPVOID Lock() |
+ { |
+ ATLASSERT(m_hResource != NULL); |
+ ATLASSERT(m_hGlobal != NULL); |
+ LPVOID pVoid = ::LockResource(m_hGlobal); |
+ ATLASSERT(pVoid != NULL); |
+ return pVoid; |
+ } |
+ |
+ void Release() |
+ { |
+ if(m_hGlobal != NULL) |
+ { |
+ FreeResource(m_hGlobal); |
+ m_hGlobal = NULL; |
+ m_hResource = NULL; |
+ } |
+ } |
+}; |
+ |
+}; // namespace WTL |
+ |
+#endif // __ATLUSER_H__ |