| // 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 __ATLCTRLS_H__ | 
 | #define __ATLCTRLS_H__ | 
 |  | 
 | #pragma once | 
 |  | 
 | #ifndef __cplusplus | 
 | 	#error ATL requires C++ compilation (use a .cpp suffix) | 
 | #endif | 
 |  | 
 | #ifndef __ATLAPP_H__ | 
 | 	#error atlctrls.h requires atlapp.h to be included first | 
 | #endif | 
 |  | 
 | #ifndef __ATLWIN_H__ | 
 | 	#error atlctrls.h requires atlwin.h to be included first | 
 | #endif | 
 |  | 
 | #if (_WIN32_IE < 0x0300) | 
 | 	#error atlctrls.h requires IE Version 3.0 or higher | 
 | #endif | 
 |  | 
 | #ifndef _WIN32_WCE | 
 |   #include <richedit.h> | 
 |   #include <richole.h> | 
 | #elif defined(WIN32_PLATFORM_WFSP) && !defined(_WINUSERM_H_) | 
 |   #include <winuserm.h> | 
 | #endif // !_WIN32_WCE | 
 |  | 
 | // protect template members from windowsx.h macros | 
 | #ifdef _INC_WINDOWSX | 
 |   #undef GetNextSibling | 
 |   #undef GetPrevSibling | 
 | #endif // _INC_WINDOWSX | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // Classes in this file: | 
 | // | 
 | // CStaticT<TBase> - CStatic | 
 | // CButtonT<TBase> - CButton | 
 | // CListBoxT<TBase> - CListBox | 
 | // CComboBoxT<TBase> - CComboBox | 
 | // CEditT<TBase> - CEdit | 
 | // CEditCommands<T> | 
 | // CScrollBarT<TBase> - CScrollBar | 
 | // | 
 | // CImageList | 
 | // CListViewCtrlT<TBase> - CListViewCtrl | 
 | // CTreeViewCtrlT<TBase> - CTreeViewCtrl | 
 | // CTreeItemT<TBase> - CTreeItem | 
 | // CTreeViewCtrlExT<TBase> - CTreeViewCtrlEx | 
 | // CHeaderCtrlT<TBase> - CHeaderCtrl | 
 | // CToolBarCtrlT<TBase> - CToolBarCtrl | 
 | // CStatusBarCtrlT<TBase> - CStatusBarCtrl | 
 | // CTabCtrlT<TBase> - CTabCtrl | 
 | // CToolInfo | 
 | // CToolTipCtrlT<TBase> - CToolTipCtrl | 
 | // CTrackBarCtrlT<TBase> - CTrackBarCtrl | 
 | // CUpDownCtrlT<TBase> - CUpDownCtrl | 
 | // CProgressBarCtrlT<TBase> - CProgressBarCtrl | 
 | // CHotKeyCtrlT<TBase> - CHotKeyCtrl | 
 | // CAnimateCtrlT<TBase> - CAnimateCtrl | 
 | // CRichEditCtrlT<TBase> - CRichEditCtrl | 
 | // CRichEditCommands<T> | 
 | // CDragListBoxT<TBase> - CDragListBox | 
 | // CDragListNotifyImpl<T> | 
 | // CReBarCtrlT<TBase> - CReBarCtrl | 
 | // CComboBoxExT<TBase> - CComboBoxEx | 
 | // CDateTimePickerCtrlT<TBase> - CDateTimePickerCtrl | 
 | // CMonthCalendarCtrlT<TBase> - CMonthCalendarCtrl | 
 | // CFlatScrollBarImpl<T> | 
 | // CFlatScrollBarT<TBase> - CFlatScrollBar | 
 | // CIPAddressCtrlT<TBase> - CIPAddressCtrl | 
 | // CPagerCtrlT<TBase> - CPagerCtrl | 
 | // CLinkCtrlT<TBase> - CLinkCtrl | 
 | // | 
 | // CCustomDraw<T> | 
 | // | 
 | // CCECommandBarCtrlT<TBase> - CCECommandBarCtrl | 
 | // CCECommandBandsCtrlT<TBase> - CCECommandBandsCtrl | 
 |  | 
 |  | 
 | namespace WTL | 
 | { | 
 |  | 
 | // These are wrapper classes for Windows standard and common controls. | 
 | // To implement a window based on a control, use following: | 
 | // Example: Implementing a window based on a list box | 
 | // | 
 | // class CMyListBox : CWindowImpl<CMyListBox, CListBox> | 
 | // { | 
 | // public: | 
 | //      BEGIN_MSG_MAP(CMyListBox) | 
 | //          // put your message handler entries here | 
 | //      END_MSG_MAP() | 
 | // }; | 
 |  | 
 |  | 
 |  | 
 | // --- Standard Windows controls --- | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CStatic - client side for a Windows STATIC control | 
 |  | 
 | template <class TBase> | 
 | class CStaticT : public TBase | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CStaticT(HWND hWnd = NULL) : TBase(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CStaticT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	static LPCTSTR GetWndClassName() | 
 | 	{ | 
 | 		return _T("STATIC"); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	HICON GetIcon() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (HICON)::SendMessage(m_hWnd, STM_GETICON, 0, 0L); | 
 | 	} | 
 |  | 
 | 	HICON SetIcon(HICON hIcon) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (HICON)::SendMessage(m_hWnd, STM_SETICON, (WPARAM)hIcon, 0L); | 
 | 	} | 
 |  | 
 | 	HENHMETAFILE GetEnhMetaFile() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (HENHMETAFILE)::SendMessage(m_hWnd, STM_GETIMAGE, IMAGE_ENHMETAFILE, 0L); | 
 | 	} | 
 |  | 
 | 	HENHMETAFILE SetEnhMetaFile(HENHMETAFILE hMetaFile) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (HENHMETAFILE)::SendMessage(m_hWnd, STM_SETIMAGE, IMAGE_ENHMETAFILE, (LPARAM)hMetaFile); | 
 | 	} | 
 | #else // CE specific | 
 | 	HICON GetIcon() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (HICON)::SendMessage(m_hWnd, STM_GETIMAGE, IMAGE_ICON, 0L); | 
 | 	} | 
 |  | 
 | 	HICON SetIcon(HICON hIcon) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (HICON)::SendMessage(m_hWnd, STM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); | 
 | 	} | 
 | #endif // _WIN32_WCE | 
 |  | 
 | 	CBitmapHandle GetBitmap() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CBitmapHandle((HBITMAP)::SendMessage(m_hWnd, STM_GETIMAGE, IMAGE_BITMAP, 0L)); | 
 | 	} | 
 |  | 
 | 	CBitmapHandle SetBitmap(HBITMAP hBitmap) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CBitmapHandle((HBITMAP)::SendMessage(m_hWnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap)); | 
 | 	} | 
 |  | 
 | 	HCURSOR GetCursor() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (HCURSOR)::SendMessage(m_hWnd, STM_GETIMAGE, IMAGE_CURSOR, 0L); | 
 | 	} | 
 |  | 
 | 	HCURSOR SetCursor(HCURSOR hCursor) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (HCURSOR)::SendMessage(m_hWnd, STM_SETIMAGE, IMAGE_CURSOR, (LPARAM)hCursor); | 
 | 	} | 
 | }; | 
 |  | 
 | typedef CStaticT<ATL::CWindow>   CStatic; | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CButton - client side for a Windows BUTTON control | 
 |  | 
 | template <class TBase> | 
 | class CButtonT : public TBase | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CButtonT(HWND hWnd = NULL) : TBase(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CButtonT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	static LPCTSTR GetWndClassName() | 
 | 	{ | 
 | 		return _T("BUTTON"); | 
 | 	} | 
 |  | 
 | 	UINT GetState() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UINT)::SendMessage(m_hWnd, BM_GETSTATE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetState(BOOL bHighlight) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, BM_SETSTATE, bHighlight, 0L); | 
 | 	} | 
 |  | 
 | 	int GetCheck() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, BM_GETCHECK, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetCheck(int nCheck) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, BM_SETCHECK, nCheck, 0L); | 
 | 	} | 
 |  | 
 | 	UINT GetButtonStyle() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UINT)::GetWindowLong(m_hWnd, GWL_STYLE) & 0xFFFF; | 
 | 	} | 
 |  | 
 | 	void SetButtonStyle(UINT nStyle, BOOL bRedraw = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, BM_SETSTYLE, nStyle, (LPARAM)bRedraw); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	HICON GetIcon() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (HICON)::SendMessage(m_hWnd, BM_GETIMAGE, IMAGE_ICON, 0L); | 
 | 	} | 
 |  | 
 | 	HICON SetIcon(HICON hIcon) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (HICON)::SendMessage(m_hWnd, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); | 
 | 	} | 
 |  | 
 | 	CBitmapHandle GetBitmap() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CBitmapHandle((HBITMAP)::SendMessage(m_hWnd, BM_GETIMAGE, IMAGE_BITMAP, 0L)); | 
 | 	} | 
 |  | 
 | 	CBitmapHandle SetBitmap(HBITMAP hBitmap) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CBitmapHandle((HBITMAP)::SendMessage(m_hWnd, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap)); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0501) | 
 | 	BOOL GetIdealSize(LPSIZE lpSize) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, BCM_GETIDEALSIZE, 0, (LPARAM)lpSize); | 
 | 	} | 
 |  | 
 | 	BOOL GetImageList(PBUTTON_IMAGELIST pButtonImagelist) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, BCM_GETIMAGELIST, 0, (LPARAM)pButtonImagelist); | 
 | 	} | 
 |  | 
 | 	BOOL SetImageList(PBUTTON_IMAGELIST pButtonImagelist) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, BCM_SETIMAGELIST, 0, (LPARAM)pButtonImagelist); | 
 | 	} | 
 |  | 
 | 	BOOL GetTextMargin(LPRECT lpRect) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, BCM_GETTEXTMARGIN, 0, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	BOOL SetTextMargin(LPRECT lpRect) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, BCM_SETTEXTMARGIN, 0, (LPARAM)lpRect); | 
 | 	} | 
 | #endif // (_WIN32_WINNT >= 0x0501) | 
 |  | 
 | #if (WINVER >= 0x0600) | 
 | 	void SetDontClick(BOOL bDontClick) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, BM_SETDONTCLICK, (WPARAM)bDontClick, 0L); | 
 | 	} | 
 | #endif // (WINVER >= 0x0600) | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0600) | 
 | 	BOOL SetDropDownState(BOOL bDropDown) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & (BS_SPLITBUTTON | BS_DEFSPLITBUTTON)) != 0); | 
 | 		return (BOOL)::SendMessage(m_hWnd, BCM_SETDROPDOWNSTATE, (WPARAM)bDropDown, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL GetSplitInfo(PBUTTON_SPLITINFO pSplitInfo) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & (BS_SPLITBUTTON | BS_DEFSPLITBUTTON)) != 0); | 
 | 		return (BOOL)::SendMessage(m_hWnd, BCM_GETSPLITINFO, 0, (LPARAM)pSplitInfo); | 
 | 	} | 
 |  | 
 | 	BOOL SetSplitInfo(PBUTTON_SPLITINFO pSplitInfo) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & (BS_SPLITBUTTON | BS_DEFSPLITBUTTON)) != 0); | 
 | 		return (BOOL)::SendMessage(m_hWnd, BCM_SETSPLITINFO, 0, (LPARAM)pSplitInfo); | 
 | 	} | 
 |  | 
 | 	int GetNoteLength() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & (BS_COMMANDLINK | BS_DEFCOMMANDLINK)) != 0); | 
 | 		return (int)::SendMessage(m_hWnd, BCM_GETNOTELENGTH, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL GetNote(LPWSTR lpstrNoteText, int cchNoteText) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & (BS_COMMANDLINK | BS_DEFCOMMANDLINK)) != 0); | 
 | 		return (BOOL)::SendMessage(m_hWnd, BCM_GETNOTE, cchNoteText, (LPARAM)lpstrNoteText); | 
 | 	} | 
 |  | 
 | 	BOOL SetNote(LPCWSTR lpstrNoteText) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & (BS_COMMANDLINK | BS_DEFCOMMANDLINK)) != 0); | 
 | 		return (BOOL)::SendMessage(m_hWnd, BCM_SETNOTE, 0, (LPARAM)lpstrNoteText); | 
 | 	} | 
 |  | 
 | 	LRESULT SetElevationRequiredState(BOOL bSet) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ::SendMessage(m_hWnd, BCM_SETSHIELD, 0, (LPARAM)bSet); | 
 | 	} | 
 | #endif // (_WIN32_WINNT >= 0x0600) | 
 |  | 
 | // Operations | 
 | 	void Click() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, BM_CLICK, 0, 0L); | 
 | 	} | 
 | }; | 
 |  | 
 | typedef CButtonT<ATL::CWindow>   CButton; | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CListBox - client side for a Windows LISTBOX control | 
 |  | 
 | template <class TBase> | 
 | class CListBoxT : public TBase | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CListBoxT(HWND hWnd = NULL) : TBase(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CListBoxT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	static LPCTSTR GetWndClassName() | 
 | 	{ | 
 | 		return _T("LISTBOX"); | 
 | 	} | 
 |  | 
 | 	// for entire listbox | 
 | 	int GetCount() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LB_GETCOUNT, 0, 0L); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	int SetCount(int cItems) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(((GetStyle() & LBS_NODATA) != 0) && ((GetStyle() & LBS_HASSTRINGS) == 0)); | 
 | 		return (int)::SendMessage(m_hWnd, LB_SETCOUNT, cItems, 0L); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 |  | 
 | 	int GetHorizontalExtent() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LB_GETHORIZONTALEXTENT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetHorizontalExtent(int cxExtent) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, LB_SETHORIZONTALEXTENT, cxExtent, 0L); | 
 | 	} | 
 |  | 
 | 	int GetTopIndex() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LB_GETTOPINDEX, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int SetTopIndex(int nIndex) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LB_SETTOPINDEX, nIndex, 0L); | 
 | 	} | 
 |  | 
 | 	LCID GetLocale() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (LCID)::SendMessage(m_hWnd, LB_GETLOCALE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	LCID SetLocale(LCID nNewLocale) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (LCID)::SendMessage(m_hWnd, LB_SETLOCALE, (WPARAM)nNewLocale, 0L); | 
 | 	} | 
 |  | 
 | #if (WINVER >= 0x0500) && !defined(_WIN32_WCE) | 
 | 	DWORD GetListBoxInfo() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | #if (_WIN32_WINNT >= 0x0501) | 
 | 		return (DWORD)::SendMessage(m_hWnd, LB_GETLISTBOXINFO, 0, 0L); | 
 | #else // !(_WIN32_WINNT >= 0x0501) | 
 | 		return ::GetListBoxInfo(m_hWnd); | 
 | #endif // !(_WIN32_WINNT >= 0x0501) | 
 | 	} | 
 | #endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE) | 
 |  | 
 | 	// for single-selection listboxes | 
 | 	int GetCurSel() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) == 0); | 
 | 		return (int)::SendMessage(m_hWnd, LB_GETCURSEL, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int SetCurSel(int nSelect) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) == 0); | 
 | 		return (int)::SendMessage(m_hWnd, LB_SETCURSEL, nSelect, 0L); | 
 | 	} | 
 |  | 
 | 	// for multiple-selection listboxes | 
 | 	int GetSel(int nIndex) const           // also works for single-selection | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LB_GETSEL, nIndex, 0L); | 
 | 	} | 
 |  | 
 | 	int SetSel(int nIndex, BOOL bSelect = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0); | 
 | 		return (int)::SendMessage(m_hWnd, LB_SETSEL, bSelect, nIndex); | 
 | 	} | 
 |  | 
 | 	int GetSelCount() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0); | 
 | 		return (int)::SendMessage(m_hWnd, LB_GETSELCOUNT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int GetSelItems(int nMaxItems, LPINT rgIndex) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0); | 
 | 		return (int)::SendMessage(m_hWnd, LB_GETSELITEMS, nMaxItems, (LPARAM)rgIndex); | 
 | 	} | 
 |  | 
 | 	int GetAnchorIndex() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0); | 
 | 		return (int)::SendMessage(m_hWnd, LB_GETANCHORINDEX, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetAnchorIndex(int nIndex) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0); | 
 | 		::SendMessage(m_hWnd, LB_SETANCHORINDEX, nIndex, 0L); | 
 | 	} | 
 |  | 
 | 	int GetCaretIndex() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LB_GETCARETINDEX, 0, 0); | 
 | 	} | 
 |  | 
 | 	int SetCaretIndex(int nIndex, BOOL bScroll = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LB_SETCARETINDEX, nIndex, MAKELONG(bScroll, 0)); | 
 | 	} | 
 |  | 
 | 	// for listbox items | 
 | 	DWORD_PTR GetItemData(int nIndex) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD_PTR)::SendMessage(m_hWnd, LB_GETITEMDATA, nIndex, 0L); | 
 | 	} | 
 |  | 
 | 	int SetItemData(int nIndex, DWORD_PTR dwItemData) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LB_SETITEMDATA, nIndex, (LPARAM)dwItemData); | 
 | 	} | 
 |  | 
 | 	void* GetItemDataPtr(int nIndex) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (void*)::SendMessage(m_hWnd, LB_GETITEMDATA, nIndex, 0L); | 
 | 	} | 
 |  | 
 | 	int SetItemDataPtr(int nIndex, void* pData) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return SetItemData(nIndex, (DWORD_PTR)pData); | 
 | 	} | 
 |  | 
 | 	int GetItemRect(int nIndex, LPRECT lpRect) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LB_GETITEMRECT, nIndex, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	int GetText(int nIndex, LPTSTR lpszBuffer) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LB_GETTEXT, nIndex, (LPARAM)lpszBuffer); | 
 | 	} | 
 |  | 
 | #ifndef _ATL_NO_COM | 
 | #ifdef _OLEAUTO_H_ | 
 | 	BOOL GetTextBSTR(int nIndex, BSTR& bstrText) const | 
 | 	{ | 
 | 		USES_CONVERSION; | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(bstrText == NULL); | 
 |  | 
 | 		int nLen = GetTextLen(nIndex); | 
 | 		if(nLen == LB_ERR) | 
 | 			return FALSE; | 
 |  | 
 | 		CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff; | 
 | 		LPTSTR lpstrText = buff.Allocate(nLen + 1); | 
 | 		if(lpstrText == NULL) | 
 | 			return FALSE; | 
 |  | 
 | 		if(GetText(nIndex, lpstrText) == LB_ERR) | 
 | 			return FALSE; | 
 |  | 
 | 		bstrText = ::SysAllocString(T2OLE(lpstrText)); | 
 | 		return (bstrText != NULL) ? TRUE : FALSE; | 
 | 	} | 
 | #endif // _OLEAUTO_H_ | 
 | #endif // !_ATL_NO_COM | 
 |  | 
 | #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) | 
 | 	int GetText(int nIndex, _CSTRING_NS::CString& strText) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		int cchLen = GetTextLen(nIndex); | 
 | 		if(cchLen == LB_ERR) | 
 | 			return LB_ERR; | 
 | 		int nRet = LB_ERR; | 
 | 		LPTSTR lpstr = strText.GetBufferSetLength(cchLen); | 
 | 		if(lpstr != NULL) | 
 | 		{ | 
 | 			nRet = GetText(nIndex, lpstr); | 
 | 			strText.ReleaseBuffer(); | 
 | 		} | 
 | 		return nRet; | 
 | 	} | 
 | #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) | 
 |  | 
 | 	int GetTextLen(int nIndex) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LB_GETTEXTLEN, nIndex, 0L); | 
 | 	} | 
 |  | 
 | 	int GetItemHeight(int nIndex) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LB_GETITEMHEIGHT, nIndex, 0L); | 
 | 	} | 
 |  | 
 | 	int SetItemHeight(int nIndex, UINT cyItemHeight) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LB_SETITEMHEIGHT, nIndex, MAKELONG(cyItemHeight, 0)); | 
 | 	} | 
 |  | 
 | 	// Settable only attributes | 
 | 	void SetColumnWidth(int cxWidth) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, LB_SETCOLUMNWIDTH, cxWidth, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetTabStops(int nTabStops, LPINT rgTabStops) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & LBS_USETABSTOPS) != 0); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LB_SETTABSTOPS, nTabStops, (LPARAM)rgTabStops); | 
 | 	} | 
 |  | 
 | 	BOOL SetTabStops() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & LBS_USETABSTOPS) != 0); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LB_SETTABSTOPS, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetTabStops(const int& cxEachStop)    // takes an 'int' | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & LBS_USETABSTOPS) != 0); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LB_SETTABSTOPS, 1, (LPARAM)(LPINT)&cxEachStop); | 
 | 	} | 
 |  | 
 | // Operations | 
 | 	int InitStorage(int nItems, UINT nBytes) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LB_INITSTORAGE, (WPARAM)nItems, nBytes); | 
 | 	} | 
 |  | 
 | 	void ResetContent() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, LB_RESETCONTENT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	UINT ItemFromPoint(POINT pt, BOOL& bOutside) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		DWORD dw = (DWORD)::SendMessage(m_hWnd, LB_ITEMFROMPOINT, 0, MAKELPARAM(pt.x, pt.y)); | 
 | 		bOutside = (BOOL)HIWORD(dw); | 
 | 		return (UINT)LOWORD(dw); | 
 | 	} | 
 |  | 
 | 	// manipulating listbox items | 
 | 	int AddString(LPCTSTR lpszItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LB_ADDSTRING, 0, (LPARAM)lpszItem); | 
 | 	} | 
 |  | 
 | 	int DeleteString(UINT nIndex) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LB_DELETESTRING, nIndex, 0L); | 
 | 	} | 
 |  | 
 | 	int InsertString(int nIndex, LPCTSTR lpszItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LB_INSERTSTRING, nIndex, (LPARAM)lpszItem); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	int Dir(UINT attr, LPCTSTR lpszWildCard) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LB_DIR, attr, (LPARAM)lpszWildCard); | 
 | 	} | 
 |  | 
 | 	int AddFile(LPCTSTR lpstrFileName) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LB_ADDFILE, 0, (LPARAM)lpstrFileName); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 |  | 
 | 	// selection helpers | 
 | 	int FindString(int nStartAfter, LPCTSTR lpszItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LB_FINDSTRING, nStartAfter, (LPARAM)lpszItem); | 
 | 	} | 
 |  | 
 | 	int FindStringExact(int nIndexStart, LPCTSTR lpszFind) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LB_FINDSTRINGEXACT, nIndexStart, (LPARAM)lpszFind); | 
 | 	} | 
 |  | 
 | 	int SelectString(int nStartAfter, LPCTSTR lpszItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LB_SELECTSTRING, nStartAfter, (LPARAM)lpszItem); | 
 | 	} | 
 |  | 
 | 	int SelItemRange(BOOL bSelect, int nFirstItem, int nLastItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0); | 
 | 		ATLASSERT(nFirstItem <= nLastItem); | 
 | 		return bSelect ? (int)::SendMessage(m_hWnd, LB_SELITEMRANGEEX, nFirstItem, nLastItem) : (int)::SendMessage(m_hWnd, LB_SELITEMRANGEEX, nLastItem, nFirstItem); | 
 | 	} | 
 |  | 
 | #ifdef WIN32_PLATFORM_WFSP   // SmartPhone only messages | 
 | 	DWORD GetInputMode(BOOL bCurrentMode = TRUE) | 
 | 	{ | 
 | 		return SendMessage(LB_GETINPUTMODE, 0, (LPARAM)bCurrentMode); | 
 | 	} | 
 |  | 
 | 	BOOL SetInputMode(DWORD dwMode) | 
 | 	{ | 
 | 		return SendMessage(LB_SETINPUTMODE, 0, (LPARAM)dwMode); | 
 | 	} | 
 | #endif // WIN32_PLATFORM_WFSP | 
 | }; | 
 |  | 
 | typedef CListBoxT<ATL::CWindow>   CListBox; | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CComboBox - client side for a Windows COMBOBOX control | 
 |  | 
 | #ifndef WIN32_PLATFORM_WFSP   // No COMBOBOX on SmartPhones | 
 |  | 
 | template <class TBase> | 
 | class CComboBoxT : public TBase | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CComboBoxT(HWND hWnd = NULL) : TBase(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CComboBoxT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	static LPCTSTR GetWndClassName() | 
 | 	{ | 
 | 		return _T("COMBOBOX"); | 
 | 	} | 
 |  | 
 | 	// for entire combo box | 
 | 	int GetCount() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, CB_GETCOUNT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int GetCurSel() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, CB_GETCURSEL, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int SetCurSel(int nSelect) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, CB_SETCURSEL, nSelect, 0L); | 
 | 	} | 
 |  | 
 | 	LCID GetLocale() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (LCID)::SendMessage(m_hWnd, CB_GETLOCALE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	LCID SetLocale(LCID nNewLocale) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (LCID)::SendMessage(m_hWnd, CB_SETLOCALE, (WPARAM)nNewLocale, 0L); | 
 | 	} | 
 |  | 
 | 	int GetTopIndex() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, CB_GETTOPINDEX, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int SetTopIndex(int nIndex) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, CB_SETTOPINDEX, nIndex, 0L); | 
 | 	} | 
 |  | 
 | 	UINT GetHorizontalExtent() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UINT)::SendMessage(m_hWnd, CB_GETHORIZONTALEXTENT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetHorizontalExtent(UINT nExtent) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, CB_SETHORIZONTALEXTENT, nExtent, 0L); | 
 | 	} | 
 |  | 
 | 	int GetDroppedWidth() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, CB_GETDROPPEDWIDTH, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int SetDroppedWidth(UINT nWidth) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, CB_SETDROPPEDWIDTH, nWidth, 0L); | 
 | 	} | 
 |  | 
 | #if ((WINVER >= 0x0500) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420)) | 
 | 	BOOL GetComboBoxInfo(PCOMBOBOXINFO pComboBoxInfo) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | #if ((_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420)) | 
 | 		return (BOOL)::SendMessage(m_hWnd, CB_GETCOMBOBOXINFO, 0, (LPARAM)pComboBoxInfo); | 
 | #else // !((_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420)) | 
 | 		return ::GetComboBoxInfo(m_hWnd, pComboBoxInfo); | 
 | #endif // !((_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420)) | 
 | 	} | 
 | #endif // ((WINVER >= 0x0500) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420)) | 
 |  | 
 | 	// for edit control | 
 | 	DWORD GetEditSel() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, CB_GETEDITSEL, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetEditSel(int nStartChar, int nEndChar) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, CB_SETEDITSEL, 0, MAKELONG(nStartChar, nEndChar)); | 
 | 	} | 
 |  | 
 | 	// for combobox item | 
 | 	DWORD_PTR GetItemData(int nIndex) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD_PTR)::SendMessage(m_hWnd, CB_GETITEMDATA, nIndex, 0L); | 
 | 	} | 
 |  | 
 | 	int SetItemData(int nIndex, DWORD_PTR dwItemData) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, CB_SETITEMDATA, nIndex, (LPARAM)dwItemData); | 
 | 	} | 
 |  | 
 | 	void* GetItemDataPtr(int nIndex) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (void*)GetItemData(nIndex); | 
 | 	} | 
 |  | 
 | 	int SetItemDataPtr(int nIndex, void* pData) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return SetItemData(nIndex, (DWORD_PTR)pData); | 
 | 	} | 
 |  | 
 | 	int GetLBText(int nIndex, LPTSTR lpszText) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, CB_GETLBTEXT, nIndex, (LPARAM)lpszText); | 
 | 	} | 
 |  | 
 | #ifndef _ATL_NO_COM | 
 | 	BOOL GetLBTextBSTR(int nIndex, BSTR& bstrText) const | 
 | 	{ | 
 | 		USES_CONVERSION; | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(bstrText == NULL); | 
 |  | 
 | 		int nLen = GetLBTextLen(nIndex); | 
 | 		if(nLen == CB_ERR) | 
 | 			return FALSE; | 
 |  | 
 | 		CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff; | 
 | 		LPTSTR lpstrText = buff.Allocate(nLen + 1); | 
 | 		if(lpstrText == NULL) | 
 | 			return FALSE; | 
 |  | 
 | 		if(GetLBText(nIndex, lpstrText) == CB_ERR) | 
 | 			return FALSE; | 
 |  | 
 | 		bstrText = ::SysAllocString(T2OLE(lpstrText)); | 
 | 		return (bstrText != NULL) ? TRUE : FALSE; | 
 | 	} | 
 | #endif // !_ATL_NO_COM | 
 |  | 
 | #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) | 
 | 	int GetLBText(int nIndex, _CSTRING_NS::CString& strText) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		int cchLen = GetLBTextLen(nIndex); | 
 | 		if(cchLen == CB_ERR) | 
 | 			return CB_ERR; | 
 | 		int nRet = CB_ERR; | 
 | 		LPTSTR lpstr = strText.GetBufferSetLength(cchLen); | 
 | 		if(lpstr != NULL) | 
 | 		{ | 
 | 			nRet = GetLBText(nIndex, lpstr); | 
 | 			strText.ReleaseBuffer(); | 
 | 		} | 
 | 		return nRet; | 
 | 	} | 
 | #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) | 
 |  | 
 | 	int GetLBTextLen(int nIndex) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, CB_GETLBTEXTLEN, nIndex, 0L); | 
 | 	} | 
 |  | 
 | 	int GetItemHeight(int nIndex) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, CB_GETITEMHEIGHT, nIndex, 0L); | 
 | 	} | 
 |  | 
 | 	int SetItemHeight(int nIndex, UINT cyItemHeight) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, CB_SETITEMHEIGHT, nIndex, MAKELONG(cyItemHeight, 0)); | 
 | 	} | 
 |  | 
 | 	BOOL GetExtendedUI() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, CB_GETEXTENDEDUI, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int SetExtendedUI(BOOL bExtended = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, CB_SETEXTENDEDUI, bExtended, 0L); | 
 | 	} | 
 |  | 
 | 	void GetDroppedControlRect(LPRECT lprect) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, CB_GETDROPPEDCONTROLRECT, 0, (LPARAM)lprect); | 
 | 	} | 
 |  | 
 | 	BOOL GetDroppedState() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, CB_GETDROPPEDSTATE, 0, 0L); | 
 | 	} | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0501) | 
 | 	int GetMinVisible() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, CB_GETMINVISIBLE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetMinVisible(int nMinVisible) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, CB_SETMINVISIBLE, nMinVisible, 0L); | 
 | 	} | 
 |  | 
 | 	// Vista only | 
 | 	BOOL GetCueBannerText(LPWSTR lpwText, int cchText) const | 
 | 	{ | 
 | #ifndef CB_GETCUEBANNER | 
 | 		const UINT CB_GETCUEBANNER = (CBM_FIRST + 4); | 
 | #endif | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, CB_GETCUEBANNER, (WPARAM)lpwText, cchText); | 
 | 	} | 
 |  | 
 | 	// Vista only | 
 | 	BOOL SetCueBannerText(LPCWSTR lpcwText) | 
 | 	{ | 
 | #ifndef CB_SETCUEBANNER | 
 | 		const UINT CB_SETCUEBANNER = (CBM_FIRST + 3); | 
 | #endif | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, CB_SETCUEBANNER, 0, (LPARAM)lpcwText); | 
 | 	} | 
 | #endif // (_WIN32_WINNT >= 0x0501) | 
 |  | 
 | // Operations | 
 | 	int InitStorage(int nItems, UINT nBytes) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, CB_INITSTORAGE, (WPARAM)nItems, nBytes); | 
 | 	} | 
 |  | 
 | 	void ResetContent() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, CB_RESETCONTENT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	// for edit control | 
 | 	BOOL LimitText(int nMaxChars) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, CB_LIMITTEXT, nMaxChars, 0L); | 
 | 	} | 
 |  | 
 | 	// for drop-down combo boxes | 
 | 	void ShowDropDown(BOOL bShowIt = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, CB_SHOWDROPDOWN, bShowIt, 0L); | 
 | 	} | 
 |  | 
 | 	// manipulating listbox items | 
 | 	int AddString(LPCTSTR lpszString) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, CB_ADDSTRING, 0, (LPARAM)lpszString); | 
 | 	} | 
 |  | 
 | 	int DeleteString(UINT nIndex) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, CB_DELETESTRING, nIndex, 0L); | 
 | 	} | 
 |  | 
 | 	int InsertString(int nIndex, LPCTSTR lpszString) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, CB_INSERTSTRING, nIndex, (LPARAM)lpszString); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	int Dir(UINT attr, LPCTSTR lpszWildCard) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, CB_DIR, attr, (LPARAM)lpszWildCard); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 |  | 
 | 	// selection helpers | 
 | 	int FindString(int nStartAfter, LPCTSTR lpszString) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, CB_FINDSTRING, nStartAfter, (LPARAM)lpszString); | 
 | 	} | 
 |  | 
 | 	int FindStringExact(int nIndexStart, LPCTSTR lpszFind) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, CB_FINDSTRINGEXACT, nIndexStart, (LPARAM)lpszFind); | 
 | 	} | 
 |  | 
 | 	int SelectString(int nStartAfter, LPCTSTR lpszString) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, CB_SELECTSTRING, nStartAfter, (LPARAM)lpszString); | 
 | 	} | 
 |  | 
 | 	// Clipboard operations | 
 | 	void Clear() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, WM_CLEAR, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void Copy() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, WM_COPY, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void Cut() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, WM_CUT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void Paste() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, WM_PASTE, 0, 0L); | 
 | 	} | 
 | }; | 
 |  | 
 | typedef CComboBoxT<ATL::CWindow>   CComboBox; | 
 |  | 
 | #endif // !WIN32_PLATFORM_WFSP | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CEdit - client side for a Windows EDIT control | 
 |  | 
 | template <class TBase> | 
 | class CEditT : public TBase | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CEditT(HWND hWnd = NULL) : TBase(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CEditT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	static LPCTSTR GetWndClassName() | 
 | 	{ | 
 | 		return _T("EDIT"); | 
 | 	} | 
 |  | 
 | 	BOOL CanUndo() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_CANUNDO, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int GetLineCount() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, EM_GETLINECOUNT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL GetModify() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_GETMODIFY, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetModify(BOOL bModified = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_SETMODIFY, bModified, 0L); | 
 | 	} | 
 |  | 
 | 	void GetRect(LPRECT lpRect) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_GETRECT, 0, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	DWORD GetSel() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, EM_GETSEL, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void GetSel(int& nStartChar, int& nEndChar) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_GETSEL, (WPARAM)&nStartChar, (LPARAM)&nEndChar); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	HLOCAL GetHandle() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (HLOCAL)::SendMessage(m_hWnd, EM_GETHANDLE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetHandle(HLOCAL hBuffer) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_SETHANDLE, (WPARAM)hBuffer, 0L); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 |  | 
 | 	DWORD GetMargins() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, EM_GETMARGINS, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetMargins(UINT nLeft, UINT nRight) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_SETMARGINS, EC_LEFTMARGIN|EC_RIGHTMARGIN, MAKELONG(nLeft, nRight)); | 
 | 	} | 
 |  | 
 | 	UINT GetLimitText() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UINT)::SendMessage(m_hWnd, EM_GETLIMITTEXT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetLimitText(UINT nMax) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_SETLIMITTEXT, nMax, 0L); | 
 | 	} | 
 |  | 
 | 	POINT PosFromChar(UINT nChar) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, EM_POSFROMCHAR, nChar, 0); | 
 | 		POINT point = { GET_X_LPARAM(dwRet), GET_Y_LPARAM(dwRet) }; | 
 | 		return point; | 
 | 	} | 
 |  | 
 | 	int CharFromPos(POINT pt, int* pLine = NULL) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, EM_CHARFROMPOS, 0, MAKELPARAM(pt.x, pt.y)); | 
 | 		if(pLine != NULL) | 
 | 			*pLine = (int)(short)HIWORD(dwRet); | 
 | 		return (int)(short)LOWORD(dwRet); | 
 | 	} | 
 |  | 
 | 	// NOTE: first word in lpszBuffer must contain the size of the buffer! | 
 | 	int GetLine(int nIndex, LPTSTR lpszBuffer) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer); | 
 | 	} | 
 |  | 
 | 	int GetLine(int nIndex, LPTSTR lpszBuffer, int nMaxLength) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		*(LPWORD)lpszBuffer = (WORD)nMaxLength; | 
 | 		return (int)::SendMessage(m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer); | 
 | 	} | 
 |  | 
 | 	TCHAR GetPasswordChar() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (TCHAR)::SendMessage(m_hWnd, EM_GETPASSWORDCHAR, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetPasswordChar(TCHAR ch) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_SETPASSWORDCHAR, ch, 0L); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	EDITWORDBREAKPROC GetWordBreakProc() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (EDITWORDBREAKPROC)::SendMessage(m_hWnd, EM_GETWORDBREAKPROC, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetWordBreakProc(EDITWORDBREAKPROC ewbprc) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_SETWORDBREAKPROC, 0, (LPARAM)ewbprc); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 |  | 
 | 	int GetFirstVisibleLine() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, EM_GETFIRSTVISIBLELINE, 0, 0L); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	int GetThumb() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & ES_MULTILINE) != 0); | 
 | 		return (int)::SendMessage(m_hWnd, EM_GETTHUMB, 0, 0L); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 |  | 
 | 	BOOL SetReadOnly(BOOL bReadOnly = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_SETREADONLY, bReadOnly, 0L); | 
 | 	} | 
 |  | 
 | #if (WINVER >= 0x0500) && !defined(_WIN32_WCE) | 
 | 	UINT GetImeStatus(UINT uStatus) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UINT)::SendMessage(m_hWnd, EM_GETIMESTATUS, uStatus, 0L); | 
 | 	} | 
 |  | 
 | 	UINT SetImeStatus(UINT uStatus, UINT uData) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UINT)::SendMessage(m_hWnd, EM_SETIMESTATUS, uStatus, uData); | 
 | 	} | 
 | #endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE) | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0501) | 
 | 	BOOL GetCueBannerText(LPCWSTR lpstrText, int cchText) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_GETCUEBANNER, (WPARAM)lpstrText, cchText); | 
 | 	} | 
 |  | 
 | 	// bKeepWithFocus - Vista only | 
 | 	BOOL SetCueBannerText(LPCWSTR lpstrText, BOOL bKeepWithFocus = FALSE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_SETCUEBANNER, (WPARAM)bKeepWithFocus, (LPARAM)(lpstrText)); | 
 | 	} | 
 | #endif // (_WIN32_WINNT >= 0x0501) | 
 |  | 
 | // Operations | 
 | 	void EmptyUndoBuffer() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_EMPTYUNDOBUFFER, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL FmtLines(BOOL bAddEOL) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_FMTLINES, bAddEOL, 0L); | 
 | 	} | 
 |  | 
 | 	void LimitText(int nChars = 0) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_LIMITTEXT, nChars, 0L); | 
 | 	} | 
 |  | 
 | 	int LineFromChar(int nIndex = -1) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, EM_LINEFROMCHAR, nIndex, 0L); | 
 | 	} | 
 |  | 
 | 	int LineIndex(int nLine = -1) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, EM_LINEINDEX, nLine, 0L); | 
 | 	} | 
 |  | 
 | 	int LineLength(int nLine = -1) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, EM_LINELENGTH, nLine, 0L); | 
 | 	} | 
 |  | 
 | 	void LineScroll(int nLines, int nChars = 0) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_LINESCROLL, nChars, nLines); | 
 | 	} | 
 |  | 
 | 	void ReplaceSel(LPCTSTR lpszNewText, BOOL bCanUndo = FALSE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_REPLACESEL, (WPARAM) bCanUndo, (LPARAM)lpszNewText); | 
 | 	} | 
 |  | 
 | 	void SetRect(LPCRECT lpRect) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_SETRECT, 0, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	void SetRectNP(LPCRECT lpRect) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_SETRECTNP, 0, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	void SetSel(DWORD dwSelection, BOOL bNoScroll = FALSE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_SETSEL, LOWORD(dwSelection), HIWORD(dwSelection)); | 
 | 		if(!bNoScroll) | 
 | 			::SendMessage(m_hWnd, EM_SCROLLCARET, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetSel(int nStartChar, int nEndChar, BOOL bNoScroll = FALSE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_SETSEL, nStartChar, nEndChar); | 
 | 		if(!bNoScroll) | 
 | 			::SendMessage(m_hWnd, EM_SCROLLCARET, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetSelAll(BOOL bNoScroll = FALSE) | 
 | 	{ | 
 | 		SetSel(0, -1, bNoScroll); | 
 | 	} | 
 |  | 
 | 	void SetSelNone(BOOL bNoScroll = FALSE) | 
 | 	{ | 
 | 		SetSel(-1, 0, bNoScroll); | 
 | 	} | 
 |  | 
 | 	BOOL SetTabStops(int nTabStops, LPINT rgTabStops) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, nTabStops, (LPARAM)rgTabStops); | 
 | 	} | 
 |  | 
 | 	BOOL SetTabStops() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetTabStops(const int& cxEachStop)    // takes an 'int' | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, 1, (LPARAM)(LPINT)&cxEachStop); | 
 | 	} | 
 |  | 
 | 	void ScrollCaret() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_SCROLLCARET, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int Scroll(int nScrollAction) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & ES_MULTILINE) != 0); | 
 | 		LRESULT lRet = ::SendMessage(m_hWnd, EM_SCROLL, nScrollAction, 0L); | 
 | 		if(!(BOOL)HIWORD(lRet)) | 
 | 			return -1;   // failed | 
 | 		return (int)(short)LOWORD(lRet); | 
 | 		 | 
 | 	} | 
 |  | 
 | 	void InsertText(int nInsertAfterChar, LPCTSTR lpstrText, BOOL bNoScroll = FALSE, BOOL bCanUndo = FALSE) | 
 | 	{ | 
 | 		SetSel(nInsertAfterChar, nInsertAfterChar, bNoScroll); | 
 | 		ReplaceSel(lpstrText, bCanUndo); | 
 | 	} | 
 |  | 
 | 	void AppendText(LPCTSTR lpstrText, BOOL bNoScroll = FALSE, BOOL bCanUndo = FALSE) | 
 | 	{ | 
 | 		InsertText(GetWindowTextLength(), lpstrText, bNoScroll, bCanUndo); | 
 | 	} | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0501) | 
 | 	BOOL ShowBalloonTip(PEDITBALLOONTIP pEditBaloonTip) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_SHOWBALLOONTIP, 0, (LPARAM)pEditBaloonTip); | 
 | 	} | 
 |  | 
 | 	BOOL HideBalloonTip() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_HIDEBALLOONTIP, 0, 0L); | 
 | 	} | 
 | #endif // (_WIN32_WINNT >= 0x0501) | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0600) | 
 | 	DWORD GetHilite() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, EM_GETHILITE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void GetHilite(int& nStartChar, int& nEndChar) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, EM_GETHILITE, 0, 0L); | 
 | 		nStartChar = (int)(short)LOWORD(dwRet); | 
 | 		nEndChar = (int)(short)HIWORD(dwRet); | 
 | 	} | 
 |  | 
 | 	void SetHilite(int nStartChar, int nEndChar) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_SETHILITE, nStartChar, nEndChar); | 
 | 	} | 
 | #endif // (_WIN32_WINNT >= 0x0600) | 
 |  | 
 | 	// Clipboard operations | 
 | 	BOOL Undo() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_UNDO, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void Clear() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, WM_CLEAR, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void Copy() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, WM_COPY, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void Cut() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, WM_CUT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void Paste() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, WM_PASTE, 0, 0L); | 
 | 	} | 
 |  | 
 | #ifdef WIN32_PLATFORM_WFSP   // SmartPhone only messages | 
 | 	DWORD GetExtendedStyle() | 
 | 	{ | 
 | 		return SendMessage(EM_GETEXTENDEDSTYLE); | 
 | 	} | 
 |  | 
 | 	DWORD SetExtendedStyle(DWORD dwMask, DWORD dwExStyle) | 
 | 	{ | 
 | 		return SendMessage(EM_SETEXTENDEDSTYLE, (WPARAM)dwMask, (LPARAM)dwExStyle); | 
 | 	} | 
 |  | 
 | 	DWORD GetInputMode(BOOL bCurrentMode = TRUE) | 
 | 	{ | 
 | 		return SendMessage(EM_GETINPUTMODE, 0, (LPARAM)bCurrentMode); | 
 | 	} | 
 |  | 
 | 	BOOL SetInputMode(DWORD dwMode) | 
 | 	{ | 
 | 		return SendMessage(EM_SETINPUTMODE, 0, (LPARAM)dwMode); | 
 | 	} | 
 |  | 
 | 	BOOL SetSymbols(LPCTSTR szSymbols) | 
 | 	{ | 
 | 		return SendMessage(EM_SETSYMBOLS, 0, (LPARAM)szSymbols); | 
 | 	} | 
 |  | 
 | 	BOOL ResetSymbols() | 
 | 	{ | 
 | 		return SendMessage(EM_SETSYMBOLS); | 
 | 	} | 
 | #endif // WIN32_PLATFORM_WFSP | 
 | }; | 
 |  | 
 | typedef CEditT<ATL::CWindow>   CEdit; | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CEditCommands - message handlers for standard EDIT commands | 
 |  | 
 | // Chain to CEditCommands message map. Your class must also derive from CEdit. | 
 | // Example: | 
 | // class CMyEdit : public CWindowImpl<CMyEdit, CEdit>, | 
 | //                 public CEditCommands<CMyEdit> | 
 | // { | 
 | // public: | 
 | //      BEGIN_MSG_MAP(CMyEdit) | 
 | //              // your handlers... | 
 | //              CHAIN_MSG_MAP_ALT(CEditCommands<CMyEdit>, 1) | 
 | //      END_MSG_MAP() | 
 | //      // other stuff... | 
 | // }; | 
 |  | 
 | template <class T> | 
 | class CEditCommands | 
 | { | 
 | public: | 
 | 	BEGIN_MSG_MAP(CEditCommands< T >) | 
 | 	ALT_MSG_MAP(1) | 
 | 		COMMAND_ID_HANDLER(ID_EDIT_CLEAR, OnEditClear) | 
 | 		COMMAND_ID_HANDLER(ID_EDIT_CLEAR_ALL, OnEditClearAll) | 
 | 		COMMAND_ID_HANDLER(ID_EDIT_COPY, OnEditCopy) | 
 | 		COMMAND_ID_HANDLER(ID_EDIT_CUT, OnEditCut) | 
 | 		COMMAND_ID_HANDLER(ID_EDIT_PASTE, OnEditPaste) | 
 | 		COMMAND_ID_HANDLER(ID_EDIT_SELECT_ALL, OnEditSelectAll) | 
 | 		COMMAND_ID_HANDLER(ID_EDIT_UNDO, OnEditUndo) | 
 | 	END_MSG_MAP() | 
 |  | 
 | 	LRESULT OnEditClear(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) | 
 | 	{ | 
 | 		T* pT = static_cast<T*>(this); | 
 | 		pT->Clear(); | 
 | 		return 0; | 
 | 	} | 
 |  | 
 | 	LRESULT OnEditClearAll(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) | 
 | 	{ | 
 | 		T* pT = static_cast<T*>(this); | 
 | 		pT->SetSel(0, -1); | 
 | 		pT->Clear(); | 
 | 		return 0; | 
 | 	} | 
 |  | 
 | 	LRESULT OnEditCopy(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) | 
 | 	{ | 
 | 		T* pT = static_cast<T*>(this); | 
 | 		pT->Copy(); | 
 | 		return 0; | 
 | 	} | 
 |  | 
 | 	LRESULT OnEditCut(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) | 
 | 	{ | 
 | 		T* pT = static_cast<T*>(this); | 
 | 		pT->Cut(); | 
 | 		return 0; | 
 | 	} | 
 |  | 
 | 	LRESULT OnEditPaste(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) | 
 | 	{ | 
 | 		T* pT = static_cast<T*>(this); | 
 | 		pT->Paste(); | 
 | 		return 0; | 
 | 	} | 
 |  | 
 | 	LRESULT OnEditSelectAll(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) | 
 | 	{ | 
 | 		T* pT = static_cast<T*>(this); | 
 | 		pT->SetSel(0, -1); | 
 | 		return 0; | 
 | 	} | 
 |  | 
 | 	LRESULT OnEditUndo(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) | 
 | 	{ | 
 | 		T* pT = static_cast<T*>(this); | 
 | 		pT->Undo(); | 
 | 		return 0; | 
 | 	} | 
 |  | 
 | // State (update UI) helpers | 
 | 	BOOL CanCut() const | 
 | 	{ return HasSelection(); } | 
 |  | 
 | 	BOOL CanCopy() const | 
 | 	{ return HasSelection(); } | 
 |  | 
 | 	BOOL CanClear() const | 
 | 	{ return HasSelection(); } | 
 |  | 
 | 	BOOL CanSelectAll() const | 
 | 	{ return HasText(); } | 
 |  | 
 | 	BOOL CanFind() const | 
 | 	{ return HasText(); } | 
 |  | 
 | 	BOOL CanRepeat() const | 
 | 	{ return HasText(); } | 
 |  | 
 | 	BOOL CanReplace() const | 
 | 	{ return HasText(); } | 
 |  | 
 | 	BOOL CanClearAll() const | 
 | 	{ return HasText(); } | 
 |  | 
 | // Implementation | 
 | 	BOOL HasSelection() const | 
 | 	{ | 
 | 		const T* pT = static_cast<const T*>(this); | 
 | 		int nMin, nMax; | 
 | 		::SendMessage(pT->m_hWnd, EM_GETSEL, (WPARAM)&nMin, (LPARAM)&nMax); | 
 | 		return (nMin != nMax); | 
 | 	} | 
 |  | 
 | 	BOOL HasText() const | 
 | 	{ | 
 | 		const T* pT = static_cast<const T*>(this); | 
 | 		return (pT->GetWindowTextLength() > 0); | 
 | 	} | 
 | }; | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CScrollBar - client side for a Windows SCROLLBAR control | 
 |  | 
 | template <class TBase> | 
 | class CScrollBarT : public TBase | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CScrollBarT(HWND hWnd = NULL) : TBase(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CScrollBarT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	static LPCTSTR GetWndClassName() | 
 | 	{ | 
 | 		return _T("SCROLLBAR"); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	int GetScrollPos() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ::GetScrollPos(m_hWnd, SB_CTL); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 |  | 
 | 	int SetScrollPos(int nPos, BOOL bRedraw = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ::SetScrollPos(m_hWnd, SB_CTL, nPos, bRedraw); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	void GetScrollRange(LPINT lpMinPos, LPINT lpMaxPos) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::GetScrollRange(m_hWnd, SB_CTL, lpMinPos, lpMaxPos); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 |  | 
 | 	void SetScrollRange(int nMinPos, int nMaxPos, BOOL bRedraw = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SetScrollRange(m_hWnd, SB_CTL, nMinPos, nMaxPos, bRedraw); | 
 | 	} | 
 |  | 
 | 	BOOL GetScrollInfo(LPSCROLLINFO lpScrollInfo) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ::GetScrollInfo(m_hWnd, SB_CTL, lpScrollInfo); | 
 | 	} | 
 |  | 
 | 	int SetScrollInfo(LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ::SetScrollInfo(m_hWnd, SB_CTL, lpScrollInfo, bRedraw); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	int GetScrollLimit() const | 
 | 	{ | 
 | 		int nMin = 0, nMax = 0; | 
 | 		::GetScrollRange(m_hWnd, SB_CTL, &nMin, &nMax); | 
 | 		SCROLLINFO info = { 0 }; | 
 | 		info.cbSize = sizeof(SCROLLINFO); | 
 | 		info.fMask = SIF_PAGE; | 
 | 		if(::GetScrollInfo(m_hWnd, SB_CTL, &info)) | 
 | 			nMax -= ((info.nPage - 1) > 0) ? (info.nPage - 1) : 0; | 
 |  | 
 | 		return nMax; | 
 | 	} | 
 |  | 
 | #if (WINVER >= 0x0500) | 
 | 	BOOL GetScrollBarInfo(PSCROLLBARINFO pScrollBarInfo) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | #if (_WIN32_WINNT >= 0x0501) | 
 | 		return (BOOL)::SendMessage(m_hWnd, SBM_GETSCROLLBARINFO, 0, (LPARAM)pScrollBarInfo); | 
 | #else // !(_WIN32_WINNT >= 0x0501) | 
 | 		return ::GetScrollBarInfo(m_hWnd, OBJID_CLIENT, pScrollBarInfo); | 
 | #endif // !(_WIN32_WINNT >= 0x0501) | 
 | 	} | 
 | #endif // (WINVER >= 0x0500) | 
 |  | 
 | // Operations | 
 | 	void ShowScrollBar(BOOL bShow = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::ShowScrollBar(m_hWnd, SB_CTL, bShow); | 
 | 	} | 
 |  | 
 | 	BOOL EnableScrollBar(UINT nArrowFlags = ESB_ENABLE_BOTH) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ::EnableScrollBar(m_hWnd, SB_CTL, nArrowFlags); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 | }; | 
 |  | 
 | typedef CScrollBarT<ATL::CWindow>   CScrollBar; | 
 |  | 
 |  | 
 | // --- Windows Common Controls --- | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CImageList | 
 |  | 
 | class CImageList | 
 | { | 
 | public: | 
 | 	HIMAGELIST m_hImageList; | 
 |  | 
 | // Constructor | 
 | 	CImageList(HIMAGELIST hImageList = NULL) : m_hImageList(hImageList) | 
 | 	{ } | 
 |  | 
 | // Operators, etc. | 
 | 	CImageList& operator =(HIMAGELIST hImageList) | 
 | 	{ | 
 | 		m_hImageList = hImageList; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	operator HIMAGELIST() const { return m_hImageList; } | 
 |  | 
 | 	void Attach(HIMAGELIST hImageList) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList == NULL); | 
 | 		ATLASSERT(hImageList != NULL); | 
 | 		m_hImageList = hImageList; | 
 | 	} | 
 |  | 
 | 	HIMAGELIST Detach() | 
 | 	{ | 
 | 		HIMAGELIST hImageList = m_hImageList; | 
 | 		m_hImageList = NULL; | 
 | 		return hImageList; | 
 | 	} | 
 |  | 
 | 	bool IsNull() const { return (m_hImageList == NULL); } | 
 |  | 
 | // Attributes | 
 | 	int GetImageCount() const | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return ImageList_GetImageCount(m_hImageList); | 
 | 	} | 
 |  | 
 | 	COLORREF GetBkColor() const | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return ImageList_GetBkColor(m_hImageList); | 
 | 	} | 
 |  | 
 | 	COLORREF SetBkColor(COLORREF cr) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return ImageList_SetBkColor(m_hImageList, cr); | 
 | 	} | 
 |  | 
 | 	BOOL GetImageInfo(int nImage, IMAGEINFO* pImageInfo) const | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return ImageList_GetImageInfo(m_hImageList, nImage, pImageInfo); | 
 | 	} | 
 |  | 
 | 	HICON GetIcon(int nIndex, UINT uFlags = ILD_NORMAL) const | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return ImageList_GetIcon(m_hImageList, nIndex, uFlags); | 
 | 	} | 
 |  | 
 | 	BOOL GetIconSize(int& cx, int& cy) const | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return ImageList_GetIconSize(m_hImageList, &cx, &cy); | 
 | 	} | 
 |  | 
 | 	BOOL GetIconSize(SIZE& size) const | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return ImageList_GetIconSize(m_hImageList, (int*)&size.cx, (int*)&size.cy); | 
 | 	} | 
 |  | 
 | 	BOOL SetIconSize(int cx, int cy) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return ImageList_SetIconSize(m_hImageList, cx, cy); | 
 | 	} | 
 |  | 
 | 	BOOL SetIconSize(SIZE size) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return ImageList_SetIconSize(m_hImageList, size.cx, size.cy); | 
 | 	} | 
 |  | 
 | 	BOOL SetImageCount(UINT uNewCount) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return ImageList_SetImageCount(m_hImageList, uNewCount); | 
 | 	} | 
 |  | 
 | 	BOOL SetOverlayImage(int nImage, int nOverlay) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return ImageList_SetOverlayImage(m_hImageList, nImage, nOverlay); | 
 | 	} | 
 |  | 
 | // Operations | 
 | 	BOOL Create(int cx, int cy, UINT nFlags, int nInitial, int nGrow) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList == NULL); | 
 | 		m_hImageList = ImageList_Create(cx, cy, nFlags, nInitial, nGrow); | 
 | 		return (m_hImageList != NULL) ? TRUE : FALSE; | 
 | 	} | 
 |  | 
 | 	BOOL Create(ATL::_U_STRINGorID bitmap, int cx, int nGrow, COLORREF crMask) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList == NULL); | 
 | 		m_hImageList = ImageList_LoadBitmap(ModuleHelper::GetResourceInstance(), bitmap.m_lpstr, cx, nGrow, crMask); | 
 | 		return (m_hImageList != NULL) ? TRUE : FALSE; | 
 | 	} | 
 |  | 
 | 	BOOL CreateFromImage(ATL::_U_STRINGorID image, int cx, int nGrow, COLORREF crMask, UINT uType, UINT uFlags = LR_DEFAULTCOLOR | LR_DEFAULTSIZE) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList == NULL); | 
 | 		m_hImageList = ImageList_LoadImage(ModuleHelper::GetResourceInstance(), image.m_lpstr, cx, nGrow, crMask, uType, uFlags); | 
 | 		return (m_hImageList != NULL) ? TRUE : FALSE; | 
 | 	} | 
 |  | 
 | 	BOOL Merge(HIMAGELIST hImageList1, int nImage1, HIMAGELIST hImageList2, int nImage2, int dx, int dy) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList == NULL); | 
 | 		m_hImageList = ImageList_Merge(hImageList1, nImage1, hImageList2, nImage2, dx, dy); | 
 | 		return (m_hImageList != NULL) ? TRUE : FALSE; | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | #ifdef __IStream_INTERFACE_DEFINED__ | 
 | 	BOOL CreateFromStream(LPSTREAM lpStream) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList == NULL); | 
 | 		m_hImageList = ImageList_Read(lpStream); | 
 | 		return (m_hImageList != NULL) ? TRUE : FALSE; | 
 | 	} | 
 | #endif // __IStream_INTERFACE_DEFINED__ | 
 | #endif // !_WIN32_WCE | 
 |  | 
 | 	BOOL Destroy() | 
 | 	{ | 
 | 		if (m_hImageList == NULL) | 
 | 			return FALSE; | 
 | 		BOOL bRet = ImageList_Destroy(m_hImageList); | 
 | 		if(bRet) | 
 | 			m_hImageList = NULL; | 
 | 		return bRet; | 
 | 	} | 
 |  | 
 | 	int Add(HBITMAP hBitmap, HBITMAP hBitmapMask = NULL) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return ImageList_Add(m_hImageList, hBitmap, hBitmapMask); | 
 | 	} | 
 |  | 
 | 	int Add(HBITMAP hBitmap, COLORREF crMask) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return ImageList_AddMasked(m_hImageList, hBitmap, crMask); | 
 | 	} | 
 |  | 
 | 	BOOL Remove(int nImage) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return ImageList_Remove(m_hImageList, nImage); | 
 | 	} | 
 |  | 
 | 	BOOL RemoveAll() | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return ImageList_RemoveAll(m_hImageList); | 
 | 	} | 
 |  | 
 | 	BOOL Replace(int nImage, HBITMAP hBitmap, HBITMAP hBitmapMask) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return ImageList_Replace(m_hImageList, nImage, hBitmap, hBitmapMask); | 
 | 	} | 
 |  | 
 | 	int AddIcon(HICON hIcon) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return ImageList_AddIcon(m_hImageList, hIcon); | 
 | 	} | 
 |  | 
 | 	int ReplaceIcon(int nImage, HICON hIcon) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return ImageList_ReplaceIcon(m_hImageList, nImage, hIcon); | 
 | 	} | 
 |  | 
 | 	HICON ExtractIcon(int nImage) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return ImageList_ExtractIcon(NULL, m_hImageList, nImage); | 
 | 	} | 
 |  | 
 | 	BOOL Draw(HDC hDC, int nImage, int x, int y, UINT nStyle) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		ATLASSERT(hDC != NULL); | 
 | 		return ImageList_Draw(m_hImageList, nImage, hDC, x, y, nStyle); | 
 | 	} | 
 |  | 
 | 	BOOL Draw(HDC hDC, int nImage, POINT pt, UINT nStyle) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		ATLASSERT(hDC != NULL); | 
 | 		return ImageList_Draw(m_hImageList, nImage, hDC, pt.x, pt.y, nStyle); | 
 | 	} | 
 |  | 
 | 	BOOL DrawEx(int nImage, HDC hDC, int x, int y, int dx, int dy, COLORREF rgbBk, COLORREF rgbFg, UINT fStyle) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		ATLASSERT(hDC != NULL); | 
 | 		return ImageList_DrawEx(m_hImageList, nImage, hDC, x, y, dx, dy, rgbBk, rgbFg, fStyle); | 
 | 	} | 
 |  | 
 | 	BOOL DrawEx(int nImage, HDC hDC, RECT& rect, COLORREF rgbBk, COLORREF rgbFg, UINT fStyle) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		ATLASSERT(hDC != NULL); | 
 | 		return ImageList_DrawEx(m_hImageList, nImage, hDC, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, rgbBk, rgbFg, fStyle); | 
 | 	} | 
 |  | 
 | 	static BOOL DrawIndirect(IMAGELISTDRAWPARAMS* pimldp) | 
 | 	{ | 
 | 		return ImageList_DrawIndirect(pimldp); | 
 | 	} | 
 |  | 
 | 	BOOL Copy(int nSrc, int nDst, UINT uFlags = ILCF_MOVE) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return ImageList_Copy(m_hImageList, nDst, m_hImageList, nSrc, uFlags); | 
 | 	} | 
 |  | 
 | #ifdef __IStream_INTERFACE_DEFINED__ | 
 | #ifndef _WIN32_WCE | 
 | 	static HIMAGELIST Read(LPSTREAM lpStream) | 
 | 	{ | 
 | 		return ImageList_Read(lpStream); | 
 | 	} | 
 |  | 
 | 	BOOL Write(LPSTREAM lpStream) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return ImageList_Write(m_hImageList, lpStream); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0501) | 
 | 	static HRESULT ReadEx(DWORD dwFlags, LPSTREAM lpStream, REFIID riid, PVOID* ppv) | 
 | 	{ | 
 | 		return ImageList_ReadEx(dwFlags, lpStream, riid, ppv); | 
 | 	} | 
 |  | 
 | 	HRESULT WriteEx(DWORD dwFlags, LPSTREAM lpStream) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return ImageList_WriteEx(m_hImageList, dwFlags, lpStream); | 
 | 	} | 
 | #endif // (_WIN32_WINNT >= 0x0501) | 
 | #endif // __IStream_INTERFACE_DEFINED__ | 
 |  | 
 | 	// Drag operations | 
 | 	BOOL BeginDrag(int nImage, POINT ptHotSpot) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return ImageList_BeginDrag(m_hImageList, nImage, ptHotSpot.x, ptHotSpot.y); | 
 | 	} | 
 |  | 
 | 	BOOL BeginDrag(int nImage, int xHotSpot, int yHotSpot) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return ImageList_BeginDrag(m_hImageList, nImage, xHotSpot, yHotSpot); | 
 | 	} | 
 |  | 
 | 	static void EndDrag() | 
 | 	{ | 
 | 		ImageList_EndDrag(); | 
 | 	} | 
 |  | 
 | 	static BOOL DragMove(POINT pt) | 
 | 	{ | 
 | 		return ImageList_DragMove(pt.x, pt.y); | 
 | 	} | 
 |  | 
 | 	static BOOL DragMove(int x, int y) | 
 | 	{ | 
 | 		return ImageList_DragMove(x, y); | 
 | 	} | 
 |  | 
 | 	BOOL SetDragCursorImage(int nDrag, POINT ptHotSpot) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return ImageList_SetDragCursorImage(m_hImageList, nDrag, ptHotSpot.x, ptHotSpot.y); | 
 | 	} | 
 |  | 
 | 	BOOL SetDragCursorImage(int nDrag, int xHotSpot, int yHotSpot) | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return ImageList_SetDragCursorImage(m_hImageList, nDrag, xHotSpot, yHotSpot); | 
 | 	} | 
 |  | 
 | 	static BOOL DragShowNolock(BOOL bShow = TRUE) | 
 | 	{ | 
 | 		return ImageList_DragShowNolock(bShow); | 
 | 	} | 
 |  | 
 | 	static CImageList GetDragImage(LPPOINT lpPoint, LPPOINT lpPointHotSpot) | 
 | 	{ | 
 | 		return CImageList(ImageList_GetDragImage(lpPoint, lpPointHotSpot)); | 
 | 	} | 
 |  | 
 | 	static BOOL DragEnter(HWND hWnd, POINT point) | 
 | 	{ | 
 | 		return ImageList_DragEnter(hWnd, point.x, point.y); | 
 | 	} | 
 |  | 
 | 	static BOOL DragEnter(HWND hWnd, int x, int y) | 
 | 	{ | 
 | 		return ImageList_DragEnter(hWnd, x, y); | 
 | 	} | 
 |  | 
 | 	static BOOL DragLeave(HWND hWnd) | 
 | 	{ | 
 | 		return ImageList_DragLeave(hWnd); | 
 | 	} | 
 |  | 
 | #if (_WIN32_IE >= 0x0400) | 
 | 	CImageList Duplicate() const | 
 | 	{ | 
 | 		ATLASSERT(m_hImageList != NULL); | 
 | 		return CImageList(ImageList_Duplicate(m_hImageList)); | 
 | 	} | 
 |  | 
 | 	static CImageList Duplicate(HIMAGELIST hImageList) | 
 | 	{ | 
 | 		ATLASSERT(hImageList != NULL); | 
 | 		return CImageList(ImageList_Duplicate(hImageList)); | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0400) | 
 | }; | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CToolTipCtrl | 
 |  | 
 | #ifndef _WIN32_WCE | 
 |  | 
 | class CToolInfo : public TOOLINFO | 
 | { | 
 | public: | 
 | 	CToolInfo(UINT nFlags, HWND hWnd, UINT nIDTool = 0, LPRECT lpRect = NULL, LPTSTR lpstrText = LPSTR_TEXTCALLBACK, LPARAM lUserParam = NULL) | 
 | 	{ | 
 | 		Init(nFlags, hWnd, nIDTool, lpRect, lpstrText, lUserParam); | 
 | 	} | 
 |  | 
 | 	operator LPTOOLINFO() { return this; } | 
 |  | 
 | 	operator LPARAM() { return (LPARAM)this; } | 
 |  | 
 | 	void Init(UINT nFlags, HWND hWnd, UINT nIDTool = 0, LPRECT lpRect = NULL, LPTSTR lpstrText = LPSTR_TEXTCALLBACK, LPARAM lUserParam = NULL) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(hWnd)); | 
 | 		memset(this, 0, sizeof(TOOLINFO)); | 
 | 		cbSize = sizeof(TOOLINFO); | 
 | 		uFlags = nFlags; | 
 | 		if(nIDTool == 0) | 
 | 		{ | 
 | 			hwnd = ::GetParent(hWnd); | 
 | 			uFlags |= TTF_IDISHWND; | 
 | 			uId = (UINT_PTR)hWnd; | 
 | 		} | 
 | 		else | 
 | 		{ | 
 | 			hwnd = hWnd; | 
 | 			uId = nIDTool; | 
 | 		} | 
 | 		if(lpRect != NULL) | 
 | 			rect = *lpRect; | 
 | 		hinst = ModuleHelper::GetResourceInstance(); | 
 | 		lpszText = lpstrText; | 
 | 		lParam = lUserParam; | 
 | 	} | 
 | }; | 
 |  | 
 | template <class TBase> | 
 | class CToolTipCtrlT : public TBase | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CToolTipCtrlT(HWND hWnd = NULL) : TBase(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CToolTipCtrlT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	static LPCTSTR GetWndClassName() | 
 | 	{ | 
 | 		return TOOLTIPS_CLASS; | 
 | 	} | 
 |  | 
 | 	void GetText(LPTOOLINFO lpToolInfo) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TTM_GETTEXT, 0, (LPARAM)&lpToolInfo); | 
 | 	} | 
 |  | 
 | 	void GetText(LPTSTR lpstrText, HWND hWnd, UINT nIDTool = 0) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(hWnd != NULL); | 
 | 		CToolInfo ti(0, hWnd, nIDTool, NULL, lpstrText); | 
 | 		::SendMessage(m_hWnd, TTM_GETTEXT, 0, ti); | 
 | 	} | 
 |  | 
 | 	BOOL GetToolInfo(LPTOOLINFO lpToolInfo) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TTM_GETTOOLINFO, 0, (LPARAM)lpToolInfo); | 
 | 	} | 
 |  | 
 | 	BOOL GetToolInfo(HWND hWnd, UINT nIDTool, UINT* puFlags, LPRECT lpRect, LPTSTR lpstrText) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(hWnd != NULL); | 
 | 		ATLASSERT(puFlags != NULL); | 
 | 		ATLASSERT(lpRect != NULL); | 
 | 		CToolInfo ti(0, hWnd, nIDTool, NULL, lpstrText); | 
 | 		BOOL bRet = (BOOL)::SendMessage(m_hWnd, TTM_GETTOOLINFO, 0, ti); | 
 | 		if(bRet != FALSE) | 
 | 		{ | 
 | 			*puFlags = ti.uFlags; | 
 | 			*lpRect = ti.rect; | 
 | 		} | 
 | 		return bRet; | 
 | 	} | 
 |  | 
 | 	void SetToolInfo(LPTOOLINFO lpToolInfo) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TTM_SETTOOLINFO, 0, (LPARAM)lpToolInfo); | 
 | 	} | 
 |  | 
 | 	void SetToolRect(LPTOOLINFO lpToolInfo) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TTM_NEWTOOLRECT, 0, (LPARAM)lpToolInfo); | 
 | 	} | 
 |  | 
 | 	void SetToolRect(HWND hWnd, UINT nIDTool, LPCRECT lpRect) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(hWnd != NULL); | 
 | 		ATLASSERT(nIDTool != 0); | 
 |  | 
 | 		CToolInfo ti(0, hWnd, nIDTool, (LPRECT)lpRect, NULL); | 
 | 		::SendMessage(m_hWnd, TTM_NEWTOOLRECT, 0, ti); | 
 | 	} | 
 |  | 
 | 	int GetToolCount() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TTM_GETTOOLCOUNT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int GetDelayTime(DWORD dwType) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TTM_GETDELAYTIME, dwType, 0L); | 
 | 	} | 
 |  | 
 | 	void SetDelayTime(DWORD dwType, int nTime) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TTM_SETDELAYTIME, dwType, MAKELPARAM(nTime, 0)); | 
 | 	} | 
 |  | 
 | 	void GetMargin(LPRECT lpRect) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TTM_GETMARGIN, 0, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	void SetMargin(LPRECT lpRect) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TTM_SETMARGIN, 0, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	int GetMaxTipWidth() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TTM_GETMAXTIPWIDTH, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int SetMaxTipWidth(int nWidth) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TTM_SETMAXTIPWIDTH, 0, nWidth); | 
 | 	} | 
 |  | 
 | 	COLORREF GetTipBkColor() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, TTM_GETTIPBKCOLOR, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetTipBkColor(COLORREF clr) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TTM_SETTIPBKCOLOR, (WPARAM)clr, 0L); | 
 | 	} | 
 |  | 
 | 	COLORREF GetTipTextColor() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, TTM_GETTIPTEXTCOLOR, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetTipTextColor(COLORREF clr) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TTM_SETTIPTEXTCOLOR, (WPARAM)clr, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL GetCurrentTool(LPTOOLINFO lpToolInfo) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TTM_GETCURRENTTOOL, 0, (LPARAM)lpToolInfo); | 
 | 	} | 
 |  | 
 | #if (_WIN32_IE >= 0x0500) | 
 | 	SIZE GetBubbleSize(LPTOOLINFO lpToolInfo) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, TTM_GETBUBBLESIZE, 0, (LPARAM)lpToolInfo); | 
 | 		SIZE size = { GET_X_LPARAM(dwRet), GET_Y_LPARAM(dwRet) }; | 
 | 		return size; | 
 | 	} | 
 |  | 
 | 	BOOL SetTitle(UINT uIcon, LPCTSTR lpstrTitle) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TTM_SETTITLE, uIcon, (LPARAM)lpstrTitle); | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0500) | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0501) | 
 | 	void GetTitle(PTTGETTITLE pTTGetTitle) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TTM_GETTITLE, 0, (LPARAM)pTTGetTitle); | 
 | 	} | 
 |  | 
 | 	void SetWindowTheme(LPCWSTR lpstrTheme) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TTM_SETWINDOWTHEME, 0, (LPARAM)lpstrTheme); | 
 | 	} | 
 | #endif // (_WIN32_WINNT >= 0x0501) | 
 |  | 
 | // Operations | 
 | 	void Activate(BOOL bActivate) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TTM_ACTIVATE, bActivate, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL AddTool(LPTOOLINFO lpToolInfo) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TTM_ADDTOOL, 0, (LPARAM)lpToolInfo); | 
 | 	} | 
 |  | 
 | 	BOOL AddTool(HWND hWnd, ATL::_U_STRINGorID text = LPSTR_TEXTCALLBACK, LPCRECT lpRectTool = NULL, UINT nIDTool = 0) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(hWnd != NULL); | 
 | 		// the toolrect and toolid must both be zero or both valid | 
 | 		ATLASSERT((lpRectTool != NULL && nIDTool != 0) || (lpRectTool == NULL && nIDTool == 0)); | 
 |  | 
 | 		CToolInfo ti(0, hWnd, nIDTool, (LPRECT)lpRectTool, (LPTSTR)text.m_lpstr); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TTM_ADDTOOL, 0, ti); | 
 | 	} | 
 |  | 
 | 	void DelTool(LPTOOLINFO lpToolInfo) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TTM_DELTOOL, 0, (LPARAM)lpToolInfo); | 
 | 	} | 
 |  | 
 | 	void DelTool(HWND hWnd, UINT nIDTool = 0) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(hWnd != NULL); | 
 |  | 
 | 		CToolInfo ti(0, hWnd, nIDTool, NULL, NULL); | 
 | 		::SendMessage(m_hWnd, TTM_DELTOOL, 0, ti); | 
 | 	} | 
 |  | 
 | 	BOOL HitTest(LPTTHITTESTINFO lpHitTestInfo) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TTM_HITTEST, 0, (LPARAM)lpHitTestInfo); | 
 | 	} | 
 |  | 
 | 	BOOL HitTest(HWND hWnd, POINT pt, LPTOOLINFO lpToolInfo) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(hWnd != NULL); | 
 | 		ATLASSERT(lpToolInfo != NULL); | 
 |  | 
 | 		TTHITTESTINFO hti = { 0 }; | 
 | 		hti.ti.cbSize = sizeof(TOOLINFO); | 
 | 		hti.hwnd = hWnd; | 
 | 		hti.pt.x = pt.x; | 
 | 		hti.pt.y = pt.y; | 
 | 		if((BOOL)::SendMessage(m_hWnd, TTM_HITTEST, 0, (LPARAM)&hti) != FALSE) | 
 | 		{ | 
 | 			*lpToolInfo = hti.ti; | 
 | 			return TRUE; | 
 | 		} | 
 | 		return FALSE; | 
 | 	} | 
 |  | 
 | 	void RelayEvent(LPMSG lpMsg) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TTM_RELAYEVENT, 0, (LPARAM)lpMsg); | 
 | 	} | 
 |  | 
 | 	void UpdateTipText(LPTOOLINFO lpToolInfo) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TTM_UPDATETIPTEXT, 0, (LPARAM)lpToolInfo); | 
 | 	} | 
 |  | 
 | 	void UpdateTipText(ATL::_U_STRINGorID text, HWND hWnd, UINT nIDTool = 0) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(hWnd != NULL); | 
 |  | 
 | 		CToolInfo ti(0, hWnd, nIDTool, NULL, (LPTSTR)text.m_lpstr); | 
 | 		::SendMessage(m_hWnd, TTM_UPDATETIPTEXT, 0, ti); | 
 | 	} | 
 |  | 
 | 	BOOL EnumTools(UINT nTool, LPTOOLINFO lpToolInfo) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TTM_ENUMTOOLS, nTool, (LPARAM)lpToolInfo); | 
 | 	} | 
 |  | 
 | 	void Pop() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TTM_POP, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void TrackActivate(LPTOOLINFO lpToolInfo, BOOL bActivate) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TTM_TRACKACTIVATE, bActivate, (LPARAM)lpToolInfo); | 
 | 	} | 
 |  | 
 | 	void TrackPosition(int xPos, int yPos) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TTM_TRACKPOSITION, 0, MAKELPARAM(xPos, yPos)); | 
 | 	} | 
 |  | 
 | #if (_WIN32_IE >= 0x0400) | 
 | 	void Update() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TTM_UPDATE, 0, 0L); | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0400) | 
 |  | 
 | #if (_WIN32_IE >= 0x0500) | 
 | 	BOOL AdjustRect(LPRECT lpRect, BOOL bLarger /*= TRUE*/) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TTM_ADJUSTRECT, bLarger, (LPARAM)lpRect); | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0500) | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0501) | 
 | 	void Popup() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TTM_POPUP, 0, 0L); | 
 | 	} | 
 | #endif // (_WIN32_WINNT >= 0x0501) | 
 | }; | 
 |  | 
 | typedef CToolTipCtrlT<ATL::CWindow>   CToolTipCtrl; | 
 |  | 
 | #endif // !_WIN32_WCE | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CHeaderCtrl | 
 |  | 
 | template <class TBase> | 
 | class CHeaderCtrlT : public TBase | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CHeaderCtrlT(HWND hWnd = NULL) : TBase(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CHeaderCtrlT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	static LPCTSTR GetWndClassName() | 
 | 	{ | 
 | 		return WC_HEADER; | 
 | 	} | 
 |  | 
 | 	int GetItemCount() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, HDM_GETITEMCOUNT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL GetItem(int nIndex, LPHDITEM pHeaderItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, HDM_GETITEM, nIndex, (LPARAM)pHeaderItem); | 
 | 	} | 
 |  | 
 | 	BOOL SetItem(int nIndex, LPHDITEM pHeaderItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, HDM_SETITEM, nIndex, (LPARAM)pHeaderItem); | 
 | 	} | 
 |  | 
 | 	CImageList GetImageList() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, HDM_GETIMAGELIST, 0, 0L)); | 
 | 	} | 
 |  | 
 | 	CImageList SetImageList(HIMAGELIST hImageList) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, HDM_SETIMAGELIST, 0, (LPARAM)hImageList)); | 
 | 	} | 
 |  | 
 | 	BOOL GetOrderArray(int nSize, int* lpnArray) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, HDM_GETORDERARRAY, nSize, (LPARAM)lpnArray); | 
 | 	} | 
 |  | 
 | 	BOOL SetOrderArray(int nSize, int* lpnArray) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, HDM_SETORDERARRAY, nSize, (LPARAM)lpnArray); | 
 | 	} | 
 |  | 
 | 	BOOL GetItemRect(int nIndex, LPRECT lpItemRect) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, HDM_GETITEMRECT, nIndex, (LPARAM)lpItemRect); | 
 | 	} | 
 |  | 
 | 	int SetHotDivider(BOOL bPos, DWORD dwInputValue) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, HDM_SETHOTDIVIDER, bPos, dwInputValue); | 
 | 	} | 
 |  | 
 | #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) | 
 | 	BOOL GetUnicodeFormat() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, HDM_GETUNICODEFORMAT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, HDM_SETUNICODEFORMAT, bUnicode, 0L); | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) | 
 |  | 
 | #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) | 
 | 	int GetBitmapMargin() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, HDM_GETBITMAPMARGIN, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int SetBitmapMargin(int nWidth) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, HDM_SETBITMAPMARGIN, nWidth, 0L); | 
 | 	} | 
 |  | 
 | 	int SetFilterChangeTimeout(DWORD dwTimeOut) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, HDM_SETFILTERCHANGETIMEOUT, 0, dwTimeOut); | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0600) | 
 | 	BOOL GetItemDropDownRect(int nIndex, LPRECT lpRect) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, HDM_GETITEMDROPDOWNRECT, nIndex, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	BOOL GetOverflowRect(LPRECT lpRect) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, HDM_GETOVERFLOWRECT, 0, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	int GetFocusedItem() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, HDM_GETFOCUSEDITEM, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetFocusedItem(int nIndex) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, HDM_SETFOCUSEDITEM, 0, nIndex); | 
 | 	} | 
 | #endif // (_WIN32_WINNT >= 0x0600) | 
 |  | 
 | // Operations | 
 | 	int InsertItem(int nIndex, LPHDITEM phdi) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, HDM_INSERTITEM, nIndex, (LPARAM)phdi); | 
 | 	} | 
 |  | 
 | 	int AddItem(LPHDITEM phdi) | 
 | 	{ | 
 | 		return InsertItem(GetItemCount(), phdi); | 
 | 	} | 
 |  | 
 | 	BOOL DeleteItem(int nIndex) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, HDM_DELETEITEM, nIndex, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL Layout(HD_LAYOUT* pHeaderLayout) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, HDM_LAYOUT, 0, (LPARAM)pHeaderLayout); | 
 | 	} | 
 |  | 
 | 	int HitTest(LPHDHITTESTINFO lpHitTestInfo) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, HDM_HITTEST, 0, (LPARAM)lpHitTestInfo); | 
 | 	} | 
 |  | 
 | 	int OrderToIndex(int nOrder) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, HDM_ORDERTOINDEX, nOrder, 0L); | 
 | 	} | 
 |  | 
 | 	CImageList CreateDragImage(int nIndex) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, HDM_CREATEDRAGIMAGE, nIndex, 0L)); | 
 | 	} | 
 |  | 
 | #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) | 
 | 	int EditFilter(int nColumn, BOOL bDiscardChanges) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, HDM_EDITFILTER, nColumn, MAKELPARAM(bDiscardChanges, 0)); | 
 | 	} | 
 |  | 
 | 	int ClearFilter(int nColumn) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, HDM_CLEARFILTER, nColumn, 0L); | 
 | 	} | 
 |  | 
 | 	int ClearAllFilters() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, HDM_CLEARFILTER, (WPARAM)-1, 0L); | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) | 
 | }; | 
 |  | 
 | typedef CHeaderCtrlT<ATL::CWindow>   CHeaderCtrl; | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CListViewCtrl | 
 |  | 
 | template <class TBase> | 
 | class CListViewCtrlT : public TBase | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CListViewCtrlT(HWND hWnd = NULL) : TBase(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CListViewCtrlT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	static LPCTSTR GetWndClassName() | 
 | 	{ | 
 | 		return WC_LISTVIEW; | 
 | 	} | 
 |  | 
 | 	COLORREF GetBkColor() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, LVM_GETBKCOLOR, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetBkColor(COLORREF cr) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_SETBKCOLOR, 0, cr); | 
 | 	} | 
 |  | 
 | 	CImageList GetImageList(int nImageListType) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, LVM_GETIMAGELIST, nImageListType, 0L)); | 
 | 	} | 
 |  | 
 | 	CImageList SetImageList(HIMAGELIST hImageList, int nImageList) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd));  | 
 | 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, LVM_SETIMAGELIST, nImageList, (LPARAM)hImageList)); | 
 | 	} | 
 |  | 
 | 	int GetItemCount() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_GETITEMCOUNT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetItemCount(int nItems) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMCOUNT, nItems, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL GetItem(LPLVITEM pItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_GETITEM, 0, (LPARAM)pItem); | 
 | 	} | 
 |  | 
 | 	BOOL SetItem(const LVITEM* pItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_SETITEM, 0, (LPARAM)pItem); | 
 | 	} | 
 |  | 
 | 	BOOL SetItem(int nItem, int nSubItem, UINT nMask, LPCTSTR lpszItem, | 
 | 		int nImage, UINT nState, UINT nStateMask, LPARAM lParam) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		LVITEM lvi = { 0 }; | 
 | 		lvi.mask = nMask; | 
 | 		lvi.iItem = nItem; | 
 | 		lvi.iSubItem = nSubItem; | 
 | 		lvi.stateMask = nStateMask; | 
 | 		lvi.state = nState; | 
 | 		lvi.pszText = (LPTSTR) lpszItem; | 
 | 		lvi.iImage = nImage; | 
 | 		lvi.lParam = lParam; | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_SETITEM, 0, (LPARAM)&lvi); | 
 | 	} | 
 |  | 
 | 	UINT GetItemState(int nItem, UINT nMask) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UINT)::SendMessage(m_hWnd, LVM_GETITEMSTATE, nItem, nMask); | 
 | 	} | 
 |  | 
 | 	BOOL SetItemState(int nItem, UINT nState, UINT nStateMask) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		LVITEM lvi = { 0 }; | 
 | 		lvi.state = nState; | 
 | 		lvi.stateMask = nStateMask; | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMSTATE, nItem, (LPARAM)&lvi); | 
 | 	} | 
 |  | 
 | 	BOOL SetItemState(int nItem, LPLVITEM pItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMSTATE, nItem, (LPARAM)pItem); | 
 | 	} | 
 |  | 
 | #ifndef _ATL_NO_COM | 
 | 	BOOL GetItemText(int nItem, int nSubItem, BSTR& bstrText) const | 
 | 	{ | 
 | 		USES_CONVERSION; | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(bstrText == NULL); | 
 | 		LVITEM lvi = { 0 }; | 
 | 		lvi.iSubItem = nSubItem; | 
 |  | 
 | 		LPTSTR lpstrText = NULL; | 
 | 		int nRes = 0; | 
 | 		for(int nLen = 256; ; nLen *= 2) | 
 | 		{ | 
 | 			ATLTRY(lpstrText = new TCHAR[nLen]); | 
 | 			if(lpstrText == NULL) | 
 | 				break; | 
 | 			lpstrText[0] = NULL; | 
 | 			lvi.cchTextMax = nLen; | 
 | 			lvi.pszText = lpstrText; | 
 | 			nRes  = (int)::SendMessage(m_hWnd, LVM_GETITEMTEXT, (WPARAM)nItem, (LPARAM)&lvi); | 
 | 			if(nRes < nLen - 1) | 
 | 				break; | 
 | 			delete [] lpstrText; | 
 | 			lpstrText = NULL; | 
 | 		} | 
 |  | 
 | 		if(lpstrText != NULL) | 
 | 		{ | 
 | 			if(nRes != 0) | 
 | 				bstrText = ::SysAllocString(T2OLE(lpstrText)); | 
 | 			delete [] lpstrText; | 
 | 		} | 
 |  | 
 | 		return (bstrText != NULL) ? TRUE : FALSE; | 
 | 	} | 
 | #endif // !_ATL_NO_COM | 
 |  | 
 | #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) | 
 | 	int GetItemText(int nItem, int nSubItem, _CSTRING_NS::CString& strText) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		LVITEM lvi = { 0 }; | 
 | 		lvi.iSubItem = nSubItem; | 
 |  | 
 | 		strText.Empty(); | 
 | 		int nRes = 0; | 
 | 		for(int nLen = 256; ; nLen *= 2) | 
 | 		{ | 
 | 			lvi.cchTextMax = nLen; | 
 | 			lvi.pszText = strText.GetBufferSetLength(nLen); | 
 | 			if(lvi.pszText == NULL) | 
 | 			{ | 
 | 				nRes = 0; | 
 | 				break; | 
 | 			} | 
 | 			nRes  = (int)::SendMessage(m_hWnd, LVM_GETITEMTEXT, (WPARAM)nItem, (LPARAM)&lvi); | 
 | 			if(nRes < nLen - 1) | 
 | 				break; | 
 | 		} | 
 | 		strText.ReleaseBuffer(); | 
 | 		return nRes; | 
 | 	} | 
 | #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) | 
 |  | 
 | 	int GetItemText(int nItem, int nSubItem, LPTSTR lpszText, int nLen) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		LVITEM lvi = { 0 }; | 
 | 		lvi.iSubItem = nSubItem; | 
 | 		lvi.cchTextMax = nLen; | 
 | 		lvi.pszText = lpszText; | 
 | 		return (int)::SendMessage(m_hWnd, LVM_GETITEMTEXT, (WPARAM)nItem, (LPARAM)&lvi); | 
 | 	} | 
 |  | 
 | 	BOOL SetItemText(int nItem, int nSubItem, LPCTSTR lpszText) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return SetItem(nItem, nSubItem, LVIF_TEXT, lpszText, 0, 0, 0, 0); | 
 | 	} | 
 |  | 
 | 	DWORD_PTR GetItemData(int nItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		LVITEM lvi = { 0 }; | 
 | 		lvi.iItem = nItem; | 
 | 		lvi.mask = LVIF_PARAM; | 
 | 		BOOL bRet = (BOOL)::SendMessage(m_hWnd, LVM_GETITEM, 0, (LPARAM)&lvi); | 
 | 		return (DWORD_PTR)(bRet ? lvi.lParam : NULL); | 
 | 	} | 
 |  | 
 | 	BOOL SetItemData(int nItem, DWORD_PTR dwData) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return SetItem(nItem, 0, LVIF_PARAM, NULL, 0, 0, 0, (LPARAM)dwData); | 
 | 	} | 
 |  | 
 | 	UINT GetCallbackMask() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UINT)::SendMessage(m_hWnd, LVM_GETCALLBACKMASK, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetCallbackMask(UINT nMask) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_SETCALLBACKMASK, nMask, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL GetItemPosition(int nItem, LPPOINT lpPoint) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_GETITEMPOSITION, nItem, (LPARAM)lpPoint); | 
 | 	} | 
 |  | 
 | 	BOOL SetItemPosition(int nItem, POINT pt) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(((GetStyle() & LVS_TYPEMASK) == LVS_ICON) || ((GetStyle() & LVS_TYPEMASK) == LVS_SMALLICON)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMPOSITION32, nItem, (LPARAM)&pt); | 
 | 	} | 
 |  | 
 | 	BOOL SetItemPosition(int nItem, int x, int y) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(((GetStyle() & LVS_TYPEMASK) == LVS_ICON) || ((GetStyle() & LVS_TYPEMASK) == LVS_SMALLICON)); | 
 | 		POINT pt = { x, y }; | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMPOSITION32, nItem, (LPARAM)&pt); | 
 | 	} | 
 |  | 
 | 	int GetStringWidth(LPCTSTR lpsz) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_GETSTRINGWIDTH, 0, (LPARAM)lpsz); | 
 | 	} | 
 |  | 
 | 	CEdit GetEditControl() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CEdit((HWND)::SendMessage(m_hWnd, LVM_GETEDITCONTROL, 0, 0L)); | 
 | 	} | 
 |  | 
 | 	BOOL GetColumn(int nCol, LVCOLUMN* pColumn) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_GETCOLUMN, nCol, (LPARAM)pColumn); | 
 | 	} | 
 |  | 
 | 	BOOL SetColumn(int nCol, const LVCOLUMN* pColumn) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_SETCOLUMN, nCol, (LPARAM)pColumn); | 
 | 	} | 
 |  | 
 | 	int GetColumnWidth(int nCol) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_GETCOLUMNWIDTH, nCol, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetColumnWidth(int nCol, int cx) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_SETCOLUMNWIDTH, nCol, MAKELPARAM(cx, 0)); | 
 | 	} | 
 |  | 
 | 	BOOL GetViewRect(LPRECT lpRect) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_GETVIEWRECT, 0, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	COLORREF GetTextColor() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, LVM_GETTEXTCOLOR, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetTextColor(COLORREF cr) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_SETTEXTCOLOR, 0, cr); | 
 | 	} | 
 |  | 
 | 	COLORREF GetTextBkColor() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, LVM_GETTEXTBKCOLOR, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetTextBkColor(COLORREF cr) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_SETTEXTBKCOLOR, 0, cr); | 
 | 	} | 
 |  | 
 | 	int GetTopIndex() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_GETTOPINDEX, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int GetCountPerPage() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_GETCOUNTPERPAGE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL GetOrigin(LPPOINT lpPoint) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_GETORIGIN, 0, (LPARAM)lpPoint); | 
 | 	} | 
 |  | 
 | 	UINT GetSelectedCount() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UINT)::SendMessage(m_hWnd, LVM_GETSELECTEDCOUNT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL GetItemRect(int nItem, LPRECT lpRect, UINT nCode) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		lpRect->left = nCode; | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_GETITEMRECT, (WPARAM)nItem, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	HCURSOR GetHotCursor() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (HCURSOR)::SendMessage(m_hWnd, LVM_GETHOTCURSOR, 0, 0L); | 
 | 	} | 
 |  | 
 | 	HCURSOR SetHotCursor(HCURSOR hHotCursor) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (HCURSOR)::SendMessage(m_hWnd, LVM_SETHOTCURSOR, 0, (LPARAM)hHotCursor); | 
 | 	} | 
 |  | 
 | 	int GetHotItem() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_GETHOTITEM, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int SetHotItem(int nIndex) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_SETHOTITEM, nIndex, 0L); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 |  | 
 | 	BOOL GetColumnOrderArray(int nCount, int* lpnArray) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_GETCOLUMNORDERARRAY, nCount, (LPARAM)lpnArray); | 
 | 	} | 
 |  | 
 | 	BOOL SetColumnOrderArray(int nCount, int* lpnArray) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_SETCOLUMNORDERARRAY, nCount, (LPARAM)lpnArray); | 
 | 	} | 
 |  | 
 | 	CHeaderCtrl GetHeader() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CHeaderCtrl((HWND)::SendMessage(m_hWnd, LVM_GETHEADER, 0, 0L)); | 
 | 	} | 
 |  | 
 | 	BOOL GetSubItemRect(int nItem, int nSubItem, int nFlag, LPRECT lpRect) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & LVS_TYPEMASK) == LVS_REPORT); | 
 | 		ATLASSERT(lpRect != NULL); | 
 | 		lpRect->top = nSubItem; | 
 | 		lpRect->left = nFlag; | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_GETSUBITEMRECT, nItem, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	DWORD SetIconSpacing(int cx, int cy) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & LVS_TYPEMASK) == LVS_ICON); | 
 | 		return (DWORD)::SendMessage(m_hWnd, LVM_SETICONSPACING, 0, MAKELPARAM(cx, cy)); | 
 | 	} | 
 |  | 
 | 	int GetISearchString(LPTSTR lpstr) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_GETISEARCHSTRING, 0, (LPARAM)lpstr); | 
 | 	} | 
 |  | 
 | 	void GetItemSpacing(SIZE& sizeSpacing, BOOL bSmallIconView = FALSE) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, LVM_GETITEMSPACING, bSmallIconView, 0L); | 
 | 		sizeSpacing.cx = GET_X_LPARAM(dwRet); | 
 | 		sizeSpacing.cy = GET_Y_LPARAM(dwRet); | 
 | 	} | 
 |  | 
 | #if (_WIN32_WCE >= 410) | 
 | 	void SetItemSpacing(INT cySpacing) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ListView_SetItemSpacing(m_hWnd, cySpacing); | 
 | 	} | 
 | #endif // (_WIN32_WCE >= 410) | 
 |  | 
 | 	// single-selection only | 
 | 	int GetSelectedIndex() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & LVS_SINGLESEL) != 0); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_GETNEXTITEM, (WPARAM)-1, MAKELPARAM(LVNI_ALL | LVNI_SELECTED, 0)); | 
 | 	} | 
 |  | 
 | 	BOOL GetSelectedItem(LPLVITEM pItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & LVS_SINGLESEL) != 0); | 
 | 		ATLASSERT(pItem != NULL); | 
 | 		pItem->iItem = (int)::SendMessage(m_hWnd, LVM_GETNEXTITEM, (WPARAM)-1, MAKELPARAM(LVNI_ALL | LVNI_SELECTED, 0)); | 
 | 		if(pItem->iItem == -1) | 
 | 			return FALSE; | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_GETITEM, 0, (LPARAM)pItem); | 
 | 	} | 
 |  | 
 | 	// extended list view styles | 
 | 	DWORD GetExtendedListViewStyle() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	// dwExMask = 0 means all styles | 
 | 	DWORD SetExtendedListViewStyle(DWORD dwExStyle, DWORD dwExMask = 0) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE, dwExMask, dwExStyle); | 
 | 	} | 
 |  | 
 | 	// checkboxes only | 
 | 	BOOL GetCheckState(int nIndex) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetExtendedListViewStyle() & LVS_EX_CHECKBOXES) != 0); | 
 | 		UINT uRet = GetItemState(nIndex, LVIS_STATEIMAGEMASK); | 
 | 		return (uRet >> 12) - 1; | 
 | 	} | 
 |  | 
 | 	BOOL SetCheckState(int nItem, BOOL bCheck) | 
 | 	{ | 
 | 		int nCheck = bCheck ? 2 : 1;   // one based index | 
 | 		return SetItemState(nItem, INDEXTOSTATEIMAGEMASK(nCheck), LVIS_STATEIMAGEMASK); | 
 | 	} | 
 |  | 
 | 	// view type | 
 | 	DWORD GetViewType() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (GetStyle() & LVS_TYPEMASK); | 
 | 	} | 
 |  | 
 | 	DWORD SetViewType(DWORD dwType) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(dwType == LVS_ICON || dwType == LVS_SMALLICON || dwType == LVS_LIST || dwType == LVS_REPORT); | 
 | 		DWORD dwOldType = GetViewType(); | 
 | 		if(dwType != dwOldType) | 
 | 			ModifyStyle(LVS_TYPEMASK, (dwType & LVS_TYPEMASK)); | 
 | 		return dwOldType; | 
 | 	} | 
 |  | 
 | #if (_WIN32_IE >= 0x0400) | 
 | #ifndef _WIN32_WCE | 
 | 	BOOL GetBkImage(LPLVBKIMAGE plvbki) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_GETBKIMAGE, 0, (LPARAM)plvbki); | 
 | 	} | 
 |  | 
 | 	BOOL SetBkImage(LPLVBKIMAGE plvbki) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_SETBKIMAGE, 0, (LPARAM)plvbki); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 |  | 
 | 	int GetSelectionMark() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_GETSELECTIONMARK, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int SetSelectionMark(int nIndex) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_SETSELECTIONMARK, 0, nIndex); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	BOOL GetWorkAreas(int nWorkAreas, LPRECT lpRect) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_GETWORKAREAS, nWorkAreas, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	BOOL SetWorkAreas(int nWorkAreas, LPRECT lpRect) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_SETWORKAREAS, nWorkAreas, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	DWORD GetHoverTime() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetExtendedListViewStyle() & (LVS_EX_TRACKSELECT | LVS_EX_ONECLICKACTIVATE | LVS_EX_TWOCLICKACTIVATE)) != 0); | 
 | 		return (DWORD)::SendMessage(m_hWnd, LVM_GETHOVERTIME, 0, 0L); | 
 | 	} | 
 |  | 
 | 	DWORD SetHoverTime(DWORD dwHoverTime) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetExtendedListViewStyle() & (LVS_EX_TRACKSELECT | LVS_EX_ONECLICKACTIVATE | LVS_EX_TWOCLICKACTIVATE)) != 0); | 
 | 		return (DWORD)::SendMessage(m_hWnd, LVM_SETHOVERTIME, 0, dwHoverTime); | 
 | 	} | 
 |  | 
 | 	BOOL GetNumberOfWorkAreas(int* pnWorkAreas) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_GETNUMBEROFWORKAREAS, 0, (LPARAM)pnWorkAreas); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 |  | 
 | 	BOOL SetItemCountEx(int nItems, DWORD dwFlags) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(((GetStyle() & LVS_OWNERDATA) != 0) && (((GetStyle() & LVS_TYPEMASK) == LVS_REPORT) || ((GetStyle() & LVS_TYPEMASK) == LVS_LIST))); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMCOUNT, nItems, dwFlags); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	CToolTipCtrl GetToolTips() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CToolTipCtrl((HWND)::SendMessage(m_hWnd, LVM_GETTOOLTIPS, 0, 0L)); | 
 | 	} | 
 |  | 
 | 	CToolTipCtrl SetToolTips(HWND hWndTT) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CToolTipCtrl((HWND)::SendMessage(m_hWnd, LVM_SETTOOLTIPS, (WPARAM)hWndTT, 0L)); | 
 | 	} | 
 |  | 
 | 	BOOL GetUnicodeFormat() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_GETUNICODEFORMAT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_SETUNICODEFORMAT, bUnicode, 0L); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 | #endif // (_WIN32_IE >= 0x0400) | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0501) | 
 | 	int GetSelectedColumn() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_GETSELECTEDCOLUMN, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetSelectedColumn(int nColumn) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, LVM_SETSELECTEDCOLUMN, nColumn, 0L); | 
 | 	} | 
 |  | 
 | 	DWORD GetView() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, LVM_GETVIEW, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int SetView(DWORD dwView) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_SETVIEW, dwView, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL IsGroupViewEnabled() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_ISGROUPVIEWENABLED, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int GetGroupInfo(int nGroupID, PLVGROUP pGroup) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_GETGROUPINFO, nGroupID, (LPARAM)pGroup); | 
 | 	} | 
 |  | 
 | 	int SetGroupInfo(int nGroupID, PLVGROUP pGroup) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_SETGROUPINFO, nGroupID, (LPARAM)pGroup); | 
 | 	} | 
 |  | 
 | 	void GetGroupMetrics(PLVGROUPMETRICS pGroupMetrics) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, LVM_GETGROUPMETRICS, 0, (LPARAM)pGroupMetrics); | 
 | 	} | 
 |  | 
 | 	void SetGroupMetrics(PLVGROUPMETRICS pGroupMetrics) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, LVM_SETGROUPMETRICS, 0, (LPARAM)pGroupMetrics); | 
 | 	} | 
 |  | 
 | 	void GetTileViewInfo(PLVTILEVIEWINFO pTileViewInfo) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, LVM_GETTILEVIEWINFO, 0, (LPARAM)pTileViewInfo); | 
 | 	} | 
 |  | 
 | 	BOOL SetTileViewInfo(PLVTILEVIEWINFO pTileViewInfo) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_SETTILEVIEWINFO, 0, (LPARAM)pTileViewInfo); | 
 | 	} | 
 |  | 
 | 	void GetTileInfo(PLVTILEINFO pTileInfo) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, LVM_GETTILEINFO, 0, (LPARAM)pTileInfo); | 
 | 	} | 
 |  | 
 | 	BOOL SetTileInfo(PLVTILEINFO pTileInfo) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_SETTILEINFO, 0, (LPARAM)pTileInfo); | 
 | 	} | 
 |  | 
 | 	BOOL GetInsertMark(LPLVINSERTMARK pInsertMark) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_GETINSERTMARK, 0, (LPARAM)pInsertMark); | 
 | 	} | 
 |  | 
 | 	BOOL SetInsertMark(LPLVINSERTMARK pInsertMark) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_SETINSERTMARK, 0, (LPARAM)pInsertMark); | 
 | 	} | 
 |  | 
 | 	int GetInsertMarkRect(LPRECT lpRect) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_GETINSERTMARKRECT, 0, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	COLORREF GetInsertMarkColor() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, LVM_GETINSERTMARKCOLOR, 0, 0L); | 
 | 	} | 
 |  | 
 | 	COLORREF SetInsertMarkColor(COLORREF clr) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, LVM_SETINSERTMARKCOLOR, 0, clr); | 
 | 	} | 
 |  | 
 | 	COLORREF GetOutlineColor() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, LVM_GETOUTLINECOLOR, 0, 0L); | 
 | 	} | 
 |  | 
 | 	COLORREF SetOutlineColor(COLORREF clr) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, LVM_SETOUTLINECOLOR, 0, clr); | 
 | 	} | 
 | #endif // (_WIN32_WINNT >= 0x0501) | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0600) | 
 | 	int GetGroupCount() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_GETGROUPCOUNT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL GetGroupInfoByIndex(int nIndex, PLVGROUP pGroup) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_GETGROUPINFOBYINDEX, nIndex, (LPARAM)pGroup); | 
 | 	} | 
 |  | 
 | 	BOOL GetGroupRect(int nGroupID, int nType, LPRECT lpRect) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(lpRect != NULL); | 
 | 		if(lpRect != NULL) | 
 | 			lpRect->top = nType; | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_GETGROUPRECT, nGroupID, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	UINT GetGroupState(int nGroupID, UINT uMask) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UINT)::SendMessage(m_hWnd, LVM_GETGROUPSTATE, nGroupID, (LPARAM)uMask); | 
 | 	} | 
 |  | 
 | 	int GetFocusedGroup() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_GETFOCUSEDGROUP, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL GetEmptyText(LPWSTR lpstrText, int cchText) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_GETEMPTYTEXT, cchText, (LPARAM)lpstrText); | 
 | 	} | 
 |  | 
 | 	BOOL GetFooterRect(LPRECT lpRect) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_GETFOOTERRECT, 0, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	BOOL GetFooterInfo(LPLVFOOTERINFO lpFooterInfo) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_GETFOOTERINFO, 0, (LPARAM)lpFooterInfo); | 
 | 	} | 
 |  | 
 | 	BOOL GetFooterItemRect(int nItem, LPRECT lpRect) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_GETFOOTERITEMRECT, nItem, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	BOOL GetFooterItem(int nItem, LPLVFOOTERITEM lpFooterItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_GETFOOTERITEM, nItem, (LPARAM)lpFooterItem); | 
 | 	} | 
 |  | 
 | 	BOOL GetItemIndexRect(PLVITEMINDEX pItemIndex, int nSubItem, int nType, LPRECT lpRect) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(pItemIndex != NULL); | 
 | 		ATLASSERT(lpRect != NULL); | 
 | 		if(lpRect != NULL) | 
 | 		{ | 
 | 			lpRect->top = nSubItem; | 
 | 			lpRect->left = nType; | 
 | 		} | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_GETITEMINDEXRECT, (WPARAM)pItemIndex, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	BOOL SetItemIndexState(PLVITEMINDEX pItemIndex, UINT uState, UINT dwMask) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		LVITEM lvi = { 0 }; | 
 | 		lvi.state = uState; | 
 | 		lvi.stateMask = dwMask; | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMINDEXSTATE, (WPARAM)pItemIndex, (LPARAM)&lvi); | 
 | 	} | 
 |  | 
 | 	BOOL GetNextItemIndex(PLVITEMINDEX pItemIndex, WORD wFlags) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_GETNEXTITEMINDEX, (WPARAM)pItemIndex, MAKELPARAM(wFlags, 0)); | 
 | 	} | 
 | #endif // (_WIN32_WINNT >= 0x0600) | 
 |  | 
 | // Operations | 
 | 	int InsertColumn(int nCol, const LVCOLUMN* pColumn) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_INSERTCOLUMN, nCol, (LPARAM)pColumn); | 
 | 	} | 
 |  | 
 | 	int InsertColumn(int nCol, LPCTSTR lpszColumnHeading, int nFormat = LVCFMT_LEFT,  | 
 | 			int nWidth = -1, int nSubItem = -1, int iImage = -1, int iOrder = -1) | 
 | 	{ | 
 | 		LVCOLUMN column = { 0 }; | 
 | 		column.mask = LVCF_TEXT|LVCF_FMT; | 
 | 		column.pszText = (LPTSTR)lpszColumnHeading; | 
 | 		column.fmt = nFormat; | 
 | 		if (nWidth != -1) | 
 | 		{ | 
 | 			column.mask |= LVCF_WIDTH; | 
 | 			column.cx = nWidth; | 
 | 		} | 
 | 		if (nSubItem != -1) | 
 | 		{ | 
 | 			column.mask |= LVCF_SUBITEM; | 
 | 			column.iSubItem = nSubItem; | 
 | 		} | 
 | 		if (iImage != -1) | 
 | 		{ | 
 | 			column.mask |= LVCF_IMAGE; | 
 | 			column.iImage = iImage; | 
 | 		} | 
 | 		if (iOrder != -1) | 
 | 		{ | 
 | 			column.mask |= LVCF_ORDER; | 
 | 			column.iOrder = iOrder; | 
 | 		} | 
 | 		return InsertColumn(nCol, &column); | 
 | 	} | 
 |  | 
 | 	BOOL DeleteColumn(int nCol) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_DELETECOLUMN, nCol, 0L); | 
 | 	} | 
 |  | 
 | 	int InsertItem(UINT nMask, int nItem, LPCTSTR lpszItem, UINT nState, UINT nStateMask, int nImage, LPARAM lParam) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		LVITEM item = { 0 }; | 
 | 		item.mask = nMask; | 
 | 		item.iItem = nItem; | 
 | 		item.iSubItem = 0; | 
 | 		item.pszText = (LPTSTR)lpszItem; | 
 | 		item.state = nState; | 
 | 		item.stateMask = nStateMask; | 
 | 		item.iImage = nImage; | 
 | 		item.lParam = lParam; | 
 | 		return InsertItem(&item); | 
 | 	} | 
 |  | 
 | 	int InsertItem(const LVITEM* pItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_INSERTITEM, 0, (LPARAM)pItem); | 
 | 	} | 
 |  | 
 | 	int InsertItem(int nItem, LPCTSTR lpszItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return InsertItem(LVIF_TEXT, nItem, lpszItem, 0, 0, 0, 0); | 
 | 	} | 
 |  | 
 | 	int InsertItem(int nItem, LPCTSTR lpszItem, int nImage) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return InsertItem(LVIF_TEXT|LVIF_IMAGE, nItem, lpszItem, 0, 0, nImage, 0); | 
 | 	} | 
 |  | 
 | 	int GetNextItem(int nItem, int nFlags) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_GETNEXTITEM, nItem, MAKELPARAM(nFlags, 0)); | 
 | 	} | 
 |  | 
 | 	BOOL DeleteItem(int nItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_DELETEITEM, nItem, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL DeleteAllItems() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_DELETEALLITEMS, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int FindItem(LVFINDINFO* pFindInfo, int nStart) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_FINDITEM, nStart, (LPARAM)pFindInfo); | 
 | 	} | 
 |  | 
 | 	int HitTest(LVHITTESTINFO* pHitTestInfo) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_HITTEST, 0, (LPARAM)pHitTestInfo); | 
 | 	} | 
 |  | 
 | 	int HitTest(POINT pt, UINT* pFlags) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		LVHITTESTINFO hti = { 0 }; | 
 | 		hti.pt = pt; | 
 | 		int nRes = (int)::SendMessage(m_hWnd, LVM_HITTEST, 0, (LPARAM)&hti); | 
 | 		if (pFlags != NULL) | 
 | 			*pFlags = hti.flags; | 
 | 		return nRes; | 
 | 	} | 
 |  | 
 | 	BOOL EnsureVisible(int nItem, BOOL bPartialOK) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_ENSUREVISIBLE, nItem, MAKELPARAM(bPartialOK, 0)); | 
 | 	} | 
 |  | 
 | 	BOOL Scroll(SIZE size) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_SCROLL, size.cx, size.cy); | 
 | 	} | 
 |  | 
 | 	BOOL RedrawItems(int nFirst, int nLast) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_REDRAWITEMS, nFirst, nLast); | 
 | 	} | 
 |  | 
 | 	BOOL Arrange(UINT nCode) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_ARRANGE, nCode, 0L); | 
 | 	} | 
 |  | 
 | 	CEdit EditLabel(int nItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CEdit((HWND)::SendMessage(m_hWnd, LVM_EDITLABEL, nItem, 0L)); | 
 | 	} | 
 |  | 
 | 	BOOL Update(int nItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_UPDATE, nItem, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SortItems(PFNLVCOMPARE pfnCompare, LPARAM lParamSort) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_SORTITEMS, (WPARAM)lParamSort, (LPARAM)pfnCompare); | 
 | 	} | 
 |  | 
 | 	CImageList RemoveImageList(int nImageList) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, LVM_SETIMAGELIST, (WPARAM)nImageList, NULL)); | 
 | 	} | 
 |  | 
 | 	CImageList CreateDragImage(int nItem, LPPOINT lpPoint) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, LVM_CREATEDRAGIMAGE, nItem, (LPARAM)lpPoint)); | 
 | 	} | 
 |  | 
 | 	DWORD ApproximateViewRect(int cx = -1, int cy = -1, int nCount = -1) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, LVM_APPROXIMATEVIEWRECT, nCount, MAKELPARAM(cx, cy)); | 
 | 	} | 
 |  | 
 | 	int SubItemHitTest(LPLVHITTESTINFO lpInfo) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_SUBITEMHITTEST, 0, (LPARAM)lpInfo); | 
 | 	} | 
 |  | 
 | 	int AddColumn(LPCTSTR strItem, int nItem, int nSubItem = -1, | 
 | 			int nMask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM, | 
 | 			int nFmt = LVCFMT_LEFT) | 
 | 	{ | 
 | 		const int cxOffset = 15; | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		LVCOLUMN lvc = { 0 }; | 
 | 		lvc.mask = nMask; | 
 | 		lvc.fmt = nFmt; | 
 | 		lvc.pszText = (LPTSTR)strItem; | 
 | 		lvc.cx = GetStringWidth(lvc.pszText) + cxOffset; | 
 | 		if(nMask & LVCF_SUBITEM) | 
 | 			lvc.iSubItem = (nSubItem != -1) ? nSubItem : nItem; | 
 | 		return InsertColumn(nItem, &lvc); | 
 | 	} | 
 |  | 
 | 	int AddItem(int nItem, int nSubItem, LPCTSTR strItem, int nImageIndex = -1) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		LVITEM lvItem = { 0 }; | 
 | 		lvItem.mask = LVIF_TEXT; | 
 | 		lvItem.iItem = nItem; | 
 | 		lvItem.iSubItem = nSubItem; | 
 | 		lvItem.pszText = (LPTSTR)strItem; | 
 | 		if(nImageIndex != -1) | 
 | 		{ | 
 | 			lvItem.mask |= LVIF_IMAGE; | 
 | 			lvItem.iImage = nImageIndex; | 
 | 		} | 
 | 		if(nSubItem == 0) | 
 | 			return InsertItem(&lvItem); | 
 | 		return SetItem(&lvItem) ? nItem : -1; | 
 | 	} | 
 |  | 
 | #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) | 
 | 	BOOL SortItemsEx(PFNLVCOMPARE pfnCompare, LPARAM lParamSort) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_SORTITEMSEX, (WPARAM)lParamSort, (LPARAM)pfnCompare); | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0501) | 
 | 	int InsertGroup(int nItem, PLVGROUP pGroup) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_INSERTGROUP, nItem, (LPARAM)pGroup); | 
 | 	} | 
 |  | 
 | 	int AddGroup(PLVGROUP pGroup) | 
 | 	{ | 
 | 		return InsertGroup(-1, pGroup); | 
 | 	} | 
 |  | 
 | 	int RemoveGroup(int nGroupID) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_REMOVEGROUP, nGroupID, 0L); | 
 | 	} | 
 |  | 
 | 	void MoveGroup(int nGroupID, int nItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, LVM_MOVEGROUP, nGroupID, nItem); | 
 | 	} | 
 |  | 
 | 	void MoveItemToGroup(int nItem, int nGroupID) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, LVM_MOVEITEMTOGROUP, nItem, nGroupID); | 
 | 	} | 
 |  | 
 | 	int EnableGroupView(BOOL bEnable) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_ENABLEGROUPVIEW, bEnable, 0L); | 
 | 	} | 
 |  | 
 | 	int SortGroups(PFNLVGROUPCOMPARE pCompareFunc, LPVOID lpVoid = NULL) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_SORTGROUPS, (WPARAM)pCompareFunc, (LPARAM)lpVoid); | 
 | 	} | 
 |  | 
 | 	void InsertGroupSorted(PLVINSERTGROUPSORTED pInsertGroupSorted) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, LVM_INSERTGROUPSORTED, (WPARAM)pInsertGroupSorted, 0L); | 
 | 	} | 
 |  | 
 | 	void RemoveAllGroups() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, LVM_REMOVEALLGROUPS, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL HasGroup(int nGroupID) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_HASGROUP, nGroupID, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL InsertMarkHitTest(LPPOINT lpPoint, LPLVINSERTMARK pInsertMark) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_INSERTMARKHITTEST, (WPARAM)lpPoint, (LPARAM)pInsertMark); | 
 | 	} | 
 |  | 
 | 	BOOL SetInfoTip(PLVSETINFOTIP pSetInfoTip) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LVM_SETINFOTIP, 0, (LPARAM)pSetInfoTip); | 
 | 	} | 
 |  | 
 | 	void CancelEditLabel() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, LVM_CANCELEDITLABEL, 0, 0L); | 
 | 	} | 
 |  | 
 | 	UINT MapIndexToID(int nIndex) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UINT)::SendMessage(m_hWnd, LVM_MAPINDEXTOID, nIndex, 0L); | 
 | 	} | 
 |  | 
 | 	int MapIDToIndex(UINT uID) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_MAPIDTOINDEX, uID, 0L); | 
 | 	} | 
 | #endif // (_WIN32_WINNT >= 0x0501) | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0600) | 
 | 	int HitTestEx(LPLVHITTESTINFO lpHitTestInfo) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_HITTEST, (WPARAM)-1, (LPARAM)lpHitTestInfo); | 
 | 	} | 
 |  | 
 | 	int HitTestEx(POINT pt, UINT* pFlags) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		LVHITTESTINFO hti = { 0 }; | 
 | 		hti.pt = pt; | 
 | 		int nRes = (int)::SendMessage(m_hWnd, LVM_HITTEST, (WPARAM)-1, (LPARAM)&hti); | 
 | 		if (pFlags != NULL) | 
 | 			*pFlags = hti.flags; | 
 | 		return nRes; | 
 | 	} | 
 |  | 
 | 	int SubItemHitTestEx(LPLVHITTESTINFO lpHitTestInfo) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LVM_SUBITEMHITTEST, (WPARAM)-1, (LPARAM)lpHitTestInfo); | 
 | 	} | 
 | #endif // (_WIN32_WINNT >= 0x0600) | 
 |  | 
 | 	// single-selection only | 
 | 	BOOL SelectItem(int nIndex) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & LVS_SINGLESEL) != 0); | 
 |  | 
 | 		BOOL bRet = SetItemState(nIndex, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); | 
 | 		if(bRet) | 
 | 			bRet = EnsureVisible(nIndex, FALSE); | 
 | 		return bRet; | 
 | 	} | 
 | }; | 
 |  | 
 | typedef CListViewCtrlT<ATL::CWindow>   CListViewCtrl; | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CTreeViewCtrl | 
 |  | 
 | template <class TBase> | 
 | class CTreeViewCtrlT : public TBase | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CTreeViewCtrlT(HWND hWnd = NULL) : TBase(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CTreeViewCtrlT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	static LPCTSTR GetWndClassName() | 
 | 	{ | 
 | 		return WC_TREEVIEW; | 
 | 	} | 
 |  | 
 | 	UINT GetCount() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UINT)::SendMessage(m_hWnd, TVM_GETCOUNT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	UINT GetIndent() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UINT)::SendMessage(m_hWnd, TVM_GETINDENT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetIndent(UINT nIndent) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TVM_SETINDENT, nIndent, 0L); | 
 | 	} | 
 |  | 
 | 	CImageList GetImageList(int nImageListType = TVSIL_NORMAL) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TVM_GETIMAGELIST, (WPARAM)nImageListType, 0L)); | 
 | 	} | 
 |  | 
 | 	CImageList SetImageList(HIMAGELIST hImageList, int nImageListType = TVSIL_NORMAL) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TVM_SETIMAGELIST, (WPARAM)nImageListType, (LPARAM)hImageList)); | 
 | 	} | 
 |  | 
 | 	BOOL GetItem(LPTVITEM pItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)pItem); | 
 | 	} | 
 |  | 
 | 	BOOL SetItem(LPTVITEM pItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TVM_SETITEM, 0, (LPARAM)pItem); | 
 | 	} | 
 |  | 
 | 	BOOL SetItem(HTREEITEM hItem, UINT nMask, LPCTSTR lpszItem, int nImage, | 
 | 		int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		TVITEM item = { 0 }; | 
 | 		item.hItem = hItem; | 
 | 		item.mask = nMask; | 
 | 		item.pszText = (LPTSTR) lpszItem; | 
 | 		item.iImage = nImage; | 
 | 		item.iSelectedImage = nSelectedImage; | 
 | 		item.state = nState; | 
 | 		item.stateMask = nStateMask; | 
 | 		item.lParam = lParam; | 
 | 		return (BOOL)::SendMessage(m_hWnd, TVM_SETITEM, 0, (LPARAM)&item); | 
 | 	} | 
 |  | 
 | 	BOOL GetItemText(HTREEITEM hItem, LPTSTR lpstrText, int nLen) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(lpstrText != NULL); | 
 |  | 
 | 		TVITEM item = { 0 }; | 
 | 		item.hItem = hItem; | 
 | 		item.mask = TVIF_TEXT; | 
 | 		item.pszText = lpstrText; | 
 | 		item.cchTextMax = nLen; | 
 |  | 
 | 		return (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item); | 
 | 	} | 
 |  | 
 | #ifndef _ATL_NO_COM | 
 | 	BOOL GetItemText(HTREEITEM hItem, BSTR& bstrText) const | 
 | 	{ | 
 | 		USES_CONVERSION; | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(bstrText == NULL); | 
 | 		TVITEM item = { 0 }; | 
 | 		item.hItem = hItem; | 
 | 		item.mask = TVIF_TEXT; | 
 |  | 
 | 		LPTSTR lpstrText = NULL; | 
 | 		BOOL bRet = FALSE; | 
 | 		for(int nLen = 256; ; nLen *= 2) | 
 | 		{ | 
 | 			ATLTRY(lpstrText = new TCHAR[nLen]); | 
 | 			if(lpstrText == NULL) | 
 | 				break; | 
 | 			lpstrText[0] = NULL; | 
 | 			item.pszText = lpstrText; | 
 | 			item.cchTextMax = nLen; | 
 | 			bRet = (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item); | 
 | 			if(!bRet || (lstrlen(item.pszText) < nLen - 1)) | 
 | 				break; | 
 | 			delete [] lpstrText; | 
 | 			lpstrText = NULL; | 
 | 		} | 
 |  | 
 | 		if(lpstrText != NULL) | 
 | 		{ | 
 | 			if(bRet) | 
 | 				bstrText = ::SysAllocString(T2OLE(lpstrText)); | 
 | 			delete [] lpstrText; | 
 | 		} | 
 |  | 
 | 		return (bstrText != NULL) ? TRUE : FALSE; | 
 | 	} | 
 | #endif // !_ATL_NO_COM | 
 |  | 
 | #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) | 
 | 	BOOL GetItemText(HTREEITEM hItem, _CSTRING_NS::CString& strText) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		TVITEM item = { 0 }; | 
 | 		item.hItem = hItem; | 
 | 		item.mask = TVIF_TEXT; | 
 |  | 
 | 		strText.Empty(); | 
 | 		BOOL bRet = FALSE; | 
 | 		for(int nLen = 256; ; nLen *= 2) | 
 | 		{ | 
 | 			item.pszText = strText.GetBufferSetLength(nLen); | 
 | 			if(item.pszText == NULL) | 
 | 			{ | 
 | 				bRet = FALSE; | 
 | 				break; | 
 | 			} | 
 | 			item.cchTextMax = nLen; | 
 | 			bRet = (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item); | 
 | 			if(!bRet || (lstrlen(item.pszText) < nLen - 1)) | 
 | 				break; | 
 | 		} | 
 | 		strText.ReleaseBuffer(); | 
 | 		return bRet; | 
 | 	} | 
 | #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) | 
 |  | 
 | 	BOOL SetItemText(HTREEITEM hItem, LPCTSTR lpszItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return SetItem(hItem, TVIF_TEXT, lpszItem, 0, 0, 0, 0, NULL); | 
 | 	} | 
 |  | 
 | 	BOOL GetItemImage(HTREEITEM hItem, int& nImage, int& nSelectedImage) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		TVITEM item = { 0 }; | 
 | 		item.hItem = hItem; | 
 | 		item.mask = TVIF_IMAGE|TVIF_SELECTEDIMAGE; | 
 | 		BOOL bRes = (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item); | 
 | 		if (bRes) | 
 | 		{ | 
 | 			nImage = item.iImage; | 
 | 			nSelectedImage = item.iSelectedImage; | 
 | 		} | 
 | 		return bRes; | 
 | 	} | 
 |  | 
 | 	BOOL SetItemImage(HTREEITEM hItem, int nImage, int nSelectedImage) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return SetItem(hItem, TVIF_IMAGE|TVIF_SELECTEDIMAGE, NULL, nImage, nSelectedImage, 0, 0, NULL); | 
 | 	} | 
 |  | 
 | 	UINT GetItemState(HTREEITEM hItem, UINT nStateMask) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) | 
 | 		return (((UINT)::SendMessage(m_hWnd, TVM_GETITEMSTATE, (WPARAM)hItem, (LPARAM)nStateMask)) & nStateMask); | 
 | #else // !((_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)) | 
 | 		TVITEM item = { 0 }; | 
 | 		item.hItem = hItem; | 
 | 		item.mask = TVIF_STATE; | 
 | 		item.state = 0; | 
 | 		item.stateMask = nStateMask; | 
 | 		::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item); | 
 | 		return (item.state & nStateMask); | 
 | #endif // !((_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)) | 
 | 	} | 
 |  | 
 | 	BOOL SetItemState(HTREEITEM hItem, UINT nState, UINT nStateMask) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return SetItem(hItem, TVIF_STATE, NULL, 0, 0, nState, nStateMask, NULL); | 
 | 	} | 
 |  | 
 | 	DWORD_PTR GetItemData(HTREEITEM hItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		TVITEM item = { 0 }; | 
 | 		item.hItem = hItem; | 
 | 		item.mask = TVIF_PARAM; | 
 | 		BOOL bRet = (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item); | 
 | 		return (DWORD_PTR)(bRet ? item.lParam : NULL); | 
 | 	} | 
 |  | 
 | 	BOOL SetItemData(HTREEITEM hItem, DWORD_PTR dwData) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return SetItem(hItem, TVIF_PARAM, NULL, 0, 0, 0, 0, (LPARAM)dwData); | 
 | 	} | 
 |  | 
 | 	CEdit GetEditControl() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CEdit((HWND)::SendMessage(m_hWnd, TVM_GETEDITCONTROL, 0, 0L)); | 
 | 	} | 
 |  | 
 | 	UINT GetVisibleCount() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UINT)::SendMessage(m_hWnd, TVM_GETVISIBLECOUNT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL GetItemRect(HTREEITEM hItem, LPRECT lpRect, BOOL bTextOnly) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		*(HTREEITEM*)lpRect = hItem; | 
 | 		return (BOOL)::SendMessage(m_hWnd, TVM_GETITEMRECT, (WPARAM)bTextOnly, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	BOOL ItemHasChildren(HTREEITEM hItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		TVITEM item = { 0 }; | 
 | 		item.hItem = hItem; | 
 | 		item.mask = TVIF_CHILDREN; | 
 | 		::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item); | 
 | 		return item.cChildren; | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	CToolTipCtrl GetToolTips() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CToolTipCtrl((HWND)::SendMessage(m_hWnd, TVM_GETTOOLTIPS, 0, 0L)); | 
 | 	} | 
 |  | 
 | 	CToolTipCtrl SetToolTips(HWND hWndTT) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CToolTipCtrl((HWND)::SendMessage(m_hWnd, TVM_SETTOOLTIPS, (WPARAM)hWndTT, 0L)); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 |  | 
 | 	int GetISearchString(LPTSTR lpstr) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TVM_GETISEARCHSTRING, 0, (LPARAM)lpstr); | 
 | 	} | 
 |  | 
 | 	// checkboxes only | 
 | 	BOOL GetCheckState(HTREEITEM hItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & TVS_CHECKBOXES) != 0); | 
 | 		UINT uRet = GetItemState(hItem, TVIS_STATEIMAGEMASK); | 
 | 		return (uRet >> 12) - 1; | 
 | 	} | 
 |  | 
 | 	BOOL SetCheckState(HTREEITEM hItem, BOOL bCheck) | 
 | 	{ | 
 | 		int nCheck = bCheck ? 2 : 1;   // one based index | 
 | 		return SetItemState(hItem, INDEXTOSTATEIMAGEMASK(nCheck), TVIS_STATEIMAGEMASK); | 
 | 	} | 
 |  | 
 | #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) | 
 | 	COLORREF GetBkColor() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, TVM_GETBKCOLOR, 0, 0L); | 
 | 	} | 
 |  | 
 | 	COLORREF SetBkColor(COLORREF clr) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, TVM_SETBKCOLOR, 0, (LPARAM)clr); | 
 | 	} | 
 |  | 
 | 	COLORREF GetInsertMarkColor() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, TVM_GETINSERTMARKCOLOR, 0, 0L); | 
 | 	} | 
 |  | 
 | 	COLORREF SetInsertMarkColor(COLORREF clr) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, TVM_SETINSERTMARKCOLOR, 0, (LPARAM)clr); | 
 | 	} | 
 |  | 
 | 	int GetItemHeight() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TVM_GETITEMHEIGHT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int SetItemHeight(int cyHeight) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TVM_SETITEMHEIGHT, cyHeight, 0L); | 
 | 	} | 
 |  | 
 | 	int GetScrollTime() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TVM_GETSCROLLTIME, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int SetScrollTime(int nScrollTime) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TVM_SETSCROLLTIME, nScrollTime, 0L); | 
 | 	} | 
 |  | 
 | 	COLORREF GetTextColor() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, TVM_GETTEXTCOLOR, 0, 0L); | 
 | 	} | 
 |  | 
 | 	COLORREF SetTextColor(COLORREF clr) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, TVM_SETTEXTCOLOR, 0, (LPARAM)clr); | 
 | 	} | 
 |  | 
 | 	BOOL GetUnicodeFormat() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TVM_GETUNICODEFORMAT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TVM_SETUNICODEFORMAT, bUnicode, 0L); | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) | 
 |  | 
 | #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) | 
 | 	COLORREF GetLineColor() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, TVM_GETLINECOLOR, 0, 0L); | 
 | 	} | 
 |  | 
 | 	COLORREF SetLineColor(COLORREF clrNew /*= CLR_DEFAULT*/) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, TVM_SETLINECOLOR, 0, (LPARAM)clrNew); | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) | 
 |  | 
 | #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) | 
 | 	BOOL GetItem(LPTVITEMEX pItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)pItem); | 
 | 	} | 
 |  | 
 | 	BOOL SetItem(LPTVITEMEX pItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TVM_SETITEM, 0, (LPARAM)pItem); | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) | 
 |  | 
 | 	DWORD GetExtendedStyle() const | 
 | 	{ | 
 | #ifndef TVM_GETEXTENDEDSTYLE | 
 | 		const UINT TVM_GETEXTENDEDSTYLE = (TV_FIRST + 45); | 
 | #endif | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, TVM_GETEXTENDEDSTYLE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	DWORD SetExtendedStyle(DWORD dwStyle, DWORD dwMask) | 
 | 	{ | 
 | #ifndef TVM_SETEXTENDEDSTYLE | 
 | 		const UINT TVM_SETEXTENDEDSTYLE = (TV_FIRST + 44); | 
 | #endif | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, TVM_SETEXTENDEDSTYLE, dwMask, dwStyle); | 
 | 	} | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0600) | 
 | 	BOOL SetAutoScrollInfo(UINT uPixPerSec, UINT uUpdateTime) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TVM_SETAUTOSCROLLINFO, (WPARAM)uPixPerSec, (LPARAM)uUpdateTime); | 
 | 	} | 
 |  | 
 | 	DWORD GetSelectedCount() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, TVM_GETSELECTEDCOUNT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL GetItemPartRect(HTREEITEM hItem, TVITEMPART partID, LPRECT lpRect) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		TVGETITEMPARTRECTINFO gipri = { hItem, lpRect, partID }; | 
 | 		return (BOOL)::SendMessage(m_hWnd, TVM_GETITEMPARTRECT, 0, (LPARAM)&gipri); | 
 | 	} | 
 | #endif // (_WIN32_WINNT >= 0x0600) | 
 |  | 
 | // Operations | 
 | 	HTREEITEM InsertItem(LPTVINSERTSTRUCT lpInsertStruct) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_INSERTITEM, 0, (LPARAM)lpInsertStruct); | 
 | 	} | 
 |  | 
 | 	HTREEITEM InsertItem(LPCTSTR lpszItem, int nImage, | 
 | 		int nSelectedImage, HTREEITEM hParent, HTREEITEM hInsertAfter) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return InsertItem(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE, lpszItem, nImage, nSelectedImage, 0, 0, 0, hParent, hInsertAfter);  | 
 | 	} | 
 |  | 
 | 	HTREEITEM InsertItem(LPCTSTR lpszItem, HTREEITEM hParent, HTREEITEM hInsertAfter) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return InsertItem(TVIF_TEXT, lpszItem, 0, 0, 0, 0, 0, hParent, hInsertAfter); | 
 | 	} | 
 |  | 
 | 	HTREEITEM InsertItem(UINT nMask, LPCTSTR lpszItem, int nImage, | 
 | 		int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam, | 
 | 		HTREEITEM hParent, HTREEITEM hInsertAfter) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		TVINSERTSTRUCT tvis = { 0 }; | 
 | 		tvis.hParent = hParent; | 
 | 		tvis.hInsertAfter = hInsertAfter; | 
 | 		tvis.item.mask = nMask; | 
 | 		tvis.item.pszText = (LPTSTR) lpszItem; | 
 | 		tvis.item.iImage = nImage; | 
 | 		tvis.item.iSelectedImage = nSelectedImage; | 
 | 		tvis.item.state = nState; | 
 | 		tvis.item.stateMask = nStateMask; | 
 | 		tvis.item.lParam = lParam; | 
 | 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_INSERTITEM, 0, (LPARAM)&tvis); | 
 | 	} | 
 |  | 
 | 	BOOL DeleteItem(HTREEITEM hItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TVM_DELETEITEM, 0, (LPARAM)hItem); | 
 | 	} | 
 |  | 
 | 	BOOL DeleteAllItems() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TVM_DELETEITEM, 0, (LPARAM)TVI_ROOT); | 
 | 	} | 
 |  | 
 | 	BOOL Expand(HTREEITEM hItem, UINT nCode = TVE_EXPAND) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TVM_EXPAND, nCode, (LPARAM)hItem); | 
 | 	} | 
 |  | 
 | 	HTREEITEM GetNextItem(HTREEITEM hItem, UINT nCode) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd));  | 
 | 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, nCode, (LPARAM)hItem); | 
 | 	} | 
 |  | 
 | 	HTREEITEM GetChildItem(HTREEITEM hItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd));  | 
 | 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_CHILD, (LPARAM)hItem); | 
 | 	} | 
 |  | 
 | 	HTREEITEM GetNextSiblingItem(HTREEITEM hItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd));  | 
 | 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXT, (LPARAM)hItem);  | 
 | 	} | 
 |  | 
 | 	HTREEITEM GetPrevSiblingItem(HTREEITEM hItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd));  | 
 | 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PREVIOUS, (LPARAM)hItem); | 
 | 	} | 
 |  | 
 | 	HTREEITEM GetParentItem(HTREEITEM hItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd));  | 
 | 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PARENT, (LPARAM)hItem);  | 
 | 	} | 
 |  | 
 | 	HTREEITEM GetFirstVisibleItem() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd));  | 
 | 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_FIRSTVISIBLE, 0L); | 
 | 	} | 
 |  | 
 | 	HTREEITEM GetNextVisibleItem(HTREEITEM hItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXTVISIBLE, (LPARAM)hItem); | 
 | 	} | 
 |  | 
 | 	HTREEITEM GetPrevVisibleItem(HTREEITEM hItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PREVIOUSVISIBLE, (LPARAM)hItem); | 
 | 	} | 
 |  | 
 | 	HTREEITEM GetSelectedItem() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_CARET, 0L); | 
 | 	} | 
 |  | 
 | 	HTREEITEM GetDropHilightItem() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_DROPHILITE, 0L); | 
 | 	} | 
 |  | 
 | 	HTREEITEM GetRootItem() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_ROOT, 0L); | 
 | 	} | 
 |  | 
 | #if !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400) | 
 | 	HTREEITEM GetLastVisibleItem() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_LASTVISIBLE, 0L); | 
 | 	} | 
 | #endif // !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400) | 
 |  | 
 | #if (_WIN32_IE >= 0x0600) | 
 | 	HTREEITEM GetNextSelectedItem() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXTSELECTED, 0L); | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0600) | 
 |  | 
 | 	BOOL Select(HTREEITEM hItem, UINT nCode) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TVM_SELECTITEM, nCode, (LPARAM)hItem); | 
 | 	} | 
 |  | 
 | 	BOOL SelectItem(HTREEITEM hItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TVM_SELECTITEM, TVGN_CARET, (LPARAM)hItem); | 
 | 	} | 
 |  | 
 | 	BOOL SelectDropTarget(HTREEITEM hItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TVM_SELECTITEM, TVGN_DROPHILITE, (LPARAM)hItem); | 
 | 	} | 
 |  | 
 | 	BOOL SelectSetFirstVisible(HTREEITEM hItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TVM_SELECTITEM, TVGN_FIRSTVISIBLE, (LPARAM)hItem); | 
 | 	} | 
 |  | 
 | 	CEdit EditLabel(HTREEITEM hItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CEdit((HWND)::SendMessage(m_hWnd, TVM_EDITLABEL, 0, (LPARAM)hItem)); | 
 | 	} | 
 |  | 
 | 	BOOL EndEditLabelNow(BOOL bCancel) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TVM_ENDEDITLABELNOW, bCancel, 0L); | 
 | 	} | 
 |  | 
 | 	HTREEITEM HitTest(TVHITTESTINFO* pHitTestInfo) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_HITTEST, 0, (LPARAM)pHitTestInfo); | 
 | 	} | 
 |  | 
 | 	HTREEITEM HitTest(POINT pt, UINT* pFlags) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		TVHITTESTINFO hti = { 0 }; | 
 | 		hti.pt = pt; | 
 | 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_HITTEST, 0, (LPARAM)&hti); | 
 | 		if (pFlags != NULL) | 
 | 			*pFlags = hti.flags; | 
 | 		return hTreeItem; | 
 | 	} | 
 |  | 
 | 	BOOL SortChildren(HTREEITEM hItem, BOOL bRecurse = FALSE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TVM_SORTCHILDREN, (WPARAM)bRecurse, (LPARAM)hItem); | 
 | 	} | 
 |  | 
 | 	BOOL EnsureVisible(HTREEITEM hItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TVM_ENSUREVISIBLE, 0, (LPARAM)hItem); | 
 | 	} | 
 |  | 
 | 	BOOL SortChildrenCB(LPTVSORTCB pSort, BOOL bRecurse = FALSE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TVM_SORTCHILDRENCB, (WPARAM)bRecurse, (LPARAM)pSort); | 
 | 	} | 
 |  | 
 | 	CImageList RemoveImageList(int nImageList) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TVM_SETIMAGELIST, (WPARAM)nImageList, NULL)); | 
 | 	} | 
 |  | 
 | 	CImageList CreateDragImage(HTREEITEM hItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TVM_CREATEDRAGIMAGE, 0, (LPARAM)hItem)); | 
 | 	} | 
 |  | 
 | #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) | 
 | 	BOOL SetInsertMark(HTREEITEM hTreeItem, BOOL bAfter) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TVM_SETINSERTMARK, bAfter, (LPARAM)hTreeItem); | 
 | 	} | 
 |  | 
 | 	BOOL RemoveInsertMark() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TVM_SETINSERTMARK, 0, 0L); | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0501) | 
 | 	HTREEITEM MapAccIDToHTREEITEM(UINT uID) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_MAPACCIDTOHTREEITEM, uID, 0L); | 
 | 	} | 
 |  | 
 | 	UINT MapHTREEITEMToAccID(HTREEITEM hTreeItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UINT)::SendMessage(m_hWnd, TVM_MAPHTREEITEMTOACCID, (WPARAM)hTreeItem, 0L); | 
 | 	} | 
 | #endif // (_WIN32_WINNT >= 0x0501) | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0600) | 
 | 	void ShowInfoTip(HTREEITEM hItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TVM_SHOWINFOTIP, 0, (LPARAM)hItem); | 
 | 	} | 
 | #endif // (_WIN32_WINNT >= 0x0600) | 
 | }; | 
 |  | 
 | typedef CTreeViewCtrlT<ATL::CWindow>   CTreeViewCtrl; | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CTreeViewCtrlEx | 
 |  | 
 | // forward declaration | 
 | template <class TBase> class CTreeViewCtrlExT; | 
 |  | 
 | // Note: TBase here is for CTreeViewCtrlExT, and not for CTreeItemT itself | 
 | template <class TBase> | 
 | class CTreeItemT | 
 | { | 
 | public: | 
 | 	HTREEITEM m_hTreeItem; | 
 | 	CTreeViewCtrlExT<TBase>* m_pTreeView; | 
 |  | 
 | // Construction | 
 | 	CTreeItemT(HTREEITEM hTreeItem = NULL, CTreeViewCtrlExT<TBase>* pTreeView = NULL) : m_hTreeItem(hTreeItem), m_pTreeView(pTreeView) | 
 | 	{ } | 
 |   | 
 | 	CTreeItemT(const CTreeItemT<TBase>& posSrc) | 
 | 	{ | 
 | 		*this = posSrc; | 
 | 	} | 
 |  | 
 | 	operator HTREEITEM() { return m_hTreeItem; } | 
 |  | 
 | 	CTreeItemT<TBase>& operator =(const CTreeItemT<TBase>& itemSrc) | 
 | 	{ | 
 | 		m_hTreeItem = itemSrc.m_hTreeItem; | 
 | 		m_pTreeView = itemSrc.m_pTreeView; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	CTreeViewCtrlExT<TBase>* GetTreeView() const { return m_pTreeView; } | 
 |  | 
 | 	BOOL operator !() const { return m_hTreeItem == NULL; } | 
 |  | 
 | 	BOOL IsNull() const { return m_hTreeItem == NULL; } | 
 | 	 | 
 | 	BOOL GetRect(LPRECT lpRect, BOOL bTextOnly) const; | 
 | 	BOOL GetText(LPTSTR lpstrText, int nLen) const; | 
 | #ifndef _ATL_NO_COM | 
 | 	BOOL GetText(BSTR& bstrText) const; | 
 | #endif // !_ATL_NO_COM | 
 | #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) | 
 | 	BOOL GetText(_CSTRING_NS::CString& strText) const; | 
 | #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) | 
 | 	BOOL SetText(LPCTSTR lpszItem); | 
 | 	BOOL GetImage(int& nImage, int& nSelectedImage) const; | 
 | 	BOOL SetImage(int nImage, int nSelectedImage); | 
 | 	UINT GetState(UINT nStateMask) const; | 
 | 	BOOL SetState(UINT nState, UINT nStateMask); | 
 | 	DWORD_PTR GetData() const; | 
 | 	BOOL SetData(DWORD_PTR dwData); | 
 | 	BOOL SetItem(UINT nMask, LPCTSTR lpszItem, int nImage, int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam); | 
 |  | 
 | // Operations | 
 | 	CTreeItemT<TBase> InsertAfter(LPCTSTR lpstrItem, HTREEITEM hItemAfter, int nImageIndex) | 
 | 	{ | 
 | 		return _Insert(lpstrItem, nImageIndex, hItemAfter); | 
 | 	} | 
 |  | 
 | 	CTreeItemT<TBase> AddHead(LPCTSTR lpstrItem, int nImageIndex) | 
 | 	{ | 
 | 		return _Insert(lpstrItem, nImageIndex, TVI_FIRST); | 
 | 	} | 
 |  | 
 | 	CTreeItemT<TBase> AddTail(LPCTSTR lpstrItem, int nImageIndex) | 
 | 	{ | 
 | 		return _Insert(lpstrItem, nImageIndex, TVI_LAST); | 
 | 	} | 
 |  | 
 | 	CTreeItemT<TBase> GetChild() const; | 
 | 	CTreeItemT<TBase> GetNext(UINT nCode) const; | 
 | 	CTreeItemT<TBase> GetNextSibling() const; | 
 | 	CTreeItemT<TBase> GetPrevSibling() const; | 
 | 	CTreeItemT<TBase> GetParent() const; | 
 | 	CTreeItemT<TBase> GetFirstVisible() const; | 
 | 	CTreeItemT<TBase> GetNextVisible() const; | 
 | 	CTreeItemT<TBase> GetPrevVisible() const; | 
 | 	CTreeItemT<TBase> GetSelected() const; | 
 | 	CTreeItemT<TBase> GetDropHilight() const; | 
 | 	CTreeItemT<TBase> GetRoot() const; | 
 | #if !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400) | 
 | 	CTreeItemT<TBase> GetLastVisible() const; | 
 | #endif // !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400) | 
 | #if (_WIN32_IE >= 0x0600) | 
 | 	CTreeItemT<TBase> GetNextSelected() const; | 
 | #endif // (_WIN32_IE >= 0x0600) | 
 | 	BOOL HasChildren() const; | 
 | 	BOOL Delete(); | 
 | 	BOOL Expand(UINT nCode = TVE_EXPAND); | 
 | 	BOOL Select(UINT nCode); | 
 | 	BOOL Select(); | 
 | 	BOOL SelectDropTarget(); | 
 | 	BOOL SelectSetFirstVisible(); | 
 | 	HWND EditLabel(); | 
 | 	HIMAGELIST CreateDragImage(); | 
 | 	BOOL SortChildren(BOOL bRecurse = FALSE); | 
 | 	BOOL EnsureVisible(); | 
 | 	CTreeItemT<TBase> _Insert(LPCTSTR lpstrItem, int nImageIndex, HTREEITEM hItemAfter); | 
 | 	int GetImageIndex() const; | 
 | #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) | 
 | 	BOOL SetInsertMark(BOOL bAfter); | 
 | #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) | 
 | #if (_WIN32_WINNT >= 0x0501) | 
 | 	UINT MapHTREEITEMToAccID() const; | 
 | #endif // (_WIN32_WINNT >= 0x0501) | 
 | #if (_WIN32_WINNT >= 0x0600) | 
 | 	void ShowInfoTip(); | 
 | 	BOOL GetPartRect(TVITEMPART partID, LPRECT lpRect) const; | 
 | #endif // (_WIN32_WINNT >= 0x0600) | 
 | }; | 
 |  | 
 | typedef CTreeItemT<ATL::CWindow>   CTreeItem; | 
 |  | 
 |  | 
 | template <class TBase> | 
 | class CTreeViewCtrlExT : public CTreeViewCtrlT< TBase > | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CTreeViewCtrlExT(HWND hWnd = NULL) : CTreeViewCtrlT< TBase >(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CTreeViewCtrlExT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | // Operations (overides that return CTreeItem) | 
 | 	CTreeItemT<TBase> InsertItem(LPTVINSERTSTRUCT lpInsertStruct) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_INSERTITEM, 0, (LPARAM)lpInsertStruct); | 
 | 		return CTreeItemT<TBase>(hTreeItem, this); | 
 | 	} | 
 |  | 
 | 	CTreeItemT<TBase> InsertItem(LPCTSTR lpszItem, int nImage, | 
 | 		int nSelectedImage, HTREEITEM hParent, HTREEITEM hInsertAfter) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return InsertItem(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE, lpszItem, nImage, nSelectedImage, 0, 0, 0, hParent, hInsertAfter);  | 
 | 	} | 
 |  | 
 | 	CTreeItemT<TBase> InsertItem(LPCTSTR lpszItem, HTREEITEM hParent, HTREEITEM hInsertAfter) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return InsertItem(TVIF_TEXT, lpszItem, 0, 0, 0, 0, 0, hParent, hInsertAfter); | 
 | 	} | 
 |  | 
 | 	CTreeItemT<TBase> GetNextItem(HTREEITEM hItem, UINT nCode) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd));  | 
 | 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, nCode, (LPARAM)hItem); | 
 | 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this); | 
 | 	} | 
 |  | 
 | 	CTreeItemT<TBase> GetChildItem(HTREEITEM hItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd));  | 
 | 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_CHILD, (LPARAM)hItem); | 
 | 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);  | 
 | 	} | 
 |  | 
 | 	CTreeItemT<TBase> GetNextSiblingItem(HTREEITEM hItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd));  | 
 | 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXT, (LPARAM)hItem);  | 
 | 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this); | 
 | 	} | 
 |  | 
 | 	CTreeItemT<TBase> GetPrevSiblingItem(HTREEITEM hItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd));  | 
 | 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PREVIOUS, (LPARAM)hItem); | 
 | 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this); | 
 | 	} | 
 |  | 
 | 	CTreeItemT<TBase> GetParentItem(HTREEITEM hItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd));  | 
 | 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PARENT, (LPARAM)hItem);  | 
 | 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this); | 
 | 	} | 
 |  | 
 | 	CTreeItemT<TBase> GetFirstVisibleItem() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd));  | 
 | 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_FIRSTVISIBLE, 0L); | 
 | 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this); | 
 | 	} | 
 |  | 
 | 	CTreeItemT<TBase> GetNextVisibleItem(HTREEITEM hItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXTVISIBLE, (LPARAM)hItem); | 
 | 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this); | 
 | 	} | 
 |  | 
 | 	CTreeItemT<TBase> GetPrevVisibleItem(HTREEITEM hItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PREVIOUSVISIBLE, (LPARAM)hItem); | 
 | 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this); | 
 | 	} | 
 |  | 
 | 	CTreeItemT<TBase> GetSelectedItem() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_CARET, 0L); | 
 | 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this); | 
 | 	} | 
 |  | 
 | 	CTreeItemT<TBase> GetDropHilightItem() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_DROPHILITE, 0L); | 
 | 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this); | 
 | 	} | 
 |  | 
 | 	CTreeItemT<TBase> GetRootItem() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_ROOT, 0L); | 
 | 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this); | 
 | 	} | 
 |  | 
 | #if !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400) | 
 | 	CTreeItemT<TBase> GetLastVisibleItem() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_LASTVISIBLE, 0L); | 
 | 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this); | 
 | 	} | 
 | #endif // !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400) | 
 |  | 
 | #if (_WIN32_IE >= 0x0600) | 
 | 	CTreeItemT<TBase> GetNextSelectedItem() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXTSELECTED, 0L); | 
 | 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this); | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0600) | 
 |  | 
 | 	CTreeItemT<TBase> HitTest(TVHITTESTINFO* pHitTestInfo) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_HITTEST, 0, (LPARAM)pHitTestInfo); | 
 | 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this); | 
 | 	} | 
 |  | 
 | 	CTreeItemT<TBase> InsertItem(UINT nMask, LPCTSTR lpszItem, int nImage, | 
 | 		int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam, | 
 | 		HTREEITEM hParent, HTREEITEM hInsertAfter) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		TVINSERTSTRUCT tvis = { 0 }; | 
 | 		tvis.hParent = hParent; | 
 | 		tvis.hInsertAfter = hInsertAfter; | 
 | 		tvis.item.mask = nMask; | 
 | 		tvis.item.pszText = (LPTSTR) lpszItem; | 
 | 		tvis.item.iImage = nImage; | 
 | 		tvis.item.iSelectedImage = nSelectedImage; | 
 | 		tvis.item.state = nState; | 
 | 		tvis.item.stateMask = nStateMask; | 
 | 		tvis.item.lParam = lParam; | 
 | 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_INSERTITEM, 0, (LPARAM)&tvis); | 
 | 		return CTreeItemT<TBase>(hTreeItem, this); | 
 | 	} | 
 |  | 
 | 	CTreeItemT<TBase> HitTest(POINT pt, UINT* pFlags) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		TVHITTESTINFO hti = { 0 }; | 
 | 		hti.pt = pt; | 
 | 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_HITTEST, 0, (LPARAM)&hti); | 
 | 		if (pFlags != NULL) | 
 | 			*pFlags = hti.flags; | 
 | 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this); | 
 | 	} | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0501) | 
 | 	CTreeItemT<TBase> MapAccIDToHTREEITEM(UINT uID) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_MAPACCIDTOHTREEITEM, uID, 0L); | 
 | 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this); | 
 | 	} | 
 | #endif // (_WIN32_WINNT >= 0x0501) | 
 | }; | 
 |  | 
 | typedef CTreeViewCtrlExT<ATL::CWindow>   CTreeViewCtrlEx; | 
 |  | 
 |  | 
 | // CTreeItem inline methods | 
 | template <class TBase> | 
 | inline BOOL CTreeItemT<TBase>::GetRect(LPRECT lpRect, BOOL bTextOnly) const | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->GetItemRect(m_hTreeItem,lpRect,bTextOnly); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline CTreeItemT<TBase> CTreeItemT<TBase>::GetNext(UINT nCode) const | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->GetNextItem(m_hTreeItem,nCode); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline CTreeItemT<TBase> CTreeItemT<TBase>::GetChild() const | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->GetChildItem(m_hTreeItem); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline CTreeItemT<TBase> CTreeItemT<TBase>::GetNextSibling() const | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->GetNextSiblingItem(m_hTreeItem); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline CTreeItemT<TBase> CTreeItemT<TBase>::GetPrevSibling() const | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->GetPrevSiblingItem(m_hTreeItem); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline CTreeItemT<TBase> CTreeItemT<TBase>::GetParent() const | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->GetParentItem(m_hTreeItem); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline CTreeItemT<TBase> CTreeItemT<TBase>::GetFirstVisible() const | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->GetFirstVisibleItem(); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline CTreeItemT<TBase> CTreeItemT<TBase>::GetNextVisible() const | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->GetNextVisibleItem(m_hTreeItem); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline CTreeItemT<TBase> CTreeItemT<TBase>::GetPrevVisible() const | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->GetPrevVisibleItem(m_hTreeItem); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline CTreeItemT<TBase> CTreeItemT<TBase>::GetSelected() const | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->GetSelectedItem(); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline CTreeItemT<TBase> CTreeItemT<TBase>::GetDropHilight() const | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->GetDropHilightItem(); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline CTreeItemT<TBase> CTreeItemT<TBase>::GetRoot() const | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->GetRootItem(); | 
 | } | 
 |  | 
 | #if !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400) | 
 | template <class TBase> | 
 | inline CTreeItemT<TBase> CTreeItemT<TBase>::GetLastVisible() const | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->GetLastVisibleItem(); | 
 | } | 
 | #endif // !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400) | 
 |  | 
 | #if (_WIN32_IE >= 0x0600) | 
 | template <class TBase> | 
 | inline CTreeItemT<TBase> CTreeItemT<TBase>::GetNextSelected() const | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->GetNextSelectedItem(); | 
 | } | 
 | #endif // (_WIN32_IE >= 0x0600) | 
 |  | 
 | template <class TBase> | 
 | inline BOOL CTreeItemT<TBase>::GetText(LPTSTR lpstrText, int nLen) const | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->GetItemText(m_hTreeItem, lpstrText, nLen); | 
 | } | 
 |  | 
 | #ifndef _ATL_NO_COM | 
 | #ifdef _OLEAUTO_H_ | 
 | template <class TBase> | 
 | inline BOOL CTreeItemT<TBase>::GetText(BSTR& bstrText) const | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->GetItemText(m_hTreeItem, bstrText); | 
 | } | 
 | #endif // _OLEAUTO_H_ | 
 | #endif // !_ATL_NO_COM | 
 |  | 
 | #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) | 
 | template <class TBase> | 
 | inline BOOL CTreeItemT<TBase>::GetText(_CSTRING_NS::CString& strText) const | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->GetItemText(m_hTreeItem, strText); | 
 | } | 
 | #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) | 
 |  | 
 | template <class TBase> | 
 | inline BOOL CTreeItemT<TBase>::GetImage(int& nImage, int& nSelectedImage) const | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->GetItemImage(m_hTreeItem,nImage,nSelectedImage); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline UINT CTreeItemT<TBase>::GetState(UINT nStateMask) const | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->GetItemState(m_hTreeItem,nStateMask); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline DWORD_PTR CTreeItemT<TBase>::GetData() const | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->GetItemData(m_hTreeItem); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline BOOL CTreeItemT<TBase>::SetItem(UINT nMask, LPCTSTR lpszItem, int nImage, | 
 | 		int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam) | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->SetItem(m_hTreeItem, nMask, lpszItem, nImage, nSelectedImage, nState, nStateMask, lParam); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline BOOL CTreeItemT<TBase>::SetText(LPCTSTR lpszItem) | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->SetItemText(m_hTreeItem,lpszItem); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline BOOL CTreeItemT<TBase>::SetImage(int nImage, int nSelectedImage) | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->SetItemImage(m_hTreeItem,nImage,nSelectedImage); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline BOOL CTreeItemT<TBase>::SetState(UINT nState, UINT nStateMask) | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->SetItemState(m_hTreeItem,nState,nStateMask); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline BOOL CTreeItemT<TBase>::SetData(DWORD_PTR dwData) | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->SetItemData(m_hTreeItem,dwData); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline BOOL CTreeItemT<TBase>::HasChildren() const | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->ItemHasChildren(m_hTreeItem); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline BOOL CTreeItemT<TBase>::Delete() | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->DeleteItem(m_hTreeItem); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline BOOL CTreeItemT<TBase>::Expand(UINT nCode /*= TVE_EXPAND*/) | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->Expand(m_hTreeItem,nCode); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline BOOL CTreeItemT<TBase>::Select(UINT nCode) | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->Select(m_hTreeItem,nCode); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline BOOL CTreeItemT<TBase>::Select() | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->SelectItem(m_hTreeItem); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline BOOL CTreeItemT<TBase>::SelectDropTarget() | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->SelectDropTarget(m_hTreeItem); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline BOOL CTreeItemT<TBase>::SelectSetFirstVisible() | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->SelectSetFirstVisible(m_hTreeItem); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline HWND CTreeItemT<TBase>::EditLabel() | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->EditLabel(m_hTreeItem); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline HIMAGELIST CTreeItemT<TBase>::CreateDragImage() | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->CreateDragImage(m_hTreeItem); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline BOOL CTreeItemT<TBase>::SortChildren(BOOL bRecurse /*= FALSE*/) | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->SortChildren(m_hTreeItem, bRecurse); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline BOOL CTreeItemT<TBase>::EnsureVisible() | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->EnsureVisible(m_hTreeItem); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline CTreeItemT<TBase> CTreeItemT<TBase>::_Insert(LPCTSTR lpstrItem, int nImageIndex, HTREEITEM hItemAfter) | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	TVINSERTSTRUCT ins = { 0 }; | 
 | 	ins.hParent = m_hTreeItem; | 
 | 	ins.hInsertAfter = hItemAfter; | 
 | 	ins.item.mask = TVIF_TEXT; | 
 | 	ins.item.pszText = (LPTSTR)lpstrItem; | 
 | 	if(nImageIndex != -1) | 
 | 	{ | 
 | 		ins.item.mask |= TVIF_IMAGE | TVIF_SELECTEDIMAGE; | 
 | 		ins.item.iImage = nImageIndex; | 
 | 		ins.item.iSelectedImage = nImageIndex; | 
 | 	} | 
 | 	return CTreeItemT<TBase>(m_pTreeView->InsertItem(&ins), m_pTreeView); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline int CTreeItemT<TBase>::GetImageIndex() const | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	TVITEM item = { 0 }; | 
 | 	item.mask = TVIF_HANDLE | TVIF_IMAGE; | 
 | 	item.hItem = m_hTreeItem; | 
 | 	m_pTreeView->GetItem(&item); | 
 | 	return item.iImage; | 
 | } | 
 |  | 
 | #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) | 
 | template <class TBase> | 
 | inline BOOL CTreeItemT<TBase>::SetInsertMark(BOOL bAfter) | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->SetInsertMark(m_hTreeItem, bAfter); | 
 | } | 
 | #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0501) | 
 | template <class TBase> | 
 | inline UINT CTreeItemT<TBase>::MapHTREEITEMToAccID() const | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->MapHTREEITEMToAccID(m_hTreeItem); | 
 | } | 
 | #endif // (_WIN32_WINNT >= 0x0501) | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0600) | 
 | template <class TBase> | 
 | inline void CTreeItemT<TBase>::ShowInfoTip() | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	m_pTreeView->ShowInfoTip(m_hTreeItem); | 
 | } | 
 |  | 
 | template <class TBase> | 
 | inline BOOL CTreeItemT<TBase>::GetPartRect(TVITEMPART partID, LPRECT lpRect) const | 
 | { | 
 | 	ATLASSERT(m_pTreeView != NULL); | 
 | 	return m_pTreeView->GetItemPartRect(m_hTreeItem, partID, lpRect); | 
 | } | 
 | #endif // (_WIN32_WINNT >= 0x0600) | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CToolBarCtrl | 
 |  | 
 | template <class TBase> | 
 | class CToolBarCtrlT : public TBase | 
 | { | 
 | public: | 
 | // Construction | 
 | 	CToolBarCtrlT(HWND hWnd = NULL) : TBase(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CToolBarCtrlT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	static LPCTSTR GetWndClassName() | 
 | 	{ | 
 | 		return TOOLBARCLASSNAME; | 
 | 	} | 
 |  | 
 | 	BOOL IsButtonEnabled(int nID) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_ISBUTTONENABLED, nID, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL IsButtonChecked(int nID) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_ISBUTTONCHECKED, nID, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL IsButtonPressed(int nID) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_ISBUTTONPRESSED, nID, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL IsButtonHidden(int nID) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return(BOOL) ::SendMessage(m_hWnd, TB_ISBUTTONHIDDEN, nID, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL IsButtonIndeterminate(int nID) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_ISBUTTONINDETERMINATE, nID, 0L); | 
 | 	} | 
 |  | 
 | 	int GetState(int nID) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TB_GETSTATE, nID, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetState(int nID, UINT nState) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_SETSTATE, nID, MAKELPARAM(nState, 0)); | 
 | 	} | 
 |  | 
 | 	BOOL GetButton(int nIndex, LPTBBUTTON lpButton) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_GETBUTTON, nIndex, (LPARAM)lpButton); | 
 | 	} | 
 |  | 
 | 	int GetButtonCount() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TB_BUTTONCOUNT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL GetItemRect(int nIndex, LPRECT lpRect) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_GETITEMRECT, nIndex, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	void SetButtonStructSize(int nSize = sizeof(TBBUTTON)) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TB_BUTTONSTRUCTSIZE, nSize, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetButtonSize(SIZE size) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_SETBUTTONSIZE, 0, MAKELPARAM(size.cx, size.cy)); | 
 | 	} | 
 |  | 
 | 	BOOL SetButtonSize(int cx, int cy) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_SETBUTTONSIZE, 0, MAKELPARAM(cx, cy)); | 
 | 	} | 
 |  | 
 | 	BOOL SetBitmapSize(SIZE size) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_SETBITMAPSIZE, 0, MAKELPARAM(size.cx, size.cy)); | 
 | 	} | 
 |  | 
 | 	BOOL SetBitmapSize(int cx, int cy) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_SETBITMAPSIZE, 0, MAKELPARAM(cx, cy)); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	CToolTipCtrl GetToolTips() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CToolTipCtrl((HWND)::SendMessage(m_hWnd, TB_GETTOOLTIPS, 0, 0L)); | 
 | 	} | 
 |  | 
 | 	void SetToolTips(HWND hWndToolTip) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TB_SETTOOLTIPS, (WPARAM)hWndToolTip, 0L); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 |  | 
 | 	void SetNotifyWnd(HWND hWnd) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TB_SETPARENT, (WPARAM)hWnd, 0L); | 
 | 	} | 
 |  | 
 | 	int GetRows() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TB_GETROWS, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetRows(int nRows, BOOL bLarger, LPRECT lpRect) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TB_SETROWS, MAKELPARAM(nRows, bLarger), (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	BOOL SetCmdID(int nIndex, UINT nID) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_SETCMDID, nIndex, nID); | 
 | 	} | 
 |  | 
 | 	DWORD GetBitmapFlags() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, TB_GETBITMAPFLAGS, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int GetBitmap(int nID) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TB_GETBITMAP, nID, 0L); | 
 | 	} | 
 |  | 
 | 	int GetButtonText(int nID, LPTSTR lpstrText) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TB_GETBUTTONTEXT, nID, (LPARAM)lpstrText); | 
 | 	} | 
 |  | 
 | 	// nIndex - IE5 or higher only | 
 | 	CImageList GetImageList(int nIndex = 0) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_GETIMAGELIST, nIndex, 0L)); | 
 | 	} | 
 |  | 
 | 	// nIndex - IE5 or higher only | 
 | 	CImageList SetImageList(HIMAGELIST hImageList, int nIndex = 0) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_SETIMAGELIST, nIndex, (LPARAM)hImageList)); | 
 | 	} | 
 |  | 
 | 	// nIndex - IE5 or higher only | 
 | 	CImageList GetDisabledImageList(int nIndex = 0) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_GETDISABLEDIMAGELIST, nIndex, 0L)); | 
 | 	} | 
 |  | 
 | 	// nIndex - IE5 or higher only | 
 | 	CImageList SetDisabledImageList(HIMAGELIST hImageList, int nIndex = 0) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_SETDISABLEDIMAGELIST, nIndex, (LPARAM)hImageList)); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	// nIndex - IE5 or higher only | 
 | 	CImageList GetHotImageList(int nIndex = 0) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_GETHOTIMAGELIST, nIndex, 0L)); | 
 | 	} | 
 |  | 
 | 	// nIndex - IE5 or higher only | 
 | 	CImageList SetHotImageList(HIMAGELIST hImageList, int nIndex = 0) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_SETHOTIMAGELIST, nIndex, (LPARAM)hImageList)); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 |  | 
 | 	DWORD GetStyle() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, TB_GETSTYLE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetStyle(DWORD dwStyle) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TB_SETSTYLE, 0, dwStyle); | 
 | 	} | 
 |  | 
 | 	DWORD GetButtonSize() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, TB_GETBUTTONSIZE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void GetButtonSize(SIZE& size) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, TB_GETBUTTONSIZE, 0, 0L); | 
 | 		size.cx = LOWORD(dwRet); | 
 | 		size.cy = HIWORD(dwRet); | 
 | 	} | 
 |  | 
 | 	BOOL GetRect(int nID, LPRECT lpRect) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_GETRECT, nID, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	int GetTextRows() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TB_GETTEXTROWS, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetButtonWidth(int cxMin, int cxMax) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_SETBUTTONWIDTH, 0, MAKELPARAM(cxMin, cxMax)); | 
 | 	} | 
 |  | 
 | 	BOOL SetIndent(int nIndent) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_SETINDENT, nIndent, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetMaxTextRows(int nMaxTextRows) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_SETMAXTEXTROWS, nMaxTextRows, 0L); | 
 | 	} | 
 |  | 
 | #if (_WIN32_IE >= 0x0400) | 
 | #ifndef _WIN32_WCE | 
 | 	BOOL GetAnchorHighlight() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_GETANCHORHIGHLIGHT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetAnchorHighlight(BOOL bEnable = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_SETANCHORHIGHLIGHT, bEnable, 0L); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 |  | 
 | 	int GetButtonInfo(int nID, LPTBBUTTONINFO lptbbi) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TB_GETBUTTONINFO, nID, (LPARAM)lptbbi); | 
 | 	} | 
 |  | 
 | 	BOOL SetButtonInfo(int nID, LPTBBUTTONINFO lptbbi) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_SETBUTTONINFO, nID, (LPARAM)lptbbi); | 
 | 	} | 
 |  | 
 | 	BOOL SetButtonInfo(int nID, DWORD dwMask, BYTE Style, BYTE State, LPCTSTR lpszItem,  | 
 | 	                   int iImage, WORD cx, int iCommand, DWORD_PTR lParam) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		TBBUTTONINFO tbbi = { 0 }; | 
 | 		tbbi.cbSize = sizeof(TBBUTTONINFO); | 
 | 		tbbi.dwMask = dwMask; | 
 | 		tbbi.idCommand = iCommand; | 
 | 		tbbi.iImage = iImage; | 
 | 		tbbi.fsState = State; | 
 | 		tbbi.fsStyle = Style; | 
 | 		tbbi.cx = cx; | 
 | 		tbbi.pszText = (LPTSTR) lpszItem; | 
 | 		tbbi.lParam = lParam; | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_SETBUTTONINFO, nID, (LPARAM)&tbbi); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	int GetHotItem() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TB_GETHOTITEM, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int SetHotItem(int nItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TB_SETHOTITEM, nItem, 0L); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 |  | 
 | 	BOOL IsButtonHighlighted(int nButtonID) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_ISBUTTONHIGHLIGHTED, nButtonID, 0L); | 
 | 	} | 
 |  | 
 | 	DWORD SetDrawTextFlags(DWORD dwMask, DWORD dwFlags) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, TB_SETDRAWTEXTFLAGS, dwMask, dwFlags); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	BOOL GetColorScheme(LPCOLORSCHEME lpcs) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_GETCOLORSCHEME, 0, (LPARAM)lpcs); | 
 | 	} | 
 |  | 
 | 	void SetColorScheme(LPCOLORSCHEME lpcs) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TB_SETCOLORSCHEME, 0, (LPARAM)lpcs); | 
 | 	} | 
 |  | 
 | 	DWORD GetExtendedStyle() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, TB_GETEXTENDEDSTYLE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	DWORD SetExtendedStyle(DWORD dwStyle) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, TB_SETEXTENDEDSTYLE, 0, dwStyle); | 
 | 	} | 
 |  | 
 | 	void GetInsertMark(LPTBINSERTMARK lptbim) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TB_GETINSERTMARK, 0, (LPARAM)lptbim); | 
 | 	} | 
 |  | 
 | 	void SetInsertMark(LPTBINSERTMARK lptbim) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TB_SETINSERTMARK, 0, (LPARAM)lptbim); | 
 | 	} | 
 |  | 
 | 	COLORREF GetInsertMarkColor() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, TB_GETINSERTMARKCOLOR, 0, 0L); | 
 | 	} | 
 |  | 
 | 	COLORREF SetInsertMarkColor(COLORREF clr) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, TB_SETINSERTMARKCOLOR, 0, (LPARAM)clr); | 
 | 	} | 
 |  | 
 | 	BOOL GetMaxSize(LPSIZE lpSize) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_GETMAXSIZE, 0, (LPARAM)lpSize); | 
 | 	} | 
 |  | 
 | 	void GetPadding(LPSIZE lpSizePadding) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(lpSizePadding != NULL); | 
 | 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, TB_GETPADDING, 0, 0L); | 
 | 		lpSizePadding->cx = GET_X_LPARAM(dwRet); | 
 | 		lpSizePadding->cy = GET_Y_LPARAM(dwRet); | 
 | 	} | 
 |  | 
 | 	void SetPadding(int cx, int cy, LPSIZE lpSizePadding = NULL) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, TB_SETPADDING, 0, MAKELPARAM(cx, cy)); | 
 | 		if(lpSizePadding != NULL) | 
 | 		{ | 
 | 			lpSizePadding->cx = GET_X_LPARAM(dwRet); | 
 | 			lpSizePadding->cy = GET_Y_LPARAM(dwRet); | 
 | 		} | 
 | 	} | 
 |  | 
 | 	BOOL GetUnicodeFormat() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_GETUNICODEFORMAT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_SETUNICODEFORMAT, bUnicode, 0L); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 | #endif // (_WIN32_IE >= 0x0400) | 
 |  | 
 | #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) | 
 | 	int GetString(int nString, LPTSTR lpstrString, int cchMaxLen) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TB_GETSTRING, MAKEWPARAM(cchMaxLen, nString), (LPARAM)lpstrString); | 
 | 	} | 
 |  | 
 | 	int GetStringBSTR(int nString, BSTR& bstrString) const | 
 | 	{ | 
 | 		USES_CONVERSION; | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(bstrString == NULL); | 
 | 		int nLength = (int)(short)LOWORD(::SendMessage(m_hWnd, TB_GETSTRING, MAKEWPARAM(0, nString), NULL)); | 
 | 		if(nLength != -1) | 
 | 		{ | 
 | 			CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff; | 
 | 			LPTSTR lpstrText = buff.Allocate(nLength + 1); | 
 | 			if(lpstrText != NULL) | 
 | 			{ | 
 | 				nLength = (int)::SendMessage(m_hWnd, TB_GETSTRING, MAKEWPARAM(nLength + 1, nString), (LPARAM)lpstrText); | 
 | 				if(nLength != -1) | 
 | 					bstrString = ::SysAllocString(T2OLE(lpstrText)); | 
 | 			} | 
 | 			else | 
 | 			{ | 
 | 				nLength = -1; | 
 | 			} | 
 | 		} | 
 |  | 
 | 		return nLength; | 
 | 	} | 
 |  | 
 | #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) | 
 | 	int GetString(int nString, _CSTRING_NS::CString& str) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		int nLength = (int)(short)LOWORD(::SendMessage(m_hWnd, TB_GETSTRING, MAKEWPARAM(0, nString), NULL)); | 
 | 		if(nLength != -1) | 
 | 		{ | 
 | 			LPTSTR lpstr = str.GetBufferSetLength(nLength + 1); | 
 | 			if(lpstr != NULL) | 
 | 				nLength = (int)::SendMessage(m_hWnd, TB_GETSTRING, MAKEWPARAM(nLength + 1, nString), (LPARAM)lpstr); | 
 | 			else | 
 | 				nLength = -1; | 
 | 			str.ReleaseBuffer(); | 
 | 		} | 
 | 		return nLength; | 
 | 	} | 
 | #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) | 
 | #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0501) | 
 | 	void GetMetrics(LPTBMETRICS lptbm) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TB_GETMETRICS, 0, (LPARAM)lptbm); | 
 | 	} | 
 |  | 
 | 	void SetMetrics(LPTBMETRICS lptbm) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TB_SETMETRICS, 0, (LPARAM)lptbm); | 
 | 	} | 
 |  | 
 | 	void SetWindowTheme(LPCWSTR lpstrTheme) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TB_SETWINDOWTHEME, 0, (LPARAM)lpstrTheme); | 
 | 	} | 
 | #endif // (_WIN32_WINNT >= 0x0501) | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0600) | 
 | 	CImageList GetPressedImageList(int nIndex = 0) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_GETPRESSEDIMAGELIST, nIndex, 0L)); | 
 | 	} | 
 |  | 
 | 	CImageList SetPressedImageList(HIMAGELIST hImageList, int nIndex = 0) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_SETPRESSEDIMAGELIST, nIndex, (LPARAM)hImageList)); | 
 | 	} | 
 | #endif // (_WIN32_WINNT >= 0x0600) | 
 |  | 
 | // Operations | 
 | 	BOOL EnableButton(int nID, BOOL bEnable = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_ENABLEBUTTON, nID, MAKELPARAM(bEnable, 0)); | 
 | 	} | 
 |  | 
 | 	BOOL CheckButton(int nID, BOOL bCheck = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_CHECKBUTTON, nID, MAKELPARAM(bCheck, 0)); | 
 | 	} | 
 |  | 
 | 	BOOL PressButton(int nID, BOOL bPress = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_PRESSBUTTON, nID, MAKELPARAM(bPress, 0)); | 
 | 	} | 
 |  | 
 | 	BOOL HideButton(int nID, BOOL bHide = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_HIDEBUTTON, nID, MAKELPARAM(bHide, 0)); | 
 | 	} | 
 |  | 
 | 	BOOL Indeterminate(int nID, BOOL bIndeterminate = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_INDETERMINATE, nID, MAKELPARAM(bIndeterminate, 0)); | 
 | 	} | 
 |  | 
 | 	int AddBitmap(int nNumButtons, UINT nBitmapID) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		TBADDBITMAP tbab = { 0 }; | 
 | 		tbab.hInst = ModuleHelper::GetResourceInstance(); | 
 | 		ATLASSERT(tbab.hInst != NULL); | 
 | 		tbab.nID = nBitmapID; | 
 | 		return (int)::SendMessage(m_hWnd, TB_ADDBITMAP, (WPARAM)nNumButtons, (LPARAM)&tbab); | 
 | 	} | 
 |  | 
 | 	int AddBitmap(int nNumButtons, HBITMAP hBitmap) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		TBADDBITMAP tbab = { 0 }; | 
 | 		tbab.hInst = NULL; | 
 | 		tbab.nID = (UINT_PTR)hBitmap; | 
 | 		return (int)::SendMessage(m_hWnd, TB_ADDBITMAP, (WPARAM)nNumButtons, (LPARAM)&tbab); | 
 | 	} | 
 |  | 
 | 	BOOL AddButtons(int nNumButtons, LPTBBUTTON lpButtons) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_ADDBUTTONS, nNumButtons, (LPARAM)lpButtons); | 
 | 	} | 
 |  | 
 | 	BOOL InsertButton(int nIndex, LPTBBUTTON lpButton) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_INSERTBUTTON, nIndex, (LPARAM)lpButton); | 
 | 	} | 
 |  | 
 | 	BOOL InsertButton(int nIndex, int iCommand, BYTE Style, BYTE State, int iBitmap,  | 
 | 	                  INT_PTR iString, DWORD_PTR lParam) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		TBBUTTON tbb = { 0 }; | 
 | 		tbb.fsStyle = Style; | 
 | 		tbb.fsState = State; | 
 | 		tbb.idCommand = iCommand; | 
 | 		tbb.iBitmap = iBitmap; | 
 | 		tbb.iString = iString; | 
 | 		tbb.dwData = lParam; | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_INSERTBUTTON, nIndex, (LPARAM)&tbb); | 
 | 	} | 
 |  | 
 | 	BOOL InsertButton(int nIndex, int iCommand, BYTE Style, BYTE State, int iBitmap,  | 
 | 	                  LPCTSTR lpszItem, DWORD_PTR lParam) | 
 | 	{ | 
 | 		return InsertButton(nIndex, iCommand, Style, State, iBitmap, (INT_PTR)lpszItem, lParam); | 
 | 	} | 
 |  | 
 | 	BOOL AddButton(LPTBBUTTON lpButton) | 
 | 	{ | 
 | 		return InsertButton(-1, lpButton); | 
 | 	} | 
 |  | 
 | 	BOOL AddButton(int iCommand, BYTE Style, BYTE State, int iBitmap, INT_PTR iString, DWORD_PTR lParam) | 
 | 	{ | 
 | 		return InsertButton(-1, iCommand, Style, State, iBitmap, iString, lParam); | 
 | 	} | 
 |  | 
 | 	BOOL AddButton(int iCommand, BYTE Style, BYTE State, int iBitmap, LPCTSTR lpszItem, DWORD_PTR lParam) | 
 | 	{ | 
 | 		return InsertButton(-1, iCommand, Style, State, iBitmap, lpszItem, lParam); | 
 | 	} | 
 |  | 
 | 	BOOL DeleteButton(int nIndex) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_DELETEBUTTON, nIndex, 0L); | 
 | 	} | 
 |  | 
 | 	UINT CommandToIndex(UINT nID) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UINT)::SendMessage(m_hWnd, TB_COMMANDTOINDEX, nID, 0L); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	void SaveState(HKEY hKeyRoot, LPCTSTR lpszSubKey, LPCTSTR lpszValueName) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		TBSAVEPARAMS tbs = { 0 }; | 
 | 		tbs.hkr = hKeyRoot; | 
 | 		tbs.pszSubKey = lpszSubKey; | 
 | 		tbs.pszValueName = lpszValueName; | 
 | 		::SendMessage(m_hWnd, TB_SAVERESTORE, (WPARAM)TRUE, (LPARAM)&tbs); | 
 | 	} | 
 |  | 
 | 	void RestoreState(HKEY hKeyRoot, LPCTSTR lpszSubKey, LPCTSTR lpszValueName) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		TBSAVEPARAMS tbs = { 0 }; | 
 | 		tbs.hkr = hKeyRoot; | 
 | 		tbs.pszSubKey = lpszSubKey; | 
 | 		tbs.pszValueName = lpszValueName; | 
 | 		::SendMessage(m_hWnd, TB_SAVERESTORE, (WPARAM)FALSE, (LPARAM)&tbs); | 
 | 	} | 
 |  | 
 | 	void Customize() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TB_CUSTOMIZE, 0, 0L); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 |  | 
 | 	int AddString(UINT nStringID) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TB_ADDSTRING, (WPARAM)ModuleHelper::GetResourceInstance(), (LPARAM)nStringID); | 
 | 	} | 
 |  | 
 | 	int AddStrings(LPCTSTR lpszStrings) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TB_ADDSTRING, 0, (LPARAM)lpszStrings); | 
 | 	} | 
 |  | 
 | 	void AutoSize() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TB_AUTOSIZE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL ChangeBitmap(int nID, int nBitmap) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_CHANGEBITMAP, nID, MAKELPARAM(nBitmap, 0)); | 
 | 	} | 
 |  | 
 | 	int LoadImages(int nBitmapID) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TB_LOADIMAGES, nBitmapID, (LPARAM)ModuleHelper::GetResourceInstance()); | 
 | 	} | 
 |  | 
 | 	int LoadStdImages(int nBitmapID) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TB_LOADIMAGES, nBitmapID, (LPARAM)HINST_COMMCTRL); | 
 | 	} | 
 |  | 
 | 	BOOL ReplaceBitmap(LPTBREPLACEBITMAP ptbrb) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_REPLACEBITMAP, 0, (LPARAM)ptbrb); | 
 | 	} | 
 |  | 
 | #if (_WIN32_IE >= 0x0400) | 
 | 	int HitTest(LPPOINT lpPoint) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TB_HITTEST, 0, (LPARAM)lpPoint); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	BOOL InsertMarkHitTest(LPPOINT lpPoint, LPTBINSERTMARK lptbim) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_INSERTMARKHITTEST, (WPARAM)lpPoint, (LPARAM)lptbim); | 
 | 	} | 
 |  | 
 | 	BOOL InsertMarkHitTest(int x, int y, LPTBINSERTMARK lptbim) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		POINT pt = { x, y }; | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_INSERTMARKHITTEST, (WPARAM)&pt, (LPARAM)lptbim); | 
 | 	} | 
 |  | 
 | 	BOOL MapAccelerator(TCHAR chAccel, int& nID) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_MAPACCELERATOR, (WPARAM)chAccel, (LPARAM)&nID); | 
 | 	} | 
 |  | 
 | 	BOOL MarkButton(int nID, BOOL bHighlight = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_MARKBUTTON, nID, MAKELPARAM(bHighlight, 0)); | 
 | 	} | 
 |  | 
 | 	BOOL MoveButton(int nOldPos, int nNewPos) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TB_MOVEBUTTON, nOldPos, nNewPos); | 
 | 	} | 
 |  | 
 | 	HRESULT GetObject(REFIID iid, LPVOID* ppvObject) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (HRESULT)::SendMessage(m_hWnd, TB_GETOBJECT, (WPARAM)&iid, (LPARAM)ppvObject); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 | #endif // (_WIN32_IE >= 0x0400) | 
 | }; | 
 |  | 
 | typedef CToolBarCtrlT<ATL::CWindow>   CToolBarCtrl; | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CStatusBarCtrl | 
 |  | 
 | template <class TBase> | 
 | class CStatusBarCtrlT : public TBase | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CStatusBarCtrlT(HWND hWnd = NULL) : TBase(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CStatusBarCtrlT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 	} | 
 |  | 
 | // Methods | 
 | 	static LPCTSTR GetWndClassName() | 
 | 	{ | 
 | 		return STATUSCLASSNAME; | 
 | 	} | 
 |  | 
 | 	int GetParts(int nParts, int* pParts) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, SB_GETPARTS, nParts, (LPARAM)pParts); | 
 | 	} | 
 |  | 
 | 	BOOL SetParts(int nParts, int* pWidths) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, SB_SETPARTS, nParts, (LPARAM)pWidths); | 
 | 	} | 
 |  | 
 | 	int GetTextLength(int nPane, int* pType = NULL) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(nPane < 256); | 
 | 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, SB_GETTEXTLENGTH, (WPARAM)nPane, 0L); | 
 | 		if (pType != NULL) | 
 | 			*pType = (int)(short)HIWORD(dwRet); | 
 | 		return (int)(short)LOWORD(dwRet); | 
 | 	} | 
 |  | 
 | 	int GetText(int nPane, LPTSTR lpszText, int* pType = NULL) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(nPane < 256); | 
 | 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, SB_GETTEXT, (WPARAM)nPane, (LPARAM)lpszText); | 
 | 		if(pType != NULL) | 
 | 			*pType = (int)(short)HIWORD(dwRet); | 
 | 		return (int)(short)LOWORD(dwRet); | 
 | 	} | 
 |  | 
 | #ifndef _ATL_NO_COM | 
 | 	BOOL GetTextBSTR(int nPane, BSTR& bstrText, int* pType = NULL) const | 
 | 	{ | 
 | 		USES_CONVERSION; | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(nPane < 256); | 
 | 		ATLASSERT(bstrText == NULL); | 
 | 		int nLength = (int)(short)LOWORD(::SendMessage(m_hWnd, SB_GETTEXTLENGTH, (WPARAM)nPane, 0L)); | 
 | 		if(nLength == 0) | 
 | 			return FALSE; | 
 |  | 
 | 		CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff; | 
 | 		LPTSTR lpstrText = buff.Allocate(nLength + 1); | 
 | 		if(lpstrText == NULL) | 
 | 			return FALSE; | 
 |  | 
 | 		if(!GetText(nPane, lpstrText, pType)) | 
 | 			return FALSE; | 
 |  | 
 | 		bstrText = ::SysAllocString(T2OLE(lpstrText)); | 
 | 		return (bstrText != NULL) ? TRUE : FALSE; | 
 | 	} | 
 | #endif // !_ATL_NO_COM | 
 |  | 
 | #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) | 
 | 	int GetText(int nPane, _CSTRING_NS::CString& strText, int* pType = NULL) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(nPane < 256); | 
 | 		int nLength = (int)(short)LOWORD(::SendMessage(m_hWnd, SB_GETTEXTLENGTH, (WPARAM)nPane, 0L)); | 
 | 		if(nLength == 0) | 
 | 			return 0; | 
 |  | 
 | 		LPTSTR lpstr = strText.GetBufferSetLength(nLength); | 
 | 		if(lpstr == NULL) | 
 | 			return 0; | 
 | 		return GetText(nPane, lpstr, pType); | 
 | 	} | 
 | #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) | 
 |  | 
 | 	BOOL SetText(int nPane, LPCTSTR lpszText, int nType = 0) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(nPane < 256); | 
 | 		return (BOOL)::SendMessage(m_hWnd, SB_SETTEXT, (nPane | nType), (LPARAM)lpszText); | 
 | 	} | 
 |  | 
 | 	BOOL GetRect(int nPane, LPRECT lpRect) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(nPane < 256); | 
 | 		return (BOOL)::SendMessage(m_hWnd, SB_GETRECT, nPane, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	BOOL GetBorders(int* pBorders) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, SB_GETBORDERS, 0, (LPARAM)pBorders); | 
 | 	} | 
 |  | 
 | 	BOOL GetBorders(int& nHorz, int& nVert, int& nSpacing) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		int borders[3] = { 0, 0, 0 }; | 
 | 		BOOL bResult = (BOOL)::SendMessage(m_hWnd, SB_GETBORDERS, 0, (LPARAM)&borders); | 
 | 		if(bResult) | 
 | 		{ | 
 | 			nHorz = borders[0]; | 
 | 			nVert = borders[1]; | 
 | 			nSpacing = borders[2]; | 
 | 		} | 
 | 		return bResult; | 
 | 	} | 
 |  | 
 | 	void SetMinHeight(int nMin) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, SB_SETMINHEIGHT, nMin, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetSimple(BOOL bSimple = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, SB_SIMPLE, bSimple, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL IsSimple() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, SB_ISSIMPLE, 0, 0L); | 
 | 	} | 
 |  | 
 | #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) | 
 | 	BOOL GetUnicodeFormat() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, SB_GETUNICODEFORMAT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, SB_SETUNICODEFORMAT, bUnicode, 0L); | 
 | 	} | 
 |  | 
 | 	void GetTipText(int nPane, LPTSTR lpstrText, int nSize) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(nPane < 256); | 
 | 		::SendMessage(m_hWnd, SB_GETTIPTEXT, MAKEWPARAM(nPane, nSize), (LPARAM)lpstrText); | 
 | 	} | 
 |  | 
 | 	void SetTipText(int nPane, LPCTSTR lpstrText) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(nPane < 256); | 
 | 		::SendMessage(m_hWnd, SB_SETTIPTEXT, nPane, (LPARAM)lpstrText); | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) | 
 |  | 
 | #if ((_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 0x0500)) | 
 | 	COLORREF SetBkColor(COLORREF clrBk) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, SB_SETBKCOLOR, 0, (LPARAM)clrBk); | 
 | 	} | 
 |  | 
 | 	HICON GetIcon(int nPane) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(nPane < 256); | 
 | 		return (HICON)::SendMessage(m_hWnd, SB_GETICON, nPane, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetIcon(int nPane, HICON hIcon) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(nPane < 256); | 
 | 		return (BOOL)::SendMessage(m_hWnd, SB_SETICON, nPane, (LPARAM)hIcon); | 
 | 	} | 
 | #endif // ((_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 0x0500)) | 
 | }; | 
 |  | 
 | typedef CStatusBarCtrlT<ATL::CWindow>   CStatusBarCtrl; | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CTabCtrl | 
 |  | 
 | template <class TBase> | 
 | class CTabCtrlT : public TBase | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CTabCtrlT(HWND hWnd = NULL) : TBase(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CTabCtrlT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	static LPCTSTR GetWndClassName() | 
 | 	{ | 
 | 		return WC_TABCONTROL; | 
 | 	} | 
 |  | 
 | 	CImageList GetImageList() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TCM_GETIMAGELIST, 0, 0L)); | 
 | 	} | 
 |  | 
 | 	CImageList SetImageList(HIMAGELIST hImageList) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TCM_SETIMAGELIST, 0, (LPARAM)hImageList)); | 
 | 	} | 
 |  | 
 | 	int GetItemCount() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TCM_GETITEMCOUNT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL GetItem(int nItem, LPTCITEM pTabCtrlItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TCM_GETITEM, nItem, (LPARAM)pTabCtrlItem); | 
 | 	} | 
 |  | 
 | 	BOOL SetItem(int nItem, LPTCITEM pTabCtrlItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TCM_SETITEM, nItem, (LPARAM)pTabCtrlItem); | 
 | 	} | 
 |  | 
 | 	int SetItem(int nItem, UINT mask, LPCTSTR lpszItem, DWORD dwState, DWORD dwStateMask, int iImage, LPARAM lParam) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		TCITEM tci = { 0 }; | 
 | 		tci.mask = mask; | 
 | 		tci.pszText = (LPTSTR) lpszItem; | 
 | 		tci.dwState = dwState; | 
 | 		tci.dwStateMask = dwStateMask; | 
 | 		tci.iImage = iImage; | 
 | 		tci.lParam = lParam; | 
 | 		return (int)::SendMessage(m_hWnd, TCM_SETITEM, nItem, (LPARAM)&tci); | 
 | 	} | 
 |  | 
 | 	BOOL GetItemRect(int nItem, LPRECT lpRect) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TCM_GETITEMRECT, nItem, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	int GetCurSel() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TCM_GETCURSEL, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int SetCurSel(int nItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TCM_SETCURSEL, nItem, 0L); | 
 | 	} | 
 |  | 
 | 	SIZE SetItemSize(SIZE size) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		DWORD dwSize = (DWORD)::SendMessage(m_hWnd, TCM_SETITEMSIZE, 0, MAKELPARAM(size.cx, size.cy)); | 
 | 		SIZE sizeRet = { GET_X_LPARAM(dwSize), GET_Y_LPARAM(dwSize) }; | 
 | 		return sizeRet; | 
 | 	} | 
 |  | 
 | 	void SetItemSize(int cx, int cy) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TCM_SETITEMSIZE, 0, MAKELPARAM(cx, cy)); | 
 | 	} | 
 |  | 
 | 	void SetPadding(SIZE size) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TCM_SETPADDING, 0, MAKELPARAM(size.cx, size.cy)); | 
 | 	} | 
 |  | 
 | 	int GetRowCount() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TCM_GETROWCOUNT, 0, 0L); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	CToolTipCtrl GetTooltips() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CToolTipCtrl((HWND)::SendMessage(m_hWnd, TCM_GETTOOLTIPS, 0, 0L)); | 
 | 	} | 
 |  | 
 | 	void SetTooltips(HWND hWndToolTip) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TCM_SETTOOLTIPS, (WPARAM)hWndToolTip, 0L); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 |  | 
 | 	int GetCurFocus() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TCM_GETCURFOCUS, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetCurFocus(int nItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TCM_SETCURFOCUS, nItem, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetItemExtra(int cbExtra) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(GetItemCount() == 0);   // must be empty | 
 | 		return (BOOL)::SendMessage(m_hWnd, TCM_SETITEMEXTRA, cbExtra, 0L); | 
 | 	} | 
 |  | 
 | 	int SetMinTabWidth(int nWidth = -1) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TCM_SETMINTABWIDTH, 0, nWidth); | 
 | 	} | 
 |  | 
 | #if (_WIN32_IE >= 0x0400) | 
 | 	DWORD GetExtendedStyle() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, TCM_GETEXTENDEDSTYLE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	DWORD SetExtendedStyle(DWORD dwExMask, DWORD dwExStyle) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, TCM_SETEXTENDEDSTYLE, dwExMask, dwExStyle); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	BOOL GetUnicodeFormat() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TCM_GETUNICODEFORMAT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TCM_SETUNICODEFORMAT, bUnicode, 0L); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 | #endif // (_WIN32_IE >= 0x0400) | 
 |  | 
 | // Operations | 
 | 	int InsertItem(int nItem, LPTCITEM pTabCtrlItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TCM_INSERTITEM, nItem, (LPARAM)pTabCtrlItem); | 
 | 	} | 
 |  | 
 | 	int InsertItem(int nItem, UINT mask, LPCTSTR lpszItem, int iImage, LPARAM lParam) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		TCITEM tci = { 0 }; | 
 | 		tci.mask = mask; | 
 | 		tci.pszText = (LPTSTR) lpszItem; | 
 | 		tci.iImage = iImage; | 
 | 		tci.lParam = lParam; | 
 | 		return (int)::SendMessage(m_hWnd, TCM_INSERTITEM, nItem, (LPARAM)&tci); | 
 | 	} | 
 |  | 
 | 	int InsertItem(int nItem, LPCTSTR lpszItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		TCITEM tci = { 0 }; | 
 | 		tci.mask = TCIF_TEXT; | 
 | 		tci.pszText = (LPTSTR) lpszItem; | 
 | 		return (int)::SendMessage(m_hWnd, TCM_INSERTITEM, nItem, (LPARAM)&tci); | 
 | 	} | 
 |  | 
 | 	int AddItem(LPTCITEM pTabCtrlItem) | 
 | 	{ | 
 | 		return InsertItem(GetItemCount(), pTabCtrlItem); | 
 | 	} | 
 |  | 
 | 	int AddItem(UINT mask, LPCTSTR lpszItem, int iImage, LPARAM lParam) | 
 | 	{ | 
 | 		return InsertItem(GetItemCount(), mask, lpszItem, iImage, lParam); | 
 | 	} | 
 |  | 
 | 	int AddItem(LPCTSTR lpszItem) | 
 | 	{ | 
 | 		return InsertItem(GetItemCount(), lpszItem); | 
 | 	} | 
 |  | 
 | 	BOOL DeleteItem(int nItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TCM_DELETEITEM, nItem, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL DeleteAllItems() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TCM_DELETEALLITEMS, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void AdjustRect(BOOL bLarger, LPRECT lpRect) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TCM_ADJUSTRECT, bLarger, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	void RemoveImage(int nImage) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TCM_REMOVEIMAGE, nImage, 0L); | 
 | 	} | 
 |  | 
 | 	int HitTest(TC_HITTESTINFO* pHitTestInfo) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TCM_HITTEST, 0, (LPARAM)pHitTestInfo); | 
 | 	} | 
 |  | 
 | 	void DeselectAll(BOOL bExcludeFocus = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TCM_DESELECTALL, bExcludeFocus, 0L); | 
 | 	} | 
 |  | 
 | #if (_WIN32_IE >= 0x0400) | 
 | 	BOOL HighlightItem(int nIndex, BOOL bHighlight = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TCM_HIGHLIGHTITEM, nIndex, MAKELPARAM(bHighlight, 0)); | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0400) | 
 | }; | 
 |  | 
 | typedef CTabCtrlT<ATL::CWindow>   CTabCtrl; | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CTrackBarCtrl | 
 |  | 
 | template <class TBase> | 
 | class CTrackBarCtrlT : public TBase | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CTrackBarCtrlT(HWND hWnd = NULL) : TBase(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CTrackBarCtrlT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	static LPCTSTR GetWndClassName() | 
 | 	{ | 
 | 		return TRACKBAR_CLASS; | 
 | 	} | 
 |  | 
 | 	int GetLineSize() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TBM_GETLINESIZE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int SetLineSize(int nSize) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TBM_SETLINESIZE, 0, nSize); | 
 | 	} | 
 |  | 
 | 	int GetPageSize() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TBM_GETPAGESIZE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int SetPageSize(int nSize) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TBM_SETPAGESIZE, 0, nSize); | 
 | 	} | 
 |  | 
 | 	int GetRangeMin() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TBM_GETRANGEMIN, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetRangeMin(int nMin, BOOL bRedraw = FALSE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TBM_SETRANGEMIN, bRedraw, nMin); | 
 | 	} | 
 |  | 
 | 	int GetRangeMax() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TBM_GETRANGEMAX, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetRangeMax(int nMax, BOOL bRedraw = FALSE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TBM_SETRANGEMAX, bRedraw, nMax); | 
 | 	} | 
 |  | 
 | 	void GetRange(int& nMin, int& nMax) const | 
 | 	{ | 
 | 		nMin = GetRangeMin(); | 
 | 		nMax = GetRangeMax(); | 
 | 	} | 
 |  | 
 | 	void SetRange(int nMin, int nMax, BOOL bRedraw = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TBM_SETRANGE, bRedraw, MAKELPARAM(nMin, nMax)); | 
 | 	} | 
 |  | 
 | 	int GetSelStart() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TBM_GETSELSTART, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetSelStart(int nMin) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TBM_SETSELSTART, 0, (LPARAM)nMin); | 
 | 	} | 
 |  | 
 | 	int GetSelEnd() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TBM_GETSELEND, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetSelEnd(int nMax) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TBM_SETSELEND, 0, (LPARAM)nMax); | 
 | 	} | 
 |  | 
 | 	void GetSelection(int& nMin, int& nMax) const | 
 | 	{ | 
 | 		nMin = GetSelStart(); | 
 | 		nMax = GetSelEnd(); | 
 | 	} | 
 |  | 
 | 	void SetSelection(int nMin, int nMax) | 
 | 	{ | 
 | 		SetSelStart(nMin); | 
 | 		SetSelEnd(nMax); | 
 | 	} | 
 |  | 
 | 	void GetChannelRect(LPRECT lprc) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TBM_GETCHANNELRECT, 0, (LPARAM)lprc); | 
 | 	} | 
 |  | 
 | 	void GetThumbRect(LPRECT lprc) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TBM_GETTHUMBRECT, 0, (LPARAM)lprc); | 
 | 	} | 
 |  | 
 | 	int GetPos() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TBM_GETPOS, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetPos(int nPos) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TBM_SETPOS, TRUE, nPos); | 
 | 	} | 
 |  | 
 | 	UINT GetNumTics() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UINT)::SendMessage(m_hWnd, TBM_GETNUMTICS, 0, 0L); | 
 | 	} | 
 |  | 
 | 	DWORD* GetTicArray() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD*)::SendMessage(m_hWnd, TBM_GETPTICS, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int GetTic(int nTic) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TBM_GETTIC, nTic, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetTic(int nTic) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TBM_SETTIC, 0, nTic); | 
 | 	} | 
 |  | 
 | 	int GetTicPos(int nTic) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TBM_GETTICPOS, nTic, 0L); | 
 | 	} | 
 |  | 
 | 	void SetTicFreq(int nFreq) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TBM_SETTICFREQ, nFreq, 0L); | 
 | 	} | 
 |  | 
 | 	int GetThumbLength() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TBM_GETTHUMBLENGTH, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetThumbLength(int nLength) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TBM_SETTHUMBLENGTH, nLength, 0L); | 
 | 	} | 
 |  | 
 | 	void SetSel(int nStart, int nEnd, BOOL bRedraw = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & TBS_ENABLESELRANGE) != 0); | 
 | 		::SendMessage(m_hWnd, TBM_SETSEL, bRedraw, MAKELPARAM(nStart, nEnd)); | 
 | 	} | 
 |  | 
 | 	ATL::CWindow GetBuddy(BOOL bLeft = TRUE) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ATL::CWindow((HWND)::SendMessage(m_hWnd, TBM_GETBUDDY, bLeft, 0L)); | 
 | 	} | 
 |  | 
 | 	ATL::CWindow SetBuddy(HWND hWndBuddy, BOOL bLeft = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ATL::CWindow((HWND)::SendMessage(m_hWnd, TBM_SETBUDDY, bLeft, (LPARAM)hWndBuddy)); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	CToolTipCtrl GetToolTips() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CToolTipCtrl((HWND)::SendMessage(m_hWnd, TBM_GETTOOLTIPS, 0, 0L)); | 
 | 	} | 
 |  | 
 | 	void SetToolTips(HWND hWndTT) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TBM_SETTOOLTIPS, (WPARAM)hWndTT, 0L); | 
 | 	} | 
 |  | 
 | 	int SetTipSide(int nSide) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, TBM_SETTIPSIDE, nSide, 0L); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 |  | 
 | #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) | 
 | 	BOOL GetUnicodeFormat() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TBM_GETUNICODEFORMAT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, TBM_SETUNICODEFORMAT, bUnicode, 0L); | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) | 
 |  | 
 | // Operations | 
 | 	void ClearSel(BOOL bRedraw = FALSE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TBM_CLEARSEL, bRedraw, 0L); | 
 | 	} | 
 |  | 
 | 	void VerifyPos() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TBM_SETPOS, FALSE, 0L); | 
 | 	} | 
 |  | 
 | 	void ClearTics(BOOL bRedraw = FALSE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, TBM_CLEARTICS, bRedraw, 0L); | 
 | 	} | 
 | }; | 
 |  | 
 | typedef CTrackBarCtrlT<ATL::CWindow>   CTrackBarCtrl; | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CUpDownCtrl | 
 |  | 
 | template <class TBase> | 
 | class CUpDownCtrlT : public TBase | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CUpDownCtrlT(HWND hWnd = NULL) : TBase(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CUpDownCtrlT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	static LPCTSTR GetWndClassName() | 
 | 	{ | 
 | 		return UPDOWN_CLASS; | 
 | 	} | 
 |  | 
 | 	UINT GetAccel(int nAccel, UDACCEL* pAccel) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UINT)LOWORD(::SendMessage(m_hWnd, UDM_GETACCEL, nAccel, (LPARAM)pAccel)); | 
 | 	} | 
 |  | 
 | 	BOOL SetAccel(int nAccel, UDACCEL* pAccel) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)LOWORD(::SendMessage(m_hWnd, UDM_SETACCEL, nAccel, (LPARAM)pAccel)); | 
 | 	} | 
 |  | 
 | 	UINT GetBase() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UINT)LOWORD(::SendMessage(m_hWnd, UDM_GETBASE, 0, 0L)); | 
 | 	} | 
 |  | 
 | 	int SetBase(int nBase) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, UDM_SETBASE, nBase, 0L); | 
 | 	} | 
 |  | 
 | 	ATL::CWindow GetBuddy() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ATL::CWindow((HWND)::SendMessage(m_hWnd, UDM_GETBUDDY, 0, 0L)); | 
 | 	} | 
 |  | 
 | 	ATL::CWindow SetBuddy(HWND hWndBuddy) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ATL::CWindow((HWND)::SendMessage(m_hWnd, UDM_SETBUDDY, (WPARAM)hWndBuddy, 0L)); | 
 | 	} | 
 |  | 
 | 	int GetPos(LPBOOL lpbError = NULL) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, UDM_GETPOS, 0, 0L); | 
 | 		// Note: Seems that Windows always sets error to TRUE if | 
 | 		// UDS_SETBUDDYINT style is not used | 
 | 		if(lpbError != NULL) | 
 | 			*lpbError = (HIWORD(dwRet) != 0) ? TRUE : FALSE; | 
 | 		return (int)(short)LOWORD(dwRet); | 
 | 	} | 
 |  | 
 | 	int SetPos(int nPos) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)(short)LOWORD(::SendMessage(m_hWnd, UDM_SETPOS, 0, MAKELPARAM(nPos, 0))); | 
 | 	} | 
 |  | 
 | 	DWORD GetRange() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, UDM_GETRANGE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void GetRange(int& nLower, int& nUpper) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, UDM_GETRANGE, 0, 0L); | 
 | 		nLower = (int)(short)HIWORD(dwRet); | 
 | 		nUpper = (int)(short)LOWORD(dwRet); | 
 | 	} | 
 |  | 
 | 	void SetRange(int nLower, int nUpper) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, UDM_SETRANGE, 0, MAKELPARAM(nUpper, nLower)); | 
 | 	} | 
 |  | 
 | #if (_WIN32_IE >= 0x0400) | 
 | 	void SetRange32(int nLower, int nUpper) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, UDM_SETRANGE32, nLower, nUpper); | 
 | 	} | 
 |  | 
 | 	void GetRange32(int& nLower, int& nUpper) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, UDM_GETRANGE32, (WPARAM)&nLower, (LPARAM)&nUpper); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	BOOL GetUnicodeFormat() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, UDM_GETUNICODEFORMAT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, UDM_SETUNICODEFORMAT, bUnicode, 0L); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 | #endif // (_WIN32_IE >= 0x0400) | 
 |  | 
 | #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) | 
 | 	int GetPos32(LPBOOL lpbError = NULL) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		// Note: Seems that Windows always sets error to TRUE if | 
 | 		// UDS_SETBUDDYINT style is not used | 
 | 		return (int)::SendMessage(m_hWnd, UDM_GETPOS32, 0, (LPARAM)lpbError); | 
 | 	} | 
 |  | 
 | 	int SetPos32(int nPos) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, UDM_SETPOS32, 0, (LPARAM)nPos); | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) | 
 | }; | 
 |  | 
 | typedef CUpDownCtrlT<ATL::CWindow>   CUpDownCtrl; | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CProgressBarCtrl | 
 |  | 
 | template <class TBase> | 
 | class CProgressBarCtrlT : public TBase | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CProgressBarCtrlT(HWND hWnd = NULL) : TBase(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CProgressBarCtrlT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	static LPCTSTR GetWndClassName() | 
 | 	{ | 
 | 		return PROGRESS_CLASS; | 
 | 	} | 
 |  | 
 | 	DWORD SetRange(int nLower, int nUpper) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, PBM_SETRANGE, 0, MAKELPARAM(nLower, nUpper)); | 
 | 	} | 
 |  | 
 | 	int SetPos(int nPos) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)(short)LOWORD(::SendMessage(m_hWnd, PBM_SETPOS, nPos, 0L)); | 
 | 	} | 
 |  | 
 | 	int OffsetPos(int nPos) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)(short)LOWORD(::SendMessage(m_hWnd, PBM_DELTAPOS, nPos, 0L)); | 
 | 	} | 
 |  | 
 | 	int SetStep(int nStep) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)(short)LOWORD(::SendMessage(m_hWnd, PBM_SETSTEP, nStep, 0L)); | 
 | 	} | 
 |  | 
 | 	UINT GetPos() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UINT)::SendMessage(m_hWnd, PBM_GETPOS, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void GetRange(PPBRANGE pPBRange) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(pPBRange != NULL); | 
 | 		::SendMessage(m_hWnd, PBM_GETRANGE, TRUE, (LPARAM)pPBRange); | 
 | 	} | 
 |  | 
 | 	void GetRange(int& nLower, int& nUpper) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		PBRANGE range = { 0 }; | 
 | 		::SendMessage(m_hWnd, PBM_GETRANGE, TRUE, (LPARAM)&range); | 
 | 		nLower = range.iLow; | 
 | 		nUpper = range.iHigh; | 
 | 	} | 
 |  | 
 | 	int GetRangeLimit(BOOL bLowLimit) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, PBM_GETRANGE, bLowLimit, (LPARAM)NULL); | 
 | 	} | 
 |  | 
 | 	DWORD SetRange32(int nMin, int nMax) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, PBM_SETRANGE32, nMin, nMax); | 
 | 	} | 
 |  | 
 | #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) | 
 | 	COLORREF SetBarColor(COLORREF clr) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, PBM_SETBARCOLOR, 0, (LPARAM)clr); | 
 | 	} | 
 |  | 
 | 	COLORREF SetBkColor(COLORREF clr) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, PBM_SETBKCOLOR, 0, (LPARAM)clr); | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0501) && defined(PBM_SETMARQUEE) | 
 | 	BOOL SetMarquee(BOOL bMarquee, UINT uUpdateTime = 0U) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, PBM_SETMARQUEE, (WPARAM)bMarquee, (LPARAM)uUpdateTime); | 
 | 	} | 
 | #endif // (_WIN32_WINNT >= 0x0501) && defined(PBM_SETMARQUEE) | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0600) | 
 | 	int GetStep() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, PBM_GETSTEP, 0, 0L); | 
 | 	} | 
 |  | 
 | 	COLORREF GetBkColor() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, PBM_GETBKCOLOR, 0, 0L); | 
 | 	} | 
 |  | 
 | 	COLORREF GetBarColor() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, PBM_GETBARCOLOR, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int GetState() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, PBM_GETSTATE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int SetState(int nState) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, PBM_SETSTATE, nState, 0L); | 
 | 	} | 
 | #endif // (_WIN32_WINNT >= 0x0600) | 
 |  | 
 | // Operations | 
 | 	int StepIt() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)(short)LOWORD(::SendMessage(m_hWnd, PBM_STEPIT, 0, 0L)); | 
 | 	} | 
 | }; | 
 |  | 
 | typedef CProgressBarCtrlT<ATL::CWindow>   CProgressBarCtrl; | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CHotKeyCtrl | 
 |  | 
 | #ifndef _WIN32_WCE | 
 |  | 
 | template <class TBase> | 
 | class CHotKeyCtrlT : public TBase | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CHotKeyCtrlT(HWND hWnd = NULL) : TBase(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CHotKeyCtrlT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	static LPCTSTR GetWndClassName() | 
 | 	{ | 
 | 		return HOTKEY_CLASS; | 
 | 	} | 
 |  | 
 | 	DWORD GetHotKey() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, HKM_GETHOTKEY, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void GetHotKey(WORD &wVirtualKeyCode, WORD &wModifiers) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		DWORD dw = (DWORD)::SendMessage(m_hWnd, HKM_GETHOTKEY, 0, 0L); | 
 | 		wVirtualKeyCode = LOBYTE(LOWORD(dw)); | 
 | 		wModifiers = HIBYTE(LOWORD(dw)); | 
 | 	} | 
 |  | 
 | 	void SetHotKey(WORD wVirtualKeyCode, WORD wModifiers) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, HKM_SETHOTKEY, MAKEWORD(wVirtualKeyCode, wModifiers), 0L); | 
 | 	} | 
 |  | 
 | 	void SetRules(WORD wInvalidComb, WORD wModifiers) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, HKM_SETRULES, wInvalidComb, MAKELPARAM(wModifiers, 0)); | 
 | 	} | 
 | }; | 
 |  | 
 | typedef CHotKeyCtrlT<ATL::CWindow>   CHotKeyCtrl; | 
 |  | 
 | #endif // !_WIN32_WCE | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CAnimateCtrl | 
 |  | 
 | #ifndef _WIN32_WCE | 
 |  | 
 | template <class TBase> | 
 | class CAnimateCtrlT : public TBase | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CAnimateCtrlT(HWND hWnd = NULL) : TBase(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CAnimateCtrlT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	static LPCTSTR GetWndClassName() | 
 | 	{ | 
 | 		return ANIMATE_CLASS; | 
 | 	} | 
 |  | 
 | // Operations | 
 | 	BOOL Open(ATL::_U_STRINGorID FileName) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, ACM_OPEN, 0, (LPARAM)FileName.m_lpstr); | 
 | 	} | 
 |  | 
 | 	BOOL Play(UINT nFrom, UINT nTo, UINT nRep) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, ACM_PLAY, nRep, MAKELPARAM(nFrom, nTo)); | 
 | 	} | 
 |  | 
 | 	BOOL Stop() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, ACM_STOP, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL Close() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, ACM_OPEN, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL Seek(UINT nTo) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, ACM_PLAY, 0, MAKELPARAM(nTo, nTo)); | 
 | 	} | 
 |  | 
 | 	// Vista only | 
 | 	BOOL IsPlaying() const | 
 | 	{ | 
 | #ifndef ACM_ISPLAYING | 
 | 		const UINT ACM_ISPLAYING = (WM_USER+104); | 
 | #endif | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, ACM_ISPLAYING, 0, 0L); | 
 | 	} | 
 | }; | 
 |  | 
 | typedef CAnimateCtrlT<ATL::CWindow>   CAnimateCtrl; | 
 |  | 
 | #endif // !_WIN32_WCE | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CRichEditCtrl | 
 |  | 
 | #ifndef _WIN32_WCE | 
 |  | 
 | #ifdef _UNICODE | 
 | #if (_RICHEDIT_VER == 0x0100) | 
 | #undef RICHEDIT_CLASS | 
 | #define RICHEDIT_CLASS	L"RICHEDIT" | 
 | #endif // (_RICHEDIT_VER == 0x0100) | 
 | #endif // _UNICODE | 
 |  | 
 | template <class TBase> | 
 | class CRichEditCtrlT : public TBase | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CRichEditCtrlT(HWND hWnd = NULL) : TBase(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CRichEditCtrlT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	static LPCTSTR GetWndClassName() | 
 | 	{ | 
 | 		return RICHEDIT_CLASS; | 
 | 	} | 
 |  | 
 | 	static LPCTSTR GetLibraryName() | 
 | 	{ | 
 | #if (_RICHEDIT_VER >= 0x0200) | 
 | 		return _T("RICHED20.DLL"); | 
 | #else | 
 | 		return _T("RICHED32.DLL"); | 
 | #endif | 
 | 	} | 
 |  | 
 | 	int GetLineCount() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, EM_GETLINECOUNT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL GetModify() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_GETMODIFY, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetModify(BOOL bModified = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_SETMODIFY, bModified, 0L); | 
 | 	} | 
 |  | 
 | 	void GetRect(LPRECT lpRect) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_GETRECT, 0, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	DWORD GetOptions() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, EM_GETOPTIONS, 0, 0L); | 
 | 	} | 
 |  | 
 | 	DWORD SetOptions(WORD wOperation, DWORD dwOptions) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, EM_SETOPTIONS, wOperation, dwOptions); | 
 | 	} | 
 |  | 
 | 	// NOTE: first word in lpszBuffer must contain the size of the buffer! | 
 | 	int GetLine(int nIndex, LPTSTR lpszBuffer) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer); | 
 | 	} | 
 |  | 
 | 	int GetLine(int nIndex, LPTSTR lpszBuffer, int nMaxLength) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		*(LPWORD)lpszBuffer = (WORD)nMaxLength; | 
 | 		return (int)::SendMessage(m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer); | 
 | 	} | 
 |  | 
 | 	BOOL CanUndo() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_CANUNDO, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL CanPaste(UINT nFormat = 0) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_CANPASTE, nFormat, 0L); | 
 | 	} | 
 |  | 
 | 	void GetSel(LONG& nStartChar, LONG& nEndChar) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		CHARRANGE cr = { 0, 0 }; | 
 | 		::SendMessage(m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr); | 
 | 		nStartChar = cr.cpMin; | 
 | 		nEndChar = cr.cpMax; | 
 | 	} | 
 |  | 
 | 	void GetSel(CHARRANGE &cr) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr); | 
 | 	} | 
 |  | 
 | 	int SetSel(LONG nStartChar, LONG nEndChar) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		CHARRANGE cr = { nStartChar, nEndChar }; | 
 | 		return (int)::SendMessage(m_hWnd, EM_EXSETSEL, 0, (LPARAM)&cr); | 
 | 	} | 
 |  | 
 | 	int SetSel(CHARRANGE &cr) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, EM_EXSETSEL, 0, (LPARAM)&cr); | 
 | 	} | 
 |  | 
 | 	int SetSelAll() | 
 | 	{ | 
 | 		return SetSel(0, -1); | 
 | 	} | 
 |  | 
 | 	int SetSelNone() | 
 | 	{ | 
 | 		return SetSel(-1, 0); | 
 | 	} | 
 |  | 
 | 	DWORD GetDefaultCharFormat(CHARFORMAT& cf) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		cf.cbSize = sizeof(CHARFORMAT); | 
 | 		return (DWORD)::SendMessage(m_hWnd, EM_GETCHARFORMAT, 0, (LPARAM)&cf); | 
 | 	} | 
 |  | 
 | 	DWORD GetSelectionCharFormat(CHARFORMAT& cf) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		cf.cbSize = sizeof(CHARFORMAT); | 
 | 		return (DWORD)::SendMessage(m_hWnd, EM_GETCHARFORMAT, 1, (LPARAM)&cf); | 
 | 	} | 
 |  | 
 | 	DWORD GetEventMask() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, EM_GETEVENTMASK, 0, 0L); | 
 | 	} | 
 |  | 
 | 	LONG GetLimitText() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (LONG)::SendMessage(m_hWnd, EM_GETLIMITTEXT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	DWORD GetParaFormat(PARAFORMAT& pf) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		pf.cbSize = sizeof(PARAFORMAT); | 
 | 		return (DWORD)::SendMessage(m_hWnd, EM_GETPARAFORMAT, 0, (LPARAM)&pf); | 
 | 	} | 
 |  | 
 | #if (_RICHEDIT_VER >= 0x0200) | 
 | 	LONG GetSelText(LPTSTR lpstrBuff) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (LONG)::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrBuff); | 
 | 	} | 
 | #else // !(_RICHEDIT_VER >= 0x0200) | 
 | 	// RichEdit 1.0 EM_GETSELTEXT is ANSI only | 
 | 	LONG GetSelText(LPSTR lpstrBuff) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (LONG)::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrBuff); | 
 | 	} | 
 | #endif // !(_RICHEDIT_VER >= 0x0200) | 
 |  | 
 | #ifndef _ATL_NO_COM | 
 | 	BOOL GetSelTextBSTR(BSTR& bstrText) const | 
 | 	{ | 
 | 		USES_CONVERSION; | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(bstrText == NULL); | 
 |  | 
 | 		CHARRANGE cr = { 0, 0 }; | 
 | 		::SendMessage(m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr); | 
 |  | 
 | #if (_RICHEDIT_VER >= 0x0200) | 
 | 		CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff; | 
 | 		LPTSTR lpstrText = buff.Allocate(cr.cpMax - cr.cpMin + 1); | 
 | 		if(lpstrText == NULL) | 
 | 			return FALSE; | 
 | 		if(::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrText) == 0) | 
 | 			return FALSE; | 
 |  | 
 | 		bstrText = ::SysAllocString(T2W(lpstrText)); | 
 | #else // !(_RICHEDIT_VER >= 0x0200) | 
 | 		CTempBuffer<char, _WTL_STACK_ALLOC_THRESHOLD> buff; | 
 | 		LPSTR lpstrText = buff.Allocate(cr.cpMax - cr.cpMin + 1); | 
 | 		if(lpstrText == NULL) | 
 | 			return FALSE; | 
 | 		if(::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrText) == 0) | 
 | 			return FALSE; | 
 |  | 
 | 		bstrText = ::SysAllocString(A2W(lpstrText)); | 
 | #endif // !(_RICHEDIT_VER >= 0x0200) | 
 |  | 
 | 		return (bstrText != NULL) ? TRUE : FALSE; | 
 | 	} | 
 | #endif // !_ATL_NO_COM | 
 |  | 
 | #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) | 
 | 	LONG GetSelText(_CSTRING_NS::CString& strText) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 |  | 
 | 		CHARRANGE cr = { 0, 0 }; | 
 | 		::SendMessage(m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr); | 
 |  | 
 | #if (_RICHEDIT_VER >= 0x0200) | 
 | 		LONG lLen = 0; | 
 | 		LPTSTR lpstrText = strText.GetBufferSetLength(cr.cpMax - cr.cpMin); | 
 | 		if(lpstrText != NULL) | 
 | 		{ | 
 | 			lLen = (LONG)::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrText); | 
 | 			strText.ReleaseBuffer(); | 
 | 		} | 
 | #else // !(_RICHEDIT_VER >= 0x0200) | 
 | 		CTempBuffer<char, _WTL_STACK_ALLOC_THRESHOLD> buff; | 
 | 		LPSTR lpstrText = buff.Allocate(cr.cpMax - cr.cpMin + 1); | 
 | 		if(lpstrText == NULL) | 
 | 			return 0; | 
 | 		LONG lLen = (LONG)::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrText); | 
 | 		if(lLen == 0) | 
 | 			return 0; | 
 |  | 
 | 		USES_CONVERSION; | 
 | 		strText = A2T(lpstrText); | 
 | #endif // !(_RICHEDIT_VER >= 0x0200) | 
 |  | 
 | 		return lLen; | 
 | 	} | 
 | #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) | 
 |  | 
 | 	WORD GetSelectionType() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (WORD)::SendMessage(m_hWnd, EM_SELECTIONTYPE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	COLORREF SetBackgroundColor(COLORREF cr) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, EM_SETBKGNDCOLOR, 0, cr); | 
 | 	} | 
 |  | 
 | 	COLORREF SetBackgroundColor()   // sets to system background | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, EM_SETBKGNDCOLOR, 1, 0); | 
 | 	} | 
 |  | 
 | 	BOOL SetCharFormat(CHARFORMAT& cf, WORD wFlags) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		cf.cbSize = sizeof(CHARFORMAT); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, (WPARAM)wFlags, (LPARAM)&cf); | 
 | 	} | 
 |  | 
 | 	BOOL SetDefaultCharFormat(CHARFORMAT& cf) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		cf.cbSize = sizeof(CHARFORMAT); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, 0, (LPARAM)&cf); | 
 | 	} | 
 |  | 
 | 	BOOL SetSelectionCharFormat(CHARFORMAT& cf) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		cf.cbSize = sizeof(CHARFORMAT); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); | 
 | 	} | 
 |  | 
 | 	BOOL SetWordCharFormat(CHARFORMAT& cf) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		cf.cbSize = sizeof(CHARFORMAT); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, SCF_SELECTION | SCF_WORD, (LPARAM)&cf); | 
 | 	} | 
 |  | 
 | 	DWORD SetEventMask(DWORD dwEventMask) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, EM_SETEVENTMASK, 0, dwEventMask); | 
 | 	} | 
 |  | 
 | 	BOOL SetParaFormat(PARAFORMAT& pf) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		pf.cbSize = sizeof(PARAFORMAT); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_SETPARAFORMAT, 0, (LPARAM)&pf); | 
 | 	} | 
 |  | 
 | 	BOOL SetTargetDevice(HDC hDC, int cxLineWidth) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_SETTARGETDEVICE, (WPARAM)hDC, cxLineWidth); | 
 | 	} | 
 |  | 
 | 	int GetTextLength() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, WM_GETTEXTLENGTH, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetReadOnly(BOOL bReadOnly = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_SETREADONLY, bReadOnly, 0L); | 
 | 	} | 
 |  | 
 | 	int GetFirstVisibleLine() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, EM_GETFIRSTVISIBLELINE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	EDITWORDBREAKPROCEX GetWordBreakProcEx() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (EDITWORDBREAKPROCEX)::SendMessage(m_hWnd, EM_GETWORDBREAKPROCEX, 0, 0L); | 
 | 	} | 
 |  | 
 | 	EDITWORDBREAKPROCEX SetWordBreakProcEx(EDITWORDBREAKPROCEX pfnEditWordBreakProcEx) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (EDITWORDBREAKPROCEX)::SendMessage(m_hWnd, EM_SETWORDBREAKPROCEX, 0, (LPARAM)pfnEditWordBreakProcEx); | 
 | 	} | 
 |  | 
 | 	int GetTextRange(TEXTRANGE* pTextRange) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, EM_GETTEXTRANGE, 0, (LPARAM)pTextRange); | 
 | 	} | 
 |  | 
 | #if (_RICHEDIT_VER >= 0x0200) | 
 | 	int GetTextRange(LONG nStartChar, LONG nEndChar, LPTSTR lpstrText) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		TEXTRANGE tr = { 0 }; | 
 | 		tr.chrg.cpMin = nStartChar; | 
 | 		tr.chrg.cpMax = nEndChar; | 
 | 		tr.lpstrText = lpstrText; | 
 | 		return (int)::SendMessage(m_hWnd, EM_GETTEXTRANGE, 0, (LPARAM)&tr); | 
 | 	} | 
 | #else // !(_RICHEDIT_VER >= 0x0200) | 
 |  | 
 | 	int GetTextRange(LONG nStartChar, LONG nEndChar, LPSTR lpstrText) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		TEXTRANGE tr = { 0 }; | 
 | 		tr.chrg.cpMin = nStartChar; | 
 | 		tr.chrg.cpMax = nEndChar; | 
 | 		tr.lpstrText = lpstrText; | 
 | 		return (int)::SendMessage(m_hWnd, EM_GETTEXTRANGE, 0, (LPARAM)&tr); | 
 | 	} | 
 | #endif // !(_RICHEDIT_VER >= 0x0200) | 
 |  | 
 | #if (_RICHEDIT_VER >= 0x0200) | 
 | 	DWORD GetDefaultCharFormat(CHARFORMAT2& cf) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		cf.cbSize = sizeof(CHARFORMAT2); | 
 | 		return (DWORD)::SendMessage(m_hWnd, EM_GETCHARFORMAT, 0, (LPARAM)&cf); | 
 | 	} | 
 |  | 
 | 	BOOL SetCharFormat(CHARFORMAT2& cf, WORD wFlags) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		cf.cbSize = sizeof(CHARFORMAT2); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, (WPARAM)wFlags, (LPARAM)&cf); | 
 | 	} | 
 |  | 
 | 	BOOL SetDefaultCharFormat(CHARFORMAT2& cf) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		cf.cbSize = sizeof(CHARFORMAT2); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, 0, (LPARAM)&cf); | 
 | 	} | 
 |  | 
 | 	DWORD GetSelectionCharFormat(CHARFORMAT2& cf) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		cf.cbSize = sizeof(CHARFORMAT2); | 
 | 		return (DWORD)::SendMessage(m_hWnd, EM_GETCHARFORMAT, 1, (LPARAM)&cf); | 
 | 	} | 
 |  | 
 | 	BOOL SetSelectionCharFormat(CHARFORMAT2& cf) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		cf.cbSize = sizeof(CHARFORMAT2); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); | 
 | 	} | 
 |  | 
 | 	BOOL SetWordCharFormat(CHARFORMAT2& cf) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		cf.cbSize = sizeof(CHARFORMAT2); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, SCF_SELECTION | SCF_WORD, (LPARAM)&cf); | 
 | 	} | 
 |  | 
 | 	DWORD GetParaFormat(PARAFORMAT2& pf) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		pf.cbSize = sizeof(PARAFORMAT2); | 
 | 		return (DWORD)::SendMessage(m_hWnd, EM_GETPARAFORMAT, 0, (LPARAM)&pf); | 
 | 	} | 
 |  | 
 | 	BOOL SetParaFormat(PARAFORMAT2& pf) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		pf.cbSize = sizeof(PARAFORMAT2); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_SETPARAFORMAT, 0, (LPARAM)&pf); | 
 | 	} | 
 |  | 
 | 	TEXTMODE GetTextMode() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (TEXTMODE)::SendMessage(m_hWnd, EM_GETTEXTMODE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetTextMode(TEXTMODE enumTextMode) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return !(BOOL)::SendMessage(m_hWnd, EM_SETTEXTMODE, enumTextMode, 0L); | 
 | 	} | 
 |  | 
 | 	UNDONAMEID GetUndoName() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UNDONAMEID)::SendMessage(m_hWnd, EM_GETUNDONAME, 0, 0L); | 
 | 	} | 
 |  | 
 | 	UNDONAMEID GetRedoName() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UNDONAMEID)::SendMessage(m_hWnd, EM_GETREDONAME, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL CanRedo() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_CANREDO, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL GetAutoURLDetect() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_GETAUTOURLDETECT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetAutoURLDetect(BOOL bAutoDetect = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return !(BOOL)::SendMessage(m_hWnd, EM_AUTOURLDETECT, bAutoDetect, 0L); | 
 | 	} | 
 |  | 
 | 	// this method is deprecated, please use SetAutoURLDetect | 
 | 	BOOL EnableAutoURLDetect(BOOL bEnable = TRUE) { return SetAutoURLDetect(bEnable); } | 
 |  | 
 | 	UINT SetUndoLimit(UINT uUndoLimit) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UINT)::SendMessage(m_hWnd, EM_SETUNDOLIMIT, uUndoLimit, 0L); | 
 | 	} | 
 |  | 
 | 	void SetPalette(HPALETTE hPalette) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_SETPALETTE, (WPARAM)hPalette, 0L); | 
 | 	} | 
 |  | 
 | 	int GetTextEx(GETTEXTEX* pGetTextEx, LPTSTR lpstrText) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, EM_GETTEXTEX, (WPARAM)pGetTextEx, (LPARAM)lpstrText); | 
 | 	} | 
 |  | 
 | 	int GetTextEx(LPTSTR lpstrText, int nTextLen, DWORD dwFlags = GT_DEFAULT, UINT uCodePage = CP_ACP, LPCSTR lpDefaultChar = NULL, LPBOOL lpUsedDefChar = NULL) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		GETTEXTEX gte = { 0 }; | 
 | 		gte.cb = nTextLen * sizeof(TCHAR); | 
 | 		gte.codepage = uCodePage; | 
 | 		gte.flags = dwFlags; | 
 | 		gte.lpDefaultChar = lpDefaultChar; | 
 | 		gte.lpUsedDefChar = lpUsedDefChar; | 
 | 		return (int)::SendMessage(m_hWnd, EM_GETTEXTEX, (WPARAM)>e, (LPARAM)lpstrText); | 
 | 	} | 
 |  | 
 | 	int GetTextLengthEx(GETTEXTLENGTHEX* pGetTextLengthEx) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, EM_GETTEXTLENGTHEX, (WPARAM)pGetTextLengthEx, 0L); | 
 | 	} | 
 |  | 
 | 	int GetTextLengthEx(DWORD dwFlags = GTL_DEFAULT, UINT uCodePage = CP_ACP) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		GETTEXTLENGTHEX gtle = { 0 }; | 
 | 		gtle.codepage = uCodePage; | 
 | 		gtle.flags = dwFlags; | 
 | 		return (int)::SendMessage(m_hWnd, EM_GETTEXTLENGTHEX, (WPARAM)>le, 0L); | 
 | 	} | 
 | #endif // (_RICHEDIT_VER >= 0x0200) | 
 |  | 
 | #if (_RICHEDIT_VER >= 0x0300) | 
 | 	int SetTextEx(SETTEXTEX* pSetTextEx, LPCTSTR lpstrText) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, EM_SETTEXTEX, (WPARAM)pSetTextEx, (LPARAM)lpstrText); | 
 | 	} | 
 |  | 
 | 	int SetTextEx(LPCTSTR lpstrText, DWORD dwFlags = ST_DEFAULT, UINT uCodePage = CP_ACP) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		SETTEXTEX ste = { 0 }; | 
 | 		ste.flags = dwFlags; | 
 | 		ste.codepage = uCodePage; | 
 | 		return (int)::SendMessage(m_hWnd, EM_SETTEXTEX, (WPARAM)&ste, (LPARAM)lpstrText); | 
 | 	} | 
 |  | 
 | 	int GetEditStyle() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, EM_GETEDITSTYLE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int SetEditStyle(int nStyle, int nMask = -1) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		if(nMask == -1) | 
 | 			nMask = nStyle;   // set everything specified | 
 | 		return (int)::SendMessage(m_hWnd, EM_SETEDITSTYLE, nStyle, nMask); | 
 | 	} | 
 |  | 
 | 	BOOL SetFontSize(int nFontSizeDelta) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(nFontSizeDelta >= -1637 && nFontSizeDelta <= 1638); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_SETFONTSIZE, nFontSizeDelta, 0L); | 
 | 	} | 
 |  | 
 | 	void GetScrollPos(LPPOINT lpPoint) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(lpPoint != NULL); | 
 | 		::SendMessage(m_hWnd, EM_GETSCROLLPOS, 0, (LPARAM)lpPoint); | 
 | 	} | 
 |  | 
 | 	void SetScrollPos(LPPOINT lpPoint) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(lpPoint != NULL); | 
 | 		::SendMessage(m_hWnd, EM_SETSCROLLPOS, 0, (LPARAM)lpPoint); | 
 | 	} | 
 |  | 
 | 	BOOL GetZoom(int& nNum, int& nDen) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_GETZOOM, (WPARAM)&nNum, (LPARAM)&nDen); | 
 | 	} | 
 |  | 
 | 	BOOL SetZoom(int nNum, int nDen) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(nNum >= 0 && nNum <= 64); | 
 | 		ATLASSERT(nDen >= 0 && nDen <= 64); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_SETZOOM, nNum, nDen); | 
 | 	} | 
 |  | 
 | 	BOOL SetZoomOff() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_SETZOOM, 0, 0L); | 
 | 	} | 
 | #endif // (_RICHEDIT_VER >= 0x0300) | 
 |  | 
 | // Operations | 
 | 	void LimitText(LONG nChars = 0) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_EXLIMITTEXT, 0, nChars); | 
 | 	} | 
 |  | 
 | 	int LineFromChar(LONG nIndex) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, EM_EXLINEFROMCHAR, 0, nIndex); | 
 | 	} | 
 |  | 
 | 	POINT PosFromChar(LONG nChar) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		POINT point = { 0, 0 }; | 
 | 		::SendMessage(m_hWnd, EM_POSFROMCHAR, (WPARAM)&point, nChar); | 
 | 		return point; | 
 | 	} | 
 |  | 
 | 	int CharFromPos(POINT pt) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		POINTL ptl = { pt.x, pt.y }; | 
 | 		return (int)::SendMessage(m_hWnd, EM_CHARFROMPOS, 0, (LPARAM)&ptl); | 
 | 	} | 
 |  | 
 | 	void EmptyUndoBuffer() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_EMPTYUNDOBUFFER, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int LineIndex(int nLine = -1) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, EM_LINEINDEX, nLine, 0L); | 
 | 	} | 
 |  | 
 | 	int LineLength(int nLine = -1) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, EM_LINELENGTH, nLine, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL LineScroll(int nLines, int nChars = 0) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_LINESCROLL, nChars, nLines); | 
 | 	} | 
 |  | 
 | 	void ReplaceSel(LPCTSTR lpszNewText, BOOL bCanUndo = FALSE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_REPLACESEL, (WPARAM) bCanUndo, (LPARAM)lpszNewText); | 
 | 	} | 
 |  | 
 | 	void SetRect(LPCRECT lpRect) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_SETRECT, 0, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	BOOL DisplayBand(LPRECT pDisplayRect) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_DISPLAYBAND, 0, (LPARAM)pDisplayRect); | 
 | 	} | 
 |  | 
 | 	LONG FindText(DWORD dwFlags, FINDTEXT& ft) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | #if (_RICHEDIT_VER >= 0x0200) && defined(_UNICODE) | 
 | 		return (LONG)::SendMessage(m_hWnd, EM_FINDTEXTW, dwFlags, (LPARAM)&ft); | 
 | #else | 
 | 		return (LONG)::SendMessage(m_hWnd, EM_FINDTEXT, dwFlags, (LPARAM)&ft); | 
 | #endif | 
 | 	} | 
 |  | 
 | 	LONG FindText(DWORD dwFlags, FINDTEXTEX& ft) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | #if (_RICHEDIT_VER >= 0x0200) && defined(_UNICODE) | 
 | 		return (LONG)::SendMessage(m_hWnd, EM_FINDTEXTEXW, dwFlags, (LPARAM)&ft); | 
 | #else | 
 | 		return (LONG)::SendMessage(m_hWnd, EM_FINDTEXTEX, dwFlags, (LPARAM)&ft); | 
 | #endif | 
 | 	} | 
 |  | 
 | 	LONG FormatRange(FORMATRANGE& fr, BOOL bDisplay = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (LONG)::SendMessage(m_hWnd, EM_FORMATRANGE, bDisplay, (LPARAM)&fr); | 
 | 	} | 
 |  | 
 | 	LONG FormatRange(FORMATRANGE* pFormatRange, BOOL bDisplay = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (LONG)::SendMessage(m_hWnd, EM_FORMATRANGE, bDisplay, (LPARAM)pFormatRange); | 
 | 	} | 
 |  | 
 | 	void HideSelection(BOOL bHide = TRUE, BOOL bChangeStyle = FALSE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_HIDESELECTION, bHide, bChangeStyle); | 
 | 	} | 
 |  | 
 | 	void PasteSpecial(UINT uClipFormat, DWORD dwAspect = 0, HMETAFILE hMF = 0) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		REPASTESPECIAL reps = { dwAspect, (DWORD_PTR)hMF }; | 
 | 		::SendMessage(m_hWnd, EM_PASTESPECIAL, uClipFormat, (LPARAM)&reps); | 
 | 	} | 
 |  | 
 | 	void RequestResize() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_REQUESTRESIZE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	LONG StreamIn(UINT uFormat, EDITSTREAM& es) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (LONG)::SendMessage(m_hWnd, EM_STREAMIN, uFormat, (LPARAM)&es); | 
 | 	} | 
 |  | 
 | 	LONG StreamOut(UINT uFormat, EDITSTREAM& es) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (LONG)::SendMessage(m_hWnd, EM_STREAMOUT, uFormat, (LPARAM)&es); | 
 | 	} | 
 |  | 
 | 	DWORD FindWordBreak(int nCode, LONG nStartChar) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, EM_FINDWORDBREAK, nCode, nStartChar); | 
 | 	} | 
 |  | 
 | 	// Additional operations | 
 | 	void ScrollCaret() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_SCROLLCARET, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int InsertText(long nInsertAfterChar, LPCTSTR lpstrText, BOOL bCanUndo = FALSE) | 
 | 	{ | 
 | 		int nRet = SetSel(nInsertAfterChar, nInsertAfterChar); | 
 | 		ReplaceSel(lpstrText, bCanUndo); | 
 | 		return nRet; | 
 | 	} | 
 |  | 
 | 	int AppendText(LPCTSTR lpstrText, BOOL bCanUndo = FALSE) | 
 | 	{ | 
 | 		return InsertText(GetWindowTextLength(), lpstrText, bCanUndo); | 
 | 	} | 
 |  | 
 | 	// Clipboard operations | 
 | 	BOOL Undo() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_UNDO, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void Clear() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, WM_CLEAR, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void Copy() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, WM_COPY, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void Cut() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, WM_CUT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void Paste() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, WM_PASTE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	// OLE support | 
 | 	IRichEditOle* GetOleInterface() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		IRichEditOle *pRichEditOle = NULL; | 
 | 		::SendMessage(m_hWnd, EM_GETOLEINTERFACE, 0, (LPARAM)&pRichEditOle); | 
 | 		return pRichEditOle; | 
 | 	} | 
 |  | 
 | 	BOOL SetOleCallback(IRichEditOleCallback* pCallback) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_SETOLECALLBACK, 0, (LPARAM)pCallback); | 
 | 	} | 
 |  | 
 | #if (_RICHEDIT_VER >= 0x0200) | 
 | 	BOOL Redo() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_REDO, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void StopGroupTyping() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_STOPGROUPTYPING, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void ShowScrollBar(int nBarType, BOOL bVisible = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, EM_SHOWSCROLLBAR, nBarType, bVisible); | 
 | 	} | 
 | #endif // (_RICHEDIT_VER >= 0x0200) | 
 |  | 
 | #if (_RICHEDIT_VER >= 0x0300) | 
 | 	BOOL SetTabStops(int nTabStops, LPINT rgTabStops) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, nTabStops, (LPARAM)rgTabStops); | 
 | 	} | 
 |  | 
 | 	BOOL SetTabStops() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetTabStops(const int& cxEachStop)    // takes an 'int' | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, 1, (LPARAM)(LPINT)&cxEachStop); | 
 | 	} | 
 | #endif // (_RICHEDIT_VER >= 0x0300) | 
 | }; | 
 |  | 
 | typedef CRichEditCtrlT<ATL::CWindow>   CRichEditCtrl; | 
 |  | 
 | #endif // !_WIN32_WCE | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CRichEditCommands - message handlers for standard EDIT commands | 
 |  | 
 | #ifndef _WIN32_WCE | 
 |  | 
 | // Chain to CRichEditCommands message map. Your class must also derive from CRichEditCtrl. | 
 | // Example: | 
 | // class CMyRichEdit : public CWindowImpl<CMyRichEdit, CRichEditCtrl>, | 
 | //                     public CRichEditCommands<CMyRichEdit> | 
 | // { | 
 | // public: | 
 | //      BEGIN_MSG_MAP(CMyRichEdit) | 
 | //              // your handlers... | 
 | //              CHAIN_MSG_MAP_ALT(CRichEditCommands<CMyRichEdit>, 1) | 
 | //      END_MSG_MAP() | 
 | //      // other stuff... | 
 | // }; | 
 |  | 
 | template <class T> | 
 | class CRichEditCommands : public CEditCommands< T > | 
 | { | 
 | public: | 
 | 	BEGIN_MSG_MAP(CRichEditCommands< T >) | 
 | 	ALT_MSG_MAP(1) | 
 | 		COMMAND_ID_HANDLER(ID_EDIT_CLEAR, CEditCommands< T >::OnEditClear) | 
 | 		COMMAND_ID_HANDLER(ID_EDIT_CLEAR_ALL, CEditCommands< T >::OnEditClearAll) | 
 | 		COMMAND_ID_HANDLER(ID_EDIT_COPY, CEditCommands< T >::OnEditCopy) | 
 | 		COMMAND_ID_HANDLER(ID_EDIT_CUT, CEditCommands< T >::OnEditCut) | 
 | 		COMMAND_ID_HANDLER(ID_EDIT_PASTE, CEditCommands< T >::OnEditPaste) | 
 | 		COMMAND_ID_HANDLER(ID_EDIT_SELECT_ALL, CEditCommands< T >::OnEditSelectAll) | 
 | 		COMMAND_ID_HANDLER(ID_EDIT_UNDO, CEditCommands< T >::OnEditUndo) | 
 | #if (_RICHEDIT_VER >= 0x0200) | 
 | 		COMMAND_ID_HANDLER(ID_EDIT_REDO, OnEditRedo) | 
 | #endif // (_RICHEDIT_VER >= 0x0200) | 
 | 	END_MSG_MAP() | 
 |  | 
 | #if (_RICHEDIT_VER >= 0x0200) | 
 | 	LRESULT OnEditRedo(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) | 
 | 	{ | 
 | 		T* pT = static_cast<T*>(this); | 
 | 		pT->Redo(); | 
 | 		return 0; | 
 | 	} | 
 | #endif // (_RICHEDIT_VER >= 0x0200) | 
 |  | 
 | // State (update UI) helpers | 
 | 	BOOL CanCut() const | 
 | 	{ return HasSelection(); } | 
 |  | 
 | 	BOOL CanCopy() const | 
 | 	{ return HasSelection(); } | 
 |  | 
 | 	BOOL CanClear() const | 
 | 	{ return HasSelection(); } | 
 |  | 
 | // Implementation | 
 | 	BOOL HasSelection() const | 
 | 	{ | 
 | 		const T* pT = static_cast<const T*>(this); | 
 | 		return (pT->GetSelectionType() != SEL_EMPTY); | 
 | 	} | 
 | }; | 
 |  | 
 | #endif // _WIN32_WCE | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CDragListBox | 
 |  | 
 | #ifndef _WIN32_WCE | 
 |  | 
 | template <class TBase> | 
 | class CDragListBoxT : public CListBoxT< TBase > | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CDragListBoxT(HWND hWnd = NULL) : CListBoxT< TBase >(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CDragListBoxT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		HWND hWnd = TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 		if(hWnd != NULL) | 
 | 			MakeDragList(); | 
 | 		return hWnd; | 
 | 	} | 
 |  | 
 | // Operations | 
 | 	BOOL MakeDragList() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) == 0); | 
 | 		return ::MakeDragList(m_hWnd); | 
 | 	} | 
 |  | 
 | 	int LBItemFromPt(POINT pt, BOOL bAutoScroll = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ::LBItemFromPt(m_hWnd, pt, bAutoScroll); | 
 | 	} | 
 |  | 
 | 	void DrawInsert(int nItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::DrawInsert(GetParent(), m_hWnd, nItem); | 
 | 	} | 
 |  | 
 | 	static UINT GetDragListMessage() | 
 | 	{ | 
 | 		static UINT uDragListMessage = 0; | 
 | 		if(uDragListMessage == 0) | 
 | 		{ | 
 | 			CStaticDataInitCriticalSectionLock lock; | 
 | 			if(FAILED(lock.Lock())) | 
 | 			{ | 
 | 				ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CDragListBox::GetDragListMessage.\n")); | 
 | 				ATLASSERT(FALSE); | 
 | 				return 0; | 
 | 			} | 
 |  | 
 | 			if(uDragListMessage == 0) | 
 | 				uDragListMessage = ::RegisterWindowMessage(DRAGLISTMSGSTRING); | 
 |  | 
 | 			lock.Unlock(); | 
 | 		} | 
 | 		ATLASSERT(uDragListMessage != 0); | 
 | 		return uDragListMessage; | 
 | 	} | 
 | }; | 
 |  | 
 | typedef CDragListBoxT<ATL::CWindow>   CDragListBox; | 
 |  | 
 | template <class T> | 
 | class CDragListNotifyImpl | 
 | { | 
 | public: | 
 | 	BEGIN_MSG_MAP(CDragListNotifyImpl< T >) | 
 | 		MESSAGE_HANDLER(CDragListBox::GetDragListMessage(), OnDragListNotify) | 
 | 	END_MSG_MAP() | 
 |  | 
 | 	LRESULT OnDragListNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) | 
 | 	{ | 
 | 		uMsg;   // avoid level 4 warning | 
 | 		ATLASSERT(uMsg == CDragListBox::GetDragListMessage()); | 
 | 		T* pT = static_cast<T*>(this); | 
 | 		LPDRAGLISTINFO lpDragListInfo = (LPDRAGLISTINFO)lParam; | 
 | 		LRESULT lRet = 0; | 
 | 		switch(lpDragListInfo->uNotification) | 
 | 		{ | 
 | 		case DL_BEGINDRAG: | 
 | 			lRet = (LPARAM)pT->OnBeginDrag((int)wParam, lpDragListInfo->hWnd, lpDragListInfo->ptCursor); | 
 | 			break; | 
 | 		case DL_CANCELDRAG: | 
 | 			pT->OnCancelDrag((int)wParam, lpDragListInfo->hWnd, lpDragListInfo->ptCursor); | 
 | 			break; | 
 | 		case DL_DRAGGING: | 
 | 			lRet = (LPARAM)pT->OnDragging((int)wParam, lpDragListInfo->hWnd, lpDragListInfo->ptCursor); | 
 | 			break; | 
 | 		case DL_DROPPED: | 
 | 			pT->OnDropped((int)wParam, lpDragListInfo->hWnd, lpDragListInfo->ptCursor); | 
 | 			break; | 
 | 		default: | 
 | 			ATLTRACE2(atlTraceUI, 0, _T("Unknown DragListBox notification\n")); | 
 | 			bHandled = FALSE;   // don't handle it | 
 | 			break; | 
 | 		} | 
 | 		return lRet; | 
 | 	} | 
 |  | 
 | // Overrideables | 
 | 	BOOL OnBeginDrag(int /*nCtlID*/, HWND /*hWndDragList*/, POINT /*ptCursor*/) | 
 | 	{ | 
 | 		return TRUE;   // allow dragging | 
 | 	} | 
 |  | 
 | 	void OnCancelDrag(int /*nCtlID*/, HWND /*hWndDragList*/, POINT /*ptCursor*/) | 
 | 	{ | 
 | 		// nothing to do | 
 | 	} | 
 |  | 
 | 	int OnDragging(int /*nCtlID*/, HWND /*hWndDragList*/, POINT /*ptCursor*/) | 
 | 	{ | 
 | 		return 0;   // don't change cursor | 
 | 	} | 
 |  | 
 | 	void OnDropped(int /*nCtlID*/, HWND /*hWndDragList*/, POINT /*ptCursor*/) | 
 | 	{ | 
 | 		// nothing to do | 
 | 	} | 
 | }; | 
 |  | 
 | #endif // _WIN32_WCE | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CReBarCtrl | 
 |  | 
 | template <class TBase> | 
 | class CReBarCtrlT : public TBase | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CReBarCtrlT(HWND hWnd = NULL) : TBase(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CReBarCtrlT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	static LPCTSTR GetWndClassName() | 
 | 	{ | 
 | 		return REBARCLASSNAME; | 
 | 	} | 
 |  | 
 | 	UINT GetBandCount() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UINT)::SendMessage(m_hWnd, RB_GETBANDCOUNT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL GetBandInfo(int nBand, LPREBARBANDINFO lprbbi) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, RB_GETBANDINFO, nBand, (LPARAM)lprbbi); | 
 | 	} | 
 |  | 
 | 	BOOL SetBandInfo(int nBand, LPREBARBANDINFO lprbbi) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, RB_SETBANDINFO, nBand, (LPARAM)lprbbi); | 
 | 	} | 
 |  | 
 | 	BOOL GetBarInfo(LPREBARINFO lprbi) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, RB_GETBARINFO, 0, (LPARAM)lprbi); | 
 | 	} | 
 |  | 
 | 	BOOL SetBarInfo(LPREBARINFO lprbi) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, RB_SETBARINFO, 0, (LPARAM)lprbi); | 
 | 	} | 
 |  | 
 | 	CImageList GetImageList() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		REBARINFO rbi = { 0 }; | 
 | 		rbi.cbSize = sizeof(REBARINFO); | 
 | 		rbi.fMask = RBIM_IMAGELIST; | 
 | 		if( (BOOL)::SendMessage(m_hWnd, RB_GETBARINFO, 0, (LPARAM)&rbi) == FALSE ) return CImageList(); | 
 | 		return CImageList(rbi.himl); | 
 | 	} | 
 |  | 
 | 	BOOL SetImageList(HIMAGELIST hImageList) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		REBARINFO rbi = { 0 }; | 
 | 		rbi.cbSize = sizeof(REBARINFO); | 
 | 		rbi.fMask = RBIM_IMAGELIST; | 
 | 		rbi.himl = hImageList; | 
 | 		return (BOOL)::SendMessage(m_hWnd, RB_SETBARINFO, 0, (LPARAM)&rbi); | 
 | 	} | 
 |  | 
 | 	UINT GetRowCount() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UINT)::SendMessage(m_hWnd, RB_GETROWCOUNT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	UINT GetRowHeight(int nBand) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UINT)::SendMessage(m_hWnd, RB_GETROWHEIGHT, nBand, 0L); | 
 | 	} | 
 |  | 
 | #if (_WIN32_IE >= 0x0400) | 
 | 	COLORREF GetTextColor() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, RB_GETTEXTCOLOR, 0, 0L); | 
 | 	} | 
 |  | 
 | 	COLORREF SetTextColor(COLORREF clr) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, RB_SETTEXTCOLOR, 0, (LPARAM)clr); | 
 | 	} | 
 |  | 
 | 	COLORREF GetBkColor() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, RB_GETBKCOLOR, 0, 0L); | 
 | 	} | 
 |  | 
 | 	COLORREF SetBkColor(COLORREF clr) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, RB_SETBKCOLOR, 0, (LPARAM)clr); | 
 | 	} | 
 |  | 
 | 	UINT GetBarHeight() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (UINT)::SendMessage(m_hWnd, RB_GETBARHEIGHT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL GetRect(int nBand, LPRECT lpRect) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, RB_GETRECT, nBand, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	CToolTipCtrl GetToolTips() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CToolTipCtrl((HWND)::SendMessage(m_hWnd, RB_GETTOOLTIPS, 0, 0L)); | 
 | 	} | 
 |  | 
 | 	void SetToolTips(HWND hwndToolTip) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, RB_SETTOOLTIPS, (WPARAM)hwndToolTip, 0L); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 |  | 
 | 	void GetBandBorders(int nBand, LPRECT lpRect) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(lpRect != NULL); | 
 | 		::SendMessage(m_hWnd, RB_GETBANDBORDERS, nBand, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	BOOL GetColorScheme(LPCOLORSCHEME lpColorScheme) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(lpColorScheme != NULL); | 
 | 		return (BOOL)::SendMessage(m_hWnd, RB_GETCOLORSCHEME, 0, (LPARAM)lpColorScheme); | 
 | 	} | 
 |  | 
 | 	void SetColorScheme(LPCOLORSCHEME lpColorScheme) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(lpColorScheme != NULL); | 
 | 		::SendMessage(m_hWnd, RB_SETCOLORSCHEME, 0, (LPARAM)lpColorScheme); | 
 | 	} | 
 |  | 
 | 	HPALETTE GetPalette() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (HPALETTE)::SendMessage(m_hWnd, RB_GETPALETTE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	HPALETTE SetPalette(HPALETTE hPalette) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (HPALETTE)::SendMessage(m_hWnd, RB_SETPALETTE, 0, (LPARAM)hPalette); | 
 | 	} | 
 |  | 
 | 	BOOL GetUnicodeFormat() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, RB_GETUNICODEFORMAT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, RB_SETUNICODEFORMAT, bUnicode, 0L); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 | #endif // (_WIN32_IE >= 0x0400) | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0501) | 
 | 	// requires uxtheme.h to be included to use MARGINS struct | 
 | #ifndef _UXTHEME_H_ | 
 | 	typedef struct _MARGINS*   PMARGINS; | 
 | #endif // !_UXTHEME_H_ | 
 | 	void GetBandMargins(PMARGINS pMargins) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, RB_GETBANDMARGINS, 0, (LPARAM)pMargins); | 
 | 	} | 
 |  | 
 | 	void SetWindowTheme(LPCWSTR lpstrTheme) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, RB_SETWINDOWTHEME, 0, (LPARAM)lpstrTheme); | 
 | 	} | 
 | #endif // (_WIN32_WINNT >= 0x0501) | 
 |  | 
 | #if (_WIN32_IE >= 0x0600) | 
 | 	DWORD GetExtendedStyle() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, RB_GETEXTENDEDSTYLE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	DWORD SetExtendedStyle(DWORD dwStyle, DWORD dwMask) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, RB_SETEXTENDEDSTYLE, dwMask, dwStyle); | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0600) | 
 |  | 
 | // Operations | 
 | 	BOOL InsertBand(int nBand, LPREBARBANDINFO lprbbi) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, RB_INSERTBAND, nBand, (LPARAM)lprbbi); | 
 | 	} | 
 |  | 
 | 	BOOL AddBand(LPREBARBANDINFO lprbbi) | 
 | 	{ | 
 | 		return InsertBand(-1, lprbbi); | 
 | 	} | 
 |  | 
 | 	BOOL DeleteBand(int nBand) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, RB_DELETEBAND, nBand, 0L); | 
 | 	} | 
 |  | 
 | 	ATL::CWindow SetNotifyWnd(HWND hWnd) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ATL::CWindow((HWND)::SendMessage(m_hWnd, RB_SETPARENT, (WPARAM)hWnd, 0L)); | 
 | 	} | 
 |  | 
 | #if (_WIN32_IE >= 0x0400) | 
 | 	void BeginDrag(int nBand, DWORD dwPos) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, RB_BEGINDRAG, nBand, dwPos); | 
 | 	} | 
 |  | 
 | 	void BeginDrag(int nBand, int xPos, int yPos) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, RB_BEGINDRAG, nBand, MAKELPARAM(xPos, yPos)); | 
 | 	} | 
 |  | 
 | 	void EndDrag() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, RB_ENDDRAG, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void DragMove(DWORD dwPos) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, RB_DRAGMOVE, 0, dwPos); | 
 | 	} | 
 |  | 
 | 	void DragMove(int xPos, int yPos) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, RB_DRAGMOVE, 0, MAKELPARAM(xPos, yPos)); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	void GetDropTarget(IDropTarget** ppDropTarget) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, RB_GETDROPTARGET, 0, (LPARAM)ppDropTarget); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 |  | 
 | 	void MaximizeBand(int nBand, BOOL bIdeal = FALSE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, RB_MAXIMIZEBAND, nBand, bIdeal); | 
 | 	} | 
 |  | 
 | 	void MinimizeBand(int nBand) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, RB_MINIMIZEBAND, nBand, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SizeToRect(LPRECT lpRect) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, RB_SIZETORECT, 0, (LPARAM)lpRect); | 
 | 	} | 
 |  | 
 | 	int IdToIndex(UINT uBandID) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, RB_IDTOINDEX, uBandID, 0L); | 
 | 	} | 
 |  | 
 | 	int HitTest(LPRBHITTESTINFO lprbht) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, RB_HITTEST, 0, (LPARAM)lprbht); | 
 | 	} | 
 |  | 
 | 	BOOL ShowBand(int nBand, BOOL bShow) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, RB_SHOWBAND, nBand, bShow); | 
 | 	} | 
 |  | 
 | #ifndef _WIN32_WCE | 
 | 	BOOL MoveBand(int nBand, int nNewPos) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(nNewPos >= 0 && nNewPos <= ((int)GetBandCount() - 1)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, RB_MOVEBAND, nBand, nNewPos); | 
 | 	} | 
 | #endif // !_WIN32_WCE | 
 | #endif // (_WIN32_IE >= 0x0400) | 
 |  | 
 | #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) | 
 | 	void PushChevron(int nBand, LPARAM lAppValue) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, RB_PUSHCHEVRON, nBand, lAppValue); | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) | 
 |  | 
 | // Extra operations | 
 | #if (_WIN32_IE >= 0x0400) | 
 | 	void LockBands(bool bLock) | 
 | 	{ | 
 | 		int nBandCount = GetBandCount(); | 
 | 		for(int i =0; i < nBandCount; i++) | 
 | 		{ | 
 | 			REBARBANDINFO rbbi = { RunTimeHelper::SizeOf_REBARBANDINFO() }; | 
 | 			rbbi.fMask = RBBIM_STYLE; | 
 | 			BOOL bRet = GetBandInfo(i, &rbbi); | 
 | 			ATLASSERT(bRet); | 
 |  | 
 | 			if((rbbi.fStyle & RBBS_GRIPPERALWAYS) == 0) | 
 | 			{ | 
 | 				rbbi.fStyle |= RBBS_GRIPPERALWAYS; | 
 | 				bRet = SetBandInfo(i, &rbbi); | 
 | 				ATLASSERT(bRet); | 
 | 				rbbi.fStyle &= ~RBBS_GRIPPERALWAYS; | 
 | 			} | 
 |  | 
 | 			if(bLock) | 
 | 				rbbi.fStyle |= RBBS_NOGRIPPER; | 
 | 			else | 
 | 				rbbi.fStyle &= ~RBBS_NOGRIPPER; | 
 |  | 
 | 			bRet = SetBandInfo(i, &rbbi); | 
 | 			ATLASSERT(bRet); | 
 | 		} | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0400) | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0600) | 
 | 	BOOL SetBandWidth(int nBand, int cxWidth) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, RB_SETBANDWIDTH, nBand, cxWidth); | 
 | 	} | 
 | #endif // (_WIN32_WINNT >= 0x0600) | 
 | }; | 
 |  | 
 | typedef CReBarCtrlT<ATL::CWindow>   CReBarCtrl; | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CComboBoxEx | 
 |  | 
 | #ifndef _WIN32_WCE | 
 |  | 
 | template <class TBase> | 
 | class CComboBoxExT : public CComboBoxT< TBase > | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CComboBoxExT(HWND hWnd = NULL) : CComboBoxT< TBase >(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CComboBoxExT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	static LPCTSTR GetWndClassName() | 
 | 	{ | 
 | 		return WC_COMBOBOXEX; | 
 | 	} | 
 |  | 
 | 	CImageList GetImageList() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, CBEM_GETIMAGELIST, 0, 0L)); | 
 | 	} | 
 |  | 
 | 	CImageList SetImageList(HIMAGELIST hImageList) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, CBEM_SETIMAGELIST, 0, (LPARAM)hImageList)); | 
 | 	} | 
 |  | 
 | #if (_WIN32_IE >= 0x0400) | 
 | 	DWORD GetExtendedStyle() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, CBEM_GETEXTENDEDSTYLE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	DWORD SetExtendedStyle(DWORD dwExMask, DWORD dwExStyle) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, CBEM_SETEXTENDEDSTYLE, dwExMask, dwExStyle); | 
 | 	} | 
 |  | 
 | 	BOOL GetUnicodeFormat() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, CBEM_GETUNICODEFORMAT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, CBEM_SETUNICODEFORMAT, bUnicode, 0L); | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0400) | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0501) | 
 | 	void SetWindowTheme(LPCWSTR lpstrTheme) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, CBEM_SETWINDOWTHEME, 0, (LPARAM)lpstrTheme); | 
 | 	} | 
 | #endif // (_WIN32_WINNT >= 0x0501) | 
 |  | 
 | // Operations | 
 | 	int InsertItem(const COMBOBOXEXITEM* lpcCBItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, CBEM_INSERTITEM, 0, (LPARAM)lpcCBItem); | 
 | 	} | 
 |  | 
 | 	int InsertItem(UINT nMask, int nIndex, LPCTSTR lpszItem, int nImage, int nSelImage,  | 
 | 	               int iIndent, int iOverlay, LPARAM lParam) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		COMBOBOXEXITEM cbex = { 0 }; | 
 | 		cbex.mask = nMask; | 
 | 		cbex.iItem = nIndex; | 
 | 		cbex.pszText = (LPTSTR) lpszItem; | 
 | 		cbex.iImage = nImage; | 
 | 		cbex.iSelectedImage = nSelImage; | 
 | 		cbex.iIndent = iIndent; | 
 | 		cbex.iOverlay = iOverlay; | 
 | 		cbex.lParam = lParam; | 
 | 		return (int)::SendMessage(m_hWnd, CBEM_INSERTITEM, 0, (LPARAM)&cbex); | 
 | 	} | 
 |  | 
 | 	int InsertItem(int nIndex, LPCTSTR lpszItem, int nImage, int nSelImage, int iIndent, LPARAM lParam = 0) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		COMBOBOXEXITEM cbex = { 0 }; | 
 | 		cbex.mask = CBEIF_TEXT | CBEIF_IMAGE | CBEIF_SELECTEDIMAGE | CBEIF_INDENT | CBEIF_LPARAM; | 
 | 		cbex.iItem = nIndex; | 
 | 		cbex.pszText = (LPTSTR) lpszItem; | 
 | 		cbex.iImage = nImage; | 
 | 		cbex.iSelectedImage = nSelImage; | 
 | 		cbex.iIndent = iIndent; | 
 | 		cbex.lParam = lParam; | 
 | 		return (int)::SendMessage(m_hWnd, CBEM_INSERTITEM, 0, (LPARAM)&cbex); | 
 | 	} | 
 |  | 
 | 	int AddItem(UINT nMask, LPCTSTR lpszItem, int nImage, int nSelImage, int iIndent, int iOverlay, LPARAM lParam) | 
 | 	{ | 
 | 		return InsertItem(nMask, -1, lpszItem, nImage, nSelImage, iIndent, iOverlay, lParam); | 
 | 	} | 
 |  | 
 | 	int AddItem(LPCTSTR lpszItem, int nImage, int nSelImage, int iIndent, LPARAM lParam = 0) | 
 | 	{ | 
 | 		return InsertItem(-1, lpszItem, nImage, nSelImage, iIndent, lParam); | 
 | 	} | 
 |  | 
 | 	int DeleteItem(int nIndex) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, CBEM_DELETEITEM, nIndex, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL GetItem(PCOMBOBOXEXITEM pCBItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, CBEM_GETITEM, 0, (LPARAM)pCBItem); | 
 | 	} | 
 |  | 
 | 	BOOL SetItem(const COMBOBOXEXITEM* lpcCBItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, CBEM_SETITEM, 0, (LPARAM)lpcCBItem); | 
 | 	} | 
 |  | 
 | 	int SetItem(int nIndex, UINT nMask, LPCTSTR lpszItem, int nImage, int nSelImage,  | 
 | 	            int iIndent, int iOverlay, LPARAM lParam) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		COMBOBOXEXITEM cbex = { 0 }; | 
 | 		cbex.mask = nMask; | 
 | 		cbex.iItem = nIndex; | 
 | 		cbex.pszText = (LPTSTR) lpszItem; | 
 | 		cbex.iImage = nImage; | 
 | 		cbex.iSelectedImage = nSelImage; | 
 | 		cbex.iIndent = iIndent; | 
 | 		cbex.iOverlay = iOverlay; | 
 | 		cbex.lParam = lParam; | 
 | 		return (int)::SendMessage(m_hWnd, CBEM_SETITEM, 0, (LPARAM)&cbex); | 
 | 	} | 
 |  | 
 | 	BOOL GetItemText(int nIndex, LPTSTR lpszItem, int nLen) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(lpszItem != NULL); | 
 |  | 
 | 		COMBOBOXEXITEM cbex = { 0 }; | 
 | 		cbex.mask = CBEIF_TEXT; | 
 | 		cbex.iItem = nIndex; | 
 | 		cbex.pszText = lpszItem; | 
 | 		cbex.cchTextMax = nLen; | 
 |  | 
 | 		return (BOOL)::SendMessage(m_hWnd, CBEM_GETITEM, 0, (LPARAM)&cbex); | 
 | 	} | 
 |  | 
 | #ifndef _ATL_NO_COM | 
 | 	BOOL GetItemText(int nIndex, BSTR& bstrText) const | 
 | 	{ | 
 | 		USES_CONVERSION; | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(bstrText == NULL); | 
 |  | 
 | 		COMBOBOXEXITEM cbex = { 0 }; | 
 | 		cbex.mask = CBEIF_TEXT; | 
 | 		cbex.iItem = nIndex; | 
 |  | 
 | 		LPTSTR lpstrText = NULL; | 
 | 		BOOL bRet = FALSE; | 
 | 		for(int nLen = 256; ; nLen *= 2) | 
 | 		{ | 
 | 			ATLTRY(lpstrText = new TCHAR[nLen]); | 
 | 			if(lpstrText == NULL) | 
 | 				break; | 
 | 			lpstrText[0] = NULL; | 
 | 			cbex.pszText = lpstrText; | 
 | 			cbex.cchTextMax = nLen; | 
 | 			bRet = (BOOL)::SendMessage(m_hWnd, CBEM_GETITEM, 0, (LPARAM)&cbex); | 
 | 			if(!bRet || (lstrlen(cbex.pszText) < nLen - 1)) | 
 | 				break; | 
 | 			delete [] lpstrText; | 
 | 			lpstrText = NULL; | 
 | 		} | 
 |  | 
 | 		if(lpstrText != NULL) | 
 | 		{ | 
 | 			if(bRet) | 
 | 				bstrText = ::SysAllocString(T2OLE(lpstrText)); | 
 | 			delete [] lpstrText; | 
 | 		} | 
 |  | 
 | 		return (bstrText != NULL) ? TRUE : FALSE; | 
 | 	} | 
 | #endif // !_ATL_NO_COM | 
 |  | 
 | #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) | 
 | 	BOOL GetItemText(int nIndex, _CSTRING_NS::CString& strText) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 |  | 
 | 		COMBOBOXEXITEM cbex = { 0 }; | 
 | 		cbex.mask = CBEIF_TEXT; | 
 | 		cbex.iItem = nIndex; | 
 |  | 
 | 		strText.Empty(); | 
 | 		BOOL bRet = FALSE; | 
 | 		for(int nLen = 256; ; nLen *= 2) | 
 | 		{ | 
 | 			cbex.pszText = strText.GetBufferSetLength(nLen); | 
 | 			if(cbex.pszText == NULL) | 
 | 			{ | 
 | 				bRet = FALSE; | 
 | 				break; | 
 | 			} | 
 | 			cbex.cchTextMax = nLen; | 
 | 			bRet = (BOOL)::SendMessage(m_hWnd, CBEM_GETITEM, 0, (LPARAM)&cbex); | 
 | 			if(!bRet || (lstrlen(cbex.pszText) < nLen - 1)) | 
 | 				break; | 
 | 		} | 
 | 		strText.ReleaseBuffer(); | 
 | 		return bRet; | 
 | 	} | 
 | #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) | 
 |  | 
 | 	BOOL SetItemText(int nIndex, LPCTSTR lpszItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return SetItem(nIndex, CBEIF_TEXT, lpszItem, 0, 0, 0, 0, 0); | 
 | 	} | 
 |  | 
 | 	CComboBox GetComboCtrl() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CComboBox((HWND)::SendMessage(m_hWnd, CBEM_GETCOMBOCONTROL, 0, 0L)); | 
 | 	} | 
 |  | 
 | 	CEdit GetEditCtrl() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CEdit((HWND)::SendMessage(m_hWnd, CBEM_GETEDITCONTROL, 0, 0L)); | 
 | 	} | 
 |  | 
 | 	BOOL HasEditChanged() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, CBEM_HASEDITCHANGED, 0, 0L); | 
 | 	} | 
 |  | 
 | // Non-functional | 
 | 	int AddString(LPCTSTR /*lpszItem*/) | 
 | 	{ | 
 | 		ATLASSERT(FALSE);  // Not available in CComboBoxEx; use InsertItem | 
 | 		return 0; | 
 | 	} | 
 |  | 
 | 	int InsertString(int /*nIndex*/, LPCTSTR /*lpszString*/) | 
 | 	{ | 
 | 		ATLASSERT(FALSE);  // Not available in CComboBoxEx; use InsertItem | 
 | 		return 0; | 
 | 	} | 
 |  | 
 | 	int Dir(UINT /*attr*/, LPCTSTR /*lpszWildCard*/) | 
 | 	{ | 
 | 		ATLASSERT(FALSE);  // Not available in CComboBoxEx | 
 | 		return 0; | 
 | 	} | 
 |  | 
 | 	int FindString(int /*nStartAfter*/, LPCTSTR /*lpszString*/) const | 
 | 	{ | 
 | 		ATLASSERT(FALSE);  // Not available in CComboBoxEx; try FindStringExact | 
 | 		return 0; | 
 | 	} | 
 | }; | 
 |  | 
 | typedef CComboBoxExT<ATL::CWindow>   CComboBoxEx; | 
 |  | 
 | #endif // !_WIN32_WCE | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CMonthCalendarCtrl | 
 |  | 
 | template <class TBase> | 
 | class CMonthCalendarCtrlT : public TBase | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CMonthCalendarCtrlT(HWND hWnd = NULL) : TBase(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CMonthCalendarCtrlT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	static LPCTSTR GetWndClassName() | 
 | 	{ | 
 | 		return MONTHCAL_CLASS; | 
 | 	} | 
 |  | 
 | 	COLORREF GetColor(int nColorType) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, MCM_GETCOLOR, nColorType, 0L); | 
 | 	} | 
 |  | 
 | 	COLORREF SetColor(int nColorType, COLORREF clr) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, MCM_SETCOLOR, nColorType, clr); | 
 | 	} | 
 |  | 
 | 	BOOL GetCurSel(LPSYSTEMTIME lpSysTime) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, MCM_GETCURSEL, 0, (LPARAM)lpSysTime); | 
 | 	} | 
 |  | 
 | 	BOOL SetCurSel(LPSYSTEMTIME lpSysTime) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, MCM_SETCURSEL, 0, (LPARAM)lpSysTime); | 
 | 	} | 
 |  | 
 | 	int GetFirstDayOfWeek(BOOL* pbLocaleVal = NULL) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, MCM_GETFIRSTDAYOFWEEK, 0, 0L); | 
 | 		if(pbLocaleVal != NULL) | 
 | 			*pbLocaleVal = (BOOL)HIWORD(dwRet); | 
 | 		return (int)(short)LOWORD(dwRet); | 
 | 	} | 
 |  | 
 | 	int SetFirstDayOfWeek(int nDay, BOOL* pbLocaleVal = NULL) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, MCM_SETFIRSTDAYOFWEEK, 0, nDay); | 
 | 		if(pbLocaleVal != NULL) | 
 | 			*pbLocaleVal = (BOOL)HIWORD(dwRet); | 
 | 		return (int)(short)LOWORD(dwRet); | 
 | 	} | 
 |  | 
 | 	int GetMaxSelCount() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, MCM_GETMAXSELCOUNT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetMaxSelCount(int nMax) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, MCM_SETMAXSELCOUNT, nMax, 0L); | 
 | 	} | 
 |  | 
 | 	int GetMonthDelta() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, MCM_GETMONTHDELTA, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int SetMonthDelta(int nDelta) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, MCM_SETMONTHDELTA, nDelta, 0L); | 
 | 	} | 
 |  | 
 | 	DWORD GetRange(LPSYSTEMTIME lprgSysTimeArray) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, MCM_GETRANGE, 0, (LPARAM)lprgSysTimeArray); | 
 | 	} | 
 |  | 
 | 	BOOL SetRange(DWORD dwFlags, LPSYSTEMTIME lprgSysTimeArray) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, MCM_SETRANGE, dwFlags, (LPARAM)lprgSysTimeArray); | 
 | 	} | 
 |  | 
 | 	BOOL GetSelRange(LPSYSTEMTIME lprgSysTimeArray) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, MCM_GETSELRANGE, 0, (LPARAM)lprgSysTimeArray); | 
 | 	} | 
 |  | 
 | 	BOOL SetSelRange(LPSYSTEMTIME lprgSysTimeArray) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, MCM_SETSELRANGE, 0, (LPARAM)lprgSysTimeArray); | 
 | 	} | 
 |  | 
 | 	BOOL GetToday(LPSYSTEMTIME lpSysTime) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, MCM_GETTODAY, 0, (LPARAM)lpSysTime); | 
 | 	} | 
 |  | 
 | 	void SetToday(LPSYSTEMTIME lpSysTime) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, MCM_SETTODAY, 0, (LPARAM)lpSysTime); | 
 | 	} | 
 |  | 
 | 	BOOL GetMinReqRect(LPRECT lpRectInfo) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, MCM_GETMINREQRECT, 0, (LPARAM)lpRectInfo); | 
 | 	} | 
 |  | 
 | 	int GetMaxTodayWidth() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, MCM_GETMAXTODAYWIDTH, 0, 0L); | 
 | 	} | 
 |  | 
 | #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) | 
 | 	BOOL GetUnicodeFormat() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, MCM_GETUNICODEFORMAT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, MCM_SETUNICODEFORMAT, bUnicode, 0L); | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) | 
 |  | 
 | #if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) | 
 | 	DWORD GetCurrentView() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, MCM_GETCURRENTVIEW, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL SetCurrentView(DWORD dwView) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, MCM_SETCURRENTVIEW, 0, dwView); | 
 | 	} | 
 |  | 
 | 	DWORD GetCalendarCount() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, MCM_GETCALENDARCOUNT, 0, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL GetCalendarGridInfo(PMCGRIDINFO pGridInfo) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, MCM_GETCALENDARGRIDINFO, 0, (LPARAM)pGridInfo); | 
 | 	} | 
 |  | 
 | 	CALID GetCALID() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (CALID)::SendMessage(m_hWnd, MCM_GETCALID, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetCALID(CALID calid) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, MCM_SETCALID, (LPARAM)calid, 0L); | 
 | 	} | 
 |  | 
 | 	int GetCalendarBorder() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, MCM_GETCALENDARBORDER, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetCalendarBorder(int cxyBorder, BOOL bSet = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, MCM_SETCALENDARBORDER, (WPARAM)bSet, (LPARAM)cxyBorder); | 
 | 	} | 
 | #endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) | 
 |  | 
 | // Operations | 
 | 	int GetMonthRange(DWORD dwFlags, LPSYSTEMTIME lprgSysTimeArray) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, MCM_GETMONTHRANGE, dwFlags, (LPARAM)lprgSysTimeArray); | 
 | 	} | 
 |  | 
 | 	BOOL SetDayState(int nMonths, LPMONTHDAYSTATE lpDayStateArray) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, MCM_SETDAYSTATE, nMonths, (LPARAM)lpDayStateArray); | 
 | 	} | 
 |  | 
 | 	DWORD HitTest(PMCHITTESTINFO pMCHitTest) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, MCM_HITTEST, 0, (LPARAM)pMCHitTest); | 
 | 	} | 
 |  | 
 | #if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) | 
 | 	void SizeRectToMin(LPRECT lpRect) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, MCM_SIZERECTTOMIN, 0, (LPARAM)lpRect); | 
 | 	} | 
 | #endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) | 
 | }; | 
 |  | 
 | typedef CMonthCalendarCtrlT<ATL::CWindow>   CMonthCalendarCtrl; | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CDateTimePickerCtrl | 
 |  | 
 | template <class TBase> | 
 | class CDateTimePickerCtrlT : public TBase | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CDateTimePickerCtrlT(HWND hWnd = NULL) : TBase(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CDateTimePickerCtrlT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 	} | 
 |  | 
 | // Operations | 
 | 	static LPCTSTR GetWndClassName() | 
 | 	{ | 
 | 		return DATETIMEPICK_CLASS; | 
 | 	} | 
 |  | 
 | 	BOOL SetFormat(LPCTSTR lpszFormat) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, DTM_SETFORMAT, 0, (LPARAM)lpszFormat); | 
 | 	} | 
 |  | 
 | 	COLORREF GetMonthCalColor(int nColorType) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, DTM_GETMCCOLOR, nColorType, 0L); | 
 | 	} | 
 |  | 
 | 	COLORREF SetMonthCalColor(int nColorType, COLORREF clr) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, DTM_SETMCCOLOR, nColorType, clr); | 
 | 	} | 
 |  | 
 | 	DWORD GetRange(LPSYSTEMTIME lpSysTimeArray) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, DTM_GETRANGE, 0, (LPARAM)lpSysTimeArray); | 
 | 	} | 
 |  | 
 | 	BOOL SetRange(DWORD dwFlags, LPSYSTEMTIME lpSysTimeArray) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, DTM_SETRANGE, dwFlags, (LPARAM)lpSysTimeArray); | 
 | 	} | 
 |  | 
 | 	DWORD GetSystemTime(LPSYSTEMTIME lpSysTime) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)lpSysTime); | 
 | 	} | 
 |  | 
 | 	BOOL SetSystemTime(DWORD dwFlags, LPSYSTEMTIME lpSysTime) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, DTM_SETSYSTEMTIME, dwFlags, (LPARAM)lpSysTime); | 
 | 	} | 
 |  | 
 | 	CMonthCalendarCtrl GetMonthCal() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CMonthCalendarCtrl((HWND)::SendMessage(m_hWnd, DTM_GETMONTHCAL, 0, 0L)); | 
 | 	} | 
 |  | 
 | #if (_WIN32_IE >= 0x0400) | 
 | 	CFontHandle GetMonthCalFont() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CFontHandle((HFONT)::SendMessage(m_hWnd, DTM_GETMCFONT, 0, 0L)); | 
 | 	} | 
 |  | 
 | 	void SetMonthCalFont(HFONT hFont, BOOL bRedraw = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, DTM_SETMCFONT, (WPARAM)hFont, MAKELPARAM(bRedraw, 0)); | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0400) | 
 |  | 
 | #if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) | 
 | 	DWORD GetMonthCalStyle() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, DTM_GETMCSTYLE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	DWORD SetMonthCalStyle(DWORD dwStyle) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (DWORD)::SendMessage(m_hWnd, DTM_SETMCSTYLE, 0, (LPARAM)dwStyle); | 
 | 	} | 
 |  | 
 | 	void GetDateTimePickerInfo(LPDATETIMEPICKERINFO lpPickerInfo) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, DTM_GETDATETIMEPICKERINFO, 0, (LPARAM)lpPickerInfo); | 
 | 	} | 
 |  | 
 | 	BOOL GetIdealSize(LPSIZE lpSize) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, DTM_GETIDEALSIZE, 0, (LPARAM)lpSize); | 
 | 	} | 
 |  | 
 | 	void CloseMonthCal() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, DTM_CLOSEMONTHCAL, 0, 0L); | 
 | 	} | 
 | #endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) | 
 | }; | 
 |  | 
 | typedef CDateTimePickerCtrlT<ATL::CWindow>   CDateTimePickerCtrl; | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CFlatScrollBarImpl - support for flat scroll bars | 
 |  | 
 | #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) | 
 |  | 
 | template <class T> | 
 | class CFlatScrollBarImpl | 
 | { | 
 | public: | 
 | // Initialization | 
 | 	BOOL FlatSB_Initialize() | 
 | 	{ | 
 | 		T* pT = static_cast<T*>(this); | 
 | 		ATLASSERT(::IsWindow(pT->m_hWnd)); | 
 | 		return ::InitializeFlatSB(pT->m_hWnd); | 
 | 	} | 
 |  | 
 | 	HRESULT FlatSB_Uninitialize() | 
 | 	{ | 
 | 		T* pT = static_cast<T*>(this); | 
 | 		ATLASSERT(::IsWindow(pT->m_hWnd)); | 
 | 		return ::UninitializeFlatSB(pT->m_hWnd); | 
 | 	} | 
 |  | 
 | // Flat scroll bar properties | 
 | 	BOOL FlatSB_GetScrollProp(UINT uIndex, LPINT lpnValue) const | 
 | 	{ | 
 | 		const T* pT = static_cast<const T*>(this); | 
 | 		ATLASSERT(::IsWindow(pT->m_hWnd)); | 
 | 		return ::FlatSB_GetScrollProp(pT->m_hWnd, uIndex, lpnValue); | 
 | 	} | 
 |  | 
 | 	BOOL FlatSB_SetScrollProp(UINT uIndex, int nValue, BOOL bRedraw = TRUE) | 
 | 	{ | 
 | 		T* pT = static_cast<T*>(this); | 
 | 		ATLASSERT(::IsWindow(pT->m_hWnd)); | 
 | 		return ::FlatSB_SetScrollProp(pT->m_hWnd, uIndex, nValue, bRedraw); | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	int FlatSB_GetScrollPos(int nBar) const | 
 | 	{ | 
 | 		const T* pT = static_cast<const T*>(this); | 
 | 		ATLASSERT(::IsWindow(pT->m_hWnd)); | 
 | 		return ::FlatSB_GetScrollPos(pT->m_hWnd, nBar); | 
 | 	} | 
 |  | 
 | 	int FlatSB_SetScrollPos(int nBar, int nPos, BOOL bRedraw = TRUE) | 
 | 	{ | 
 | 		T* pT = static_cast<T*>(this); | 
 | 		ATLASSERT(::IsWindow(pT->m_hWnd)); | 
 | 		return ::FlatSB_SetScrollPos(pT->m_hWnd, nBar, nPos, bRedraw); | 
 | 	} | 
 |  | 
 | 	BOOL FlatSB_GetScrollRange(int nBar, LPINT lpMinPos, LPINT lpMaxPos) const | 
 | 	{ | 
 | 		const T* pT = static_cast<const T*>(this); | 
 | 		ATLASSERT(::IsWindow(pT->m_hWnd)); | 
 | 		return ::FlatSB_GetScrollRange(pT->m_hWnd, nBar, lpMinPos, lpMaxPos); | 
 | 	} | 
 |  | 
 | 	BOOL FlatSB_SetScrollRange(int nBar, int nMinPos, int nMaxPos, BOOL bRedraw = TRUE) | 
 | 	{ | 
 | 		T* pT = static_cast<T*>(this); | 
 | 		ATLASSERT(::IsWindow(pT->m_hWnd)); | 
 | 		return ::FlatSB_SetScrollRange(pT->m_hWnd, nBar, nMinPos, nMaxPos, bRedraw); | 
 | 	} | 
 |  | 
 | 	BOOL FlatSB_GetScrollInfo(int nBar, LPSCROLLINFO lpScrollInfo) const | 
 | 	{ | 
 | 		const T* pT = static_cast<const T*>(this); | 
 | 		ATLASSERT(::IsWindow(pT->m_hWnd)); | 
 | 		return ::FlatSB_GetScrollInfo(pT->m_hWnd, nBar, lpScrollInfo); | 
 | 	} | 
 |  | 
 | 	int FlatSB_SetScrollInfo(int nBar, LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE) | 
 | 	{ | 
 | 		T* pT = static_cast<T*>(this); | 
 | 		ATLASSERT(::IsWindow(pT->m_hWnd)); | 
 | 		return ::FlatSB_SetScrollInfo(pT->m_hWnd, nBar, lpScrollInfo, bRedraw); | 
 | 	} | 
 |  | 
 | // Operations | 
 | 	BOOL FlatSB_ShowScrollBar(UINT nBar, BOOL bShow = TRUE) | 
 | 	{ | 
 | 		T* pT = static_cast<T*>(this); | 
 | 		ATLASSERT(::IsWindow(pT->m_hWnd)); | 
 | 		return ::FlatSB_ShowScrollBar(pT->m_hWnd, nBar, bShow); | 
 | 	} | 
 |  | 
 | 	BOOL FlatSB_EnableScrollBar(UINT uSBFlags, UINT uArrowFlags = ESB_ENABLE_BOTH) | 
 | 	{ | 
 | 		T* pT = static_cast<T*>(this); | 
 | 		ATLASSERT(::IsWindow(pT->m_hWnd)); | 
 | 		return ::FlatSB_EnableScrollBar(pT->m_hWnd, uSBFlags, uArrowFlags); | 
 | 	} | 
 | }; | 
 |  | 
 | template <class TBase> | 
 | class CFlatScrollBarT : public TBase, public CFlatScrollBarImpl<CFlatScrollBarT< TBase > > | 
 | { | 
 | public: | 
 | 	CFlatScrollBarT(HWND hWnd = NULL) : TBase(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CFlatScrollBarT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 | }; | 
 |  | 
 | typedef CFlatScrollBarT<ATL::CWindow>   CFlatScrollBar; | 
 |  | 
 | #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CIPAddressCtrl | 
 |  | 
 | #if (_WIN32_IE >= 0x0400) | 
 |  | 
 | template <class TBase> | 
 | class CIPAddressCtrlT : public TBase | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CIPAddressCtrlT(HWND hWnd = NULL) : TBase(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CIPAddressCtrlT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 	} | 
 |  | 
 | // Atteributes | 
 | 	static LPCTSTR GetWndClassName() | 
 | 	{ | 
 | 		return WC_IPADDRESS; | 
 | 	} | 
 |  | 
 | 	BOOL IsBlank() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, IPM_ISBLANK, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int GetAddress(LPDWORD lpdwAddress) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, IPM_GETADDRESS, 0, (LPARAM)lpdwAddress); | 
 | 	} | 
 |  | 
 | 	void SetAddress(DWORD dwAddress) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, IPM_SETADDRESS, 0, dwAddress); | 
 | 	} | 
 |  | 
 | 	void ClearAddress() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, IPM_CLEARADDRESS, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void SetRange(int nField, WORD wRange) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, IPM_SETRANGE, nField, wRange); | 
 | 	} | 
 |  | 
 | 	void SetRange(int nField, BYTE nMin, BYTE nMax) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, IPM_SETRANGE, nField, MAKEIPRANGE(nMin, nMax)); | 
 | 	} | 
 |  | 
 | 	void SetFocus(int nField) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, IPM_SETFOCUS, nField, 0L); | 
 | 	} | 
 | }; | 
 |  | 
 | typedef CIPAddressCtrlT<ATL::CWindow>   CIPAddressCtrl; | 
 |  | 
 | #endif // (_WIN32_IE >= 0x0400) | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CPagerCtrl | 
 |  | 
 | #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) | 
 |  | 
 | template <class TBase> | 
 | class CPagerCtrlT : public TBase | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CPagerCtrlT(HWND hWnd = NULL) : TBase(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CPagerCtrlT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	static LPCTSTR GetWndClassName() | 
 | 	{ | 
 | 		return WC_PAGESCROLLER; | 
 | 	} | 
 |  | 
 | 	int GetButtonSize() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, PGM_GETBUTTONSIZE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int SetButtonSize(int nButtonSize) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, PGM_SETBUTTONSIZE, 0, nButtonSize); | 
 | 	} | 
 |  | 
 | 	DWORD GetButtonState(int nButton) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(nButton == PGB_TOPORLEFT || nButton == PGB_BOTTOMORRIGHT); | 
 | 		return (DWORD)::SendMessage(m_hWnd, PGM_GETBUTTONSTATE, 0, nButton); | 
 | 	} | 
 |  | 
 | 	COLORREF GetBkColor() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, PGM_GETBKCOLOR, 0, 0L); | 
 | 	} | 
 |  | 
 | 	COLORREF SetBkColor(COLORREF clrBk) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (COLORREF)::SendMessage(m_hWnd, PGM_SETBKCOLOR, 0, (LPARAM)clrBk); | 
 | 	} | 
 |  | 
 | 	int GetBorder() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, PGM_GETBORDER, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int SetBorder(int nBorderSize) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, PGM_SETBORDER, 0, nBorderSize); | 
 | 	} | 
 |  | 
 | 	int GetPos() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, PGM_GETPOS, 0, 0L); | 
 | 	} | 
 |  | 
 | 	int SetPos(int nPos) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, PGM_SETPOS, 0, nPos); | 
 | 	} | 
 |  | 
 | // Operations | 
 | 	void SetChild(HWND hWndChild) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, PGM_SETCHILD, 0, (LPARAM)hWndChild); | 
 | 	} | 
 |  | 
 | 	void ForwardMouse(BOOL bForward = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, PGM_FORWARDMOUSE, bForward, 0L); | 
 | 	} | 
 |  | 
 | 	void RecalcSize() | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		::SendMessage(m_hWnd, PGM_RECALCSIZE, 0, 0L); | 
 | 	} | 
 |  | 
 | 	void GetDropTarget(IDropTarget** ppDropTarget) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		ATLASSERT(ppDropTarget != NULL); | 
 | 		::SendMessage(m_hWnd, PGM_GETDROPTARGET, 0, (LPARAM)ppDropTarget); | 
 | 	} | 
 | }; | 
 |  | 
 | typedef CPagerCtrlT<ATL::CWindow>   CPagerCtrl; | 
 |  | 
 | #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CLinkCtrl - Windows SYSLINK control | 
 |  | 
 | #if (_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE) | 
 |  | 
 | template <class TBase> | 
 | class CLinkCtrlT : public TBase | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CLinkCtrlT(HWND hWnd = NULL) : TBase(hWnd) | 
 | 	{ } | 
 |  | 
 | 	CLinkCtrlT< TBase >& operator =(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, | 
 | 			DWORD dwStyle = 0, DWORD dwExStyle = 0, | 
 | 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) | 
 | 	{ | 
 | 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	static LPCTSTR GetWndClassName() | 
 | 	{ | 
 | #ifdef _UNICODE | 
 | 		return WC_LINK; | 
 | #else // !_UNICODE | 
 | 		return "SysLink"; | 
 | #endif // !_UNICODE | 
 | 	} | 
 |  | 
 | 	int GetIdealHeight(int cxMaxWidth = 0) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LM_GETIDEALHEIGHT, cxMaxWidth, 0L); | 
 | 	} | 
 |  | 
 | 	BOOL GetItem(PLITEM pLItem) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LM_GETITEM, 0, (LPARAM)pLItem); | 
 | 	} | 
 |  | 
 | 	BOOL SetItem(PLITEM pLItem) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LM_SETITEM, 0, (LPARAM)pLItem); | 
 | 	} | 
 |  | 
 | 	// Vista only | 
 | 	int GetIdealSize(SIZE& size, int cxMaxWidth = 0) const | 
 | 	{ | 
 | #ifndef LM_GETIDEALSIZE | 
 | 		const UINT LM_GETIDEALSIZE = LM_GETIDEALHEIGHT; | 
 | #endif | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (int)::SendMessage(m_hWnd, LM_GETIDEALSIZE, cxMaxWidth, (LPARAM)&size); | 
 | 	} | 
 |  | 
 | // Operations | 
 | 	BOOL HitTest(PLHITTESTINFO pLHitTestInfo) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return (BOOL)::SendMessage(m_hWnd, LM_HITTEST, 0, (LPARAM)pLHitTestInfo); | 
 | 	} | 
 | }; | 
 |  | 
 | typedef CLinkCtrlT<ATL::CWindow>   CLinkCtrl; | 
 |  | 
 | #endif // (_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE) | 
 |  | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CCustomDraw - MI class for custom-draw support | 
 |  | 
 | template <class T> | 
 | class CCustomDraw | 
 | { | 
 | public: | 
 | #if (_ATL_VER < 0x0700) | 
 | 	BOOL m_bHandledCD; | 
 |  | 
 | 	BOOL IsMsgHandled() const | 
 | 	{ | 
 | 		return m_bHandledCD; | 
 | 	} | 
 |  | 
 | 	void SetMsgHandled(BOOL bHandled) | 
 | 	{ | 
 | 		m_bHandledCD = bHandled; | 
 | 	} | 
 | #endif // !(_ATL_VER < 0x0700) | 
 |  | 
 | // Message map and handlers | 
 | 	BEGIN_MSG_MAP(CCustomDraw< T >) | 
 | 		NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnCustomDraw) | 
 | 	ALT_MSG_MAP(1) | 
 | 		REFLECTED_NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnCustomDraw) | 
 | 	END_MSG_MAP() | 
 |  | 
 | // message handler | 
 | 	LRESULT OnCustomDraw(int idCtrl, LPNMHDR pnmh, BOOL& bHandled) | 
 | 	{ | 
 | 		T* pT = static_cast<T*>(this); | 
 | 		pT->SetMsgHandled(TRUE); | 
 | 		LPNMCUSTOMDRAW lpNMCustomDraw = (LPNMCUSTOMDRAW)pnmh; | 
 | 		DWORD dwRet = 0; | 
 | 		switch(lpNMCustomDraw->dwDrawStage) | 
 | 		{ | 
 | 		case CDDS_PREPAINT: | 
 | 			dwRet = pT->OnPrePaint(idCtrl, lpNMCustomDraw); | 
 | 			break; | 
 | 		case CDDS_POSTPAINT: | 
 | 			dwRet = pT->OnPostPaint(idCtrl, lpNMCustomDraw); | 
 | 			break; | 
 | 		case CDDS_PREERASE: | 
 | 			dwRet = pT->OnPreErase(idCtrl, lpNMCustomDraw); | 
 | 			break; | 
 | 		case CDDS_POSTERASE: | 
 | 			dwRet = pT->OnPostErase(idCtrl, lpNMCustomDraw); | 
 | 			break; | 
 | 		case CDDS_ITEMPREPAINT: | 
 | 			dwRet = pT->OnItemPrePaint(idCtrl, lpNMCustomDraw); | 
 | 			break; | 
 | 		case CDDS_ITEMPOSTPAINT: | 
 | 			dwRet = pT->OnItemPostPaint(idCtrl, lpNMCustomDraw); | 
 | 			break; | 
 | 		case CDDS_ITEMPREERASE: | 
 | 			dwRet = pT->OnItemPreErase(idCtrl, lpNMCustomDraw); | 
 | 			break; | 
 | 		case CDDS_ITEMPOSTERASE: | 
 | 			dwRet = pT->OnItemPostErase(idCtrl, lpNMCustomDraw); | 
 | 			break; | 
 | #if (_WIN32_IE >= 0x0400) | 
 | 		case (CDDS_ITEMPREPAINT | CDDS_SUBITEM): | 
 | 			dwRet = pT->OnSubItemPrePaint(idCtrl, lpNMCustomDraw); | 
 | 			break; | 
 | #endif // (_WIN32_IE >= 0x0400) | 
 | 		default: | 
 | 			pT->SetMsgHandled(FALSE); | 
 | 			break; | 
 | 		} | 
 | 		bHandled = pT->IsMsgHandled(); | 
 | 		return dwRet; | 
 | 	} | 
 |  | 
 | // Overrideables | 
 | 	DWORD OnPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) | 
 | 	{ | 
 | 		return CDRF_DODEFAULT; | 
 | 	} | 
 |  | 
 | 	DWORD OnPostPaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) | 
 | 	{ | 
 | 		return CDRF_DODEFAULT; | 
 | 	} | 
 |  | 
 | 	DWORD OnPreErase(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) | 
 | 	{ | 
 | 		return CDRF_DODEFAULT; | 
 | 	} | 
 |  | 
 | 	DWORD OnPostErase(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) | 
 | 	{ | 
 | 		return CDRF_DODEFAULT; | 
 | 	} | 
 |  | 
 | 	DWORD OnItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) | 
 | 	{ | 
 | 		return CDRF_DODEFAULT; | 
 | 	} | 
 |  | 
 | 	DWORD OnItemPostPaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) | 
 | 	{ | 
 | 		return CDRF_DODEFAULT; | 
 | 	} | 
 |  | 
 | 	DWORD OnItemPreErase(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) | 
 | 	{ | 
 | 		return CDRF_DODEFAULT; | 
 | 	} | 
 |  | 
 | 	DWORD OnItemPostErase(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) | 
 | 	{ | 
 | 		return CDRF_DODEFAULT; | 
 | 	} | 
 |  | 
 | #if (_WIN32_IE >= 0x0400) | 
 | 	DWORD OnSubItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) | 
 | 	{ | 
 | 		return CDRF_DODEFAULT; | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0400) | 
 | }; | 
 |  | 
 |  | 
 | // --- Windows CE common controls --- | 
 |  | 
 | #ifdef _WIN32_WCE | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CCECommandBarCtrl | 
 |  | 
 | template <class TBase> | 
 | class CCECommandBarCtrlT : public TBase | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CCECommandBarCtrlT(HWND hWnd = NULL) : TBase(hWnd) { } | 
 |  | 
 | 	CCECommandBarCtrlT< TBase >& operator=(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	BOOL IsVisible() const | 
 | 	{ | 
 | 		return IsWindowVisible(); | 
 | 	} | 
 |  | 
 | 	int GetHeight() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ::CommandBar_Height(m_hWnd); | 
 | 	} | 
 |  | 
 | 	HMENU GetMenu(WORD wButton) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ::CommandBar_GetMenu(m_hWnd, wButton); | 
 | 	} | 
 |  | 
 | // Operations | 
 | 	HWND Create(HWND hWndParent, int nCmdBarID) | 
 | 	{ | 
 | 		m_hWnd = ::CommandBar_Create(ModuleHelper::GetModuleInstance(), hWndParent, nCmdBarID); | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return m_hWnd; | 
 | 	} | 
 |  | 
 | 	void Destroy() | 
 | 	{ | 
 | 		DestroyWindow(); | 
 | 	} | 
 |  | 
 | 	BOOL Show(BOOL bShow = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ::CommandBar_Show(m_hWnd, bShow); | 
 | 	} | 
 |  | 
 | 	BOOL DrawMenuBar(WORD wButton) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ::CommandBar_DrawMenuBar(m_hWnd, wButton); | 
 | 	} | 
 |  | 
 | 	BOOL AddAdornments(DWORD dwFlags = 0) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ::CommandBar_AddAdornments(m_hWnd, dwFlags, 0); | 
 | 	} | 
 |  | 
 | 	int AddBitmap(int nBitmapID, int nNumImages) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ::CommandBar_AddBitmap(m_hWnd, ModuleHelper::GetResourceInstance(), nBitmapID, nNumImages, 16, 16); | 
 | 	} | 
 |  | 
 | 	BOOL AddButtons(UINT uNumButtons, LPTBBUTTON lpButtons) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CommandBar_AddButtons(m_hWnd, uNumButtons, lpButtons); | 
 | 	} | 
 |  | 
 | 	BOOL AddToolTips(UINT uNumToolTips, LPTSTR lpToolTips) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CommandBar_AddToolTips(m_hWnd, uNumToolTips, lpToolTips); | 
 | 	} | 
 |  | 
 | 	BOOL InsertButton(int nButton, LPTBBUTTON lpButton) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CommandBar_InsertButton(m_hWnd, nButton, lpButton); | 
 | 	} | 
 |  | 
 | 	HWND InsertComboBox(int nWidth, UINT dwStyle, WORD wComboBoxID, WORD wButton) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ::CommandBar_InsertComboBox(m_hWnd, ModuleHelper::GetModuleInstance(), nWidth, dwStyle, wComboBoxID, wButton); | 
 | 	} | 
 |  | 
 | 	BOOL InsertMenubar(WORD wMenuID, WORD wButton) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ::CommandBar_InsertMenubar(m_hWnd, ModuleHelper::GetResourceInstance(), wMenuID, wButton); | 
 | 	} | 
 |  | 
 | 	BOOL InsertMenubarEx(ATL::_U_STRINGorID menu, WORD wButton) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ::CommandBar_InsertMenubarEx(m_hWnd, ModuleHelper::GetResourceInstance(), (LPTSTR)menu.m_lpstr, wButton); | 
 | 	} | 
 |  | 
 | 	BOOL IsCommandBarMessage(LPMSG lpMsg) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ::IsCommandBarMessage(m_hWnd, lpMsg); | 
 | 	} | 
 | }; | 
 |  | 
 | #if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC MenuBar | 
 | 	typedef CCECommandBarCtrlT<CToolBarCtrl>	CMenuBarCtrl; | 
 | #else | 
 | 	typedef CCECommandBarCtrlT<CToolBarCtrl>	CCECommandBarCtrl; | 
 | #endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // CCECommandBandsCtrl | 
 |  | 
 | template <class TBase> | 
 | class CCECommandBandsCtrlT : public TBase | 
 | { | 
 | public: | 
 | // Constructors | 
 | 	CCECommandBandsCtrlT(HWND hWnd = NULL) : TBase(hWnd) { } | 
 |  | 
 | 	CCECommandBandsCtrlT< TBase >& operator=(HWND hWnd) | 
 | 	{ | 
 | 		m_hWnd = hWnd; | 
 | 		return *this; | 
 | 	} | 
 |  | 
 | // Attributes | 
 | 	BOOL IsVisible() const | 
 | 	{ | 
 | 		return IsWindowVisible(); | 
 | 	} | 
 |  | 
 | #if (_WIN32_IE >= 0x0400) | 
 | 	UINT GetHeight() const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return CommandBands_Height(m_hWnd); | 
 | 	} | 
 | #endif // (_WIN32_IE >= 0x0400) | 
 |  | 
 | 	HWND GetCommandBar(UINT uBand) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ::CommandBands_GetCommandBar(m_hWnd, uBand); | 
 | 	} | 
 |  | 
 | 	BOOL GetRestoreInformation(UINT uBand, LPCOMMANDBANDSRESTOREINFO pcbr) const | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ::CommandBands_GetRestoreInformation(m_hWnd, uBand, pcbr); | 
 | 	} | 
 |  | 
 | // Operations | 
 | 	HWND Create(HWND hWndParent, UINT wID, DWORD dwStyles, HIMAGELIST hImageList = NULL) | 
 | 	{ | 
 | 		m_hWnd = ::CommandBands_Create(ModuleHelper::GetModuleInstance(), hWndParent, wID, dwStyles, hImageList); | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return m_hWnd; | 
 | 	} | 
 |  | 
 | 	BOOL AddAdornments(DWORD dwFlags = 0, LPREBARBANDINFO prbbi = NULL) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ::CommandBands_AddAdornments(m_hWnd, ModuleHelper::GetModuleInstance(), dwFlags, prbbi); | 
 | 	} | 
 |  | 
 | 	BOOL AddBands(UINT uBandCount, LPREBARBANDINFO prbbi) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ::CommandBands_AddBands(m_hWnd, ModuleHelper::GetModuleInstance(), uBandCount, prbbi); | 
 | 	} | 
 |  | 
 | 	BOOL Show(BOOL bShow = TRUE) | 
 | 	{ | 
 | 		ATLASSERT(::IsWindow(m_hWnd)); | 
 | 		return ::CommandBands_Show(m_hWnd, bShow); | 
 | 	} | 
 | }; | 
 |  | 
 | typedef CCECommandBandsCtrlT<ATL::CWindow>	CCECommandBandsCtrl; | 
 |  | 
 | #endif // _WIN32_WCE | 
 |  | 
 | }; // namespace WTL | 
 |  | 
 | #endif // __ATLCTRLS_H__ |