1 // Windows Template Library - WTL version 8.0
\r
2 // Copyright (C) Microsoft Corporation. All rights reserved.
\r
4 // This file is a part of the Windows Template Library.
\r
5 // The use and distribution terms for this software are covered by the
\r
6 // Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)
\r
7 // which can be found in the file CPL.TXT at the root of this distribution.
\r
8 // By using this software in any fashion, you are agreeing to be bound by
\r
9 // the terms of this license. You must not remove this notice, or
\r
10 // any other, from this software.
\r
12 #ifndef __ATLUSER_H__
\r
13 #define __ATLUSER_H__
\r
18 #error ATL requires C++ compilation (use a .cpp suffix)
\r
21 #ifndef __ATLAPP_H__
\r
22 #error atluser.h requires atlapp.h to be included first
\r
26 ///////////////////////////////////////////////////////////////////////////////
\r
27 // Classes in this file:
\r
30 // CMenuT<t_bManaged>
\r
31 // CAcceleratorT<t_bManaged>
\r
32 // CIconT<t_bManaged>
\r
33 // CCursorT<t_bManaged>
\r
36 // Global functions:
\r
43 ///////////////////////////////////////////////////////////////////////////////
\r
44 // AtlMessageBox - accepts both memory and resource based strings
\r
46 inline int AtlMessageBox(HWND hWndOwner, ATL::_U_STRINGorID message, ATL::_U_STRINGorID title = (LPCTSTR)NULL, UINT uType = MB_OK | MB_ICONINFORMATION)
\r
48 ATLASSERT(hWndOwner == NULL || ::IsWindow(hWndOwner));
\r
50 LPTSTR lpstrMessage = NULL;
\r
51 if(IS_INTRESOURCE(message.m_lpstr))
\r
53 for(int nLen = 256; ; nLen *= 2)
\r
55 ATLTRY(lpstrMessage = new TCHAR[nLen]);
\r
56 if(lpstrMessage == NULL)
\r
61 int nRes = ::LoadString(ModuleHelper::GetResourceInstance(), LOWORD(message.m_lpstr), lpstrMessage, nLen);
\r
64 delete [] lpstrMessage;
\r
65 lpstrMessage = NULL;
\r
68 message.m_lpstr = lpstrMessage;
\r
71 LPTSTR lpstrTitle = NULL;
\r
72 if(IS_INTRESOURCE(title.m_lpstr) && LOWORD(title.m_lpstr) != 0)
\r
74 for(int nLen = 256; ; nLen *= 2)
\r
76 ATLTRY(lpstrTitle = new TCHAR[nLen]);
\r
77 if(lpstrTitle == NULL)
\r
82 int nRes = ::LoadString(ModuleHelper::GetResourceInstance(), LOWORD(title.m_lpstr), lpstrTitle, nLen);
\r
85 delete [] lpstrTitle;
\r
89 title.m_lpstr = lpstrTitle;
\r
92 int nRet = ::MessageBox(hWndOwner, message.m_lpstr, title.m_lpstr, uType);
\r
94 delete [] lpstrMessage;
\r
95 delete [] lpstrTitle;
\r
101 ///////////////////////////////////////////////////////////////////////////////
\r
104 #if (WINVER >= 0x0500)
\r
105 #ifndef MII_SIZEOF_STRUCT
\r
106 #define MII_SIZEOF_STRUCT(structname, member) (((int)((LPBYTE)(&((structname*)0)->member) - ((LPBYTE)((structname*)0)))) + sizeof(((structname*)0)->member))
\r
108 #define MENUITEMINFO_SIZE_VERSION_400A MII_SIZEOF_STRUCT(MENUITEMINFOA, cch)
\r
109 #define MENUITEMINFO_SIZE_VERSION_400W MII_SIZEOF_STRUCT(MENUITEMINFOW, cch)
\r
111 #define MENUITEMINFO_SIZE_VERSION_400 MENUITEMINFO_SIZE_VERSION_400W
\r
113 #define MENUITEMINFO_SIZE_VERSION_400 MENUITEMINFO_SIZE_VERSION_400A
\r
115 #endif // (WINVER >= 0x0500)
\r
117 class CMenuItemInfo : public MENUITEMINFO
\r
122 memset(this, 0, sizeof(MENUITEMINFO));
\r
123 cbSize = sizeof(MENUITEMINFO);
\r
124 #if (WINVER >= 0x0500)
\r
125 // adjust struct size if running on older version of Windows
\r
126 if(AtlIsOldWindows())
\r
128 ATLASSERT(cbSize > MENUITEMINFO_SIZE_VERSION_400); // must be
\r
129 cbSize = MENUITEMINFO_SIZE_VERSION_400;
\r
131 #endif // (WINVER >= 0x0500)
\r
136 // forward declarations
\r
137 template <bool t_bManaged> class CMenuT;
\r
138 typedef CMenuT<false> CMenuHandle;
\r
139 typedef CMenuT<true> CMenu;
\r
142 template <bool t_bManaged>
\r
149 // Constructor/destructor/operators
\r
150 CMenuT(HMENU hMenu = NULL) : m_hMenu(hMenu)
\r
155 if(t_bManaged && m_hMenu != NULL)
\r
159 CMenuT<t_bManaged>& operator =(HMENU hMenu)
\r
165 void Attach(HMENU hMenuNew)
\r
167 ATLASSERT(::IsMenu(hMenuNew));
\r
168 if(t_bManaged && m_hMenu != NULL && m_hMenu != hMenuNew)
\r
169 ::DestroyMenu(m_hMenu);
\r
170 m_hMenu = hMenuNew;
\r
175 HMENU hMenu = m_hMenu;
\r
180 operator HMENU() const { return m_hMenu; }
\r
182 bool IsNull() const { return (m_hMenu == NULL); }
\r
184 BOOL IsMenu() const
\r
186 return ::IsMenu(m_hMenu);
\r
189 // Create/destroy methods
\r
192 ATLASSERT(m_hMenu == NULL);
\r
193 m_hMenu = ::CreateMenu();
\r
194 return (m_hMenu != NULL) ? TRUE : FALSE;
\r
197 BOOL CreatePopupMenu()
\r
199 ATLASSERT(m_hMenu == NULL);
\r
200 m_hMenu = ::CreatePopupMenu();
\r
201 return (m_hMenu != NULL) ? TRUE : FALSE;
\r
204 BOOL LoadMenu(ATL::_U_STRINGorID menu)
\r
206 ATLASSERT(m_hMenu == NULL);
\r
207 m_hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), menu.m_lpstr);
\r
208 return (m_hMenu != NULL) ? TRUE : FALSE;
\r
212 BOOL LoadMenuIndirect(const void* lpMenuTemplate)
\r
214 ATLASSERT(m_hMenu == NULL);
\r
215 m_hMenu = ::LoadMenuIndirect(lpMenuTemplate);
\r
216 return (m_hMenu != NULL) ? TRUE : FALSE;
\r
218 #endif // !_WIN32_WCE
\r
222 if (m_hMenu == NULL)
\r
224 BOOL bRet = ::DestroyMenu(m_hMenu);
\r
231 BOOL DeleteMenu(UINT nPosition, UINT nFlags)
\r
233 ATLASSERT(::IsMenu(m_hMenu));
\r
234 return ::DeleteMenu(m_hMenu, nPosition, nFlags);
\r
237 BOOL TrackPopupMenu(UINT nFlags, int x, int y, HWND hWnd, LPCRECT lpRect = NULL)
\r
239 ATLASSERT(::IsMenu(m_hMenu));
\r
241 #if (WINVER >= 0x0500)
\r
242 x = _FixTrackMenuPopupX(x, y);
\r
243 #endif // !(WINVER >= 0x0500)
\r
244 return ::TrackPopupMenu(m_hMenu, nFlags, x, y, 0, hWnd, lpRect);
\r
245 #else // CE specific
\r
247 return ::TrackPopupMenuEx(m_hMenu, nFlags, x, y, hWnd, NULL);
\r
248 #endif // _WIN32_WCE
\r
251 BOOL TrackPopupMenuEx(UINT uFlags, int x, int y, HWND hWnd, LPTPMPARAMS lptpm = NULL)
\r
253 ATLASSERT(::IsMenu(m_hMenu));
\r
254 #if (WINVER >= 0x0500) && !defined(_WIN32_WCE)
\r
255 x = _FixTrackMenuPopupX(x, y);
\r
256 #endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE)
\r
257 return ::TrackPopupMenuEx(m_hMenu, uFlags, x, y, hWnd, lptpm);
\r
260 #if (WINVER >= 0x0500) && !defined(_WIN32_WCE)
\r
261 // helper that fixes popup menu X position when it's off-screen
\r
262 static int _FixTrackMenuPopupX(int x, int y)
\r
264 POINT pt = { x, y };
\r
265 HMONITOR hMonitor = ::MonitorFromPoint(pt, MONITOR_DEFAULTTONULL);
\r
266 if(hMonitor == NULL)
\r
268 HMONITOR hMonitorNear = ::MonitorFromPoint(pt, MONITOR_DEFAULTTONEAREST);
\r
269 if(hMonitorNear != NULL)
\r
271 MONITORINFO mi = { 0 };
\r
272 mi.cbSize = sizeof(MONITORINFO);
\r
273 if(::GetMonitorInfo(hMonitorNear, &mi) != FALSE)
\r
275 if(x < mi.rcWork.left)
\r
276 x = mi.rcWork.left;
\r
277 else if(x > mi.rcWork.right)
\r
278 x = mi.rcWork.right;
\r
286 BOOL GetMenuInfo(LPMENUINFO lpMenuInfo) const
\r
288 ATLASSERT(::IsMenu(m_hMenu));
\r
289 return ::GetMenuInfo(m_hMenu, lpMenuInfo);
\r
292 BOOL SetMenuInfo(LPCMENUINFO lpMenuInfo)
\r
294 ATLASSERT(::IsMenu(m_hMenu));
\r
295 return ::SetMenuInfo(m_hMenu, lpMenuInfo);
\r
297 #endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE)
\r
299 // Menu Item Operations
\r
300 BOOL AppendMenu(UINT nFlags, UINT_PTR nIDNewItem = 0, LPCTSTR lpszNewItem = NULL)
\r
302 ATLASSERT(::IsMenu(m_hMenu));
\r
303 return ::AppendMenu(m_hMenu, nFlags, nIDNewItem, lpszNewItem);
\r
306 BOOL AppendMenu(UINT nFlags, HMENU hSubMenu, LPCTSTR lpszNewItem)
\r
308 ATLASSERT(::IsMenu(m_hMenu));
\r
309 ATLASSERT(::IsMenu(hSubMenu));
\r
310 return ::AppendMenu(m_hMenu, nFlags | MF_POPUP, (UINT_PTR)hSubMenu, lpszNewItem);
\r
314 BOOL AppendMenu(UINT nFlags, UINT_PTR nIDNewItem, HBITMAP hBmp)
\r
316 ATLASSERT(::IsMenu(m_hMenu));
\r
317 return ::AppendMenu(m_hMenu, nFlags | MF_BITMAP, nIDNewItem, (LPCTSTR)hBmp);
\r
320 BOOL AppendMenu(UINT nFlags, HMENU hSubMenu, HBITMAP hBmp)
\r
322 ATLASSERT(::IsMenu(m_hMenu));
\r
323 ATLASSERT(::IsMenu(hSubMenu));
\r
324 return ::AppendMenu(m_hMenu, nFlags | (MF_BITMAP | MF_POPUP), (UINT_PTR)hSubMenu, (LPCTSTR)hBmp);
\r
326 #endif // !_WIN32_WCE
\r
328 UINT CheckMenuItem(UINT nIDCheckItem, UINT nCheck)
\r
330 ATLASSERT(::IsMenu(m_hMenu));
\r
331 return (UINT)::CheckMenuItem(m_hMenu, nIDCheckItem, nCheck);
\r
334 UINT EnableMenuItem(UINT nIDEnableItem, UINT nEnable)
\r
336 ATLASSERT(::IsMenu(m_hMenu));
\r
337 return ::EnableMenuItem(m_hMenu, nIDEnableItem, nEnable);
\r
341 BOOL HiliteMenuItem(HWND hWnd, UINT uIDHiliteItem, UINT uHilite)
\r
343 ATLASSERT(::IsMenu(m_hMenu));
\r
344 return ::HiliteMenuItem(hWnd, m_hMenu, uIDHiliteItem, uHilite);
\r
347 int GetMenuItemCount() const
\r
349 ATLASSERT(::IsMenu(m_hMenu));
\r
350 return ::GetMenuItemCount(m_hMenu);
\r
353 UINT GetMenuItemID(int nPos) const
\r
355 ATLASSERT(::IsMenu(m_hMenu));
\r
356 return ::GetMenuItemID(m_hMenu, nPos);
\r
359 UINT GetMenuState(UINT nID, UINT nFlags) const
\r
361 ATLASSERT(::IsMenu(m_hMenu));
\r
362 return ::GetMenuState(m_hMenu, nID, nFlags);
\r
365 int GetMenuString(UINT nIDItem, LPTSTR lpString, int nMaxCount, UINT nFlags) const
\r
367 ATLASSERT(::IsMenu(m_hMenu));
\r
368 return ::GetMenuString(m_hMenu, nIDItem, lpString, nMaxCount, nFlags);
\r
371 int GetMenuStringLen(UINT nIDItem, UINT nFlags) const
\r
373 ATLASSERT(::IsMenu(m_hMenu));
\r
374 return ::GetMenuString(m_hMenu, nIDItem, NULL, 0, nFlags);
\r
377 #ifndef _ATL_NO_COM
\r
378 BOOL GetMenuString(UINT nIDItem, BSTR& bstrText, UINT nFlags) const
\r
381 ATLASSERT(::IsMenu(m_hMenu));
\r
382 ATLASSERT(bstrText == NULL);
\r
384 int nLen = GetMenuStringLen(nIDItem, nFlags);
\r
387 bstrText = ::SysAllocString(OLESTR(""));
\r
388 return (bstrText != NULL) ? TRUE : FALSE;
\r
391 nLen++; // increment to include terminating NULL char
\r
392 CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;
\r
393 LPTSTR lpszText = buff.Allocate(nLen);
\r
394 if(lpszText == NULL)
\r
397 if(!GetMenuString(nIDItem, lpszText, nLen, nFlags))
\r
400 bstrText = ::SysAllocString(T2OLE(lpszText));
\r
401 return (bstrText != NULL) ? TRUE : FALSE;
\r
403 #endif // !_ATL_NO_COM
\r
404 #endif // !_WIN32_WCE
\r
406 #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
\r
407 int GetMenuString(UINT nIDItem, _CSTRING_NS::CString& strText, UINT nFlags) const
\r
409 ATLASSERT(::IsMenu(m_hMenu));
\r
411 int nLen = GetMenuStringLen(nIDItem, nFlags);
\r
415 nLen++; // increment to include terminating NULL char
\r
416 LPTSTR lpstr = strText.GetBufferSetLength(nLen);
\r
419 int nRet = GetMenuString(nIDItem, lpstr, nLen, nFlags);
\r
420 strText.ReleaseBuffer();
\r
423 #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
\r
425 CMenuHandle GetSubMenu(int nPos) const
\r
427 ATLASSERT(::IsMenu(m_hMenu));
\r
428 return CMenuHandle(::GetSubMenu(m_hMenu, nPos));
\r
431 BOOL InsertMenu(UINT nPosition, UINT nFlags, UINT_PTR nIDNewItem = 0, LPCTSTR lpszNewItem = NULL)
\r
433 ATLASSERT(::IsMenu(m_hMenu));
\r
434 return ::InsertMenu(m_hMenu, nPosition, nFlags, nIDNewItem, lpszNewItem);
\r
437 BOOL InsertMenu(UINT nPosition, UINT nFlags, HMENU hSubMenu, LPCTSTR lpszNewItem)
\r
439 ATLASSERT(::IsMenu(m_hMenu));
\r
440 ATLASSERT(::IsMenu(hSubMenu));
\r
441 return ::InsertMenu(m_hMenu, nPosition, nFlags | MF_POPUP, (UINT_PTR)hSubMenu, lpszNewItem);
\r
445 BOOL InsertMenu(UINT nPosition, UINT nFlags, UINT_PTR nIDNewItem, HBITMAP hBmp)
\r
447 ATLASSERT(::IsMenu(m_hMenu));
\r
448 return ::InsertMenu(m_hMenu, nPosition, nFlags | MF_BITMAP, nIDNewItem, (LPCTSTR)hBmp);
\r
451 BOOL InsertMenu(UINT nPosition, UINT nFlags, HMENU hSubMenu, HBITMAP hBmp)
\r
453 ATLASSERT(::IsMenu(m_hMenu));
\r
454 ATLASSERT(::IsMenu(hSubMenu));
\r
455 return ::InsertMenu(m_hMenu, nPosition, nFlags | (MF_BITMAP | MF_POPUP), (UINT_PTR)hSubMenu, (LPCTSTR)hBmp);
\r
458 BOOL ModifyMenu(UINT nPosition, UINT nFlags, UINT_PTR nIDNewItem = 0, LPCTSTR lpszNewItem = NULL)
\r
460 ATLASSERT(::IsMenu(m_hMenu));
\r
461 return ::ModifyMenu(m_hMenu, nPosition, nFlags, nIDNewItem, lpszNewItem);
\r
464 BOOL ModifyMenu(UINT nPosition, UINT nFlags, HMENU hSubMenu, LPCTSTR lpszNewItem)
\r
466 ATLASSERT(::IsMenu(m_hMenu));
\r
467 ATLASSERT(::IsMenu(hSubMenu));
\r
468 return ::ModifyMenu(m_hMenu, nPosition, nFlags | MF_POPUP, (UINT_PTR)hSubMenu, lpszNewItem);
\r
471 BOOL ModifyMenu(UINT nPosition, UINT nFlags, UINT_PTR nIDNewItem, HBITMAP hBmp)
\r
473 ATLASSERT(::IsMenu(m_hMenu));
\r
474 return ::ModifyMenu(m_hMenu, nPosition, nFlags | MF_BITMAP, nIDNewItem, (LPCTSTR)hBmp);
\r
477 BOOL ModifyMenu(UINT nPosition, UINT nFlags, HMENU hSubMenu, HBITMAP hBmp)
\r
479 ATLASSERT(::IsMenu(m_hMenu));
\r
480 ATLASSERT(::IsMenu(hSubMenu));
\r
481 return ::ModifyMenu(m_hMenu, nPosition, nFlags | (MF_BITMAP | MF_POPUP), (UINT_PTR)hSubMenu, (LPCTSTR)hBmp);
\r
483 #endif // !_WIN32_WCE
\r
485 BOOL RemoveMenu(UINT nPosition, UINT nFlags)
\r
487 ATLASSERT(::IsMenu(m_hMenu));
\r
488 return ::RemoveMenu(m_hMenu, nPosition, nFlags);
\r
492 BOOL SetMenuItemBitmaps(UINT nPosition, UINT nFlags, HBITMAP hBmpUnchecked, HBITMAP hBmpChecked)
\r
494 ATLASSERT(::IsMenu(m_hMenu));
\r
495 return ::SetMenuItemBitmaps(m_hMenu, nPosition, nFlags, hBmpUnchecked, hBmpChecked);
\r
497 #endif // !_WIN32_WCE
\r
499 BOOL CheckMenuRadioItem(UINT nIDFirst, UINT nIDLast, UINT nIDItem, UINT nFlags)
\r
501 ATLASSERT(::IsMenu(m_hMenu));
\r
502 return ::CheckMenuRadioItem(m_hMenu, nIDFirst, nIDLast, nIDItem, nFlags);
\r
505 BOOL GetMenuItemInfo(UINT uItem, BOOL bByPosition, LPMENUITEMINFO lpmii) const
\r
507 ATLASSERT(::IsMenu(m_hMenu));
\r
508 return (BOOL)::GetMenuItemInfo(m_hMenu, uItem, bByPosition, lpmii);
\r
511 BOOL SetMenuItemInfo(UINT uItem, BOOL bByPosition, LPMENUITEMINFO lpmii)
\r
513 ATLASSERT(::IsMenu(m_hMenu));
\r
514 return (BOOL)::SetMenuItemInfo(m_hMenu, uItem, bByPosition, lpmii);
\r
518 BOOL InsertMenuItem(UINT uItem, BOOL bByPosition, LPMENUITEMINFO lpmii)
\r
520 ATLASSERT(::IsMenu(m_hMenu));
\r
521 return (BOOL)::InsertMenuItem(m_hMenu, uItem, bByPosition, lpmii);
\r
524 UINT GetMenuDefaultItem(BOOL bByPosition = FALSE, UINT uFlags = 0U) const
\r
526 ATLASSERT(::IsMenu(m_hMenu));
\r
527 return ::GetMenuDefaultItem(m_hMenu, (UINT)bByPosition, uFlags);
\r
530 BOOL SetMenuDefaultItem(UINT uItem = (UINT)-1, BOOL bByPosition = FALSE)
\r
532 ATLASSERT(::IsMenu(m_hMenu));
\r
533 return ::SetMenuDefaultItem(m_hMenu, uItem, (UINT)bByPosition);
\r
536 BOOL GetMenuItemRect(HWND hWnd, UINT uItem, LPRECT lprcItem) const
\r
538 ATLASSERT(::IsMenu(m_hMenu));
\r
539 return ::GetMenuItemRect(hWnd, m_hMenu, uItem, lprcItem);
\r
542 int MenuItemFromPoint(HWND hWnd, POINT point) const
\r
544 ATLASSERT(::IsMenu(m_hMenu));
\r
545 return ::MenuItemFromPoint(hWnd, m_hMenu, point);
\r
548 // Context Help Functions
\r
549 BOOL SetMenuContextHelpId(DWORD dwContextHelpId)
\r
551 ATLASSERT(::IsMenu(m_hMenu));
\r
552 return ::SetMenuContextHelpId(m_hMenu, dwContextHelpId);
\r
555 DWORD GetMenuContextHelpId() const
\r
557 ATLASSERT(::IsMenu(m_hMenu));
\r
558 return ::GetMenuContextHelpId(m_hMenu);
\r
560 #endif // !_WIN32_WCE
\r
564 ///////////////////////////////////////////////////////////////////////////////
\r
567 template <bool t_bManaged>
\r
568 class CAcceleratorT
\r
573 // Constructor/destructor/operators
\r
574 CAcceleratorT(HACCEL hAccel = NULL) : m_hAccel(hAccel)
\r
579 if(t_bManaged && m_hAccel != NULL)
\r
580 ::DestroyAcceleratorTable(m_hAccel);
\r
583 CAcceleratorT<t_bManaged>& operator =(HACCEL hAccel)
\r
589 void Attach(HACCEL hAccel)
\r
591 if(t_bManaged && m_hAccel != NULL)
\r
592 ::DestroyAcceleratorTable(m_hAccel);
\r
598 HACCEL hAccel = m_hAccel;
\r
603 operator HACCEL() const { return m_hAccel; }
\r
605 bool IsNull() const { return m_hAccel == NULL; }
\r
607 // Create/destroy methods
\r
608 HACCEL LoadAccelerators(ATL::_U_STRINGorID accel)
\r
610 ATLASSERT(m_hAccel == NULL);
\r
611 m_hAccel = ::LoadAccelerators(ModuleHelper::GetResourceInstance(), accel.m_lpstr);
\r
615 HACCEL CreateAcceleratorTable(LPACCEL pAccel, int cEntries)
\r
617 ATLASSERT(m_hAccel == NULL);
\r
618 ATLASSERT(pAccel != NULL);
\r
619 m_hAccel = ::CreateAcceleratorTable(pAccel, cEntries);
\r
623 void DestroyObject()
\r
625 if(m_hAccel != NULL)
\r
627 ::DestroyAcceleratorTable(m_hAccel);
\r
634 int CopyAcceleratorTable(LPACCEL lpAccelDst, int cEntries)
\r
636 ATLASSERT(m_hAccel != NULL);
\r
637 ATLASSERT(lpAccelDst != NULL);
\r
638 return ::CopyAcceleratorTable(m_hAccel, lpAccelDst, cEntries);
\r
641 int GetEntriesCount() const
\r
643 ATLASSERT(m_hAccel != NULL);
\r
644 return ::CopyAcceleratorTable(m_hAccel, NULL, 0);
\r
646 #endif // !_WIN32_WCE
\r
648 BOOL TranslateAccelerator(HWND hWnd, LPMSG pMsg)
\r
650 ATLASSERT(m_hAccel != NULL);
\r
651 ATLASSERT(::IsWindow(hWnd));
\r
652 ATLASSERT(pMsg != NULL);
\r
653 return ::TranslateAccelerator(hWnd, m_hAccel, pMsg);
\r
657 typedef CAcceleratorT<false> CAcceleratorHandle;
\r
658 typedef CAcceleratorT<true> CAccelerator;
\r
661 ///////////////////////////////////////////////////////////////////////////////
\r
664 template <bool t_bManaged>
\r
670 // Constructor/destructor/operators
\r
671 CIconT(HICON hIcon = NULL) : m_hIcon(hIcon)
\r
676 if(t_bManaged && m_hIcon != NULL)
\r
677 ::DestroyIcon(m_hIcon);
\r
680 CIconT<t_bManaged>& operator =(HICON hIcon)
\r
686 void Attach(HICON hIcon)
\r
688 if(t_bManaged && m_hIcon != NULL)
\r
689 ::DestroyIcon(m_hIcon);
\r
695 HICON hIcon = m_hIcon;
\r
700 operator HICON() const { return m_hIcon; }
\r
702 bool IsNull() const { return m_hIcon == NULL; }
\r
704 // Create/destroy methods
\r
705 HICON LoadIcon(ATL::_U_STRINGorID icon)
\r
707 ATLASSERT(m_hIcon == NULL);
\r
708 m_hIcon = ::LoadIcon(ModuleHelper::GetResourceInstance(), icon.m_lpstr);
\r
712 HICON LoadIcon(ATL::_U_STRINGorID icon, int cxDesired, int cyDesired, UINT fuLoad = 0)
\r
714 ATLASSERT(m_hIcon == NULL);
\r
715 m_hIcon = (HICON) ::LoadImage(ModuleHelper::GetResourceInstance(), icon.m_lpstr, IMAGE_ICON, cxDesired, cyDesired, fuLoad);
\r
720 HICON LoadOEMIcon(LPCTSTR lpstrIconName)
\r
722 ATLASSERT(m_hIcon == NULL);
\r
723 ATLASSERT(IsOEMIcon(lpstrIconName));
\r
724 m_hIcon = ::LoadIcon(NULL, lpstrIconName);
\r
728 HICON CreateIcon(int nWidth, int nHeight, BYTE cPlanes, BYTE cBitsPixel, CONST BYTE* lpbANDbits, CONST BYTE *lpbXORbits)
\r
730 ATLASSERT(m_hIcon == NULL);
\r
731 ATLASSERT(lpbANDbits != NULL);
\r
732 ATLASSERT(lpbXORbits != NULL);
\r
733 m_hIcon = ::CreateIcon(ModuleHelper::GetResourceInstance(), nWidth, nHeight, cPlanes, cBitsPixel, lpbANDbits, lpbXORbits);
\r
737 HICON CreateIconFromResource(PBYTE pBits, DWORD dwResSize, DWORD dwVersion = 0x00030000)
\r
739 ATLASSERT(m_hIcon == NULL);
\r
740 ATLASSERT(pBits != NULL);
\r
741 m_hIcon = ::CreateIconFromResource(pBits, dwResSize, TRUE, dwVersion);
\r
745 HICON CreateIconFromResourceEx(PBYTE pbBits, DWORD cbBits, DWORD dwVersion = 0x00030000, int cxDesired = 0, int cyDesired = 0, UINT uFlags = LR_DEFAULTCOLOR)
\r
747 ATLASSERT(m_hIcon == NULL);
\r
748 ATLASSERT(pbBits != NULL);
\r
749 ATLASSERT(cbBits > 0);
\r
750 m_hIcon = ::CreateIconFromResourceEx(pbBits, cbBits, TRUE, dwVersion, cxDesired, cyDesired, uFlags);
\r
753 #endif // !_WIN32_WCE
\r
755 HICON CreateIconIndirect(PICONINFO pIconInfo)
\r
757 ATLASSERT(m_hIcon == NULL);
\r
758 ATLASSERT(pIconInfo != NULL);
\r
759 m_hIcon = ::CreateIconIndirect(pIconInfo);
\r
764 HICON ExtractIcon(LPCTSTR lpszExeFileName, UINT nIconIndex)
\r
766 ATLASSERT(m_hIcon == NULL);
\r
767 ATLASSERT(lpszExeFileName != NULL);
\r
768 m_hIcon = ::ExtractIcon(ModuleHelper::GetModuleInstance(), lpszExeFileName, nIconIndex);
\r
772 HICON ExtractAssociatedIcon(HINSTANCE hInst, LPTSTR lpIconPath, LPWORD lpiIcon)
\r
774 ATLASSERT(m_hIcon == NULL);
\r
775 ATLASSERT(lpIconPath != NULL);
\r
776 ATLASSERT(lpiIcon != NULL);
\r
777 m_hIcon = ::ExtractAssociatedIcon(hInst, lpIconPath, lpiIcon);
\r
780 #endif // !_WIN32_WCE
\r
784 ATLASSERT(m_hIcon != NULL);
\r
785 BOOL bRet = ::DestroyIcon(m_hIcon);
\r
795 ATLASSERT(m_hIcon != NULL);
\r
796 return ::CopyIcon(m_hIcon);
\r
799 HICON DuplicateIcon()
\r
801 ATLASSERT(m_hIcon != NULL);
\r
802 return ::DuplicateIcon(NULL, m_hIcon);
\r
804 #endif // !_WIN32_WCE
\r
806 BOOL DrawIcon(HDC hDC, int x, int y)
\r
808 ATLASSERT(m_hIcon != NULL);
\r
810 return ::DrawIcon(hDC, x, y, m_hIcon);
\r
811 #else // CE specific
\r
812 return ::DrawIconEx(hDC, x, y, m_hIcon, 0, 0, 0, NULL, DI_NORMAL);
\r
813 #endif // _WIN32_WCE
\r
816 BOOL DrawIcon(HDC hDC, POINT pt)
\r
818 ATLASSERT(m_hIcon != NULL);
\r
820 return ::DrawIcon(hDC, pt.x, pt.y, m_hIcon);
\r
821 #else // CE specific
\r
822 return ::DrawIconEx(hDC, pt.x, pt.y, m_hIcon, 0, 0, 0, NULL, DI_NORMAL);
\r
823 #endif // _WIN32_WCE
\r
826 BOOL DrawIconEx(HDC hDC, int x, int y, int cxWidth, int cyWidth, UINT uStepIfAniCur = 0, HBRUSH hbrFlickerFreeDraw = NULL, UINT uFlags = DI_NORMAL)
\r
828 ATLASSERT(m_hIcon != NULL);
\r
829 return ::DrawIconEx(hDC, x, y, m_hIcon, cxWidth, cyWidth, uStepIfAniCur, hbrFlickerFreeDraw, uFlags);
\r
832 BOOL DrawIconEx(HDC hDC, POINT pt, SIZE size, UINT uStepIfAniCur = 0, HBRUSH hbrFlickerFreeDraw = NULL, UINT uFlags = DI_NORMAL)
\r
834 ATLASSERT(m_hIcon != NULL);
\r
835 return ::DrawIconEx(hDC, pt.x, pt.y, m_hIcon, size.cx, size.cy, uStepIfAniCur, hbrFlickerFreeDraw, uFlags);
\r
839 BOOL GetIconInfo(PICONINFO pIconInfo) const
\r
841 ATLASSERT(m_hIcon != NULL);
\r
842 ATLASSERT(pIconInfo != NULL);
\r
843 return ::GetIconInfo(m_hIcon, pIconInfo);
\r
846 #if (_WIN32_WINNT >= 0x0600)
\r
847 BOOL GetIconInfoEx(PICONINFOEX pIconInfo) const
\r
849 ATLASSERT(m_hIcon != NULL);
\r
850 ATLASSERT(pIconInfo != NULL);
\r
851 return ::GetIconInfoEx(m_hIcon, pIconInfo);
\r
853 #endif // (_WIN32_WINNT >= 0x0600)
\r
855 #if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)
\r
856 HRESULT LoadIconMetric(ATL::_U_STRINGorID icon, int lims)
\r
858 ATLASSERT(m_hIcon == NULL);
\r
860 return ::LoadIconMetric(ModuleHelper::GetResourceInstance(), T2CW(icon.m_lpstr), lims, &m_hIcon);
\r
863 HRESULT LoadIconWithScaleDown(ATL::_U_STRINGorID icon, int cx, int cy)
\r
865 ATLASSERT(m_hIcon == NULL);
\r
867 return ::LoadIconWithScaleDown(ModuleHelper::GetResourceInstance(), T2CW(icon.m_lpstr), cx, cy, &m_hIcon);
\r
870 HRESULT LoadOEMIconMetric(LPCTSTR lpstrIconName, int lims)
\r
872 ATLASSERT(m_hIcon == NULL);
\r
873 ATLASSERT(IsOEMIcon(lpstrIconName));
\r
874 return ::LoadIconMetric(NULL, (LPCWSTR)lpstrIconName, lims, &m_hIcon);
\r
877 HRESULT LoadOEMIconWithScaleDown(LPCTSTR lpstrIconName, int cx, int cy)
\r
879 ATLASSERT(m_hIcon == NULL);
\r
880 ATLASSERT(IsOEMIcon(lpstrIconName));
\r
882 return ::LoadIconWithScaleDown(NULL, (LPCWSTR)lpstrIconName, cx, cy, &m_hIcon);
\r
884 #endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)
\r
885 #endif // !_WIN32_WCE
\r
889 static bool IsOEMIcon(LPCTSTR lpstrIconName)
\r
891 #if (WINVER >= 0x0600)
\r
892 return (lpstrIconName == IDI_APPLICATION || lpstrIconName == IDI_ASTERISK || lpstrIconName == IDI_EXCLAMATION ||
\r
893 lpstrIconName == IDI_HAND || lpstrIconName == IDI_QUESTION || lpstrIconName == IDI_WINLOGO ||
\r
894 lpstrIconName == IDI_SHIELD);
\r
895 #else // !(WINVER >= 0x0600)
\r
896 return (lpstrIconName == IDI_APPLICATION || lpstrIconName == IDI_ASTERISK || lpstrIconName == IDI_EXCLAMATION ||
\r
897 lpstrIconName == IDI_HAND || lpstrIconName == IDI_QUESTION || lpstrIconName == IDI_WINLOGO);
\r
898 #endif // !(WINVER >= 0x0600)
\r
900 #endif // !_WIN32_WCE
\r
903 typedef CIconT<false> CIconHandle;
\r
904 typedef CIconT<true> CIcon;
\r
907 ///////////////////////////////////////////////////////////////////////////////
\r
910 // protect template member from a winuser.h macro
\r
915 template <bool t_bManaged>
\r
921 // Constructor/destructor/operators
\r
922 CCursorT(HCURSOR hCursor = NULL) : m_hCursor(hCursor)
\r
927 if(t_bManaged && m_hCursor != NULL)
\r
931 CCursorT<t_bManaged>& operator =(HCURSOR hCursor)
\r
937 void Attach(HCURSOR hCursor)
\r
939 if(t_bManaged && m_hCursor != NULL)
\r
941 m_hCursor = hCursor;
\r
946 HCURSOR hCursor = m_hCursor;
\r
951 operator HCURSOR() const { return m_hCursor; }
\r
953 bool IsNull() const { return m_hCursor == NULL; }
\r
955 // Create/destroy methods
\r
956 HCURSOR LoadCursor(ATL::_U_STRINGorID cursor)
\r
958 ATLASSERT(m_hCursor == NULL);
\r
959 m_hCursor = ::LoadCursor(ModuleHelper::GetResourceInstance(), cursor.m_lpstr);
\r
963 HCURSOR LoadSysCursor(LPCTSTR lpstrCursorName)
\r
965 ATLASSERT(m_hCursor == NULL);
\r
966 #if (WINVER >= 0x0500)
\r
967 ATLASSERT(lpstrCursorName == IDC_ARROW || lpstrCursorName == IDC_IBEAM || lpstrCursorName == IDC_WAIT ||
\r
968 lpstrCursorName == IDC_CROSS || lpstrCursorName == IDC_UPARROW || lpstrCursorName == IDC_SIZE ||
\r
969 lpstrCursorName == IDC_ICON || lpstrCursorName == IDC_SIZENWSE || lpstrCursorName == IDC_SIZENESW ||
\r
970 lpstrCursorName == IDC_SIZEWE || lpstrCursorName == IDC_SIZENS || lpstrCursorName == IDC_SIZEALL ||
\r
971 lpstrCursorName == IDC_NO || lpstrCursorName == IDC_APPSTARTING || lpstrCursorName == IDC_HELP ||
\r
972 lpstrCursorName == IDC_HAND);
\r
973 #else // !(WINVER >= 0x0500)
\r
974 ATLASSERT(lpstrCursorName == IDC_ARROW || lpstrCursorName == IDC_IBEAM || lpstrCursorName == IDC_WAIT ||
\r
975 lpstrCursorName == IDC_CROSS || lpstrCursorName == IDC_UPARROW || lpstrCursorName == IDC_SIZE ||
\r
976 lpstrCursorName == IDC_ICON || lpstrCursorName == IDC_SIZENWSE || lpstrCursorName == IDC_SIZENESW ||
\r
977 lpstrCursorName == IDC_SIZEWE || lpstrCursorName == IDC_SIZENS || lpstrCursorName == IDC_SIZEALL ||
\r
978 lpstrCursorName == IDC_NO || lpstrCursorName == IDC_APPSTARTING || lpstrCursorName == IDC_HELP);
\r
979 #endif // !(WINVER >= 0x0500)
\r
980 m_hCursor = ::LoadCursor(NULL, lpstrCursorName);
\r
985 HCURSOR LoadOEMCursor(LPCTSTR lpstrCursorName)
\r
987 return LoadSysCursor(lpstrCursorName);
\r
990 HCURSOR LoadCursor(ATL::_U_STRINGorID cursor, int cxDesired, int cyDesired, UINT fuLoad = 0)
\r
992 ATLASSERT(m_hCursor == NULL);
\r
993 m_hCursor = (HCURSOR) ::LoadImage(ModuleHelper::GetResourceInstance(), cursor.m_lpstr, IMAGE_CURSOR, cxDesired, cyDesired, fuLoad);
\r
998 HCURSOR LoadCursorFromFile(LPCTSTR pstrFilename)
\r
1000 ATLASSERT(m_hCursor == NULL);
\r
1001 ATLASSERT(pstrFilename != NULL);
\r
1002 m_hCursor = ::LoadCursorFromFile(pstrFilename);
\r
1005 #endif // !_WIN32_WCE
\r
1007 #if !defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)))
\r
1008 HCURSOR CreateCursor(int xHotSpot, int yHotSpot, int nWidth, int nHeight, CONST VOID *pvANDPlane, CONST VOID *pvXORPlane)
\r
1010 ATLASSERT(m_hCursor == NULL);
\r
1011 m_hCursor = ::CreateCursor(ModuleHelper::GetResourceInstance(), xHotSpot, yHotSpot, nWidth, nHeight, pvANDPlane, pvXORPlane);
\r
1014 #endif // !defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)))
\r
1016 #ifndef _WIN32_WCE
\r
1017 HCURSOR CreateCursorFromResource(PBYTE pBits, DWORD dwResSize, DWORD dwVersion = 0x00030000)
\r
1019 ATLASSERT(m_hCursor == NULL);
\r
1020 ATLASSERT(pBits != NULL);
\r
1021 m_hCursor = (HCURSOR)::CreateIconFromResource(pBits, dwResSize, FALSE, dwVersion);
\r
1025 HCURSOR CreateCursorFromResourceEx(PBYTE pbBits, DWORD cbBits, DWORD dwVersion = 0x00030000, int cxDesired = 0, int cyDesired = 0, UINT uFlags = LR_DEFAULTCOLOR)
\r
1027 ATLASSERT(m_hCursor == NULL);
\r
1028 ATLASSERT(pbBits != NULL);
\r
1029 ATLASSERT(cbBits > 0);
\r
1030 m_hCursor = (HCURSOR)::CreateIconFromResourceEx(pbBits, cbBits, FALSE, dwVersion, cxDesired, cyDesired, uFlags);
\r
1033 #endif // !_WIN32_WCE
\r
1035 BOOL DestroyCursor()
\r
1037 ATLASSERT(m_hCursor != NULL);
\r
1038 #if !defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)))
\r
1039 BOOL bRet = ::DestroyCursor(m_hCursor);
\r
1043 #else // !(!defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP))))
\r
1044 ATLTRACE2(atlTraceUI, 0, _T("Warning: This version of Windows CE does not have ::DestroyCursor()\n"));
\r
1046 #endif // !(!defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP))))
\r
1050 #ifndef _WIN32_WCE
\r
1051 HCURSOR CopyCursor()
\r
1053 ATLASSERT(m_hCursor != NULL);
\r
1054 return (HCURSOR)::CopyIcon((HICON)m_hCursor);
\r
1056 #endif // !_WIN32_WCE
\r
1058 #if (WINVER >= 0x0500) && !defined(_WIN32_WCE)
\r
1059 BOOL GetCursorInfo(LPCURSORINFO pCursorInfo)
\r
1061 ATLASSERT(m_hCursor != NULL);
\r
1062 ATLASSERT(pCursorInfo != NULL);
\r
1063 return ::GetCursorInfo(pCursorInfo);
\r
1065 #endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE)
\r
1068 typedef CCursorT<false> CCursorHandle;
\r
1069 typedef CCursorT<true> CCursor;
\r
1072 ///////////////////////////////////////////////////////////////////////////////
\r
1073 // CResource - Wraps a generic Windows resource.
\r
1074 // Use it with custom resource types other than the
\r
1075 // standard RT_CURSOR, RT_BITMAP, etc.
\r
1080 HGLOBAL m_hGlobal;
\r
1081 HRSRC m_hResource;
\r
1083 // Constructor/destructor
\r
1084 CResource() : m_hGlobal(NULL), m_hResource(NULL)
\r
1093 bool Load(ATL::_U_STRINGorID Type, ATL::_U_STRINGorID ID)
\r
1095 ATLASSERT(m_hResource == NULL);
\r
1096 ATLASSERT(m_hGlobal == NULL);
\r
1098 m_hResource = ::FindResource(ModuleHelper::GetResourceInstance(), ID.m_lpstr, Type.m_lpstr);
\r
1099 if(m_hResource == NULL)
\r
1102 m_hGlobal = ::LoadResource(ModuleHelper::GetResourceInstance(), m_hResource);
\r
1103 if(m_hGlobal == NULL)
\r
1105 m_hResource = NULL;
\r
1112 #ifndef _WIN32_WCE
\r
1113 bool LoadEx(ATL::_U_STRINGorID Type, ATL::_U_STRINGorID ID, WORD wLanguage)
\r
1115 ATLASSERT(m_hResource == NULL);
\r
1116 ATLASSERT(m_hGlobal == NULL);
\r
1118 m_hResource = ::FindResourceEx(ModuleHelper::GetResourceInstance(), ID.m_lpstr, Type.m_lpstr, wLanguage);
\r
1119 if(m_hResource == NULL)
\r
1122 m_hGlobal = ::LoadResource(ModuleHelper::GetResourceInstance(), m_hResource);
\r
1123 if(m_hGlobal == NULL)
\r
1125 m_hResource = NULL;
\r
1131 #endif // !_WIN32_WCE
\r
1133 // Misc. operations
\r
1134 DWORD GetSize() const
\r
1136 ATLASSERT(m_hResource != NULL);
\r
1137 return ::SizeofResource(ModuleHelper::GetResourceInstance(), m_hResource);
\r
1142 ATLASSERT(m_hResource != NULL);
\r
1143 ATLASSERT(m_hGlobal != NULL);
\r
1144 LPVOID pVoid = ::LockResource(m_hGlobal);
\r
1145 ATLASSERT(pVoid != NULL);
\r
1151 if(m_hGlobal != NULL)
\r
1153 FreeResource(m_hGlobal);
\r
1155 m_hResource = NULL;
\r
1160 }; // namespace WTL
\r
1162 #endif // __ATLUSER_H__
\r