1 // Windows Template Library - WTL version 9.10
2 // Copyright (C) Microsoft Corporation, WTL Team. All rights reserved.
3 //
4 // This file is a part of the Windows Template Library.
5 // The use and distribution terms for this software are covered by the
6 // Microsoft Public License (http://opensource.org/licenses/MS-PL)
7 // which can be found in the file MS-PL.txt at the root folder.
8 
9 #ifndef __ATLCTRLS_H__
10 #define __ATLCTRLS_H__
11 
12 #pragma once
13 
14 #ifndef __ATLAPP_H__
15 	#error atlctrls.h requires atlapp.h to be included first
16 #endif
17 
18 #ifndef __ATLWIN_H__
19 	#error atlctrls.h requires atlwin.h to be included first
20 #endif
21 
22 #ifndef _WIN32_WCE
23   #include <richedit.h>
24   #include <richole.h>
25 #elif defined(WIN32_PLATFORM_WFSP) && !defined(_WINUSERM_H_)
26   #include <winuserm.h>
27 #endif // !_WIN32_WCE
28 
29 // protect template members from windowsx.h macros
30 #ifdef _INC_WINDOWSX
31   #undef GetNextSibling
32   #undef GetPrevSibling
33 #endif // _INC_WINDOWSX
34 
35 
36 ///////////////////////////////////////////////////////////////////////////////
37 // Classes in this file:
38 //
39 // CStaticT<TBase> - CStatic
40 // CButtonT<TBase> - CButton
41 // CListBoxT<TBase> - CListBox
42 // CComboBoxT<TBase> - CComboBox
43 // CEditT<TBase> - CEdit
44 // CEditCommands<T>
45 // CScrollBarT<TBase> - CScrollBar
46 //
47 // CImageListT<t_bManaged> - CImageList, CImageListManaged
48 // CListViewCtrlT<TBase> - CListViewCtrl
49 // CTreeViewCtrlT<TBase> - CTreeViewCtrl
50 // CTreeItemT<TBase> - CTreeItem
51 // CTreeViewCtrlExT<TBase> - CTreeViewCtrlEx
52 // CHeaderCtrlT<TBase> - CHeaderCtrl
53 // CToolBarCtrlT<TBase> - CToolBarCtrl
54 // CStatusBarCtrlT<TBase> - CStatusBarCtrl
55 // CTabCtrlT<TBase> - CTabCtrl
56 // CToolInfo
57 // CToolTipCtrlT<TBase> - CToolTipCtrl
58 // CTrackBarCtrlT<TBase> - CTrackBarCtrl
59 // CUpDownCtrlT<TBase> - CUpDownCtrl
60 // CProgressBarCtrlT<TBase> - CProgressBarCtrl
61 // CHotKeyCtrlT<TBase> - CHotKeyCtrl
62 // CAnimateCtrlT<TBase> - CAnimateCtrl
63 // CRichEditCtrlT<TBase> - CRichEditCtrl
64 // CRichEditCommands<T>
65 // CDragListBoxT<TBase> - CDragListBox
66 // CDragListNotifyImpl<T>
67 // CReBarCtrlT<TBase> - CReBarCtrl
68 // CComboBoxExT<TBase> - CComboBoxEx
69 // CDateTimePickerCtrlT<TBase> - CDateTimePickerCtrl
70 // CMonthCalendarCtrlT<TBase> - CMonthCalendarCtrl
71 // CFlatScrollBarImpl<T>
72 // CFlatScrollBarT<TBase> - CFlatScrollBar
73 // CIPAddressCtrlT<TBase> - CIPAddressCtrl
74 // CPagerCtrlT<TBase> - CPagerCtrl
75 // CLinkCtrlT<TBase> - CLinkCtrl
76 //
77 // CCustomDraw<T>
78 //
79 // CCECommandBarCtrlT<TBase> - CCECommandBarCtrl
80 // CCECommandBandsCtrlT<TBase> - CCECommandBandsCtrl
81 
82 
83 namespace WTL
84 {
85 
86 // These are wrapper classes for Windows standard and common controls.
87 // To implement a window based on a control, use following:
88 // Example: Implementing a window based on a list box
89 //
90 // class CMyListBox : CWindowImpl<CMyListBox, CListBox>
91 // {
92 // public:
93 //      BEGIN_MSG_MAP(CMyListBox)
94 //          // put your message handler entries here
95 //      END_MSG_MAP()
96 // };
97 
98 
99 
100 // --- Standard Windows controls ---
101 
102 ///////////////////////////////////////////////////////////////////////////////
103 // CStatic - client side for a Windows STATIC control
104 
105 template <class TBase>
106 class CStaticT : public TBase
107 {
108 public:
109 // Constructors
TBase(hWnd)110 	CStaticT(HWND hWnd = NULL) : TBase(hWnd)
111 	{ }
112 
113 	CStaticT< TBase >& operator =(HWND hWnd)
114 	{
115 		m_hWnd = hWnd;
116 		return *this;
117 	}
118 
119 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
120 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
121 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
122 	{
123 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
124 	}
125 
126 // Attributes
GetWndClassName()127 	static LPCTSTR GetWndClassName()
128 	{
129 		return _T("STATIC");
130 	}
131 
132 #ifndef _WIN32_WCE
GetIcon()133 	HICON GetIcon() const
134 	{
135 		ATLASSERT(::IsWindow(m_hWnd));
136 		return (HICON)::SendMessage(m_hWnd, STM_GETICON, 0, 0L);
137 	}
138 
SetIcon(HICON hIcon)139 	HICON SetIcon(HICON hIcon)
140 	{
141 		ATLASSERT(::IsWindow(m_hWnd));
142 		return (HICON)::SendMessage(m_hWnd, STM_SETICON, (WPARAM)hIcon, 0L);
143 	}
144 
GetEnhMetaFile()145 	HENHMETAFILE GetEnhMetaFile() const
146 	{
147 		ATLASSERT(::IsWindow(m_hWnd));
148 		return (HENHMETAFILE)::SendMessage(m_hWnd, STM_GETIMAGE, IMAGE_ENHMETAFILE, 0L);
149 	}
150 
SetEnhMetaFile(HENHMETAFILE hMetaFile)151 	HENHMETAFILE SetEnhMetaFile(HENHMETAFILE hMetaFile)
152 	{
153 		ATLASSERT(::IsWindow(m_hWnd));
154 		return (HENHMETAFILE)::SendMessage(m_hWnd, STM_SETIMAGE, IMAGE_ENHMETAFILE, (LPARAM)hMetaFile);
155 	}
156 #else // CE specific
GetIcon()157 	HICON GetIcon() const
158 	{
159 		ATLASSERT(::IsWindow(m_hWnd));
160 		return (HICON)::SendMessage(m_hWnd, STM_GETIMAGE, IMAGE_ICON, 0L);
161 	}
162 
SetIcon(HICON hIcon)163 	HICON SetIcon(HICON hIcon)
164 	{
165 		ATLASSERT(::IsWindow(m_hWnd));
166 		return (HICON)::SendMessage(m_hWnd, STM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon);
167 	}
168 #endif // _WIN32_WCE
169 
GetBitmap()170 	CBitmapHandle GetBitmap() const
171 	{
172 		ATLASSERT(::IsWindow(m_hWnd));
173 		return CBitmapHandle((HBITMAP)::SendMessage(m_hWnd, STM_GETIMAGE, IMAGE_BITMAP, 0L));
174 	}
175 
SetBitmap(HBITMAP hBitmap)176 	CBitmapHandle SetBitmap(HBITMAP hBitmap)
177 	{
178 		ATLASSERT(::IsWindow(m_hWnd));
179 		return CBitmapHandle((HBITMAP)::SendMessage(m_hWnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap));
180 	}
181 
GetCursor()182 	HCURSOR GetCursor() const
183 	{
184 		ATLASSERT(::IsWindow(m_hWnd));
185 		return (HCURSOR)::SendMessage(m_hWnd, STM_GETIMAGE, IMAGE_CURSOR, 0L);
186 	}
187 
SetCursor(HCURSOR hCursor)188 	HCURSOR SetCursor(HCURSOR hCursor)
189 	{
190 		ATLASSERT(::IsWindow(m_hWnd));
191 		return (HCURSOR)::SendMessage(m_hWnd, STM_SETIMAGE, IMAGE_CURSOR, (LPARAM)hCursor);
192 	}
193 };
194 
195 typedef CStaticT<ATL::CWindow>   CStatic;
196 
197 
198 ///////////////////////////////////////////////////////////////////////////////
199 // CButton - client side for a Windows BUTTON control
200 
201 template <class TBase>
202 class CButtonT : public TBase
203 {
204 public:
205 // Constructors
TBase(hWnd)206 	CButtonT(HWND hWnd = NULL) : TBase(hWnd)
207 	{ }
208 
209 	CButtonT< TBase >& operator =(HWND hWnd)
210 	{
211 		m_hWnd = hWnd;
212 		return *this;
213 	}
214 
215 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
216 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
217 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
218 	{
219 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
220 	}
221 
222 // Attributes
GetWndClassName()223 	static LPCTSTR GetWndClassName()
224 	{
225 		return _T("BUTTON");
226 	}
227 
GetState()228 	UINT GetState() const
229 	{
230 		ATLASSERT(::IsWindow(m_hWnd));
231 		return (UINT)::SendMessage(m_hWnd, BM_GETSTATE, 0, 0L);
232 	}
233 
SetState(BOOL bHighlight)234 	void SetState(BOOL bHighlight)
235 	{
236 		ATLASSERT(::IsWindow(m_hWnd));
237 		::SendMessage(m_hWnd, BM_SETSTATE, bHighlight, 0L);
238 	}
239 
GetCheck()240 	int GetCheck() const
241 	{
242 		ATLASSERT(::IsWindow(m_hWnd));
243 		return (int)::SendMessage(m_hWnd, BM_GETCHECK, 0, 0L);
244 	}
245 
SetCheck(int nCheck)246 	void SetCheck(int nCheck)
247 	{
248 		ATLASSERT(::IsWindow(m_hWnd));
249 		::SendMessage(m_hWnd, BM_SETCHECK, nCheck, 0L);
250 	}
251 
GetButtonStyle()252 	UINT GetButtonStyle() const
253 	{
254 		ATLASSERT(::IsWindow(m_hWnd));
255 		return (UINT)::GetWindowLong(m_hWnd, GWL_STYLE) & 0xFFFF;
256 	}
257 
258 	void SetButtonStyle(UINT nStyle, BOOL bRedraw = TRUE)
259 	{
260 		ATLASSERT(::IsWindow(m_hWnd));
261 		::SendMessage(m_hWnd, BM_SETSTYLE, nStyle, (LPARAM)bRedraw);
262 	}
263 
264 #ifndef _WIN32_WCE
GetIcon()265 	HICON GetIcon() const
266 	{
267 		ATLASSERT(::IsWindow(m_hWnd));
268 		return (HICON)::SendMessage(m_hWnd, BM_GETIMAGE, IMAGE_ICON, 0L);
269 	}
270 
SetIcon(HICON hIcon)271 	HICON SetIcon(HICON hIcon)
272 	{
273 		ATLASSERT(::IsWindow(m_hWnd));
274 		return (HICON)::SendMessage(m_hWnd, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon);
275 	}
276 
GetBitmap()277 	CBitmapHandle GetBitmap() const
278 	{
279 		ATLASSERT(::IsWindow(m_hWnd));
280 		return CBitmapHandle((HBITMAP)::SendMessage(m_hWnd, BM_GETIMAGE, IMAGE_BITMAP, 0L));
281 	}
282 
SetBitmap(HBITMAP hBitmap)283 	CBitmapHandle SetBitmap(HBITMAP hBitmap)
284 	{
285 		ATLASSERT(::IsWindow(m_hWnd));
286 		return CBitmapHandle((HBITMAP)::SendMessage(m_hWnd, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap));
287 	}
288 #endif // !_WIN32_WCE
289 
290 #if (_WIN32_WINNT >= 0x0501)
GetIdealSize(LPSIZE lpSize)291 	BOOL GetIdealSize(LPSIZE lpSize) const
292 	{
293 		ATLASSERT(::IsWindow(m_hWnd));
294 		return (BOOL)::SendMessage(m_hWnd, BCM_GETIDEALSIZE, 0, (LPARAM)lpSize);
295 	}
296 
GetImageList(PBUTTON_IMAGELIST pButtonImagelist)297 	BOOL GetImageList(PBUTTON_IMAGELIST pButtonImagelist) const
298 	{
299 		ATLASSERT(::IsWindow(m_hWnd));
300 		return (BOOL)::SendMessage(m_hWnd, BCM_GETIMAGELIST, 0, (LPARAM)pButtonImagelist);
301 	}
302 
SetImageList(PBUTTON_IMAGELIST pButtonImagelist)303 	BOOL SetImageList(PBUTTON_IMAGELIST pButtonImagelist)
304 	{
305 		ATLASSERT(::IsWindow(m_hWnd));
306 		return (BOOL)::SendMessage(m_hWnd, BCM_SETIMAGELIST, 0, (LPARAM)pButtonImagelist);
307 	}
308 
GetTextMargin(LPRECT lpRect)309 	BOOL GetTextMargin(LPRECT lpRect) const
310 	{
311 		ATLASSERT(::IsWindow(m_hWnd));
312 		return (BOOL)::SendMessage(m_hWnd, BCM_GETTEXTMARGIN, 0, (LPARAM)lpRect);
313 	}
314 
SetTextMargin(LPRECT lpRect)315 	BOOL SetTextMargin(LPRECT lpRect)
316 	{
317 		ATLASSERT(::IsWindow(m_hWnd));
318 		return (BOOL)::SendMessage(m_hWnd, BCM_SETTEXTMARGIN, 0, (LPARAM)lpRect);
319 	}
320 #endif // (_WIN32_WINNT >= 0x0501)
321 
322 #if (WINVER >= 0x0600)
SetDontClick(BOOL bDontClick)323 	void SetDontClick(BOOL bDontClick)
324 	{
325 		ATLASSERT(::IsWindow(m_hWnd));
326 		::SendMessage(m_hWnd, BM_SETDONTCLICK, (WPARAM)bDontClick, 0L);
327 	}
328 #endif // (WINVER >= 0x0600)
329 
330 #if (_WIN32_WINNT >= 0x0600)
SetDropDownState(BOOL bDropDown)331 	BOOL SetDropDownState(BOOL bDropDown)
332 	{
333 		ATLASSERT(::IsWindow(m_hWnd));
334 		ATLASSERT((GetStyle() & (BS_SPLITBUTTON | BS_DEFSPLITBUTTON)) != 0);
335 		return (BOOL)::SendMessage(m_hWnd, BCM_SETDROPDOWNSTATE, (WPARAM)bDropDown, 0L);
336 	}
337 
GetSplitInfo(PBUTTON_SPLITINFO pSplitInfo)338 	BOOL GetSplitInfo(PBUTTON_SPLITINFO pSplitInfo) const
339 	{
340 		ATLASSERT(::IsWindow(m_hWnd));
341 		ATLASSERT((GetStyle() & (BS_SPLITBUTTON | BS_DEFSPLITBUTTON)) != 0);
342 		return (BOOL)::SendMessage(m_hWnd, BCM_GETSPLITINFO, 0, (LPARAM)pSplitInfo);
343 	}
344 
SetSplitInfo(PBUTTON_SPLITINFO pSplitInfo)345 	BOOL SetSplitInfo(PBUTTON_SPLITINFO pSplitInfo)
346 	{
347 		ATLASSERT(::IsWindow(m_hWnd));
348 		ATLASSERT((GetStyle() & (BS_SPLITBUTTON | BS_DEFSPLITBUTTON)) != 0);
349 		return (BOOL)::SendMessage(m_hWnd, BCM_SETSPLITINFO, 0, (LPARAM)pSplitInfo);
350 	}
351 
GetNoteLength()352 	int GetNoteLength() const
353 	{
354 		ATLASSERT(::IsWindow(m_hWnd));
355 		ATLASSERT((GetStyle() & (BS_COMMANDLINK | BS_DEFCOMMANDLINK)) != 0);
356 		return (int)::SendMessage(m_hWnd, BCM_GETNOTELENGTH, 0, 0L);
357 	}
358 
GetNote(LPWSTR lpstrNoteText,int cchNoteText)359 	BOOL GetNote(LPWSTR lpstrNoteText, int cchNoteText) const
360 	{
361 		ATLASSERT(::IsWindow(m_hWnd));
362 		ATLASSERT((GetStyle() & (BS_COMMANDLINK | BS_DEFCOMMANDLINK)) != 0);
363 		return (BOOL)::SendMessage(m_hWnd, BCM_GETNOTE, cchNoteText, (LPARAM)lpstrNoteText);
364 	}
365 
SetNote(LPCWSTR lpstrNoteText)366 	BOOL SetNote(LPCWSTR lpstrNoteText)
367 	{
368 		ATLASSERT(::IsWindow(m_hWnd));
369 		ATLASSERT((GetStyle() & (BS_COMMANDLINK | BS_DEFCOMMANDLINK)) != 0);
370 		return (BOOL)::SendMessage(m_hWnd, BCM_SETNOTE, 0, (LPARAM)lpstrNoteText);
371 	}
372 
SetElevationRequiredState(BOOL bSet)373 	LRESULT SetElevationRequiredState(BOOL bSet)
374 	{
375 		ATLASSERT(::IsWindow(m_hWnd));
376 		return ::SendMessage(m_hWnd, BCM_SETSHIELD, 0, (LPARAM)bSet);
377 	}
378 #endif // (_WIN32_WINNT >= 0x0600)
379 
380 // Operations
Click()381 	void Click()
382 	{
383 		ATLASSERT(::IsWindow(m_hWnd));
384 		::SendMessage(m_hWnd, BM_CLICK, 0, 0L);
385 	}
386 };
387 
388 typedef CButtonT<ATL::CWindow>   CButton;
389 
390 
391 ///////////////////////////////////////////////////////////////////////////////
392 // CListBox - client side for a Windows LISTBOX control
393 
394 template <class TBase>
395 class CListBoxT : public TBase
396 {
397 public:
398 // Constructors
TBase(hWnd)399 	CListBoxT(HWND hWnd = NULL) : TBase(hWnd)
400 	{ }
401 
402 	CListBoxT< TBase >& operator =(HWND hWnd)
403 	{
404 		m_hWnd = hWnd;
405 		return *this;
406 	}
407 
408 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
409 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
410 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
411 	{
412 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
413 	}
414 
415 // Attributes
GetWndClassName()416 	static LPCTSTR GetWndClassName()
417 	{
418 		return _T("LISTBOX");
419 	}
420 
421 	// for entire listbox
GetCount()422 	int GetCount() const
423 	{
424 		ATLASSERT(::IsWindow(m_hWnd));
425 		return (int)::SendMessage(m_hWnd, LB_GETCOUNT, 0, 0L);
426 	}
427 
428 #ifndef _WIN32_WCE
SetCount(int cItems)429 	int SetCount(int cItems)
430 	{
431 		ATLASSERT(::IsWindow(m_hWnd));
432 		ATLASSERT(((GetStyle() & LBS_NODATA) != 0) && ((GetStyle() & LBS_HASSTRINGS) == 0));
433 		return (int)::SendMessage(m_hWnd, LB_SETCOUNT, cItems, 0L);
434 	}
435 #endif // !_WIN32_WCE
436 
GetHorizontalExtent()437 	int GetHorizontalExtent() const
438 	{
439 		ATLASSERT(::IsWindow(m_hWnd));
440 		return (int)::SendMessage(m_hWnd, LB_GETHORIZONTALEXTENT, 0, 0L);
441 	}
442 
SetHorizontalExtent(int cxExtent)443 	void SetHorizontalExtent(int cxExtent)
444 	{
445 		ATLASSERT(::IsWindow(m_hWnd));
446 		::SendMessage(m_hWnd, LB_SETHORIZONTALEXTENT, cxExtent, 0L);
447 	}
448 
GetTopIndex()449 	int GetTopIndex() const
450 	{
451 		ATLASSERT(::IsWindow(m_hWnd));
452 		return (int)::SendMessage(m_hWnd, LB_GETTOPINDEX, 0, 0L);
453 	}
454 
SetTopIndex(int nIndex)455 	int SetTopIndex(int nIndex)
456 	{
457 		ATLASSERT(::IsWindow(m_hWnd));
458 		return (int)::SendMessage(m_hWnd, LB_SETTOPINDEX, nIndex, 0L);
459 	}
460 
GetLocale()461 	LCID GetLocale() const
462 	{
463 		ATLASSERT(::IsWindow(m_hWnd));
464 		return (LCID)::SendMessage(m_hWnd, LB_GETLOCALE, 0, 0L);
465 	}
466 
SetLocale(LCID nNewLocale)467 	LCID SetLocale(LCID nNewLocale)
468 	{
469 		ATLASSERT(::IsWindow(m_hWnd));
470 		return (LCID)::SendMessage(m_hWnd, LB_SETLOCALE, (WPARAM)nNewLocale, 0L);
471 	}
472 
473 #if (WINVER >= 0x0500) && !defined(_WIN32_WCE)
GetListBoxInfo()474 	DWORD GetListBoxInfo() const
475 	{
476 		ATLASSERT(::IsWindow(m_hWnd));
477 #if (_WIN32_WINNT >= 0x0501)
478 		return (DWORD)::SendMessage(m_hWnd, LB_GETLISTBOXINFO, 0, 0L);
479 #else // !(_WIN32_WINNT >= 0x0501)
480 		return ::GetListBoxInfo(m_hWnd);
481 #endif // !(_WIN32_WINNT >= 0x0501)
482 	}
483 #endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE)
484 
485 	// for single-selection listboxes
GetCurSel()486 	int GetCurSel() const
487 	{
488 		ATLASSERT(::IsWindow(m_hWnd));
489 		ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) == 0);
490 		return (int)::SendMessage(m_hWnd, LB_GETCURSEL, 0, 0L);
491 	}
492 
SetCurSel(int nSelect)493 	int SetCurSel(int nSelect)
494 	{
495 		ATLASSERT(::IsWindow(m_hWnd));
496 		ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) == 0);
497 		return (int)::SendMessage(m_hWnd, LB_SETCURSEL, nSelect, 0L);
498 	}
499 
500 	// for multiple-selection listboxes
GetSel(int nIndex)501 	int GetSel(int nIndex) const           // also works for single-selection
502 	{
503 		ATLASSERT(::IsWindow(m_hWnd));
504 		return (int)::SendMessage(m_hWnd, LB_GETSEL, nIndex, 0L);
505 	}
506 
507 	int SetSel(int nIndex, BOOL bSelect = TRUE)
508 	{
509 		ATLASSERT(::IsWindow(m_hWnd));
510 		ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0);
511 		return (int)::SendMessage(m_hWnd, LB_SETSEL, bSelect, nIndex);
512 	}
513 
GetSelCount()514 	int GetSelCount() const
515 	{
516 		ATLASSERT(::IsWindow(m_hWnd));
517 		ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0);
518 		return (int)::SendMessage(m_hWnd, LB_GETSELCOUNT, 0, 0L);
519 	}
520 
GetSelItems(int nMaxItems,LPINT rgIndex)521 	int GetSelItems(int nMaxItems, LPINT rgIndex) const
522 	{
523 		ATLASSERT(::IsWindow(m_hWnd));
524 		ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0);
525 		return (int)::SendMessage(m_hWnd, LB_GETSELITEMS, nMaxItems, (LPARAM)rgIndex);
526 	}
527 
GetAnchorIndex()528 	int GetAnchorIndex() const
529 	{
530 		ATLASSERT(::IsWindow(m_hWnd));
531 		ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0);
532 		return (int)::SendMessage(m_hWnd, LB_GETANCHORINDEX, 0, 0L);
533 	}
534 
SetAnchorIndex(int nIndex)535 	void SetAnchorIndex(int nIndex)
536 	{
537 		ATLASSERT(::IsWindow(m_hWnd));
538 		ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0);
539 		::SendMessage(m_hWnd, LB_SETANCHORINDEX, nIndex, 0L);
540 	}
541 
GetCaretIndex()542 	int GetCaretIndex() const
543 	{
544 		ATLASSERT(::IsWindow(m_hWnd));
545 		return (int)::SendMessage(m_hWnd, LB_GETCARETINDEX, 0, 0);
546 	}
547 
548 	int SetCaretIndex(int nIndex, BOOL bScroll = TRUE)
549 	{
550 		ATLASSERT(::IsWindow(m_hWnd));
551 		return (int)::SendMessage(m_hWnd, LB_SETCARETINDEX, nIndex, MAKELONG(bScroll, 0));
552 	}
553 
554 	// for listbox items
GetItemData(int nIndex)555 	DWORD_PTR GetItemData(int nIndex) const
556 	{
557 		ATLASSERT(::IsWindow(m_hWnd));
558 		return (DWORD_PTR)::SendMessage(m_hWnd, LB_GETITEMDATA, nIndex, 0L);
559 	}
560 
SetItemData(int nIndex,DWORD_PTR dwItemData)561 	int SetItemData(int nIndex, DWORD_PTR dwItemData)
562 	{
563 		ATLASSERT(::IsWindow(m_hWnd));
564 		return (int)::SendMessage(m_hWnd, LB_SETITEMDATA, nIndex, (LPARAM)dwItemData);
565 	}
566 
GetItemDataPtr(int nIndex)567 	void* GetItemDataPtr(int nIndex) const
568 	{
569 		ATLASSERT(::IsWindow(m_hWnd));
570 		return (void*)::SendMessage(m_hWnd, LB_GETITEMDATA, nIndex, 0L);
571 	}
572 
SetItemDataPtr(int nIndex,void * pData)573 	int SetItemDataPtr(int nIndex, void* pData)
574 	{
575 		ATLASSERT(::IsWindow(m_hWnd));
576 		return SetItemData(nIndex, (DWORD_PTR)pData);
577 	}
578 
GetItemRect(int nIndex,LPRECT lpRect)579 	int GetItemRect(int nIndex, LPRECT lpRect) const
580 	{
581 		ATLASSERT(::IsWindow(m_hWnd));
582 		return (int)::SendMessage(m_hWnd, LB_GETITEMRECT, nIndex, (LPARAM)lpRect);
583 	}
584 
GetText(int nIndex,LPTSTR lpszBuffer)585 	int GetText(int nIndex, LPTSTR lpszBuffer) const
586 	{
587 		ATLASSERT(::IsWindow(m_hWnd));
588 		return (int)::SendMessage(m_hWnd, LB_GETTEXT, nIndex, (LPARAM)lpszBuffer);
589 	}
590 
591 #ifndef _ATL_NO_COM
592 #ifdef _OLEAUTO_H_
GetTextBSTR(int nIndex,BSTR & bstrText)593 	BOOL GetTextBSTR(int nIndex, BSTR& bstrText) const
594 	{
595 		USES_CONVERSION;
596 		ATLASSERT(::IsWindow(m_hWnd));
597 		ATLASSERT(bstrText == NULL);
598 
599 		int nLen = GetTextLen(nIndex);
600 		if(nLen == LB_ERR)
601 			return FALSE;
602 
603 		CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;
604 		LPTSTR lpstrText = buff.Allocate(nLen + 1);
605 		if(lpstrText == NULL)
606 			return FALSE;
607 
608 		if(GetText(nIndex, lpstrText) == LB_ERR)
609 			return FALSE;
610 
611 		bstrText = ::SysAllocString(T2OLE(lpstrText));
612 		return (bstrText != NULL) ? TRUE : FALSE;
613 	}
614 #endif // _OLEAUTO_H_
615 #endif // !_ATL_NO_COM
616 
617 #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
GetText(int nIndex,_CSTRING_NS::CString & strText)618 	int GetText(int nIndex, _CSTRING_NS::CString& strText) const
619 	{
620 		ATLASSERT(::IsWindow(m_hWnd));
621 		int cchLen = GetTextLen(nIndex);
622 		if(cchLen == LB_ERR)
623 			return LB_ERR;
624 		int nRet = LB_ERR;
625 		LPTSTR lpstr = strText.GetBufferSetLength(cchLen);
626 		if(lpstr != NULL)
627 		{
628 			nRet = GetText(nIndex, lpstr);
629 			strText.ReleaseBuffer();
630 		}
631 		return nRet;
632 	}
633 #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
634 
GetTextLen(int nIndex)635 	int GetTextLen(int nIndex) const
636 	{
637 		ATLASSERT(::IsWindow(m_hWnd));
638 		return (int)::SendMessage(m_hWnd, LB_GETTEXTLEN, nIndex, 0L);
639 	}
640 
GetItemHeight(int nIndex)641 	int GetItemHeight(int nIndex) const
642 	{
643 		ATLASSERT(::IsWindow(m_hWnd));
644 		return (int)::SendMessage(m_hWnd, LB_GETITEMHEIGHT, nIndex, 0L);
645 	}
646 
SetItemHeight(int nIndex,UINT cyItemHeight)647 	int SetItemHeight(int nIndex, UINT cyItemHeight)
648 	{
649 		ATLASSERT(::IsWindow(m_hWnd));
650 		return (int)::SendMessage(m_hWnd, LB_SETITEMHEIGHT, nIndex, MAKELONG(cyItemHeight, 0));
651 	}
652 
653 	// Settable only attributes
SetColumnWidth(int cxWidth)654 	void SetColumnWidth(int cxWidth)
655 	{
656 		ATLASSERT(::IsWindow(m_hWnd));
657 		::SendMessage(m_hWnd, LB_SETCOLUMNWIDTH, cxWidth, 0L);
658 	}
659 
SetTabStops(int nTabStops,LPINT rgTabStops)660 	BOOL SetTabStops(int nTabStops, LPINT rgTabStops)
661 	{
662 		ATLASSERT(::IsWindow(m_hWnd));
663 		ATLASSERT((GetStyle() & LBS_USETABSTOPS) != 0);
664 		return (BOOL)::SendMessage(m_hWnd, LB_SETTABSTOPS, nTabStops, (LPARAM)rgTabStops);
665 	}
666 
SetTabStops()667 	BOOL SetTabStops()
668 	{
669 		ATLASSERT(::IsWindow(m_hWnd));
670 		ATLASSERT((GetStyle() & LBS_USETABSTOPS) != 0);
671 		return (BOOL)::SendMessage(m_hWnd, LB_SETTABSTOPS, 0, 0L);
672 	}
673 
SetTabStops(const int & cxEachStop)674 	BOOL SetTabStops(const int& cxEachStop)    // takes an 'int'
675 	{
676 		ATLASSERT(::IsWindow(m_hWnd));
677 		ATLASSERT((GetStyle() & LBS_USETABSTOPS) != 0);
678 		return (BOOL)::SendMessage(m_hWnd, LB_SETTABSTOPS, 1, (LPARAM)(LPINT)&cxEachStop);
679 	}
680 
681 // Operations
InitStorage(int nItems,UINT nBytes)682 	int InitStorage(int nItems, UINT nBytes)
683 	{
684 		ATLASSERT(::IsWindow(m_hWnd));
685 		return (int)::SendMessage(m_hWnd, LB_INITSTORAGE, (WPARAM)nItems, nBytes);
686 	}
687 
ResetContent()688 	void ResetContent()
689 	{
690 		ATLASSERT(::IsWindow(m_hWnd));
691 		::SendMessage(m_hWnd, LB_RESETCONTENT, 0, 0L);
692 	}
693 
ItemFromPoint(POINT pt,BOOL & bOutside)694 	UINT ItemFromPoint(POINT pt, BOOL& bOutside) const
695 	{
696 		ATLASSERT(::IsWindow(m_hWnd));
697 		DWORD dw = (DWORD)::SendMessage(m_hWnd, LB_ITEMFROMPOINT, 0, MAKELPARAM(pt.x, pt.y));
698 		bOutside = (BOOL)HIWORD(dw);
699 		return (UINT)LOWORD(dw);
700 	}
701 
702 	// manipulating listbox items
AddString(LPCTSTR lpszItem)703 	int AddString(LPCTSTR lpszItem)
704 	{
705 		ATLASSERT(::IsWindow(m_hWnd));
706 		return (int)::SendMessage(m_hWnd, LB_ADDSTRING, 0, (LPARAM)lpszItem);
707 	}
708 
DeleteString(UINT nIndex)709 	int DeleteString(UINT nIndex)
710 	{
711 		ATLASSERT(::IsWindow(m_hWnd));
712 		return (int)::SendMessage(m_hWnd, LB_DELETESTRING, nIndex, 0L);
713 	}
714 
InsertString(int nIndex,LPCTSTR lpszItem)715 	int InsertString(int nIndex, LPCTSTR lpszItem)
716 	{
717 		ATLASSERT(::IsWindow(m_hWnd));
718 		return (int)::SendMessage(m_hWnd, LB_INSERTSTRING, nIndex, (LPARAM)lpszItem);
719 	}
720 
721 #ifndef _WIN32_WCE
Dir(UINT attr,LPCTSTR lpszWildCard)722 	int Dir(UINT attr, LPCTSTR lpszWildCard)
723 	{
724 		ATLASSERT(::IsWindow(m_hWnd));
725 		return (int)::SendMessage(m_hWnd, LB_DIR, attr, (LPARAM)lpszWildCard);
726 	}
727 
AddFile(LPCTSTR lpstrFileName)728 	int AddFile(LPCTSTR lpstrFileName)
729 	{
730 		ATLASSERT(::IsWindow(m_hWnd));
731 		return (int)::SendMessage(m_hWnd, LB_ADDFILE, 0, (LPARAM)lpstrFileName);
732 	}
733 #endif // !_WIN32_WCE
734 
735 	// selection helpers
FindString(int nStartAfter,LPCTSTR lpszItem)736 	int FindString(int nStartAfter, LPCTSTR lpszItem) const
737 	{
738 		ATLASSERT(::IsWindow(m_hWnd));
739 		return (int)::SendMessage(m_hWnd, LB_FINDSTRING, nStartAfter, (LPARAM)lpszItem);
740 	}
741 
FindStringExact(int nIndexStart,LPCTSTR lpszFind)742 	int FindStringExact(int nIndexStart, LPCTSTR lpszFind) const
743 	{
744 		ATLASSERT(::IsWindow(m_hWnd));
745 		return (int)::SendMessage(m_hWnd, LB_FINDSTRINGEXACT, nIndexStart, (LPARAM)lpszFind);
746 	}
747 
SelectString(int nStartAfter,LPCTSTR lpszItem)748 	int SelectString(int nStartAfter, LPCTSTR lpszItem)
749 	{
750 		ATLASSERT(::IsWindow(m_hWnd));
751 		return (int)::SendMessage(m_hWnd, LB_SELECTSTRING, nStartAfter, (LPARAM)lpszItem);
752 	}
753 
SelItemRange(BOOL bSelect,int nFirstItem,int nLastItem)754 	int SelItemRange(BOOL bSelect, int nFirstItem, int nLastItem)
755 	{
756 		ATLASSERT(::IsWindow(m_hWnd));
757 		ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0);
758 		ATLASSERT(nFirstItem <= nLastItem);
759 		return bSelect ? (int)::SendMessage(m_hWnd, LB_SELITEMRANGEEX, nFirstItem, nLastItem) : (int)::SendMessage(m_hWnd, LB_SELITEMRANGEEX, nLastItem, nFirstItem);
760 	}
761 
762 #ifdef WIN32_PLATFORM_WFSP   // SmartPhone only messages
763 	DWORD GetInputMode(BOOL bCurrentMode = TRUE)
764 	{
765 		return SendMessage(LB_GETINPUTMODE, 0, (LPARAM)bCurrentMode);
766 	}
767 
SetInputMode(DWORD dwMode)768 	BOOL SetInputMode(DWORD dwMode)
769 	{
770 		return SendMessage(LB_SETINPUTMODE, 0, (LPARAM)dwMode);
771 	}
772 #endif // WIN32_PLATFORM_WFSP
773 };
774 
775 typedef CListBoxT<ATL::CWindow>   CListBox;
776 
777 
778 ///////////////////////////////////////////////////////////////////////////////
779 // CComboBox - client side for a Windows COMBOBOX control
780 
781 #ifndef WIN32_PLATFORM_WFSP   // No COMBOBOX on SmartPhones
782 
783 template <class TBase>
784 class CComboBoxT : public TBase
785 {
786 public:
787 // Constructors
TBase(hWnd)788 	CComboBoxT(HWND hWnd = NULL) : TBase(hWnd)
789 	{ }
790 
791 	CComboBoxT< TBase >& operator =(HWND hWnd)
792 	{
793 		m_hWnd = hWnd;
794 		return *this;
795 	}
796 
797 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
798 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
799 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
800 	{
801 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
802 	}
803 
804 // Attributes
GetWndClassName()805 	static LPCTSTR GetWndClassName()
806 	{
807 		return _T("COMBOBOX");
808 	}
809 
810 	// for entire combo box
GetCount()811 	int GetCount() const
812 	{
813 		ATLASSERT(::IsWindow(m_hWnd));
814 		return (int)::SendMessage(m_hWnd, CB_GETCOUNT, 0, 0L);
815 	}
816 
GetCurSel()817 	int GetCurSel() const
818 	{
819 		ATLASSERT(::IsWindow(m_hWnd));
820 		return (int)::SendMessage(m_hWnd, CB_GETCURSEL, 0, 0L);
821 	}
822 
SetCurSel(int nSelect)823 	int SetCurSel(int nSelect)
824 	{
825 		ATLASSERT(::IsWindow(m_hWnd));
826 		return (int)::SendMessage(m_hWnd, CB_SETCURSEL, nSelect, 0L);
827 	}
828 
GetLocale()829 	LCID GetLocale() const
830 	{
831 		ATLASSERT(::IsWindow(m_hWnd));
832 		return (LCID)::SendMessage(m_hWnd, CB_GETLOCALE, 0, 0L);
833 	}
834 
SetLocale(LCID nNewLocale)835 	LCID SetLocale(LCID nNewLocale)
836 	{
837 		ATLASSERT(::IsWindow(m_hWnd));
838 		return (LCID)::SendMessage(m_hWnd, CB_SETLOCALE, (WPARAM)nNewLocale, 0L);
839 	}
840 
GetTopIndex()841 	int GetTopIndex() const
842 	{
843 		ATLASSERT(::IsWindow(m_hWnd));
844 		return (int)::SendMessage(m_hWnd, CB_GETTOPINDEX, 0, 0L);
845 	}
846 
SetTopIndex(int nIndex)847 	int SetTopIndex(int nIndex)
848 	{
849 		ATLASSERT(::IsWindow(m_hWnd));
850 		return (int)::SendMessage(m_hWnd, CB_SETTOPINDEX, nIndex, 0L);
851 	}
852 
GetHorizontalExtent()853 	UINT GetHorizontalExtent() const
854 	{
855 		ATLASSERT(::IsWindow(m_hWnd));
856 		return (UINT)::SendMessage(m_hWnd, CB_GETHORIZONTALEXTENT, 0, 0L);
857 	}
858 
SetHorizontalExtent(UINT nExtent)859 	void SetHorizontalExtent(UINT nExtent)
860 	{
861 		ATLASSERT(::IsWindow(m_hWnd));
862 		::SendMessage(m_hWnd, CB_SETHORIZONTALEXTENT, nExtent, 0L);
863 	}
864 
GetDroppedWidth()865 	int GetDroppedWidth() const
866 	{
867 		ATLASSERT(::IsWindow(m_hWnd));
868 		return (int)::SendMessage(m_hWnd, CB_GETDROPPEDWIDTH, 0, 0L);
869 	}
870 
SetDroppedWidth(UINT nWidth)871 	int SetDroppedWidth(UINT nWidth)
872 	{
873 		ATLASSERT(::IsWindow(m_hWnd));
874 		return (int)::SendMessage(m_hWnd, CB_SETDROPPEDWIDTH, nWidth, 0L);
875 	}
876 
877 #if ((WINVER >= 0x0500) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420))
GetComboBoxInfo(PCOMBOBOXINFO pComboBoxInfo)878 	BOOL GetComboBoxInfo(PCOMBOBOXINFO pComboBoxInfo) const
879 	{
880 		ATLASSERT(::IsWindow(m_hWnd));
881 #if ((_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420))
882 		return (BOOL)::SendMessage(m_hWnd, CB_GETCOMBOBOXINFO, 0, (LPARAM)pComboBoxInfo);
883 #else // !((_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420))
884 		return ::GetComboBoxInfo(m_hWnd, pComboBoxInfo);
885 #endif // !((_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420))
886 	}
887 #endif // ((WINVER >= 0x0500) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420))
888 
889 	// for edit control
GetEditSel()890 	DWORD GetEditSel() const
891 	{
892 		ATLASSERT(::IsWindow(m_hWnd));
893 		return (DWORD)::SendMessage(m_hWnd, CB_GETEDITSEL, 0, 0L);
894 	}
895 
SetEditSel(int nStartChar,int nEndChar)896 	BOOL SetEditSel(int nStartChar, int nEndChar)
897 	{
898 		ATLASSERT(::IsWindow(m_hWnd));
899 		return (BOOL)::SendMessage(m_hWnd, CB_SETEDITSEL, 0, MAKELONG(nStartChar, nEndChar));
900 	}
901 
902 	// for combobox item
GetItemData(int nIndex)903 	DWORD_PTR GetItemData(int nIndex) const
904 	{
905 		ATLASSERT(::IsWindow(m_hWnd));
906 		return (DWORD_PTR)::SendMessage(m_hWnd, CB_GETITEMDATA, nIndex, 0L);
907 	}
908 
SetItemData(int nIndex,DWORD_PTR dwItemData)909 	int SetItemData(int nIndex, DWORD_PTR dwItemData)
910 	{
911 		ATLASSERT(::IsWindow(m_hWnd));
912 		return (int)::SendMessage(m_hWnd, CB_SETITEMDATA, nIndex, (LPARAM)dwItemData);
913 	}
914 
GetItemDataPtr(int nIndex)915 	void* GetItemDataPtr(int nIndex) const
916 	{
917 		ATLASSERT(::IsWindow(m_hWnd));
918 		return (void*)GetItemData(nIndex);
919 	}
920 
SetItemDataPtr(int nIndex,void * pData)921 	int SetItemDataPtr(int nIndex, void* pData)
922 	{
923 		ATLASSERT(::IsWindow(m_hWnd));
924 		return SetItemData(nIndex, (DWORD_PTR)pData);
925 	}
926 
GetLBText(int nIndex,LPTSTR lpszText)927 	int GetLBText(int nIndex, LPTSTR lpszText) const
928 	{
929 		ATLASSERT(::IsWindow(m_hWnd));
930 		return (int)::SendMessage(m_hWnd, CB_GETLBTEXT, nIndex, (LPARAM)lpszText);
931 	}
932 
933 #ifndef _ATL_NO_COM
GetLBTextBSTR(int nIndex,BSTR & bstrText)934 	BOOL GetLBTextBSTR(int nIndex, BSTR& bstrText) const
935 	{
936 		USES_CONVERSION;
937 		ATLASSERT(::IsWindow(m_hWnd));
938 		ATLASSERT(bstrText == NULL);
939 
940 		int nLen = GetLBTextLen(nIndex);
941 		if(nLen == CB_ERR)
942 			return FALSE;
943 
944 		CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;
945 		LPTSTR lpstrText = buff.Allocate(nLen + 1);
946 		if(lpstrText == NULL)
947 			return FALSE;
948 
949 		if(GetLBText(nIndex, lpstrText) == CB_ERR)
950 			return FALSE;
951 
952 		bstrText = ::SysAllocString(T2OLE(lpstrText));
953 		return (bstrText != NULL) ? TRUE : FALSE;
954 	}
955 #endif // !_ATL_NO_COM
956 
957 #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
GetLBText(int nIndex,_CSTRING_NS::CString & strText)958 	int GetLBText(int nIndex, _CSTRING_NS::CString& strText) const
959 	{
960 		ATLASSERT(::IsWindow(m_hWnd));
961 		int cchLen = GetLBTextLen(nIndex);
962 		if(cchLen == CB_ERR)
963 			return CB_ERR;
964 		int nRet = CB_ERR;
965 		LPTSTR lpstr = strText.GetBufferSetLength(cchLen);
966 		if(lpstr != NULL)
967 		{
968 			nRet = GetLBText(nIndex, lpstr);
969 			strText.ReleaseBuffer();
970 		}
971 		return nRet;
972 	}
973 #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
974 
GetLBTextLen(int nIndex)975 	int GetLBTextLen(int nIndex) const
976 	{
977 		ATLASSERT(::IsWindow(m_hWnd));
978 		return (int)::SendMessage(m_hWnd, CB_GETLBTEXTLEN, nIndex, 0L);
979 	}
980 
GetItemHeight(int nIndex)981 	int GetItemHeight(int nIndex) const
982 	{
983 		ATLASSERT(::IsWindow(m_hWnd));
984 		return (int)::SendMessage(m_hWnd, CB_GETITEMHEIGHT, nIndex, 0L);
985 	}
986 
SetItemHeight(int nIndex,UINT cyItemHeight)987 	int SetItemHeight(int nIndex, UINT cyItemHeight)
988 	{
989 		ATLASSERT(::IsWindow(m_hWnd));
990 		return (int)::SendMessage(m_hWnd, CB_SETITEMHEIGHT, nIndex, MAKELONG(cyItemHeight, 0));
991 	}
992 
GetExtendedUI()993 	BOOL GetExtendedUI() const
994 	{
995 		ATLASSERT(::IsWindow(m_hWnd));
996 		return (BOOL)::SendMessage(m_hWnd, CB_GETEXTENDEDUI, 0, 0L);
997 	}
998 
999 	int SetExtendedUI(BOOL bExtended = TRUE)
1000 	{
1001 		ATLASSERT(::IsWindow(m_hWnd));
1002 		return (int)::SendMessage(m_hWnd, CB_SETEXTENDEDUI, bExtended, 0L);
1003 	}
1004 
GetDroppedControlRect(LPRECT lprect)1005 	void GetDroppedControlRect(LPRECT lprect) const
1006 	{
1007 		ATLASSERT(::IsWindow(m_hWnd));
1008 		::SendMessage(m_hWnd, CB_GETDROPPEDCONTROLRECT, 0, (LPARAM)lprect);
1009 	}
1010 
GetDroppedState()1011 	BOOL GetDroppedState() const
1012 	{
1013 		ATLASSERT(::IsWindow(m_hWnd));
1014 		return (BOOL)::SendMessage(m_hWnd, CB_GETDROPPEDSTATE, 0, 0L);
1015 	}
1016 
1017 #if (_WIN32_WINNT >= 0x0501)
GetMinVisible()1018 	int GetMinVisible() const
1019 	{
1020 		ATLASSERT(::IsWindow(m_hWnd));
1021 		return (int)::SendMessage(m_hWnd, CB_GETMINVISIBLE, 0, 0L);
1022 	}
1023 
SetMinVisible(int nMinVisible)1024 	BOOL SetMinVisible(int nMinVisible)
1025 	{
1026 		ATLASSERT(::IsWindow(m_hWnd));
1027 		return (BOOL)::SendMessage(m_hWnd, CB_SETMINVISIBLE, nMinVisible, 0L);
1028 	}
1029 
1030 	// Vista only
GetCueBannerText(LPWSTR lpwText,int cchText)1031 	BOOL GetCueBannerText(LPWSTR lpwText, int cchText) const
1032 	{
1033 #ifndef CB_GETCUEBANNER
1034 		const UINT CB_GETCUEBANNER = (CBM_FIRST + 4);
1035 #endif
1036 		ATLASSERT(::IsWindow(m_hWnd));
1037 		return (BOOL)::SendMessage(m_hWnd, CB_GETCUEBANNER, (WPARAM)lpwText, cchText);
1038 	}
1039 
1040 	// Vista only
SetCueBannerText(LPCWSTR lpcwText)1041 	BOOL SetCueBannerText(LPCWSTR lpcwText)
1042 	{
1043 #ifndef CB_SETCUEBANNER
1044 		const UINT CB_SETCUEBANNER = (CBM_FIRST + 3);
1045 #endif
1046 		ATLASSERT(::IsWindow(m_hWnd));
1047 		return (BOOL)::SendMessage(m_hWnd, CB_SETCUEBANNER, 0, (LPARAM)lpcwText);
1048 	}
1049 #endif // (_WIN32_WINNT >= 0x0501)
1050 
1051 // Operations
InitStorage(int nItems,UINT nBytes)1052 	int InitStorage(int nItems, UINT nBytes)
1053 	{
1054 		ATLASSERT(::IsWindow(m_hWnd));
1055 		return (int)::SendMessage(m_hWnd, CB_INITSTORAGE, (WPARAM)nItems, nBytes);
1056 	}
1057 
ResetContent()1058 	void ResetContent()
1059 	{
1060 		ATLASSERT(::IsWindow(m_hWnd));
1061 		::SendMessage(m_hWnd, CB_RESETCONTENT, 0, 0L);
1062 	}
1063 
1064 	// for edit control
LimitText(int nMaxChars)1065 	BOOL LimitText(int nMaxChars)
1066 	{
1067 		ATLASSERT(::IsWindow(m_hWnd));
1068 		return (BOOL)::SendMessage(m_hWnd, CB_LIMITTEXT, nMaxChars, 0L);
1069 	}
1070 
1071 	// for drop-down combo boxes
1072 	void ShowDropDown(BOOL bShowIt = TRUE)
1073 	{
1074 		ATLASSERT(::IsWindow(m_hWnd));
1075 		::SendMessage(m_hWnd, CB_SHOWDROPDOWN, bShowIt, 0L);
1076 	}
1077 
1078 	// manipulating listbox items
AddString(LPCTSTR lpszString)1079 	int AddString(LPCTSTR lpszString)
1080 	{
1081 		ATLASSERT(::IsWindow(m_hWnd));
1082 		return (int)::SendMessage(m_hWnd, CB_ADDSTRING, 0, (LPARAM)lpszString);
1083 	}
1084 
DeleteString(UINT nIndex)1085 	int DeleteString(UINT nIndex)
1086 	{
1087 		ATLASSERT(::IsWindow(m_hWnd));
1088 		return (int)::SendMessage(m_hWnd, CB_DELETESTRING, nIndex, 0L);
1089 	}
1090 
InsertString(int nIndex,LPCTSTR lpszString)1091 	int InsertString(int nIndex, LPCTSTR lpszString)
1092 	{
1093 		ATLASSERT(::IsWindow(m_hWnd));
1094 		return (int)::SendMessage(m_hWnd, CB_INSERTSTRING, nIndex, (LPARAM)lpszString);
1095 	}
1096 
1097 #ifndef _WIN32_WCE
Dir(UINT attr,LPCTSTR lpszWildCard)1098 	int Dir(UINT attr, LPCTSTR lpszWildCard)
1099 	{
1100 		ATLASSERT(::IsWindow(m_hWnd));
1101 		return (int)::SendMessage(m_hWnd, CB_DIR, attr, (LPARAM)lpszWildCard);
1102 	}
1103 #endif // !_WIN32_WCE
1104 
1105 	// selection helpers
FindString(int nStartAfter,LPCTSTR lpszString)1106 	int FindString(int nStartAfter, LPCTSTR lpszString) const
1107 	{
1108 		ATLASSERT(::IsWindow(m_hWnd));
1109 		return (int)::SendMessage(m_hWnd, CB_FINDSTRING, nStartAfter, (LPARAM)lpszString);
1110 	}
1111 
FindStringExact(int nIndexStart,LPCTSTR lpszFind)1112 	int FindStringExact(int nIndexStart, LPCTSTR lpszFind) const
1113 	{
1114 		ATLASSERT(::IsWindow(m_hWnd));
1115 		return (int)::SendMessage(m_hWnd, CB_FINDSTRINGEXACT, nIndexStart, (LPARAM)lpszFind);
1116 	}
1117 
SelectString(int nStartAfter,LPCTSTR lpszString)1118 	int SelectString(int nStartAfter, LPCTSTR lpszString)
1119 	{
1120 		ATLASSERT(::IsWindow(m_hWnd));
1121 		return (int)::SendMessage(m_hWnd, CB_SELECTSTRING, nStartAfter, (LPARAM)lpszString);
1122 	}
1123 
1124 	// Clipboard operations
Clear()1125 	void Clear()
1126 	{
1127 		ATLASSERT(::IsWindow(m_hWnd));
1128 		::SendMessage(m_hWnd, WM_CLEAR, 0, 0L);
1129 	}
1130 
Copy()1131 	void Copy()
1132 	{
1133 		ATLASSERT(::IsWindow(m_hWnd));
1134 		::SendMessage(m_hWnd, WM_COPY, 0, 0L);
1135 	}
1136 
Cut()1137 	void Cut()
1138 	{
1139 		ATLASSERT(::IsWindow(m_hWnd));
1140 		::SendMessage(m_hWnd, WM_CUT, 0, 0L);
1141 	}
1142 
Paste()1143 	void Paste()
1144 	{
1145 		ATLASSERT(::IsWindow(m_hWnd));
1146 		::SendMessage(m_hWnd, WM_PASTE, 0, 0L);
1147 	}
1148 };
1149 
1150 typedef CComboBoxT<ATL::CWindow>   CComboBox;
1151 
1152 #endif // !WIN32_PLATFORM_WFSP
1153 
1154 ///////////////////////////////////////////////////////////////////////////////
1155 // CEdit - client side for a Windows EDIT control
1156 
1157 template <class TBase>
1158 class CEditT : public TBase
1159 {
1160 public:
1161 // Constructors
TBase(hWnd)1162 	CEditT(HWND hWnd = NULL) : TBase(hWnd)
1163 	{ }
1164 
1165 	CEditT< TBase >& operator =(HWND hWnd)
1166 	{
1167 		m_hWnd = hWnd;
1168 		return *this;
1169 	}
1170 
1171 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
1172 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
1173 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
1174 	{
1175 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
1176 	}
1177 
1178 // Attributes
GetWndClassName()1179 	static LPCTSTR GetWndClassName()
1180 	{
1181 		return _T("EDIT");
1182 	}
1183 
CanUndo()1184 	BOOL CanUndo() const
1185 	{
1186 		ATLASSERT(::IsWindow(m_hWnd));
1187 		return (BOOL)::SendMessage(m_hWnd, EM_CANUNDO, 0, 0L);
1188 	}
1189 
GetLineCount()1190 	int GetLineCount() const
1191 	{
1192 		ATLASSERT(::IsWindow(m_hWnd));
1193 		return (int)::SendMessage(m_hWnd, EM_GETLINECOUNT, 0, 0L);
1194 	}
1195 
GetModify()1196 	BOOL GetModify() const
1197 	{
1198 		ATLASSERT(::IsWindow(m_hWnd));
1199 		return (BOOL)::SendMessage(m_hWnd, EM_GETMODIFY, 0, 0L);
1200 	}
1201 
1202 	void SetModify(BOOL bModified = TRUE)
1203 	{
1204 		ATLASSERT(::IsWindow(m_hWnd));
1205 		::SendMessage(m_hWnd, EM_SETMODIFY, bModified, 0L);
1206 	}
1207 
GetRect(LPRECT lpRect)1208 	void GetRect(LPRECT lpRect) const
1209 	{
1210 		ATLASSERT(::IsWindow(m_hWnd));
1211 		::SendMessage(m_hWnd, EM_GETRECT, 0, (LPARAM)lpRect);
1212 	}
1213 
GetSel()1214 	DWORD GetSel() const
1215 	{
1216 		ATLASSERT(::IsWindow(m_hWnd));
1217 		return (DWORD)::SendMessage(m_hWnd, EM_GETSEL, 0, 0L);
1218 	}
1219 
GetSel(int & nStartChar,int & nEndChar)1220 	void GetSel(int& nStartChar, int& nEndChar) const
1221 	{
1222 		ATLASSERT(::IsWindow(m_hWnd));
1223 		::SendMessage(m_hWnd, EM_GETSEL, (WPARAM)&nStartChar, (LPARAM)&nEndChar);
1224 	}
1225 
1226 #ifndef _WIN32_WCE
GetHandle()1227 	HLOCAL GetHandle() const
1228 	{
1229 		ATLASSERT(::IsWindow(m_hWnd));
1230 		return (HLOCAL)::SendMessage(m_hWnd, EM_GETHANDLE, 0, 0L);
1231 	}
1232 
SetHandle(HLOCAL hBuffer)1233 	void SetHandle(HLOCAL hBuffer)
1234 	{
1235 		ATLASSERT(::IsWindow(m_hWnd));
1236 		::SendMessage(m_hWnd, EM_SETHANDLE, (WPARAM)hBuffer, 0L);
1237 	}
1238 #endif // !_WIN32_WCE
1239 
GetMargins()1240 	DWORD GetMargins() const
1241 	{
1242 		ATLASSERT(::IsWindow(m_hWnd));
1243 		return (DWORD)::SendMessage(m_hWnd, EM_GETMARGINS, 0, 0L);
1244 	}
1245 
GetMargins(UINT & nLeft,UINT & nRight)1246 	void GetMargins(UINT& nLeft, UINT& nRight) const
1247 	{
1248 		ATLASSERT(::IsWindow(m_hWnd));
1249 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, EM_GETMARGINS, 0, 0L);
1250 		nLeft = LOWORD(dwRet);
1251 		nRight = HIWORD(dwRet);
1252 	}
1253 
1254 	void SetMargins(UINT nLeft, UINT nRight, WORD wFlags = EC_LEFTMARGIN | EC_RIGHTMARGIN)
1255 	{
1256 		ATLASSERT(::IsWindow(m_hWnd));
1257 		::SendMessage(m_hWnd, EM_SETMARGINS, wFlags, MAKELONG(nLeft, nRight));
1258 	}
1259 
GetLimitText()1260 	UINT GetLimitText() const
1261 	{
1262 		ATLASSERT(::IsWindow(m_hWnd));
1263 		return (UINT)::SendMessage(m_hWnd, EM_GETLIMITTEXT, 0, 0L);
1264 	}
1265 
SetLimitText(UINT nMax)1266 	void SetLimitText(UINT nMax)
1267 	{
1268 		ATLASSERT(::IsWindow(m_hWnd));
1269 		::SendMessage(m_hWnd, EM_SETLIMITTEXT, nMax, 0L);
1270 	}
1271 
PosFromChar(UINT nChar)1272 	POINT PosFromChar(UINT nChar) const
1273 	{
1274 		ATLASSERT(::IsWindow(m_hWnd));
1275 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, EM_POSFROMCHAR, nChar, 0);
1276 		POINT point = { GET_X_LPARAM(dwRet), GET_Y_LPARAM(dwRet) };
1277 		return point;
1278 	}
1279 
1280 	int CharFromPos(POINT pt, int* pLine = NULL) const
1281 	{
1282 		ATLASSERT(::IsWindow(m_hWnd));
1283 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, EM_CHARFROMPOS, 0, MAKELPARAM(pt.x, pt.y));
1284 		if(pLine != NULL)
1285 			*pLine = (int)(short)HIWORD(dwRet);
1286 		return (int)(short)LOWORD(dwRet);
1287 	}
1288 
1289 	// NOTE: first word in lpszBuffer must contain the size of the buffer!
GetLine(int nIndex,LPTSTR lpszBuffer)1290 	int GetLine(int nIndex, LPTSTR lpszBuffer) const
1291 	{
1292 		ATLASSERT(::IsWindow(m_hWnd));
1293 		return (int)::SendMessage(m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer);
1294 	}
1295 
GetLine(int nIndex,LPTSTR lpszBuffer,int nMaxLength)1296 	int GetLine(int nIndex, LPTSTR lpszBuffer, int nMaxLength) const
1297 	{
1298 		ATLASSERT(::IsWindow(m_hWnd));
1299 		*(LPWORD)lpszBuffer = (WORD)nMaxLength;
1300 		return (int)::SendMessage(m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer);
1301 	}
1302 
GetPasswordChar()1303 	TCHAR GetPasswordChar() const
1304 	{
1305 		ATLASSERT(::IsWindow(m_hWnd));
1306 		return (TCHAR)::SendMessage(m_hWnd, EM_GETPASSWORDCHAR, 0, 0L);
1307 	}
1308 
SetPasswordChar(TCHAR ch)1309 	void SetPasswordChar(TCHAR ch)
1310 	{
1311 		ATLASSERT(::IsWindow(m_hWnd));
1312 		::SendMessage(m_hWnd, EM_SETPASSWORDCHAR, ch, 0L);
1313 	}
1314 
1315 #ifndef _WIN32_WCE
GetWordBreakProc()1316 	EDITWORDBREAKPROC GetWordBreakProc() const
1317 	{
1318 		ATLASSERT(::IsWindow(m_hWnd));
1319 		return (EDITWORDBREAKPROC)::SendMessage(m_hWnd, EM_GETWORDBREAKPROC, 0, 0L);
1320 	}
1321 
SetWordBreakProc(EDITWORDBREAKPROC ewbprc)1322 	void SetWordBreakProc(EDITWORDBREAKPROC ewbprc)
1323 	{
1324 		ATLASSERT(::IsWindow(m_hWnd));
1325 		::SendMessage(m_hWnd, EM_SETWORDBREAKPROC, 0, (LPARAM)ewbprc);
1326 	}
1327 #endif // !_WIN32_WCE
1328 
GetFirstVisibleLine()1329 	int GetFirstVisibleLine() const
1330 	{
1331 		ATLASSERT(::IsWindow(m_hWnd));
1332 		return (int)::SendMessage(m_hWnd, EM_GETFIRSTVISIBLELINE, 0, 0L);
1333 	}
1334 
1335 #ifndef _WIN32_WCE
GetThumb()1336 	int GetThumb() const
1337 	{
1338 		ATLASSERT(::IsWindow(m_hWnd));
1339 		ATLASSERT((GetStyle() & ES_MULTILINE) != 0);
1340 		return (int)::SendMessage(m_hWnd, EM_GETTHUMB, 0, 0L);
1341 	}
1342 #endif // !_WIN32_WCE
1343 
1344 	BOOL SetReadOnly(BOOL bReadOnly = TRUE)
1345 	{
1346 		ATLASSERT(::IsWindow(m_hWnd));
1347 		return (BOOL)::SendMessage(m_hWnd, EM_SETREADONLY, bReadOnly, 0L);
1348 	}
1349 
1350 #if (WINVER >= 0x0500) && !defined(_WIN32_WCE)
GetImeStatus(UINT uStatus)1351 	UINT GetImeStatus(UINT uStatus) const
1352 	{
1353 		ATLASSERT(::IsWindow(m_hWnd));
1354 		return (UINT)::SendMessage(m_hWnd, EM_GETIMESTATUS, uStatus, 0L);
1355 	}
1356 
SetImeStatus(UINT uStatus,UINT uData)1357 	UINT SetImeStatus(UINT uStatus, UINT uData)
1358 	{
1359 		ATLASSERT(::IsWindow(m_hWnd));
1360 		return (UINT)::SendMessage(m_hWnd, EM_SETIMESTATUS, uStatus, uData);
1361 	}
1362 #endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE)
1363 
1364 #if (_WIN32_WINNT >= 0x0501)
GetCueBannerText(LPCWSTR lpstrText,int cchText)1365 	BOOL GetCueBannerText(LPCWSTR lpstrText, int cchText) const
1366 	{
1367 		ATLASSERT(::IsWindow(m_hWnd));
1368 		return (BOOL)::SendMessage(m_hWnd, EM_GETCUEBANNER, (WPARAM)lpstrText, cchText);
1369 	}
1370 
1371 	// bKeepWithFocus - Vista only
1372 	BOOL SetCueBannerText(LPCWSTR lpstrText, BOOL bKeepWithFocus = FALSE)
1373 	{
1374 		ATLASSERT(::IsWindow(m_hWnd));
1375 		return (BOOL)::SendMessage(m_hWnd, EM_SETCUEBANNER, (WPARAM)bKeepWithFocus, (LPARAM)(lpstrText));
1376 	}
1377 #endif // (_WIN32_WINNT >= 0x0501)
1378 
1379 // Operations
EmptyUndoBuffer()1380 	void EmptyUndoBuffer()
1381 	{
1382 		ATLASSERT(::IsWindow(m_hWnd));
1383 		::SendMessage(m_hWnd, EM_EMPTYUNDOBUFFER, 0, 0L);
1384 	}
1385 
FmtLines(BOOL bAddEOL)1386 	BOOL FmtLines(BOOL bAddEOL)
1387 	{
1388 		ATLASSERT(::IsWindow(m_hWnd));
1389 		return (BOOL)::SendMessage(m_hWnd, EM_FMTLINES, bAddEOL, 0L);
1390 	}
1391 
1392 	void LimitText(int nChars = 0)
1393 	{
1394 		ATLASSERT(::IsWindow(m_hWnd));
1395 		::SendMessage(m_hWnd, EM_LIMITTEXT, nChars, 0L);
1396 	}
1397 
1398 	int LineFromChar(int nIndex = -1) const
1399 	{
1400 		ATLASSERT(::IsWindow(m_hWnd));
1401 		return (int)::SendMessage(m_hWnd, EM_LINEFROMCHAR, nIndex, 0L);
1402 	}
1403 
1404 	int LineIndex(int nLine = -1) const
1405 	{
1406 		ATLASSERT(::IsWindow(m_hWnd));
1407 		return (int)::SendMessage(m_hWnd, EM_LINEINDEX, nLine, 0L);
1408 	}
1409 
1410 	int LineLength(int nLine = -1) const
1411 	{
1412 		ATLASSERT(::IsWindow(m_hWnd));
1413 		return (int)::SendMessage(m_hWnd, EM_LINELENGTH, nLine, 0L);
1414 	}
1415 
1416 	void LineScroll(int nLines, int nChars = 0)
1417 	{
1418 		ATLASSERT(::IsWindow(m_hWnd));
1419 		::SendMessage(m_hWnd, EM_LINESCROLL, nChars, nLines);
1420 	}
1421 
1422 	void ReplaceSel(LPCTSTR lpszNewText, BOOL bCanUndo = FALSE)
1423 	{
1424 		ATLASSERT(::IsWindow(m_hWnd));
1425 		::SendMessage(m_hWnd, EM_REPLACESEL, (WPARAM) bCanUndo, (LPARAM)lpszNewText);
1426 	}
1427 
SetRect(LPCRECT lpRect)1428 	void SetRect(LPCRECT lpRect)
1429 	{
1430 		ATLASSERT(::IsWindow(m_hWnd));
1431 		::SendMessage(m_hWnd, EM_SETRECT, 0, (LPARAM)lpRect);
1432 	}
1433 
SetRectNP(LPCRECT lpRect)1434 	void SetRectNP(LPCRECT lpRect)
1435 	{
1436 		ATLASSERT(::IsWindow(m_hWnd));
1437 		::SendMessage(m_hWnd, EM_SETRECTNP, 0, (LPARAM)lpRect);
1438 	}
1439 
1440 	void SetSel(DWORD dwSelection, BOOL bNoScroll = FALSE)
1441 	{
1442 		ATLASSERT(::IsWindow(m_hWnd));
1443 		::SendMessage(m_hWnd, EM_SETSEL, LOWORD(dwSelection), HIWORD(dwSelection));
1444 		if(!bNoScroll)
1445 			::SendMessage(m_hWnd, EM_SCROLLCARET, 0, 0L);
1446 	}
1447 
1448 	void SetSel(int nStartChar, int nEndChar, BOOL bNoScroll = FALSE)
1449 	{
1450 		ATLASSERT(::IsWindow(m_hWnd));
1451 		::SendMessage(m_hWnd, EM_SETSEL, nStartChar, nEndChar);
1452 		if(!bNoScroll)
1453 			::SendMessage(m_hWnd, EM_SCROLLCARET, 0, 0L);
1454 	}
1455 
1456 	void SetSelAll(BOOL bNoScroll = FALSE)
1457 	{
1458 		SetSel(0, -1, bNoScroll);
1459 	}
1460 
1461 	void SetSelNone(BOOL bNoScroll = FALSE)
1462 	{
1463 		SetSel(-1, 0, bNoScroll);
1464 	}
1465 
SetTabStops(int nTabStops,LPINT rgTabStops)1466 	BOOL SetTabStops(int nTabStops, LPINT rgTabStops)
1467 	{
1468 		ATLASSERT(::IsWindow(m_hWnd));
1469 		return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, nTabStops, (LPARAM)rgTabStops);
1470 	}
1471 
SetTabStops()1472 	BOOL SetTabStops()
1473 	{
1474 		ATLASSERT(::IsWindow(m_hWnd));
1475 		return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, 0, 0L);
1476 	}
1477 
SetTabStops(const int & cxEachStop)1478 	BOOL SetTabStops(const int& cxEachStop)    // takes an 'int'
1479 	{
1480 		ATLASSERT(::IsWindow(m_hWnd));
1481 		return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, 1, (LPARAM)(LPINT)&cxEachStop);
1482 	}
1483 
ScrollCaret()1484 	void ScrollCaret()
1485 	{
1486 		ATLASSERT(::IsWindow(m_hWnd));
1487 		::SendMessage(m_hWnd, EM_SCROLLCARET, 0, 0L);
1488 	}
1489 
Scroll(int nScrollAction)1490 	int Scroll(int nScrollAction)
1491 	{
1492 		ATLASSERT(::IsWindow(m_hWnd));
1493 		ATLASSERT((GetStyle() & ES_MULTILINE) != 0);
1494 		LRESULT lRet = ::SendMessage(m_hWnd, EM_SCROLL, nScrollAction, 0L);
1495 		if(!(BOOL)HIWORD(lRet))
1496 			return -1;   // failed
1497 		return (int)(short)LOWORD(lRet);
1498 
1499 	}
1500 
1501 	void InsertText(int nInsertAfterChar, LPCTSTR lpstrText, BOOL bNoScroll = FALSE, BOOL bCanUndo = FALSE)
1502 	{
1503 		SetSel(nInsertAfterChar, nInsertAfterChar, bNoScroll);
1504 		ReplaceSel(lpstrText, bCanUndo);
1505 	}
1506 
1507 	void AppendText(LPCTSTR lpstrText, BOOL bNoScroll = FALSE, BOOL bCanUndo = FALSE)
1508 	{
1509 		InsertText(GetWindowTextLength(), lpstrText, bNoScroll, bCanUndo);
1510 	}
1511 
1512 #if (_WIN32_WINNT >= 0x0501)
ShowBalloonTip(PEDITBALLOONTIP pEditBaloonTip)1513 	BOOL ShowBalloonTip(PEDITBALLOONTIP pEditBaloonTip)
1514 	{
1515 		ATLASSERT(::IsWindow(m_hWnd));
1516 		return (BOOL)::SendMessage(m_hWnd, EM_SHOWBALLOONTIP, 0, (LPARAM)pEditBaloonTip);
1517 	}
1518 
HideBalloonTip()1519 	BOOL HideBalloonTip()
1520 	{
1521 		ATLASSERT(::IsWindow(m_hWnd));
1522 		return (BOOL)::SendMessage(m_hWnd, EM_HIDEBALLOONTIP, 0, 0L);
1523 	}
1524 #endif // (_WIN32_WINNT >= 0x0501)
1525 
1526 #if (_WIN32_WINNT >= 0x0600)
GetHilite()1527 	DWORD GetHilite() const
1528 	{
1529 		ATLASSERT(::IsWindow(m_hWnd));
1530 		return (DWORD)::SendMessage(m_hWnd, EM_GETHILITE, 0, 0L);
1531 	}
1532 
GetHilite(int & nStartChar,int & nEndChar)1533 	void GetHilite(int& nStartChar, int& nEndChar) const
1534 	{
1535 		ATLASSERT(::IsWindow(m_hWnd));
1536 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, EM_GETHILITE, 0, 0L);
1537 		nStartChar = (int)(short)LOWORD(dwRet);
1538 		nEndChar = (int)(short)HIWORD(dwRet);
1539 	}
1540 
SetHilite(int nStartChar,int nEndChar)1541 	void SetHilite(int nStartChar, int nEndChar)
1542 	{
1543 		ATLASSERT(::IsWindow(m_hWnd));
1544 		::SendMessage(m_hWnd, EM_SETHILITE, nStartChar, nEndChar);
1545 	}
1546 #endif // (_WIN32_WINNT >= 0x0600)
1547 
1548 	// Clipboard operations
Undo()1549 	BOOL Undo()
1550 	{
1551 		ATLASSERT(::IsWindow(m_hWnd));
1552 		return (BOOL)::SendMessage(m_hWnd, EM_UNDO, 0, 0L);
1553 	}
1554 
Clear()1555 	void Clear()
1556 	{
1557 		ATLASSERT(::IsWindow(m_hWnd));
1558 		::SendMessage(m_hWnd, WM_CLEAR, 0, 0L);
1559 	}
1560 
Copy()1561 	void Copy()
1562 	{
1563 		ATLASSERT(::IsWindow(m_hWnd));
1564 		::SendMessage(m_hWnd, WM_COPY, 0, 0L);
1565 	}
1566 
Cut()1567 	void Cut()
1568 	{
1569 		ATLASSERT(::IsWindow(m_hWnd));
1570 		::SendMessage(m_hWnd, WM_CUT, 0, 0L);
1571 	}
1572 
Paste()1573 	void Paste()
1574 	{
1575 		ATLASSERT(::IsWindow(m_hWnd));
1576 		::SendMessage(m_hWnd, WM_PASTE, 0, 0L);
1577 	}
1578 
1579 #ifdef WIN32_PLATFORM_WFSP   // SmartPhone only messages
GetExtendedStyle()1580 	DWORD GetExtendedStyle()
1581 	{
1582 		return SendMessage(EM_GETEXTENDEDSTYLE);
1583 	}
1584 
SetExtendedStyle(DWORD dwMask,DWORD dwExStyle)1585 	DWORD SetExtendedStyle(DWORD dwMask, DWORD dwExStyle)
1586 	{
1587 		return SendMessage(EM_SETEXTENDEDSTYLE, (WPARAM)dwMask, (LPARAM)dwExStyle);
1588 	}
1589 
1590 	DWORD GetInputMode(BOOL bCurrentMode = TRUE)
1591 	{
1592 		return SendMessage(EM_GETINPUTMODE, 0, (LPARAM)bCurrentMode);
1593 	}
1594 
SetInputMode(DWORD dwMode)1595 	BOOL SetInputMode(DWORD dwMode)
1596 	{
1597 		return SendMessage(EM_SETINPUTMODE, 0, (LPARAM)dwMode);
1598 	}
1599 
SetSymbols(LPCTSTR szSymbols)1600 	BOOL SetSymbols(LPCTSTR szSymbols)
1601 	{
1602 		return SendMessage(EM_SETSYMBOLS, 0, (LPARAM)szSymbols);
1603 	}
1604 
ResetSymbols()1605 	BOOL ResetSymbols()
1606 	{
1607 		return SendMessage(EM_SETSYMBOLS);
1608 	}
1609 #endif // WIN32_PLATFORM_WFSP
1610 };
1611 
1612 typedef CEditT<ATL::CWindow>   CEdit;
1613 
1614 
1615 ///////////////////////////////////////////////////////////////////////////////
1616 // CEditCommands - message handlers for standard EDIT commands
1617 
1618 // Chain to CEditCommands message map. Your class must also derive from CEdit.
1619 // Example:
1620 // class CMyEdit : public CWindowImpl<CMyEdit, CEdit>,
1621 //                 public CEditCommands<CMyEdit>
1622 // {
1623 // public:
1624 //      BEGIN_MSG_MAP(CMyEdit)
1625 //              // your handlers...
1626 //              CHAIN_MSG_MAP_ALT(CEditCommands<CMyEdit>, 1)
1627 //      END_MSG_MAP()
1628 //      // other stuff...
1629 // };
1630 
1631 template <class T>
1632 class CEditCommands
1633 {
1634 public:
BEGIN_MSG_MAP(CEditCommands<T>)1635 	BEGIN_MSG_MAP(CEditCommands< T >)
1636 	ALT_MSG_MAP(1)
1637 		COMMAND_ID_HANDLER(ID_EDIT_CLEAR, OnEditClear)
1638 		COMMAND_ID_HANDLER(ID_EDIT_CLEAR_ALL, OnEditClearAll)
1639 		COMMAND_ID_HANDLER(ID_EDIT_COPY, OnEditCopy)
1640 		COMMAND_ID_HANDLER(ID_EDIT_CUT, OnEditCut)
1641 		COMMAND_ID_HANDLER(ID_EDIT_PASTE, OnEditPaste)
1642 		COMMAND_ID_HANDLER(ID_EDIT_SELECT_ALL, OnEditSelectAll)
1643 		COMMAND_ID_HANDLER(ID_EDIT_UNDO, OnEditUndo)
1644 	END_MSG_MAP()
1645 
1646 	LRESULT OnEditClear(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
1647 	{
1648 		T* pT = static_cast<T*>(this);
1649 		pT->Clear();
1650 		return 0;
1651 	}
1652 
OnEditClearAll(WORD,WORD,HWND,BOOL &)1653 	LRESULT OnEditClearAll(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
1654 	{
1655 		T* pT = static_cast<T*>(this);
1656 		pT->SetSel(0, -1);
1657 		pT->Clear();
1658 		return 0;
1659 	}
1660 
OnEditCopy(WORD,WORD,HWND,BOOL &)1661 	LRESULT OnEditCopy(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
1662 	{
1663 		T* pT = static_cast<T*>(this);
1664 		pT->Copy();
1665 		return 0;
1666 	}
1667 
OnEditCut(WORD,WORD,HWND,BOOL &)1668 	LRESULT OnEditCut(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
1669 	{
1670 		T* pT = static_cast<T*>(this);
1671 		pT->Cut();
1672 		return 0;
1673 	}
1674 
OnEditPaste(WORD,WORD,HWND,BOOL &)1675 	LRESULT OnEditPaste(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
1676 	{
1677 		T* pT = static_cast<T*>(this);
1678 		pT->Paste();
1679 		return 0;
1680 	}
1681 
OnEditSelectAll(WORD,WORD,HWND,BOOL &)1682 	LRESULT OnEditSelectAll(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
1683 	{
1684 		T* pT = static_cast<T*>(this);
1685 		pT->SetSel(0, -1);
1686 		return 0;
1687 	}
1688 
OnEditUndo(WORD,WORD,HWND,BOOL &)1689 	LRESULT OnEditUndo(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
1690 	{
1691 		T* pT = static_cast<T*>(this);
1692 		pT->Undo();
1693 		return 0;
1694 	}
1695 
1696 // State (update UI) helpers
CanCut()1697 	BOOL CanCut() const
1698 	{ return HasSelection(); }
1699 
CanCopy()1700 	BOOL CanCopy() const
1701 	{ return HasSelection(); }
1702 
CanClear()1703 	BOOL CanClear() const
1704 	{ return HasSelection(); }
1705 
CanSelectAll()1706 	BOOL CanSelectAll() const
1707 	{ return HasText(); }
1708 
CanFind()1709 	BOOL CanFind() const
1710 	{ return HasText(); }
1711 
CanRepeat()1712 	BOOL CanRepeat() const
1713 	{ return HasText(); }
1714 
CanReplace()1715 	BOOL CanReplace() const
1716 	{ return HasText(); }
1717 
CanClearAll()1718 	BOOL CanClearAll() const
1719 	{ return HasText(); }
1720 
1721 // Implementation
HasSelection()1722 	BOOL HasSelection() const
1723 	{
1724 		const T* pT = static_cast<const T*>(this);
1725 		int nMin = 0, nMax = 0;
1726 		::SendMessage(pT->m_hWnd, EM_GETSEL, (WPARAM)&nMin, (LPARAM)&nMax);
1727 		return (nMin != nMax);
1728 	}
1729 
HasText()1730 	BOOL HasText() const
1731 	{
1732 		const T* pT = static_cast<const T*>(this);
1733 		return (pT->GetWindowTextLength() > 0);
1734 	}
1735 };
1736 
1737 
1738 ///////////////////////////////////////////////////////////////////////////////
1739 // CScrollBar - client side for a Windows SCROLLBAR control
1740 
1741 template <class TBase>
1742 class CScrollBarT : public TBase
1743 {
1744 public:
1745 // Constructors
TBase(hWnd)1746 	CScrollBarT(HWND hWnd = NULL) : TBase(hWnd)
1747 	{ }
1748 
1749 	CScrollBarT< TBase >& operator =(HWND hWnd)
1750 	{
1751 		m_hWnd = hWnd;
1752 		return *this;
1753 	}
1754 
1755 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
1756 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
1757 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
1758 	{
1759 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
1760 	}
1761 
1762 // Attributes
GetWndClassName()1763 	static LPCTSTR GetWndClassName()
1764 	{
1765 		return _T("SCROLLBAR");
1766 	}
1767 
1768 #ifndef _WIN32_WCE
GetScrollPos()1769 	int GetScrollPos() const
1770 	{
1771 		ATLASSERT(::IsWindow(m_hWnd));
1772 		return ::GetScrollPos(m_hWnd, SB_CTL);
1773 	}
1774 #endif // !_WIN32_WCE
1775 
1776 	int SetScrollPos(int nPos, BOOL bRedraw = TRUE)
1777 	{
1778 		ATLASSERT(::IsWindow(m_hWnd));
1779 		return ::SetScrollPos(m_hWnd, SB_CTL, nPos, bRedraw);
1780 	}
1781 
1782 #ifndef _WIN32_WCE
GetScrollRange(LPINT lpMinPos,LPINT lpMaxPos)1783 	void GetScrollRange(LPINT lpMinPos, LPINT lpMaxPos) const
1784 	{
1785 		ATLASSERT(::IsWindow(m_hWnd));
1786 		::GetScrollRange(m_hWnd, SB_CTL, lpMinPos, lpMaxPos);
1787 	}
1788 #endif // !_WIN32_WCE
1789 
1790 	void SetScrollRange(int nMinPos, int nMaxPos, BOOL bRedraw = TRUE)
1791 	{
1792 		ATLASSERT(::IsWindow(m_hWnd));
1793 		::SetScrollRange(m_hWnd, SB_CTL, nMinPos, nMaxPos, bRedraw);
1794 	}
1795 
GetScrollInfo(LPSCROLLINFO lpScrollInfo)1796 	BOOL GetScrollInfo(LPSCROLLINFO lpScrollInfo) const
1797 	{
1798 		ATLASSERT(::IsWindow(m_hWnd));
1799 		return ::GetScrollInfo(m_hWnd, SB_CTL, lpScrollInfo);
1800 	}
1801 
1802 	int SetScrollInfo(LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE)
1803 	{
1804 		ATLASSERT(::IsWindow(m_hWnd));
1805 		return ::SetScrollInfo(m_hWnd, SB_CTL, lpScrollInfo, bRedraw);
1806 	}
1807 
1808 #ifndef _WIN32_WCE
GetScrollLimit()1809 	int GetScrollLimit() const
1810 	{
1811 		SCROLLINFO info = { sizeof(SCROLLINFO), SIF_RANGE | SIF_PAGE };
1812 		::GetScrollInfo(m_hWnd, SB_CTL, &info);
1813 		if(info.nPage > 1)
1814 			info.nMax -= info.nPage - 1;
1815 
1816 		return info.nMax;
1817 	}
1818 
1819 #if (WINVER >= 0x0500)
GetScrollBarInfo(PSCROLLBARINFO pScrollBarInfo)1820 	BOOL GetScrollBarInfo(PSCROLLBARINFO pScrollBarInfo) const
1821 	{
1822 		ATLASSERT(::IsWindow(m_hWnd));
1823 #if (_WIN32_WINNT >= 0x0501)
1824 		return (BOOL)::SendMessage(m_hWnd, SBM_GETSCROLLBARINFO, 0, (LPARAM)pScrollBarInfo);
1825 #else // !(_WIN32_WINNT >= 0x0501)
1826 		return ::GetScrollBarInfo(m_hWnd, OBJID_CLIENT, pScrollBarInfo);
1827 #endif // !(_WIN32_WINNT >= 0x0501)
1828 	}
1829 #endif // (WINVER >= 0x0500)
1830 
1831 // Operations
1832 	void ShowScrollBar(BOOL bShow = TRUE)
1833 	{
1834 		ATLASSERT(::IsWindow(m_hWnd));
1835 		::ShowScrollBar(m_hWnd, SB_CTL, bShow);
1836 	}
1837 
1838 	BOOL EnableScrollBar(UINT nArrowFlags = ESB_ENABLE_BOTH)
1839 	{
1840 		ATLASSERT(::IsWindow(m_hWnd));
1841 		return ::EnableScrollBar(m_hWnd, SB_CTL, nArrowFlags);
1842 	}
1843 #endif // !_WIN32_WCE
1844 };
1845 
1846 typedef CScrollBarT<ATL::CWindow>   CScrollBar;
1847 
1848 
1849 // --- Windows Common Controls ---
1850 
1851 ///////////////////////////////////////////////////////////////////////////////
1852 // CImageList
1853 
1854 // forward declarations
1855 template <bool t_bManaged> class CImageListT;
1856 typedef CImageListT<false>   CImageList;
1857 typedef CImageListT<true>    CImageListManaged;
1858 
1859 
1860 template <bool t_bManaged>
1861 class CImageListT
1862 {
1863 public:
1864 // Data members
1865 	HIMAGELIST m_hImageList;
1866 
1867 // Constructor/destructor/operators
m_hImageList(hImageList)1868 	CImageListT(HIMAGELIST hImageList = NULL) : m_hImageList(hImageList)
1869 	{ }
1870 
~CImageListT()1871 	~CImageListT()
1872 	{
1873 		if(t_bManaged && (m_hImageList != NULL))
1874 			Destroy();
1875 	}
1876 
1877 	CImageListT<t_bManaged>& operator =(HIMAGELIST hImageList)
1878 	{
1879 		Attach(hImageList);
1880 		return *this;
1881 	}
1882 
Attach(HIMAGELIST hImageList)1883 	void Attach(HIMAGELIST hImageList)
1884 	{
1885 		if(t_bManaged && (m_hImageList != NULL) && (m_hImageList != hImageList))
1886 			ImageList_Destroy(m_hImageList);
1887 		m_hImageList = hImageList;
1888 	}
1889 
Detach()1890 	HIMAGELIST Detach()
1891 	{
1892 		HIMAGELIST hImageList = m_hImageList;
1893 		m_hImageList = NULL;
1894 		return hImageList;
1895 	}
1896 
HIMAGELIST()1897 	operator HIMAGELIST() const { return m_hImageList; }
1898 
IsNull()1899 	bool IsNull() const { return (m_hImageList == NULL); }
1900 
1901 // Attributes
GetImageCount()1902 	int GetImageCount() const
1903 	{
1904 		ATLASSERT(m_hImageList != NULL);
1905 		return ImageList_GetImageCount(m_hImageList);
1906 	}
1907 
GetBkColor()1908 	COLORREF GetBkColor() const
1909 	{
1910 		ATLASSERT(m_hImageList != NULL);
1911 		return ImageList_GetBkColor(m_hImageList);
1912 	}
1913 
SetBkColor(COLORREF cr)1914 	COLORREF SetBkColor(COLORREF cr)
1915 	{
1916 		ATLASSERT(m_hImageList != NULL);
1917 		return ImageList_SetBkColor(m_hImageList, cr);
1918 	}
1919 
GetImageInfo(int nImage,IMAGEINFO * pImageInfo)1920 	BOOL GetImageInfo(int nImage, IMAGEINFO* pImageInfo) const
1921 	{
1922 		ATLASSERT(m_hImageList != NULL);
1923 		return ImageList_GetImageInfo(m_hImageList, nImage, pImageInfo);
1924 	}
1925 
1926 	HICON GetIcon(int nIndex, UINT uFlags = ILD_NORMAL) const
1927 	{
1928 		ATLASSERT(m_hImageList != NULL);
1929 		return ImageList_GetIcon(m_hImageList, nIndex, uFlags);
1930 	}
1931 
GetIconSize(int & cx,int & cy)1932 	BOOL GetIconSize(int& cx, int& cy) const
1933 	{
1934 		ATLASSERT(m_hImageList != NULL);
1935 		return ImageList_GetIconSize(m_hImageList, &cx, &cy);
1936 	}
1937 
GetIconSize(SIZE & size)1938 	BOOL GetIconSize(SIZE& size) const
1939 	{
1940 		ATLASSERT(m_hImageList != NULL);
1941 		return ImageList_GetIconSize(m_hImageList, (int*)&size.cx, (int*)&size.cy);
1942 	}
1943 
SetIconSize(int cx,int cy)1944 	BOOL SetIconSize(int cx, int cy)
1945 	{
1946 		ATLASSERT(m_hImageList != NULL);
1947 		return ImageList_SetIconSize(m_hImageList, cx, cy);
1948 	}
1949 
SetIconSize(SIZE size)1950 	BOOL SetIconSize(SIZE size)
1951 	{
1952 		ATLASSERT(m_hImageList != NULL);
1953 		return ImageList_SetIconSize(m_hImageList, size.cx, size.cy);
1954 	}
1955 
SetImageCount(UINT uNewCount)1956 	BOOL SetImageCount(UINT uNewCount)
1957 	{
1958 		ATLASSERT(m_hImageList != NULL);
1959 		return ImageList_SetImageCount(m_hImageList, uNewCount);
1960 	}
1961 
SetOverlayImage(int nImage,int nOverlay)1962 	BOOL SetOverlayImage(int nImage, int nOverlay)
1963 	{
1964 		ATLASSERT(m_hImageList != NULL);
1965 		return ImageList_SetOverlayImage(m_hImageList, nImage, nOverlay);
1966 	}
1967 
1968 // Operations
Create(int cx,int cy,UINT nFlags,int nInitial,int nGrow)1969 	BOOL Create(int cx, int cy, UINT nFlags, int nInitial, int nGrow)
1970 	{
1971 		ATLASSERT(m_hImageList == NULL);
1972 		m_hImageList = ImageList_Create(cx, cy, nFlags, nInitial, nGrow);
1973 		return (m_hImageList != NULL) ? TRUE : FALSE;
1974 	}
1975 
Create(ATL::_U_STRINGorID bitmap,int cx,int nGrow,COLORREF crMask)1976 	BOOL Create(ATL::_U_STRINGorID bitmap, int cx, int nGrow, COLORREF crMask)
1977 	{
1978 		ATLASSERT(m_hImageList == NULL);
1979 		m_hImageList = ImageList_LoadBitmap(ModuleHelper::GetResourceInstance(), bitmap.m_lpstr, cx, nGrow, crMask);
1980 		return (m_hImageList != NULL) ? TRUE : FALSE;
1981 	}
1982 
1983 	BOOL CreateFromImage(ATL::_U_STRINGorID image, int cx, int nGrow, COLORREF crMask, UINT uType, UINT uFlags = LR_DEFAULTCOLOR | LR_DEFAULTSIZE)
1984 	{
1985 		ATLASSERT(m_hImageList == NULL);
1986 		m_hImageList = ImageList_LoadImage(ModuleHelper::GetResourceInstance(), image.m_lpstr, cx, nGrow, crMask, uType, uFlags);
1987 		return (m_hImageList != NULL) ? TRUE : FALSE;
1988 	}
1989 
Merge(HIMAGELIST hImageList1,int nImage1,HIMAGELIST hImageList2,int nImage2,int dx,int dy)1990 	BOOL Merge(HIMAGELIST hImageList1, int nImage1, HIMAGELIST hImageList2, int nImage2, int dx, int dy)
1991 	{
1992 		ATLASSERT(m_hImageList == NULL);
1993 		m_hImageList = ImageList_Merge(hImageList1, nImage1, hImageList2, nImage2, dx, dy);
1994 		return (m_hImageList != NULL) ? TRUE : FALSE;
1995 	}
1996 
1997 #ifndef _WIN32_WCE
1998 #ifdef __IStream_INTERFACE_DEFINED__
CreateFromStream(LPSTREAM lpStream)1999 	BOOL CreateFromStream(LPSTREAM lpStream)
2000 	{
2001 		ATLASSERT(m_hImageList == NULL);
2002 		m_hImageList = ImageList_Read(lpStream);
2003 		return (m_hImageList != NULL) ? TRUE : FALSE;
2004 	}
2005 #endif // __IStream_INTERFACE_DEFINED__
2006 #endif // !_WIN32_WCE
2007 
Destroy()2008 	BOOL Destroy()
2009 	{
2010 		if (m_hImageList == NULL)
2011 			return FALSE;
2012 		BOOL bRet = ImageList_Destroy(m_hImageList);
2013 		if(bRet)
2014 			m_hImageList = NULL;
2015 		return bRet;
2016 	}
2017 
2018 	int Add(HBITMAP hBitmap, HBITMAP hBitmapMask = NULL)
2019 	{
2020 		ATLASSERT(m_hImageList != NULL);
2021 		return ImageList_Add(m_hImageList, hBitmap, hBitmapMask);
2022 	}
2023 
Add(HBITMAP hBitmap,COLORREF crMask)2024 	int Add(HBITMAP hBitmap, COLORREF crMask)
2025 	{
2026 		ATLASSERT(m_hImageList != NULL);
2027 		return ImageList_AddMasked(m_hImageList, hBitmap, crMask);
2028 	}
2029 
Remove(int nImage)2030 	BOOL Remove(int nImage)
2031 	{
2032 		ATLASSERT(m_hImageList != NULL);
2033 		return ImageList_Remove(m_hImageList, nImage);
2034 	}
2035 
RemoveAll()2036 	BOOL RemoveAll()
2037 	{
2038 		ATLASSERT(m_hImageList != NULL);
2039 		return ImageList_RemoveAll(m_hImageList);
2040 	}
2041 
Replace(int nImage,HBITMAP hBitmap,HBITMAP hBitmapMask)2042 	BOOL Replace(int nImage, HBITMAP hBitmap, HBITMAP hBitmapMask)
2043 	{
2044 		ATLASSERT(m_hImageList != NULL);
2045 		return ImageList_Replace(m_hImageList, nImage, hBitmap, hBitmapMask);
2046 	}
2047 
AddIcon(HICON hIcon)2048 	int AddIcon(HICON hIcon)
2049 	{
2050 		ATLASSERT(m_hImageList != NULL);
2051 		return ImageList_AddIcon(m_hImageList, hIcon);
2052 	}
2053 
ReplaceIcon(int nImage,HICON hIcon)2054 	int ReplaceIcon(int nImage, HICON hIcon)
2055 	{
2056 		ATLASSERT(m_hImageList != NULL);
2057 		return ImageList_ReplaceIcon(m_hImageList, nImage, hIcon);
2058 	}
2059 
ExtractIcon(int nImage)2060 	HICON ExtractIcon(int nImage)
2061 	{
2062 		ATLASSERT(m_hImageList != NULL);
2063 		return ImageList_ExtractIcon(NULL, m_hImageList, nImage);
2064 	}
2065 
Draw(HDC hDC,int nImage,int x,int y,UINT nStyle)2066 	BOOL Draw(HDC hDC, int nImage, int x, int y, UINT nStyle)
2067 	{
2068 		ATLASSERT(m_hImageList != NULL);
2069 		ATLASSERT(hDC != NULL);
2070 		return ImageList_Draw(m_hImageList, nImage, hDC, x, y, nStyle);
2071 	}
2072 
Draw(HDC hDC,int nImage,POINT pt,UINT nStyle)2073 	BOOL Draw(HDC hDC, int nImage, POINT pt, UINT nStyle)
2074 	{
2075 		ATLASSERT(m_hImageList != NULL);
2076 		ATLASSERT(hDC != NULL);
2077 		return ImageList_Draw(m_hImageList, nImage, hDC, pt.x, pt.y, nStyle);
2078 	}
2079 
DrawEx(int nImage,HDC hDC,int x,int y,int dx,int dy,COLORREF rgbBk,COLORREF rgbFg,UINT fStyle)2080 	BOOL DrawEx(int nImage, HDC hDC, int x, int y, int dx, int dy, COLORREF rgbBk, COLORREF rgbFg, UINT fStyle)
2081 	{
2082 		ATLASSERT(m_hImageList != NULL);
2083 		ATLASSERT(hDC != NULL);
2084 		return ImageList_DrawEx(m_hImageList, nImage, hDC, x, y, dx, dy, rgbBk, rgbFg, fStyle);
2085 	}
2086 
DrawEx(int nImage,HDC hDC,RECT & rect,COLORREF rgbBk,COLORREF rgbFg,UINT fStyle)2087 	BOOL DrawEx(int nImage, HDC hDC, RECT& rect, COLORREF rgbBk, COLORREF rgbFg, UINT fStyle)
2088 	{
2089 		ATLASSERT(m_hImageList != NULL);
2090 		ATLASSERT(hDC != NULL);
2091 		return ImageList_DrawEx(m_hImageList, nImage, hDC, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, rgbBk, rgbFg, fStyle);
2092 	}
2093 
DrawIndirect(IMAGELISTDRAWPARAMS * pimldp)2094 	static BOOL DrawIndirect(IMAGELISTDRAWPARAMS* pimldp)
2095 	{
2096 		return ImageList_DrawIndirect(pimldp);
2097 	}
2098 
2099 	BOOL Copy(int nSrc, int nDst, UINT uFlags = ILCF_MOVE)
2100 	{
2101 		ATLASSERT(m_hImageList != NULL);
2102 		return ImageList_Copy(m_hImageList, nDst, m_hImageList, nSrc, uFlags);
2103 	}
2104 
2105 #ifdef __IStream_INTERFACE_DEFINED__
2106 #ifndef _WIN32_WCE
Read(LPSTREAM lpStream)2107 	static HIMAGELIST Read(LPSTREAM lpStream)
2108 	{
2109 		return ImageList_Read(lpStream);
2110 	}
2111 
Write(LPSTREAM lpStream)2112 	BOOL Write(LPSTREAM lpStream)
2113 	{
2114 		ATLASSERT(m_hImageList != NULL);
2115 		return ImageList_Write(m_hImageList, lpStream);
2116 	}
2117 #endif // !_WIN32_WCE
2118 
2119 #if (_WIN32_WINNT >= 0x0501)
ReadEx(DWORD dwFlags,LPSTREAM lpStream,REFIID riid,PVOID * ppv)2120 	static HRESULT ReadEx(DWORD dwFlags, LPSTREAM lpStream, REFIID riid, PVOID* ppv)
2121 	{
2122 		return ImageList_ReadEx(dwFlags, lpStream, riid, ppv);
2123 	}
2124 
WriteEx(DWORD dwFlags,LPSTREAM lpStream)2125 	HRESULT WriteEx(DWORD dwFlags, LPSTREAM lpStream)
2126 	{
2127 		ATLASSERT(m_hImageList != NULL);
2128 		return ImageList_WriteEx(m_hImageList, dwFlags, lpStream);
2129 	}
2130 #endif // (_WIN32_WINNT >= 0x0501)
2131 #endif // __IStream_INTERFACE_DEFINED__
2132 
2133 	// Drag operations
BeginDrag(int nImage,POINT ptHotSpot)2134 	BOOL BeginDrag(int nImage, POINT ptHotSpot)
2135 	{
2136 		ATLASSERT(m_hImageList != NULL);
2137 		return ImageList_BeginDrag(m_hImageList, nImage, ptHotSpot.x, ptHotSpot.y);
2138 	}
2139 
BeginDrag(int nImage,int xHotSpot,int yHotSpot)2140 	BOOL BeginDrag(int nImage, int xHotSpot, int yHotSpot)
2141 	{
2142 		ATLASSERT(m_hImageList != NULL);
2143 		return ImageList_BeginDrag(m_hImageList, nImage, xHotSpot, yHotSpot);
2144 	}
2145 
EndDrag()2146 	static void EndDrag()
2147 	{
2148 		ImageList_EndDrag();
2149 	}
2150 
DragMove(POINT pt)2151 	static BOOL DragMove(POINT pt)
2152 	{
2153 		return ImageList_DragMove(pt.x, pt.y);
2154 	}
2155 
DragMove(int x,int y)2156 	static BOOL DragMove(int x, int y)
2157 	{
2158 		return ImageList_DragMove(x, y);
2159 	}
2160 
SetDragCursorImage(int nDrag,POINT ptHotSpot)2161 	BOOL SetDragCursorImage(int nDrag, POINT ptHotSpot)
2162 	{
2163 		ATLASSERT(m_hImageList != NULL);
2164 		return ImageList_SetDragCursorImage(m_hImageList, nDrag, ptHotSpot.x, ptHotSpot.y);
2165 	}
2166 
SetDragCursorImage(int nDrag,int xHotSpot,int yHotSpot)2167 	BOOL SetDragCursorImage(int nDrag, int xHotSpot, int yHotSpot)
2168 	{
2169 		ATLASSERT(m_hImageList != NULL);
2170 		return ImageList_SetDragCursorImage(m_hImageList, nDrag, xHotSpot, yHotSpot);
2171 	}
2172 
2173 	static BOOL DragShowNolock(BOOL bShow = TRUE)
2174 	{
2175 		return ImageList_DragShowNolock(bShow);
2176 	}
2177 
GetDragImage(LPPOINT lpPoint,LPPOINT lpPointHotSpot)2178 	static CImageList GetDragImage(LPPOINT lpPoint, LPPOINT lpPointHotSpot)
2179 	{
2180 		return CImageList(ImageList_GetDragImage(lpPoint, lpPointHotSpot));
2181 	}
2182 
DragEnter(HWND hWnd,POINT point)2183 	static BOOL DragEnter(HWND hWnd, POINT point)
2184 	{
2185 		return ImageList_DragEnter(hWnd, point.x, point.y);
2186 	}
2187 
DragEnter(HWND hWnd,int x,int y)2188 	static BOOL DragEnter(HWND hWnd, int x, int y)
2189 	{
2190 		return ImageList_DragEnter(hWnd, x, y);
2191 	}
2192 
DragLeave(HWND hWnd)2193 	static BOOL DragLeave(HWND hWnd)
2194 	{
2195 		return ImageList_DragLeave(hWnd);
2196 	}
2197 
2198 #if (_WIN32_IE >= 0x0400)
Duplicate()2199 	CImageList Duplicate() const
2200 	{
2201 		ATLASSERT(m_hImageList != NULL);
2202 		return CImageList(ImageList_Duplicate(m_hImageList));
2203 	}
2204 
Duplicate(HIMAGELIST hImageList)2205 	static CImageList Duplicate(HIMAGELIST hImageList)
2206 	{
2207 		ATLASSERT(hImageList != NULL);
2208 		return CImageList(ImageList_Duplicate(hImageList));
2209 	}
2210 #endif // (_WIN32_IE >= 0x0400)
2211 };
2212 
2213 
2214 ///////////////////////////////////////////////////////////////////////////////
2215 // CToolTipCtrl
2216 
2217 #ifndef _WIN32_WCE
2218 
2219 class CToolInfo : public TOOLINFO
2220 {
2221 public:
2222 	CToolInfo(UINT nFlags, HWND hWnd, UINT_PTR nIDTool = 0, LPRECT lpRect = NULL, LPTSTR lpstrText = LPSTR_TEXTCALLBACK, LPARAM lUserParam = NULL)
2223 	{
2224 		Init(nFlags, hWnd, nIDTool, lpRect, lpstrText, lUserParam);
2225 	}
2226 
LPTOOLINFO()2227 	operator LPTOOLINFO() { return this; }
2228 
LPARAM()2229 	operator LPARAM() { return (LPARAM)this; }
2230 
2231 	void Init(UINT nFlags, HWND hWnd, UINT_PTR nIDTool = 0, LPRECT lpRect = NULL, LPTSTR lpstrText = LPSTR_TEXTCALLBACK, LPARAM lUserParam = NULL)
2232 	{
2233 		ATLASSERT(::IsWindow(hWnd));
2234 		memset(this, 0, sizeof(TOOLINFO));
2235 		cbSize = RunTimeHelper::SizeOf_TOOLINFO();
2236 		uFlags = nFlags;
2237 		if(nIDTool == 0)
2238 		{
2239 			hwnd = ::GetParent(hWnd);
2240 			uFlags |= TTF_IDISHWND;
2241 			uId = (UINT_PTR)hWnd;
2242 		}
2243 		else
2244 		{
2245 			hwnd = hWnd;
2246 			uId = nIDTool;
2247 		}
2248 		if(lpRect != NULL)
2249 			rect = *lpRect;
2250 		hinst = ModuleHelper::GetResourceInstance();
2251 		lpszText = lpstrText;
2252 		lParam = lUserParam;
2253 	}
2254 };
2255 
2256 template <class TBase>
2257 class CToolTipCtrlT : public TBase
2258 {
2259 public:
2260 // Constructors
TBase(hWnd)2261 	CToolTipCtrlT(HWND hWnd = NULL) : TBase(hWnd)
2262 	{ }
2263 
2264 	CToolTipCtrlT< TBase >& operator =(HWND hWnd)
2265 	{
2266 		m_hWnd = hWnd;
2267 		return *this;
2268 	}
2269 
2270 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
2271 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
2272 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
2273 	{
2274 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
2275 	}
2276 
2277 // Attributes
GetWndClassName()2278 	static LPCTSTR GetWndClassName()
2279 	{
2280 		return TOOLTIPS_CLASS;
2281 	}
2282 
GetText(LPTOOLINFO lpToolInfo)2283 	void GetText(LPTOOLINFO lpToolInfo) const
2284 	{
2285 		ATLASSERT(::IsWindow(m_hWnd));
2286 		::SendMessage(m_hWnd, TTM_GETTEXT, 0, (LPARAM)&lpToolInfo);
2287 	}
2288 
2289 	void GetText(LPTSTR lpstrText, HWND hWnd, UINT_PTR nIDTool = 0) const
2290 	{
2291 		ATLASSERT(::IsWindow(m_hWnd));
2292 		ATLASSERT(hWnd != NULL);
2293 		CToolInfo ti(0, hWnd, nIDTool, NULL, lpstrText);
2294 		::SendMessage(m_hWnd, TTM_GETTEXT, 0, ti);
2295 	}
2296 
GetToolInfo(LPTOOLINFO lpToolInfo)2297 	BOOL GetToolInfo(LPTOOLINFO lpToolInfo) const
2298 	{
2299 		ATLASSERT(::IsWindow(m_hWnd));
2300 		return (BOOL)::SendMessage(m_hWnd, TTM_GETTOOLINFO, 0, (LPARAM)lpToolInfo);
2301 	}
2302 
GetToolInfo(HWND hWnd,UINT_PTR nIDTool,UINT * puFlags,LPRECT lpRect,LPTSTR lpstrText)2303 	BOOL GetToolInfo(HWND hWnd, UINT_PTR nIDTool, UINT* puFlags, LPRECT lpRect, LPTSTR lpstrText) const
2304 	{
2305 		ATLASSERT(::IsWindow(m_hWnd));
2306 		ATLASSERT(hWnd != NULL);
2307 		ATLASSERT(puFlags != NULL);
2308 		ATLASSERT(lpRect != NULL);
2309 		CToolInfo ti(0, hWnd, nIDTool, NULL, lpstrText);
2310 		BOOL bRet = (BOOL)::SendMessage(m_hWnd, TTM_GETTOOLINFO, 0, ti);
2311 		if(bRet != FALSE)
2312 		{
2313 			*puFlags = ti.uFlags;
2314 			*lpRect = ti.rect;
2315 		}
2316 		return bRet;
2317 	}
2318 
SetToolInfo(LPTOOLINFO lpToolInfo)2319 	void SetToolInfo(LPTOOLINFO lpToolInfo)
2320 	{
2321 		ATLASSERT(::IsWindow(m_hWnd));
2322 		::SendMessage(m_hWnd, TTM_SETTOOLINFO, 0, (LPARAM)lpToolInfo);
2323 	}
2324 
SetToolRect(LPTOOLINFO lpToolInfo)2325 	void SetToolRect(LPTOOLINFO lpToolInfo)
2326 	{
2327 		ATLASSERT(::IsWindow(m_hWnd));
2328 		::SendMessage(m_hWnd, TTM_NEWTOOLRECT, 0, (LPARAM)lpToolInfo);
2329 	}
2330 
SetToolRect(HWND hWnd,UINT_PTR nIDTool,LPCRECT lpRect)2331 	void SetToolRect(HWND hWnd, UINT_PTR nIDTool, LPCRECT lpRect)
2332 	{
2333 		ATLASSERT(::IsWindow(m_hWnd));
2334 		ATLASSERT(hWnd != NULL);
2335 		ATLASSERT(nIDTool != 0);
2336 
2337 		CToolInfo ti(0, hWnd, nIDTool, (LPRECT)lpRect, NULL);
2338 		::SendMessage(m_hWnd, TTM_NEWTOOLRECT, 0, ti);
2339 	}
2340 
GetToolCount()2341 	int GetToolCount() const
2342 	{
2343 		ATLASSERT(::IsWindow(m_hWnd));
2344 		return (int)::SendMessage(m_hWnd, TTM_GETTOOLCOUNT, 0, 0L);
2345 	}
2346 
GetDelayTime(DWORD dwType)2347 	int GetDelayTime(DWORD dwType) const
2348 	{
2349 		ATLASSERT(::IsWindow(m_hWnd));
2350 		return (int)::SendMessage(m_hWnd, TTM_GETDELAYTIME, dwType, 0L);
2351 	}
2352 
SetDelayTime(DWORD dwType,int nTime)2353 	void SetDelayTime(DWORD dwType, int nTime)
2354 	{
2355 		ATLASSERT(::IsWindow(m_hWnd));
2356 		::SendMessage(m_hWnd, TTM_SETDELAYTIME, dwType, MAKELPARAM(nTime, 0));
2357 	}
2358 
GetMargin(LPRECT lpRect)2359 	void GetMargin(LPRECT lpRect) const
2360 	{
2361 		ATLASSERT(::IsWindow(m_hWnd));
2362 		::SendMessage(m_hWnd, TTM_GETMARGIN, 0, (LPARAM)lpRect);
2363 	}
2364 
SetMargin(LPRECT lpRect)2365 	void SetMargin(LPRECT lpRect)
2366 	{
2367 		ATLASSERT(::IsWindow(m_hWnd));
2368 		::SendMessage(m_hWnd, TTM_SETMARGIN, 0, (LPARAM)lpRect);
2369 	}
2370 
GetMaxTipWidth()2371 	int GetMaxTipWidth() const
2372 	{
2373 		ATLASSERT(::IsWindow(m_hWnd));
2374 		return (int)::SendMessage(m_hWnd, TTM_GETMAXTIPWIDTH, 0, 0L);
2375 	}
2376 
SetMaxTipWidth(int nWidth)2377 	int SetMaxTipWidth(int nWidth)
2378 	{
2379 		ATLASSERT(::IsWindow(m_hWnd));
2380 		return (int)::SendMessage(m_hWnd, TTM_SETMAXTIPWIDTH, 0, nWidth);
2381 	}
2382 
GetTipBkColor()2383 	COLORREF GetTipBkColor() const
2384 	{
2385 		ATLASSERT(::IsWindow(m_hWnd));
2386 		return (COLORREF)::SendMessage(m_hWnd, TTM_GETTIPBKCOLOR, 0, 0L);
2387 	}
2388 
SetTipBkColor(COLORREF clr)2389 	void SetTipBkColor(COLORREF clr)
2390 	{
2391 		ATLASSERT(::IsWindow(m_hWnd));
2392 		::SendMessage(m_hWnd, TTM_SETTIPBKCOLOR, (WPARAM)clr, 0L);
2393 	}
2394 
GetTipTextColor()2395 	COLORREF GetTipTextColor() const
2396 	{
2397 		ATLASSERT(::IsWindow(m_hWnd));
2398 		return (COLORREF)::SendMessage(m_hWnd, TTM_GETTIPTEXTCOLOR, 0, 0L);
2399 	}
2400 
SetTipTextColor(COLORREF clr)2401 	void SetTipTextColor(COLORREF clr)
2402 	{
2403 		ATLASSERT(::IsWindow(m_hWnd));
2404 		::SendMessage(m_hWnd, TTM_SETTIPTEXTCOLOR, (WPARAM)clr, 0L);
2405 	}
2406 
GetCurrentTool(LPTOOLINFO lpToolInfo)2407 	BOOL GetCurrentTool(LPTOOLINFO lpToolInfo) const
2408 	{
2409 		ATLASSERT(::IsWindow(m_hWnd));
2410 		return (BOOL)::SendMessage(m_hWnd, TTM_GETCURRENTTOOL, 0, (LPARAM)lpToolInfo);
2411 	}
2412 
2413 #if (_WIN32_IE >= 0x0500)
GetBubbleSize(LPTOOLINFO lpToolInfo)2414 	SIZE GetBubbleSize(LPTOOLINFO lpToolInfo) const
2415 	{
2416 		ATLASSERT(::IsWindow(m_hWnd));
2417 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, TTM_GETBUBBLESIZE, 0, (LPARAM)lpToolInfo);
2418 		SIZE size = { GET_X_LPARAM(dwRet), GET_Y_LPARAM(dwRet) };
2419 		return size;
2420 	}
2421 
SetTitle(UINT_PTR uIcon,LPCTSTR lpstrTitle)2422 	BOOL SetTitle(UINT_PTR uIcon, LPCTSTR lpstrTitle)
2423 	{
2424 		ATLASSERT(::IsWindow(m_hWnd));
2425 		return (BOOL)::SendMessage(m_hWnd, TTM_SETTITLE, uIcon, (LPARAM)lpstrTitle);
2426 	}
2427 
SetTitle(HICON hIcon,LPCTSTR lpstrTitle)2428 	BOOL SetTitle(HICON hIcon, LPCTSTR lpstrTitle)
2429 	{
2430 		ATLASSERT(::IsWindow(m_hWnd));
2431 		return (BOOL)::SendMessage(m_hWnd, TTM_SETTITLE, (WPARAM)hIcon, (LPARAM)lpstrTitle);
2432 	}
2433 #endif // (_WIN32_IE >= 0x0500)
2434 
2435 #if (_WIN32_WINNT >= 0x0501)
GetTitle(PTTGETTITLE pTTGetTitle)2436 	void GetTitle(PTTGETTITLE pTTGetTitle) const
2437 	{
2438 		ATLASSERT(::IsWindow(m_hWnd));
2439 		::SendMessage(m_hWnd, TTM_GETTITLE, 0, (LPARAM)pTTGetTitle);
2440 	}
2441 
SetWindowTheme(LPCWSTR lpstrTheme)2442 	void SetWindowTheme(LPCWSTR lpstrTheme)
2443 	{
2444 		ATLASSERT(::IsWindow(m_hWnd));
2445 		::SendMessage(m_hWnd, TTM_SETWINDOWTHEME, 0, (LPARAM)lpstrTheme);
2446 	}
2447 #endif // (_WIN32_WINNT >= 0x0501)
2448 
2449 // Operations
Activate(BOOL bActivate)2450 	void Activate(BOOL bActivate)
2451 	{
2452 		ATLASSERT(::IsWindow(m_hWnd));
2453 		::SendMessage(m_hWnd, TTM_ACTIVATE, bActivate, 0L);
2454 	}
2455 
AddTool(LPTOOLINFO lpToolInfo)2456 	BOOL AddTool(LPTOOLINFO lpToolInfo)
2457 	{
2458 		ATLASSERT(::IsWindow(m_hWnd));
2459 		return (BOOL)::SendMessage(m_hWnd, TTM_ADDTOOL, 0, (LPARAM)lpToolInfo);
2460 	}
2461 
2462 	BOOL AddTool(HWND hWnd, ATL::_U_STRINGorID text = LPSTR_TEXTCALLBACK, LPCRECT lpRectTool = NULL, UINT_PTR nIDTool = 0)
2463 	{
2464 		ATLASSERT(::IsWindow(m_hWnd));
2465 		ATLASSERT(hWnd != NULL);
2466 		// the toolrect and toolid must both be zero or both valid
2467 		ATLASSERT((lpRectTool != NULL && nIDTool != 0) || (lpRectTool == NULL && nIDTool == 0));
2468 
2469 		CToolInfo ti(0, hWnd, nIDTool, (LPRECT)lpRectTool, (LPTSTR)text.m_lpstr);
2470 		return (BOOL)::SendMessage(m_hWnd, TTM_ADDTOOL, 0, ti);
2471 	}
2472 
DelTool(LPTOOLINFO lpToolInfo)2473 	void DelTool(LPTOOLINFO lpToolInfo)
2474 	{
2475 		ATLASSERT(::IsWindow(m_hWnd));
2476 		::SendMessage(m_hWnd, TTM_DELTOOL, 0, (LPARAM)lpToolInfo);
2477 	}
2478 
2479 	void DelTool(HWND hWnd, UINT_PTR nIDTool = 0)
2480 	{
2481 		ATLASSERT(::IsWindow(m_hWnd));
2482 		ATLASSERT(hWnd != NULL);
2483 
2484 		CToolInfo ti(0, hWnd, nIDTool, NULL, NULL);
2485 		::SendMessage(m_hWnd, TTM_DELTOOL, 0, ti);
2486 	}
2487 
HitTest(LPTTHITTESTINFO lpHitTestInfo)2488 	BOOL HitTest(LPTTHITTESTINFO lpHitTestInfo) const
2489 	{
2490 		ATLASSERT(::IsWindow(m_hWnd));
2491 		return (BOOL)::SendMessage(m_hWnd, TTM_HITTEST, 0, (LPARAM)lpHitTestInfo);
2492 	}
2493 
HitTest(HWND hWnd,POINT pt,LPTOOLINFO lpToolInfo)2494 	BOOL HitTest(HWND hWnd, POINT pt, LPTOOLINFO lpToolInfo) const
2495 	{
2496 		ATLASSERT(::IsWindow(m_hWnd));
2497 		ATLASSERT(hWnd != NULL);
2498 		ATLASSERT(lpToolInfo != NULL);
2499 
2500 		TTHITTESTINFO hti = { 0 };
2501 		hti.ti.cbSize = RunTimeHelper::SizeOf_TOOLINFO();
2502 		hti.hwnd = hWnd;
2503 		hti.pt.x = pt.x;
2504 		hti.pt.y = pt.y;
2505 		if((BOOL)::SendMessage(m_hWnd, TTM_HITTEST, 0, (LPARAM)&hti) != FALSE)
2506 		{
2507 			*lpToolInfo = hti.ti;
2508 			return TRUE;
2509 		}
2510 		return FALSE;
2511 	}
2512 
RelayEvent(LPMSG lpMsg)2513 	void RelayEvent(LPMSG lpMsg)
2514 	{
2515 		ATLASSERT(::IsWindow(m_hWnd));
2516 		::SendMessage(m_hWnd, TTM_RELAYEVENT, 0, (LPARAM)lpMsg);
2517 	}
2518 
UpdateTipText(LPTOOLINFO lpToolInfo)2519 	void UpdateTipText(LPTOOLINFO lpToolInfo)
2520 	{
2521 		ATLASSERT(::IsWindow(m_hWnd));
2522 		::SendMessage(m_hWnd, TTM_UPDATETIPTEXT, 0, (LPARAM)lpToolInfo);
2523 	}
2524 
2525 	void UpdateTipText(ATL::_U_STRINGorID text, HWND hWnd, UINT_PTR nIDTool = 0)
2526 	{
2527 		ATLASSERT(::IsWindow(m_hWnd));
2528 		ATLASSERT(hWnd != NULL);
2529 
2530 		CToolInfo ti(0, hWnd, nIDTool, NULL, (LPTSTR)text.m_lpstr);
2531 		::SendMessage(m_hWnd, TTM_UPDATETIPTEXT, 0, ti);
2532 	}
2533 
EnumTools(UINT_PTR nTool,LPTOOLINFO lpToolInfo)2534 	BOOL EnumTools(UINT_PTR nTool, LPTOOLINFO lpToolInfo) const
2535 	{
2536 		ATLASSERT(::IsWindow(m_hWnd));
2537 		return (BOOL)::SendMessage(m_hWnd, TTM_ENUMTOOLS, nTool, (LPARAM)lpToolInfo);
2538 	}
2539 
Pop()2540 	void Pop()
2541 	{
2542 		ATLASSERT(::IsWindow(m_hWnd));
2543 		::SendMessage(m_hWnd, TTM_POP, 0, 0L);
2544 	}
2545 
TrackActivate(LPTOOLINFO lpToolInfo,BOOL bActivate)2546 	void TrackActivate(LPTOOLINFO lpToolInfo, BOOL bActivate)
2547 	{
2548 		ATLASSERT(::IsWindow(m_hWnd));
2549 		::SendMessage(m_hWnd, TTM_TRACKACTIVATE, bActivate, (LPARAM)lpToolInfo);
2550 	}
2551 
TrackActivate(HWND hWnd,UINT_PTR nIDTool,BOOL bActivate)2552 	void TrackActivate(HWND hWnd, UINT_PTR nIDTool, BOOL bActivate)
2553 	{
2554 		ATLASSERT(::IsWindow(m_hWnd));
2555 		ATLASSERT(hWnd != NULL);
2556 
2557 		CToolInfo ti(0, hWnd, nIDTool);
2558 		::SendMessage(m_hWnd, TTM_TRACKACTIVATE, bActivate, ti);
2559 	}
2560 
TrackPosition(int xPos,int yPos)2561 	void TrackPosition(int xPos, int yPos)
2562 	{
2563 		ATLASSERT(::IsWindow(m_hWnd));
2564 		::SendMessage(m_hWnd, TTM_TRACKPOSITION, 0, MAKELPARAM(xPos, yPos));
2565 	}
2566 
2567 #if (_WIN32_IE >= 0x0400)
Update()2568 	void Update()
2569 	{
2570 		ATLASSERT(::IsWindow(m_hWnd));
2571 		::SendMessage(m_hWnd, TTM_UPDATE, 0, 0L);
2572 	}
2573 #endif // (_WIN32_IE >= 0x0400)
2574 
2575 #if (_WIN32_IE >= 0x0500)
AdjustRect(LPRECT lpRect,BOOL bLarger)2576 	BOOL AdjustRect(LPRECT lpRect, BOOL bLarger /*= TRUE*/)
2577 	{
2578 		ATLASSERT(::IsWindow(m_hWnd));
2579 		return (BOOL)::SendMessage(m_hWnd, TTM_ADJUSTRECT, bLarger, (LPARAM)lpRect);
2580 	}
2581 #endif // (_WIN32_IE >= 0x0500)
2582 
2583 #if (_WIN32_WINNT >= 0x0501)
Popup()2584 	void Popup()
2585 	{
2586 		ATLASSERT(::IsWindow(m_hWnd));
2587 		::SendMessage(m_hWnd, TTM_POPUP, 0, 0L);
2588 	}
2589 #endif // (_WIN32_WINNT >= 0x0501)
2590 };
2591 
2592 typedef CToolTipCtrlT<ATL::CWindow>   CToolTipCtrl;
2593 
2594 #endif // !_WIN32_WCE
2595 
2596 
2597 ///////////////////////////////////////////////////////////////////////////////
2598 // CHeaderCtrl
2599 
2600 template <class TBase>
2601 class CHeaderCtrlT : public TBase
2602 {
2603 public:
2604 // Constructors
TBase(hWnd)2605 	CHeaderCtrlT(HWND hWnd = NULL) : TBase(hWnd)
2606 	{ }
2607 
2608 	CHeaderCtrlT< TBase >& operator =(HWND hWnd)
2609 	{
2610 		m_hWnd = hWnd;
2611 		return *this;
2612 	}
2613 
2614 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
2615 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
2616 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
2617 	{
2618 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
2619 	}
2620 
2621 // Attributes
GetWndClassName()2622 	static LPCTSTR GetWndClassName()
2623 	{
2624 		return WC_HEADER;
2625 	}
2626 
GetItemCount()2627 	int GetItemCount() const
2628 	{
2629 		ATLASSERT(::IsWindow(m_hWnd));
2630 		return (int)::SendMessage(m_hWnd, HDM_GETITEMCOUNT, 0, 0L);
2631 	}
2632 
GetItem(int nIndex,LPHDITEM pHeaderItem)2633 	BOOL GetItem(int nIndex, LPHDITEM pHeaderItem) const
2634 	{
2635 		ATLASSERT(::IsWindow(m_hWnd));
2636 		return (BOOL)::SendMessage(m_hWnd, HDM_GETITEM, nIndex, (LPARAM)pHeaderItem);
2637 	}
2638 
SetItem(int nIndex,LPHDITEM pHeaderItem)2639 	BOOL SetItem(int nIndex, LPHDITEM pHeaderItem)
2640 	{
2641 		ATLASSERT(::IsWindow(m_hWnd));
2642 		return (BOOL)::SendMessage(m_hWnd, HDM_SETITEM, nIndex, (LPARAM)pHeaderItem);
2643 	}
2644 
GetImageList()2645 	CImageList GetImageList() const
2646 	{
2647 		ATLASSERT(::IsWindow(m_hWnd));
2648 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, HDM_GETIMAGELIST, 0, 0L));
2649 	}
2650 
SetImageList(HIMAGELIST hImageList)2651 	CImageList SetImageList(HIMAGELIST hImageList)
2652 	{
2653 		ATLASSERT(::IsWindow(m_hWnd));
2654 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, HDM_SETIMAGELIST, 0, (LPARAM)hImageList));
2655 	}
2656 
GetOrderArray(int nSize,int * lpnArray)2657 	BOOL GetOrderArray(int nSize, int* lpnArray) const
2658 	{
2659 		ATLASSERT(::IsWindow(m_hWnd));
2660 		return (BOOL)::SendMessage(m_hWnd, HDM_GETORDERARRAY, nSize, (LPARAM)lpnArray);
2661 	}
2662 
SetOrderArray(int nSize,int * lpnArray)2663 	BOOL SetOrderArray(int nSize, int* lpnArray)
2664 	{
2665 		ATLASSERT(::IsWindow(m_hWnd));
2666 		return (BOOL)::SendMessage(m_hWnd, HDM_SETORDERARRAY, nSize, (LPARAM)lpnArray);
2667 	}
2668 
GetItemRect(int nIndex,LPRECT lpItemRect)2669 	BOOL GetItemRect(int nIndex, LPRECT lpItemRect) const
2670 	{
2671 		ATLASSERT(::IsWindow(m_hWnd));
2672 		return (BOOL)::SendMessage(m_hWnd, HDM_GETITEMRECT, nIndex, (LPARAM)lpItemRect);
2673 	}
2674 
SetHotDivider(BOOL bPos,DWORD dwInputValue)2675 	int SetHotDivider(BOOL bPos, DWORD dwInputValue)
2676 	{
2677 		ATLASSERT(::IsWindow(m_hWnd));
2678 		return (int)::SendMessage(m_hWnd, HDM_SETHOTDIVIDER, bPos, dwInputValue);
2679 	}
2680 
2681 #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
GetUnicodeFormat()2682 	BOOL GetUnicodeFormat() const
2683 	{
2684 		ATLASSERT(::IsWindow(m_hWnd));
2685 		return (BOOL)::SendMessage(m_hWnd, HDM_GETUNICODEFORMAT, 0, 0L);
2686 	}
2687 
2688 	BOOL SetUnicodeFormat(BOOL bUnicode = TRUE)
2689 	{
2690 		ATLASSERT(::IsWindow(m_hWnd));
2691 		return (BOOL)::SendMessage(m_hWnd, HDM_SETUNICODEFORMAT, bUnicode, 0L);
2692 	}
2693 #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
2694 
2695 #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
GetBitmapMargin()2696 	int GetBitmapMargin() const
2697 	{
2698 		ATLASSERT(::IsWindow(m_hWnd));
2699 		return (int)::SendMessage(m_hWnd, HDM_GETBITMAPMARGIN, 0, 0L);
2700 	}
2701 
SetBitmapMargin(int nWidth)2702 	int SetBitmapMargin(int nWidth)
2703 	{
2704 		ATLASSERT(::IsWindow(m_hWnd));
2705 		return (int)::SendMessage(m_hWnd, HDM_SETBITMAPMARGIN, nWidth, 0L);
2706 	}
2707 
SetFilterChangeTimeout(DWORD dwTimeOut)2708 	int SetFilterChangeTimeout(DWORD dwTimeOut)
2709 	{
2710 		ATLASSERT(::IsWindow(m_hWnd));
2711 		return (int)::SendMessage(m_hWnd, HDM_SETFILTERCHANGETIMEOUT, 0, dwTimeOut);
2712 	}
2713 #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
2714 
2715 #if (_WIN32_WINNT >= 0x0600)
GetItemDropDownRect(int nIndex,LPRECT lpRect)2716 	BOOL GetItemDropDownRect(int nIndex, LPRECT lpRect) const
2717 	{
2718 		ATLASSERT(::IsWindow(m_hWnd));
2719 		return (BOOL)::SendMessage(m_hWnd, HDM_GETITEMDROPDOWNRECT, nIndex, (LPARAM)lpRect);
2720 	}
2721 
GetOverflowRect(LPRECT lpRect)2722 	BOOL GetOverflowRect(LPRECT lpRect) const
2723 	{
2724 		ATLASSERT(::IsWindow(m_hWnd));
2725 		return (BOOL)::SendMessage(m_hWnd, HDM_GETOVERFLOWRECT, 0, (LPARAM)lpRect);
2726 	}
2727 
GetFocusedItem()2728 	int GetFocusedItem() const
2729 	{
2730 		ATLASSERT(::IsWindow(m_hWnd));
2731 		return (int)::SendMessage(m_hWnd, HDM_GETFOCUSEDITEM, 0, 0L);
2732 	}
2733 
SetFocusedItem(int nIndex)2734 	BOOL SetFocusedItem(int nIndex)
2735 	{
2736 		ATLASSERT(::IsWindow(m_hWnd));
2737 		return (BOOL)::SendMessage(m_hWnd, HDM_SETFOCUSEDITEM, 0, nIndex);
2738 	}
2739 #endif // (_WIN32_WINNT >= 0x0600)
2740 
2741 // Operations
InsertItem(int nIndex,LPHDITEM phdi)2742 	int InsertItem(int nIndex, LPHDITEM phdi)
2743 	{
2744 		ATLASSERT(::IsWindow(m_hWnd));
2745 		return (int)::SendMessage(m_hWnd, HDM_INSERTITEM, nIndex, (LPARAM)phdi);
2746 	}
2747 
AddItem(LPHDITEM phdi)2748 	int AddItem(LPHDITEM phdi)
2749 	{
2750 		return InsertItem(GetItemCount(), phdi);
2751 	}
2752 
DeleteItem(int nIndex)2753 	BOOL DeleteItem(int nIndex)
2754 	{
2755 		ATLASSERT(::IsWindow(m_hWnd));
2756 		return (BOOL)::SendMessage(m_hWnd, HDM_DELETEITEM, nIndex, 0L);
2757 	}
2758 
Layout(HD_LAYOUT * pHeaderLayout)2759 	BOOL Layout(HD_LAYOUT* pHeaderLayout)
2760 	{
2761 		ATLASSERT(::IsWindow(m_hWnd));
2762 		return (BOOL)::SendMessage(m_hWnd, HDM_LAYOUT, 0, (LPARAM)pHeaderLayout);
2763 	}
2764 
HitTest(LPHDHITTESTINFO lpHitTestInfo)2765 	int HitTest(LPHDHITTESTINFO lpHitTestInfo) const
2766 	{
2767 		ATLASSERT(::IsWindow(m_hWnd));
2768 		return (int)::SendMessage(m_hWnd, HDM_HITTEST, 0, (LPARAM)lpHitTestInfo);
2769 	}
2770 
OrderToIndex(int nOrder)2771 	int OrderToIndex(int nOrder)
2772 	{
2773 		ATLASSERT(::IsWindow(m_hWnd));
2774 		return (int)::SendMessage(m_hWnd, HDM_ORDERTOINDEX, nOrder, 0L);
2775 	}
2776 
CreateDragImage(int nIndex)2777 	CImageList CreateDragImage(int nIndex)
2778 	{
2779 		ATLASSERT(::IsWindow(m_hWnd));
2780 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, HDM_CREATEDRAGIMAGE, nIndex, 0L));
2781 	}
2782 
2783 #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
EditFilter(int nColumn,BOOL bDiscardChanges)2784 	int EditFilter(int nColumn, BOOL bDiscardChanges)
2785 	{
2786 		ATLASSERT(::IsWindow(m_hWnd));
2787 		return (int)::SendMessage(m_hWnd, HDM_EDITFILTER, nColumn, MAKELPARAM(bDiscardChanges, 0));
2788 	}
2789 
ClearFilter(int nColumn)2790 	int ClearFilter(int nColumn)
2791 	{
2792 		ATLASSERT(::IsWindow(m_hWnd));
2793 		return (int)::SendMessage(m_hWnd, HDM_CLEARFILTER, nColumn, 0L);
2794 	}
2795 
ClearAllFilters()2796 	int ClearAllFilters()
2797 	{
2798 		ATLASSERT(::IsWindow(m_hWnd));
2799 		return (int)::SendMessage(m_hWnd, HDM_CLEARFILTER, (WPARAM)-1, 0L);
2800 	}
2801 #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
2802 };
2803 
2804 typedef CHeaderCtrlT<ATL::CWindow>   CHeaderCtrl;
2805 
2806 
2807 ///////////////////////////////////////////////////////////////////////////////
2808 // CListViewCtrl
2809 
2810 template <class TBase>
2811 class CListViewCtrlT : public TBase
2812 {
2813 public:
2814 // Constructors
TBase(hWnd)2815 	CListViewCtrlT(HWND hWnd = NULL) : TBase(hWnd)
2816 	{ }
2817 
2818 	CListViewCtrlT< TBase >& operator =(HWND hWnd)
2819 	{
2820 		m_hWnd = hWnd;
2821 		return *this;
2822 	}
2823 
2824 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
2825 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
2826 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
2827 	{
2828 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
2829 	}
2830 
2831 // Attributes
GetWndClassName()2832 	static LPCTSTR GetWndClassName()
2833 	{
2834 		return WC_LISTVIEW;
2835 	}
2836 
GetBkColor()2837 	COLORREF GetBkColor() const
2838 	{
2839 		ATLASSERT(::IsWindow(m_hWnd));
2840 		return (COLORREF)::SendMessage(m_hWnd, LVM_GETBKCOLOR, 0, 0L);
2841 	}
2842 
SetBkColor(COLORREF cr)2843 	BOOL SetBkColor(COLORREF cr)
2844 	{
2845 		ATLASSERT(::IsWindow(m_hWnd));
2846 		return (BOOL)::SendMessage(m_hWnd, LVM_SETBKCOLOR, 0, cr);
2847 	}
2848 
GetImageList(int nImageListType)2849 	CImageList GetImageList(int nImageListType) const
2850 	{
2851 		ATLASSERT(::IsWindow(m_hWnd));
2852 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, LVM_GETIMAGELIST, nImageListType, 0L));
2853 	}
2854 
SetImageList(HIMAGELIST hImageList,int nImageList)2855 	CImageList SetImageList(HIMAGELIST hImageList, int nImageList)
2856 	{
2857 		ATLASSERT(::IsWindow(m_hWnd));
2858 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, LVM_SETIMAGELIST, nImageList, (LPARAM)hImageList));
2859 	}
2860 
GetItemCount()2861 	int GetItemCount() const
2862 	{
2863 		ATLASSERT(::IsWindow(m_hWnd));
2864 		return (int)::SendMessage(m_hWnd, LVM_GETITEMCOUNT, 0, 0L);
2865 	}
2866 
SetItemCount(int nItems)2867 	BOOL SetItemCount(int nItems)
2868 	{
2869 		ATLASSERT(::IsWindow(m_hWnd));
2870 		return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMCOUNT, nItems, 0L);
2871 	}
2872 
GetItem(LPLVITEM pItem)2873 	BOOL GetItem(LPLVITEM pItem) const
2874 	{
2875 		ATLASSERT(::IsWindow(m_hWnd));
2876 		return (BOOL)::SendMessage(m_hWnd, LVM_GETITEM, 0, (LPARAM)pItem);
2877 	}
2878 
SetItem(const LVITEM * pItem)2879 	BOOL SetItem(const LVITEM* pItem)
2880 	{
2881 		ATLASSERT(::IsWindow(m_hWnd));
2882 		return (BOOL)::SendMessage(m_hWnd, LVM_SETITEM, 0, (LPARAM)pItem);
2883 	}
2884 
SetItem(int nItem,int nSubItem,UINT nMask,LPCTSTR lpszItem,int nImage,UINT nState,UINT nStateMask,LPARAM lParam)2885 	BOOL SetItem(int nItem, int nSubItem, UINT nMask, LPCTSTR lpszItem,
2886 		int nImage, UINT nState, UINT nStateMask, LPARAM lParam)
2887 	{
2888 		ATLASSERT(::IsWindow(m_hWnd));
2889 		LVITEM lvi = { 0 };
2890 		lvi.mask = nMask;
2891 		lvi.iItem = nItem;
2892 		lvi.iSubItem = nSubItem;
2893 		lvi.stateMask = nStateMask;
2894 		lvi.state = nState;
2895 		lvi.pszText = (LPTSTR) lpszItem;
2896 		lvi.iImage = nImage;
2897 		lvi.lParam = lParam;
2898 		return (BOOL)::SendMessage(m_hWnd, LVM_SETITEM, 0, (LPARAM)&lvi);
2899 	}
2900 
GetItemState(int nItem,UINT nMask)2901 	UINT GetItemState(int nItem, UINT nMask) const
2902 	{
2903 		ATLASSERT(::IsWindow(m_hWnd));
2904 		return (UINT)::SendMessage(m_hWnd, LVM_GETITEMSTATE, nItem, nMask);
2905 	}
2906 
SetItemState(int nItem,UINT nState,UINT nStateMask)2907 	BOOL SetItemState(int nItem, UINT nState, UINT nStateMask)
2908 	{
2909 		ATLASSERT(::IsWindow(m_hWnd));
2910 		LVITEM lvi = { 0 };
2911 		lvi.state = nState;
2912 		lvi.stateMask = nStateMask;
2913 		return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMSTATE, nItem, (LPARAM)&lvi);
2914 	}
2915 
SetItemState(int nItem,LPLVITEM pItem)2916 	BOOL SetItemState(int nItem, LPLVITEM pItem)
2917 	{
2918 		ATLASSERT(::IsWindow(m_hWnd));
2919 		return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMSTATE, nItem, (LPARAM)pItem);
2920 	}
2921 
2922 #ifndef _ATL_NO_COM
GetItemText(int nItem,int nSubItem,BSTR & bstrText)2923 	BOOL GetItemText(int nItem, int nSubItem, BSTR& bstrText) const
2924 	{
2925 		USES_CONVERSION;
2926 		ATLASSERT(::IsWindow(m_hWnd));
2927 		ATLASSERT(bstrText == NULL);
2928 		LVITEM lvi = { 0 };
2929 		lvi.iSubItem = nSubItem;
2930 
2931 		LPTSTR lpstrText = NULL;
2932 		int nRes = 0;
2933 		for(int nLen = 256; ; nLen *= 2)
2934 		{
2935 			ATLTRY(lpstrText = new TCHAR[nLen]);
2936 			if(lpstrText == NULL)
2937 				break;
2938 			lpstrText[0] = NULL;
2939 			lvi.cchTextMax = nLen;
2940 			lvi.pszText = lpstrText;
2941 			nRes  = (int)::SendMessage(m_hWnd, LVM_GETITEMTEXT, (WPARAM)nItem, (LPARAM)&lvi);
2942 			if(nRes < nLen - 1)
2943 				break;
2944 			delete [] lpstrText;
2945 			lpstrText = NULL;
2946 		}
2947 
2948 		if(lpstrText != NULL)
2949 		{
2950 			if(nRes != 0)
2951 				bstrText = ::SysAllocString(T2OLE(lpstrText));
2952 			delete [] lpstrText;
2953 		}
2954 
2955 		return (bstrText != NULL) ? TRUE : FALSE;
2956 	}
2957 #endif // !_ATL_NO_COM
2958 
2959 #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
GetItemText(int nItem,int nSubItem,_CSTRING_NS::CString & strText)2960 	int GetItemText(int nItem, int nSubItem, _CSTRING_NS::CString& strText) const
2961 	{
2962 		ATLASSERT(::IsWindow(m_hWnd));
2963 		LVITEM lvi = { 0 };
2964 		lvi.iSubItem = nSubItem;
2965 
2966 		strText.Empty();
2967 		int nRes = 0;
2968 		for(int nLen = 256; ; nLen *= 2)
2969 		{
2970 			lvi.cchTextMax = nLen;
2971 			lvi.pszText = strText.GetBufferSetLength(nLen);
2972 			if(lvi.pszText == NULL)
2973 			{
2974 				nRes = 0;
2975 				break;
2976 			}
2977 			nRes  = (int)::SendMessage(m_hWnd, LVM_GETITEMTEXT, (WPARAM)nItem, (LPARAM)&lvi);
2978 			if(nRes < nLen - 1)
2979 				break;
2980 		}
2981 		strText.ReleaseBuffer();
2982 		return nRes;
2983 	}
2984 #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
2985 
GetItemText(int nItem,int nSubItem,LPTSTR lpszText,int nLen)2986 	int GetItemText(int nItem, int nSubItem, LPTSTR lpszText, int nLen) const
2987 	{
2988 		ATLASSERT(::IsWindow(m_hWnd));
2989 		LVITEM lvi = { 0 };
2990 		lvi.iSubItem = nSubItem;
2991 		lvi.cchTextMax = nLen;
2992 		lvi.pszText = lpszText;
2993 		return (int)::SendMessage(m_hWnd, LVM_GETITEMTEXT, (WPARAM)nItem, (LPARAM)&lvi);
2994 	}
2995 
SetItemText(int nItem,int nSubItem,LPCTSTR lpszText)2996 	BOOL SetItemText(int nItem, int nSubItem, LPCTSTR lpszText)
2997 	{
2998 		ATLASSERT(::IsWindow(m_hWnd));
2999 		return SetItem(nItem, nSubItem, LVIF_TEXT, lpszText, 0, 0, 0, 0);
3000 	}
3001 
GetItemData(int nItem)3002 	DWORD_PTR GetItemData(int nItem) const
3003 	{
3004 		ATLASSERT(::IsWindow(m_hWnd));
3005 		LVITEM lvi = { 0 };
3006 		lvi.iItem = nItem;
3007 		lvi.mask = LVIF_PARAM;
3008 		BOOL bRet = (BOOL)::SendMessage(m_hWnd, LVM_GETITEM, 0, (LPARAM)&lvi);
3009 		return (DWORD_PTR)(bRet ? lvi.lParam : NULL);
3010 	}
3011 
SetItemData(int nItem,DWORD_PTR dwData)3012 	BOOL SetItemData(int nItem, DWORD_PTR dwData)
3013 	{
3014 		ATLASSERT(::IsWindow(m_hWnd));
3015 		return SetItem(nItem, 0, LVIF_PARAM, NULL, 0, 0, 0, (LPARAM)dwData);
3016 	}
3017 
GetCallbackMask()3018 	UINT GetCallbackMask() const
3019 	{
3020 		ATLASSERT(::IsWindow(m_hWnd));
3021 		return (UINT)::SendMessage(m_hWnd, LVM_GETCALLBACKMASK, 0, 0L);
3022 	}
3023 
SetCallbackMask(UINT nMask)3024 	BOOL SetCallbackMask(UINT nMask)
3025 	{
3026 		ATLASSERT(::IsWindow(m_hWnd));
3027 		return (BOOL)::SendMessage(m_hWnd, LVM_SETCALLBACKMASK, nMask, 0L);
3028 	}
3029 
GetItemPosition(int nItem,LPPOINT lpPoint)3030 	BOOL GetItemPosition(int nItem, LPPOINT lpPoint) const
3031 	{
3032 		ATLASSERT(::IsWindow(m_hWnd));
3033 		return (BOOL)::SendMessage(m_hWnd, LVM_GETITEMPOSITION, nItem, (LPARAM)lpPoint);
3034 	}
3035 
SetItemPosition(int nItem,POINT pt)3036 	BOOL SetItemPosition(int nItem, POINT pt)
3037 	{
3038 		ATLASSERT(::IsWindow(m_hWnd));
3039 		ATLASSERT(((GetStyle() & LVS_TYPEMASK) == LVS_ICON) || ((GetStyle() & LVS_TYPEMASK) == LVS_SMALLICON));
3040 		return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMPOSITION32, nItem, (LPARAM)&pt);
3041 	}
3042 
SetItemPosition(int nItem,int x,int y)3043 	BOOL SetItemPosition(int nItem, int x, int y)
3044 	{
3045 		ATLASSERT(::IsWindow(m_hWnd));
3046 		ATLASSERT(((GetStyle() & LVS_TYPEMASK) == LVS_ICON) || ((GetStyle() & LVS_TYPEMASK) == LVS_SMALLICON));
3047 		POINT pt = { x, y };
3048 		return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMPOSITION32, nItem, (LPARAM)&pt);
3049 	}
3050 
GetStringWidth(LPCTSTR lpsz)3051 	int GetStringWidth(LPCTSTR lpsz) const
3052 	{
3053 		ATLASSERT(::IsWindow(m_hWnd));
3054 		return (int)::SendMessage(m_hWnd, LVM_GETSTRINGWIDTH, 0, (LPARAM)lpsz);
3055 	}
3056 
GetEditControl()3057 	CEdit GetEditControl() const
3058 	{
3059 		ATLASSERT(::IsWindow(m_hWnd));
3060 		return CEdit((HWND)::SendMessage(m_hWnd, LVM_GETEDITCONTROL, 0, 0L));
3061 	}
3062 
GetColumn(int nCol,LVCOLUMN * pColumn)3063 	BOOL GetColumn(int nCol, LVCOLUMN* pColumn) const
3064 	{
3065 		ATLASSERT(::IsWindow(m_hWnd));
3066 		return (BOOL)::SendMessage(m_hWnd, LVM_GETCOLUMN, nCol, (LPARAM)pColumn);
3067 	}
3068 
SetColumn(int nCol,const LVCOLUMN * pColumn)3069 	BOOL SetColumn(int nCol, const LVCOLUMN* pColumn)
3070 	{
3071 		ATLASSERT(::IsWindow(m_hWnd));
3072 		return (BOOL)::SendMessage(m_hWnd, LVM_SETCOLUMN, nCol, (LPARAM)pColumn);
3073 	}
3074 
GetColumnWidth(int nCol)3075 	int GetColumnWidth(int nCol) const
3076 	{
3077 		ATLASSERT(::IsWindow(m_hWnd));
3078 		return (int)::SendMessage(m_hWnd, LVM_GETCOLUMNWIDTH, nCol, 0L);
3079 	}
3080 
SetColumnWidth(int nCol,int cx)3081 	BOOL SetColumnWidth(int nCol, int cx)
3082 	{
3083 		ATLASSERT(::IsWindow(m_hWnd));
3084 		return (BOOL)::SendMessage(m_hWnd, LVM_SETCOLUMNWIDTH, nCol, MAKELPARAM(cx, 0));
3085 	}
3086 
GetViewRect(LPRECT lpRect)3087 	BOOL GetViewRect(LPRECT lpRect) const
3088 	{
3089 		ATLASSERT(::IsWindow(m_hWnd));
3090 		return (BOOL)::SendMessage(m_hWnd, LVM_GETVIEWRECT, 0, (LPARAM)lpRect);
3091 	}
3092 
GetTextColor()3093 	COLORREF GetTextColor() const
3094 	{
3095 		ATLASSERT(::IsWindow(m_hWnd));
3096 		return (COLORREF)::SendMessage(m_hWnd, LVM_GETTEXTCOLOR, 0, 0L);
3097 	}
3098 
SetTextColor(COLORREF cr)3099 	BOOL SetTextColor(COLORREF cr)
3100 	{
3101 		ATLASSERT(::IsWindow(m_hWnd));
3102 		return (BOOL)::SendMessage(m_hWnd, LVM_SETTEXTCOLOR, 0, cr);
3103 	}
3104 
GetTextBkColor()3105 	COLORREF GetTextBkColor() const
3106 	{
3107 		ATLASSERT(::IsWindow(m_hWnd));
3108 		return (COLORREF)::SendMessage(m_hWnd, LVM_GETTEXTBKCOLOR, 0, 0L);
3109 	}
3110 
SetTextBkColor(COLORREF cr)3111 	BOOL SetTextBkColor(COLORREF cr)
3112 	{
3113 		ATLASSERT(::IsWindow(m_hWnd));
3114 		return (BOOL)::SendMessage(m_hWnd, LVM_SETTEXTBKCOLOR, 0, cr);
3115 	}
3116 
GetTopIndex()3117 	int GetTopIndex() const
3118 	{
3119 		ATLASSERT(::IsWindow(m_hWnd));
3120 		return (int)::SendMessage(m_hWnd, LVM_GETTOPINDEX, 0, 0L);
3121 	}
3122 
GetCountPerPage()3123 	int GetCountPerPage() const
3124 	{
3125 		ATLASSERT(::IsWindow(m_hWnd));
3126 		return (int)::SendMessage(m_hWnd, LVM_GETCOUNTPERPAGE, 0, 0L);
3127 	}
3128 
GetOrigin(LPPOINT lpPoint)3129 	BOOL GetOrigin(LPPOINT lpPoint) const
3130 	{
3131 		ATLASSERT(::IsWindow(m_hWnd));
3132 		return (BOOL)::SendMessage(m_hWnd, LVM_GETORIGIN, 0, (LPARAM)lpPoint);
3133 	}
3134 
GetSelectedCount()3135 	UINT GetSelectedCount() const
3136 	{
3137 		ATLASSERT(::IsWindow(m_hWnd));
3138 		return (UINT)::SendMessage(m_hWnd, LVM_GETSELECTEDCOUNT, 0, 0L);
3139 	}
3140 
GetItemRect(int nItem,LPRECT lpRect,UINT nCode)3141 	BOOL GetItemRect(int nItem, LPRECT lpRect, UINT nCode) const
3142 	{
3143 		ATLASSERT(::IsWindow(m_hWnd));
3144 		lpRect->left = nCode;
3145 		return (BOOL)::SendMessage(m_hWnd, LVM_GETITEMRECT, (WPARAM)nItem, (LPARAM)lpRect);
3146 	}
3147 
3148 #ifndef _WIN32_WCE
GetHotCursor()3149 	HCURSOR GetHotCursor() const
3150 	{
3151 		ATLASSERT(::IsWindow(m_hWnd));
3152 		return (HCURSOR)::SendMessage(m_hWnd, LVM_GETHOTCURSOR, 0, 0L);
3153 	}
3154 
SetHotCursor(HCURSOR hHotCursor)3155 	HCURSOR SetHotCursor(HCURSOR hHotCursor)
3156 	{
3157 		ATLASSERT(::IsWindow(m_hWnd));
3158 		return (HCURSOR)::SendMessage(m_hWnd, LVM_SETHOTCURSOR, 0, (LPARAM)hHotCursor);
3159 	}
3160 
GetHotItem()3161 	int GetHotItem() const
3162 	{
3163 		ATLASSERT(::IsWindow(m_hWnd));
3164 		return (int)::SendMessage(m_hWnd, LVM_GETHOTITEM, 0, 0L);
3165 	}
3166 
SetHotItem(int nIndex)3167 	int SetHotItem(int nIndex)
3168 	{
3169 		ATLASSERT(::IsWindow(m_hWnd));
3170 		return (int)::SendMessage(m_hWnd, LVM_SETHOTITEM, nIndex, 0L);
3171 	}
3172 #endif // !_WIN32_WCE
3173 
GetColumnOrderArray(int nCount,int * lpnArray)3174 	BOOL GetColumnOrderArray(int nCount, int* lpnArray) const
3175 	{
3176 		ATLASSERT(::IsWindow(m_hWnd));
3177 		return (BOOL)::SendMessage(m_hWnd, LVM_GETCOLUMNORDERARRAY, nCount, (LPARAM)lpnArray);
3178 	}
3179 
SetColumnOrderArray(int nCount,int * lpnArray)3180 	BOOL SetColumnOrderArray(int nCount, int* lpnArray)
3181 	{
3182 		ATLASSERT(::IsWindow(m_hWnd));
3183 		return (BOOL)::SendMessage(m_hWnd, LVM_SETCOLUMNORDERARRAY, nCount, (LPARAM)lpnArray);
3184 	}
3185 
GetHeader()3186 	CHeaderCtrl GetHeader() const
3187 	{
3188 		ATLASSERT(::IsWindow(m_hWnd));
3189 		return CHeaderCtrl((HWND)::SendMessage(m_hWnd, LVM_GETHEADER, 0, 0L));
3190 	}
3191 
GetSubItemRect(int nItem,int nSubItem,int nFlag,LPRECT lpRect)3192 	BOOL GetSubItemRect(int nItem, int nSubItem, int nFlag, LPRECT lpRect) const
3193 	{
3194 		ATLASSERT(::IsWindow(m_hWnd));
3195 		ATLASSERT((GetStyle() & LVS_TYPEMASK) == LVS_REPORT);
3196 		ATLASSERT(lpRect != NULL);
3197 		lpRect->top = nSubItem;
3198 		lpRect->left = nFlag;
3199 		return (BOOL)::SendMessage(m_hWnd, LVM_GETSUBITEMRECT, nItem, (LPARAM)lpRect);
3200 	}
3201 
SetIconSpacing(int cx,int cy)3202 	DWORD SetIconSpacing(int cx, int cy)
3203 	{
3204 		ATLASSERT(::IsWindow(m_hWnd));
3205 		ATLASSERT((GetStyle() & LVS_TYPEMASK) == LVS_ICON);
3206 		return (DWORD)::SendMessage(m_hWnd, LVM_SETICONSPACING, 0, MAKELPARAM(cx, cy));
3207 	}
3208 
GetISearchString(LPTSTR lpstr)3209 	int GetISearchString(LPTSTR lpstr) const
3210 	{
3211 		ATLASSERT(::IsWindow(m_hWnd));
3212 		return (int)::SendMessage(m_hWnd, LVM_GETISEARCHSTRING, 0, (LPARAM)lpstr);
3213 	}
3214 
3215 	void GetItemSpacing(SIZE& sizeSpacing, BOOL bSmallIconView = FALSE) const
3216 	{
3217 		ATLASSERT(::IsWindow(m_hWnd));
3218 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, LVM_GETITEMSPACING, bSmallIconView, 0L);
3219 		sizeSpacing.cx = GET_X_LPARAM(dwRet);
3220 		sizeSpacing.cy = GET_Y_LPARAM(dwRet);
3221 	}
3222 
3223 #if (_WIN32_WCE >= 410)
SetItemSpacing(INT cySpacing)3224 	void SetItemSpacing(INT cySpacing)
3225 	{
3226 		ATLASSERT(::IsWindow(m_hWnd));
3227 		ListView_SetItemSpacing(m_hWnd, cySpacing);
3228 	}
3229 #endif // (_WIN32_WCE >= 410)
3230 
3231 	// single-selection only
GetSelectedIndex()3232 	int GetSelectedIndex() const
3233 	{
3234 		ATLASSERT(::IsWindow(m_hWnd));
3235 		ATLASSERT((GetStyle() & LVS_SINGLESEL) != 0);
3236 		return (int)::SendMessage(m_hWnd, LVM_GETNEXTITEM, (WPARAM)-1, MAKELPARAM(LVNI_ALL | LVNI_SELECTED, 0));
3237 	}
3238 
GetSelectedItem(LPLVITEM pItem)3239 	BOOL GetSelectedItem(LPLVITEM pItem) const
3240 	{
3241 		ATLASSERT(::IsWindow(m_hWnd));
3242 		ATLASSERT((GetStyle() & LVS_SINGLESEL) != 0);
3243 		ATLASSERT(pItem != NULL);
3244 		pItem->iItem = (int)::SendMessage(m_hWnd, LVM_GETNEXTITEM, (WPARAM)-1, MAKELPARAM(LVNI_ALL | LVNI_SELECTED, 0));
3245 		if(pItem->iItem == -1)
3246 			return FALSE;
3247 		return (BOOL)::SendMessage(m_hWnd, LVM_GETITEM, 0, (LPARAM)pItem);
3248 	}
3249 
3250 	// extended list view styles
GetExtendedListViewStyle()3251 	DWORD GetExtendedListViewStyle() const
3252 	{
3253 		ATLASSERT(::IsWindow(m_hWnd));
3254 		return (DWORD)::SendMessage(m_hWnd, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0L);
3255 	}
3256 
3257 	// dwExMask = 0 means all styles
3258 	DWORD SetExtendedListViewStyle(DWORD dwExStyle, DWORD dwExMask = 0)
3259 	{
3260 		ATLASSERT(::IsWindow(m_hWnd));
3261 		return (DWORD)::SendMessage(m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE, dwExMask, dwExStyle);
3262 	}
3263 
3264 	// checkboxes only
GetCheckState(int nIndex)3265 	BOOL GetCheckState(int nIndex) const
3266 	{
3267 		ATLASSERT(::IsWindow(m_hWnd));
3268 		ATLASSERT((GetExtendedListViewStyle() & LVS_EX_CHECKBOXES) != 0);
3269 		UINT uRet = GetItemState(nIndex, LVIS_STATEIMAGEMASK);
3270 		return (uRet >> 12) - 1;
3271 	}
3272 
SetCheckState(int nItem,BOOL bCheck)3273 	BOOL SetCheckState(int nItem, BOOL bCheck)
3274 	{
3275 		int nCheck = bCheck ? 2 : 1;   // one based index
3276 		return SetItemState(nItem, INDEXTOSTATEIMAGEMASK(nCheck), LVIS_STATEIMAGEMASK);
3277 	}
3278 
3279 	// view type
GetViewType()3280 	DWORD GetViewType() const
3281 	{
3282 		ATLASSERT(::IsWindow(m_hWnd));
3283 		return (GetStyle() & LVS_TYPEMASK);
3284 	}
3285 
SetViewType(DWORD dwType)3286 	DWORD SetViewType(DWORD dwType)
3287 	{
3288 		ATLASSERT(::IsWindow(m_hWnd));
3289 		ATLASSERT(dwType == LVS_ICON || dwType == LVS_SMALLICON || dwType == LVS_LIST || dwType == LVS_REPORT);
3290 		DWORD dwOldType = GetViewType();
3291 		if(dwType != dwOldType)
3292 			ModifyStyle(LVS_TYPEMASK, (dwType & LVS_TYPEMASK));
3293 		return dwOldType;
3294 	}
3295 
3296 #if (_WIN32_IE >= 0x0400)
3297 #ifndef _WIN32_WCE
GetBkImage(LPLVBKIMAGE plvbki)3298 	BOOL GetBkImage(LPLVBKIMAGE plvbki) const
3299 	{
3300 		ATLASSERT(::IsWindow(m_hWnd));
3301 		return (BOOL)::SendMessage(m_hWnd, LVM_GETBKIMAGE, 0, (LPARAM)plvbki);
3302 	}
3303 
SetBkImage(LPLVBKIMAGE plvbki)3304 	BOOL SetBkImage(LPLVBKIMAGE plvbki)
3305 	{
3306 		ATLASSERT(::IsWindow(m_hWnd));
3307 		return (BOOL)::SendMessage(m_hWnd, LVM_SETBKIMAGE, 0, (LPARAM)plvbki);
3308 	}
3309 #endif // !_WIN32_WCE
3310 
GetSelectionMark()3311 	int GetSelectionMark() const
3312 	{
3313 		ATLASSERT(::IsWindow(m_hWnd));
3314 		return (int)::SendMessage(m_hWnd, LVM_GETSELECTIONMARK, 0, 0L);
3315 	}
3316 
SetSelectionMark(int nIndex)3317 	int SetSelectionMark(int nIndex)
3318 	{
3319 		ATLASSERT(::IsWindow(m_hWnd));
3320 		return (int)::SendMessage(m_hWnd, LVM_SETSELECTIONMARK, 0, nIndex);
3321 	}
3322 
3323 #ifndef _WIN32_WCE
GetWorkAreas(int nWorkAreas,LPRECT lpRect)3324 	BOOL GetWorkAreas(int nWorkAreas, LPRECT lpRect) const
3325 	{
3326 		ATLASSERT(::IsWindow(m_hWnd));
3327 		return (BOOL)::SendMessage(m_hWnd, LVM_GETWORKAREAS, nWorkAreas, (LPARAM)lpRect);
3328 	}
3329 
SetWorkAreas(int nWorkAreas,LPRECT lpRect)3330 	BOOL SetWorkAreas(int nWorkAreas, LPRECT lpRect)
3331 	{
3332 		ATLASSERT(::IsWindow(m_hWnd));
3333 		return (BOOL)::SendMessage(m_hWnd, LVM_SETWORKAREAS, nWorkAreas, (LPARAM)lpRect);
3334 	}
3335 
GetHoverTime()3336 	DWORD GetHoverTime() const
3337 	{
3338 		ATLASSERT(::IsWindow(m_hWnd));
3339 		ATLASSERT((GetExtendedListViewStyle() & (LVS_EX_TRACKSELECT | LVS_EX_ONECLICKACTIVATE | LVS_EX_TWOCLICKACTIVATE)) != 0);
3340 		return (DWORD)::SendMessage(m_hWnd, LVM_GETHOVERTIME, 0, 0L);
3341 	}
3342 
SetHoverTime(DWORD dwHoverTime)3343 	DWORD SetHoverTime(DWORD dwHoverTime)
3344 	{
3345 		ATLASSERT(::IsWindow(m_hWnd));
3346 		ATLASSERT((GetExtendedListViewStyle() & (LVS_EX_TRACKSELECT | LVS_EX_ONECLICKACTIVATE | LVS_EX_TWOCLICKACTIVATE)) != 0);
3347 		return (DWORD)::SendMessage(m_hWnd, LVM_SETHOVERTIME, 0, dwHoverTime);
3348 	}
3349 
GetNumberOfWorkAreas(int * pnWorkAreas)3350 	BOOL GetNumberOfWorkAreas(int* pnWorkAreas) const
3351 	{
3352 		ATLASSERT(::IsWindow(m_hWnd));
3353 		return (BOOL)::SendMessage(m_hWnd, LVM_GETNUMBEROFWORKAREAS, 0, (LPARAM)pnWorkAreas);
3354 	}
3355 #endif // !_WIN32_WCE
3356 
SetItemCountEx(int nItems,DWORD dwFlags)3357 	BOOL SetItemCountEx(int nItems, DWORD dwFlags)
3358 	{
3359 		ATLASSERT(::IsWindow(m_hWnd));
3360 		ATLASSERT(((GetStyle() & LVS_OWNERDATA) != 0) && (((GetStyle() & LVS_TYPEMASK) == LVS_REPORT) || ((GetStyle() & LVS_TYPEMASK) == LVS_LIST)));
3361 		return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMCOUNT, nItems, dwFlags);
3362 	}
3363 
3364 #ifndef _WIN32_WCE
GetToolTips()3365 	CToolTipCtrl GetToolTips() const
3366 	{
3367 		ATLASSERT(::IsWindow(m_hWnd));
3368 		return CToolTipCtrl((HWND)::SendMessage(m_hWnd, LVM_GETTOOLTIPS, 0, 0L));
3369 	}
3370 
SetToolTips(HWND hWndTT)3371 	CToolTipCtrl SetToolTips(HWND hWndTT)
3372 	{
3373 		ATLASSERT(::IsWindow(m_hWnd));
3374 		return CToolTipCtrl((HWND)::SendMessage(m_hWnd, LVM_SETTOOLTIPS, (WPARAM)hWndTT, 0L));
3375 	}
3376 
GetUnicodeFormat()3377 	BOOL GetUnicodeFormat() const
3378 	{
3379 		ATLASSERT(::IsWindow(m_hWnd));
3380 		return (BOOL)::SendMessage(m_hWnd, LVM_GETUNICODEFORMAT, 0, 0L);
3381 	}
3382 
3383 	BOOL SetUnicodeFormat(BOOL bUnicode = TRUE)
3384 	{
3385 		ATLASSERT(::IsWindow(m_hWnd));
3386 		return (BOOL)::SendMessage(m_hWnd, LVM_SETUNICODEFORMAT, bUnicode, 0L);
3387 	}
3388 #endif // !_WIN32_WCE
3389 #endif // (_WIN32_IE >= 0x0400)
3390 
3391 #if (_WIN32_WINNT >= 0x0501)
GetSelectedColumn()3392 	int GetSelectedColumn() const
3393 	{
3394 		ATLASSERT(::IsWindow(m_hWnd));
3395 		return (int)::SendMessage(m_hWnd, LVM_GETSELECTEDCOLUMN, 0, 0L);
3396 	}
3397 
SetSelectedColumn(int nColumn)3398 	void SetSelectedColumn(int nColumn)
3399 	{
3400 		ATLASSERT(::IsWindow(m_hWnd));
3401 		::SendMessage(m_hWnd, LVM_SETSELECTEDCOLUMN, nColumn, 0L);
3402 	}
3403 
GetView()3404 	DWORD GetView() const
3405 	{
3406 		ATLASSERT(::IsWindow(m_hWnd));
3407 		return (DWORD)::SendMessage(m_hWnd, LVM_GETVIEW, 0, 0L);
3408 	}
3409 
SetView(DWORD dwView)3410 	int SetView(DWORD dwView)
3411 	{
3412 		ATLASSERT(::IsWindow(m_hWnd));
3413 		return (int)::SendMessage(m_hWnd, LVM_SETVIEW, dwView, 0L);
3414 	}
3415 
IsGroupViewEnabled()3416 	BOOL IsGroupViewEnabled() const
3417 	{
3418 		ATLASSERT(::IsWindow(m_hWnd));
3419 		return (BOOL)::SendMessage(m_hWnd, LVM_ISGROUPVIEWENABLED, 0, 0L);
3420 	}
3421 
GetGroupInfo(int nGroupID,PLVGROUP pGroup)3422 	int GetGroupInfo(int nGroupID, PLVGROUP pGroup) const
3423 	{
3424 		ATLASSERT(::IsWindow(m_hWnd));
3425 		return (int)::SendMessage(m_hWnd, LVM_GETGROUPINFO, nGroupID, (LPARAM)pGroup);
3426 	}
3427 
SetGroupInfo(int nGroupID,PLVGROUP pGroup)3428 	int SetGroupInfo(int nGroupID, PLVGROUP pGroup)
3429 	{
3430 		ATLASSERT(::IsWindow(m_hWnd));
3431 		return (int)::SendMessage(m_hWnd, LVM_SETGROUPINFO, nGroupID, (LPARAM)pGroup);
3432 	}
3433 
GetGroupMetrics(PLVGROUPMETRICS pGroupMetrics)3434 	void GetGroupMetrics(PLVGROUPMETRICS pGroupMetrics) const
3435 	{
3436 		ATLASSERT(::IsWindow(m_hWnd));
3437 		::SendMessage(m_hWnd, LVM_GETGROUPMETRICS, 0, (LPARAM)pGroupMetrics);
3438 	}
3439 
SetGroupMetrics(PLVGROUPMETRICS pGroupMetrics)3440 	void SetGroupMetrics(PLVGROUPMETRICS pGroupMetrics)
3441 	{
3442 		ATLASSERT(::IsWindow(m_hWnd));
3443 		::SendMessage(m_hWnd, LVM_SETGROUPMETRICS, 0, (LPARAM)pGroupMetrics);
3444 	}
3445 
GetTileViewInfo(PLVTILEVIEWINFO pTileViewInfo)3446 	void GetTileViewInfo(PLVTILEVIEWINFO pTileViewInfo) const
3447 	{
3448 		ATLASSERT(::IsWindow(m_hWnd));
3449 		::SendMessage(m_hWnd, LVM_GETTILEVIEWINFO, 0, (LPARAM)pTileViewInfo);
3450 	}
3451 
SetTileViewInfo(PLVTILEVIEWINFO pTileViewInfo)3452 	BOOL SetTileViewInfo(PLVTILEVIEWINFO pTileViewInfo)
3453 	{
3454 		ATLASSERT(::IsWindow(m_hWnd));
3455 		return (BOOL)::SendMessage(m_hWnd, LVM_SETTILEVIEWINFO, 0, (LPARAM)pTileViewInfo);
3456 	}
3457 
GetTileInfo(PLVTILEINFO pTileInfo)3458 	void GetTileInfo(PLVTILEINFO pTileInfo) const
3459 	{
3460 		ATLASSERT(::IsWindow(m_hWnd));
3461 		::SendMessage(m_hWnd, LVM_GETTILEINFO, 0, (LPARAM)pTileInfo);
3462 	}
3463 
SetTileInfo(PLVTILEINFO pTileInfo)3464 	BOOL SetTileInfo(PLVTILEINFO pTileInfo)
3465 	{
3466 		ATLASSERT(::IsWindow(m_hWnd));
3467 		return (BOOL)::SendMessage(m_hWnd, LVM_SETTILEINFO, 0, (LPARAM)pTileInfo);
3468 	}
3469 
GetInsertMark(LPLVINSERTMARK pInsertMark)3470 	BOOL GetInsertMark(LPLVINSERTMARK pInsertMark) const
3471 	{
3472 		ATLASSERT(::IsWindow(m_hWnd));
3473 		return (BOOL)::SendMessage(m_hWnd, LVM_GETINSERTMARK, 0, (LPARAM)pInsertMark);
3474 	}
3475 
SetInsertMark(LPLVINSERTMARK pInsertMark)3476 	BOOL SetInsertMark(LPLVINSERTMARK pInsertMark)
3477 	{
3478 		ATLASSERT(::IsWindow(m_hWnd));
3479 		return (BOOL)::SendMessage(m_hWnd, LVM_SETINSERTMARK, 0, (LPARAM)pInsertMark);
3480 	}
3481 
GetInsertMarkRect(LPRECT lpRect)3482 	int GetInsertMarkRect(LPRECT lpRect) const
3483 	{
3484 		ATLASSERT(::IsWindow(m_hWnd));
3485 		return (int)::SendMessage(m_hWnd, LVM_GETINSERTMARKRECT, 0, (LPARAM)lpRect);
3486 	}
3487 
GetInsertMarkColor()3488 	COLORREF GetInsertMarkColor() const
3489 	{
3490 		ATLASSERT(::IsWindow(m_hWnd));
3491 		return (COLORREF)::SendMessage(m_hWnd, LVM_GETINSERTMARKCOLOR, 0, 0L);
3492 	}
3493 
SetInsertMarkColor(COLORREF clr)3494 	COLORREF SetInsertMarkColor(COLORREF clr)
3495 	{
3496 		ATLASSERT(::IsWindow(m_hWnd));
3497 		return (COLORREF)::SendMessage(m_hWnd, LVM_SETINSERTMARKCOLOR, 0, clr);
3498 	}
3499 
GetOutlineColor()3500 	COLORREF GetOutlineColor() const
3501 	{
3502 		ATLASSERT(::IsWindow(m_hWnd));
3503 		return (COLORREF)::SendMessage(m_hWnd, LVM_GETOUTLINECOLOR, 0, 0L);
3504 	}
3505 
SetOutlineColor(COLORREF clr)3506 	COLORREF SetOutlineColor(COLORREF clr)
3507 	{
3508 		ATLASSERT(::IsWindow(m_hWnd));
3509 		return (COLORREF)::SendMessage(m_hWnd, LVM_SETOUTLINECOLOR, 0, clr);
3510 	}
3511 #endif // (_WIN32_WINNT >= 0x0501)
3512 
3513 #if (_WIN32_WINNT >= 0x0600)
GetGroupCount()3514 	int GetGroupCount() const
3515 	{
3516 		ATLASSERT(::IsWindow(m_hWnd));
3517 		return (int)::SendMessage(m_hWnd, LVM_GETGROUPCOUNT, 0, 0L);
3518 	}
3519 
GetGroupInfoByIndex(int nIndex,PLVGROUP pGroup)3520 	BOOL GetGroupInfoByIndex(int nIndex, PLVGROUP pGroup) const
3521 	{
3522 		ATLASSERT(::IsWindow(m_hWnd));
3523 		return (BOOL)::SendMessage(m_hWnd, LVM_GETGROUPINFOBYINDEX, nIndex, (LPARAM)pGroup);
3524 	}
3525 
GetGroupRect(int nGroupID,int nType,LPRECT lpRect)3526 	BOOL GetGroupRect(int nGroupID, int nType, LPRECT lpRect) const
3527 	{
3528 		ATLASSERT(::IsWindow(m_hWnd));
3529 		ATLASSERT(lpRect != NULL);
3530 		if(lpRect != NULL)
3531 			lpRect->top = nType;
3532 		return (BOOL)::SendMessage(m_hWnd, LVM_GETGROUPRECT, nGroupID, (LPARAM)lpRect);
3533 	}
3534 
GetGroupState(int nGroupID,UINT uMask)3535 	UINT GetGroupState(int nGroupID, UINT uMask) const
3536 	{
3537 		ATLASSERT(::IsWindow(m_hWnd));
3538 		return (UINT)::SendMessage(m_hWnd, LVM_GETGROUPSTATE, nGroupID, (LPARAM)uMask);
3539 	}
3540 
GetFocusedGroup()3541 	int GetFocusedGroup() const
3542 	{
3543 		ATLASSERT(::IsWindow(m_hWnd));
3544 		return (int)::SendMessage(m_hWnd, LVM_GETFOCUSEDGROUP, 0, 0L);
3545 	}
3546 
GetEmptyText(LPWSTR lpstrText,int cchText)3547 	BOOL GetEmptyText(LPWSTR lpstrText, int cchText) const
3548 	{
3549 		ATLASSERT(::IsWindow(m_hWnd));
3550 		return (BOOL)::SendMessage(m_hWnd, LVM_GETEMPTYTEXT, cchText, (LPARAM)lpstrText);
3551 	}
3552 
GetFooterRect(LPRECT lpRect)3553 	BOOL GetFooterRect(LPRECT lpRect) const
3554 	{
3555 		ATLASSERT(::IsWindow(m_hWnd));
3556 		return (BOOL)::SendMessage(m_hWnd, LVM_GETFOOTERRECT, 0, (LPARAM)lpRect);
3557 	}
3558 
GetFooterInfo(LPLVFOOTERINFO lpFooterInfo)3559 	BOOL GetFooterInfo(LPLVFOOTERINFO lpFooterInfo) const
3560 	{
3561 		ATLASSERT(::IsWindow(m_hWnd));
3562 		return (BOOL)::SendMessage(m_hWnd, LVM_GETFOOTERINFO, 0, (LPARAM)lpFooterInfo);
3563 	}
3564 
GetFooterItemRect(int nItem,LPRECT lpRect)3565 	BOOL GetFooterItemRect(int nItem, LPRECT lpRect) const
3566 	{
3567 		ATLASSERT(::IsWindow(m_hWnd));
3568 		return (BOOL)::SendMessage(m_hWnd, LVM_GETFOOTERITEMRECT, nItem, (LPARAM)lpRect);
3569 	}
3570 
GetFooterItem(int nItem,LPLVFOOTERITEM lpFooterItem)3571 	BOOL GetFooterItem(int nItem, LPLVFOOTERITEM lpFooterItem) const
3572 	{
3573 		ATLASSERT(::IsWindow(m_hWnd));
3574 		return (BOOL)::SendMessage(m_hWnd, LVM_GETFOOTERITEM, nItem, (LPARAM)lpFooterItem);
3575 	}
3576 
GetItemIndexRect(PLVITEMINDEX pItemIndex,int nSubItem,int nType,LPRECT lpRect)3577 	BOOL GetItemIndexRect(PLVITEMINDEX pItemIndex, int nSubItem, int nType, LPRECT lpRect) const
3578 	{
3579 		ATLASSERT(::IsWindow(m_hWnd));
3580 		ATLASSERT(pItemIndex != NULL);
3581 		ATLASSERT(lpRect != NULL);
3582 		if(lpRect != NULL)
3583 		{
3584 			lpRect->top = nSubItem;
3585 			lpRect->left = nType;
3586 		}
3587 		return (BOOL)::SendMessage(m_hWnd, LVM_GETITEMINDEXRECT, (WPARAM)pItemIndex, (LPARAM)lpRect);
3588 	}
3589 
SetItemIndexState(PLVITEMINDEX pItemIndex,UINT uState,UINT dwMask)3590 	BOOL SetItemIndexState(PLVITEMINDEX pItemIndex, UINT uState, UINT dwMask)
3591 	{
3592 		ATLASSERT(::IsWindow(m_hWnd));
3593 		LVITEM lvi = { 0 };
3594 		lvi.state = uState;
3595 		lvi.stateMask = dwMask;
3596 		return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMINDEXSTATE, (WPARAM)pItemIndex, (LPARAM)&lvi);
3597 	}
3598 
GetNextItemIndex(PLVITEMINDEX pItemIndex,WORD wFlags)3599 	BOOL GetNextItemIndex(PLVITEMINDEX pItemIndex, WORD wFlags) const
3600 	{
3601 		ATLASSERT(::IsWindow(m_hWnd));
3602 		return (BOOL)::SendMessage(m_hWnd, LVM_GETNEXTITEMINDEX, (WPARAM)pItemIndex, MAKELPARAM(wFlags, 0));
3603 	}
3604 #endif // (_WIN32_WINNT >= 0x0600)
3605 
3606 // Operations
InsertColumn(int nCol,const LVCOLUMN * pColumn)3607 	int InsertColumn(int nCol, const LVCOLUMN* pColumn)
3608 	{
3609 		ATLASSERT(::IsWindow(m_hWnd));
3610 		return (int)::SendMessage(m_hWnd, LVM_INSERTCOLUMN, nCol, (LPARAM)pColumn);
3611 	}
3612 
3613 	int InsertColumn(int nCol, LPCTSTR lpszColumnHeading, int nFormat = LVCFMT_LEFT,
3614 			int nWidth = -1, int nSubItem = -1, int iImage = -1, int iOrder = -1)
3615 	{
3616 		LVCOLUMN column = { 0 };
3617 		column.mask = LVCF_TEXT|LVCF_FMT;
3618 		column.pszText = (LPTSTR)lpszColumnHeading;
3619 		column.fmt = nFormat;
3620 		if (nWidth != -1)
3621 		{
3622 			column.mask |= LVCF_WIDTH;
3623 			column.cx = nWidth;
3624 		}
3625 		if (nSubItem != -1)
3626 		{
3627 			column.mask |= LVCF_SUBITEM;
3628 			column.iSubItem = nSubItem;
3629 		}
3630 		if (iImage != -1)
3631 		{
3632 			column.mask |= LVCF_IMAGE;
3633 			column.iImage = iImage;
3634 		}
3635 		if (iOrder != -1)
3636 		{
3637 			column.mask |= LVCF_ORDER;
3638 			column.iOrder = iOrder;
3639 		}
3640 		return InsertColumn(nCol, &column);
3641 	}
3642 
DeleteColumn(int nCol)3643 	BOOL DeleteColumn(int nCol)
3644 	{
3645 		ATLASSERT(::IsWindow(m_hWnd));
3646 		return (BOOL)::SendMessage(m_hWnd, LVM_DELETECOLUMN, nCol, 0L);
3647 	}
3648 
InsertItem(UINT nMask,int nItem,LPCTSTR lpszItem,UINT nState,UINT nStateMask,int nImage,LPARAM lParam)3649 	int InsertItem(UINT nMask, int nItem, LPCTSTR lpszItem, UINT nState, UINT nStateMask, int nImage, LPARAM lParam)
3650 	{
3651 		ATLASSERT(::IsWindow(m_hWnd));
3652 		LVITEM item = { 0 };
3653 		item.mask = nMask;
3654 		item.iItem = nItem;
3655 		item.iSubItem = 0;
3656 		item.pszText = (LPTSTR)lpszItem;
3657 		item.state = nState;
3658 		item.stateMask = nStateMask;
3659 		item.iImage = nImage;
3660 		item.lParam = lParam;
3661 		return InsertItem(&item);
3662 	}
3663 
InsertItem(const LVITEM * pItem)3664 	int InsertItem(const LVITEM* pItem)
3665 	{
3666 		ATLASSERT(::IsWindow(m_hWnd));
3667 		return (int)::SendMessage(m_hWnd, LVM_INSERTITEM, 0, (LPARAM)pItem);
3668 	}
3669 
InsertItem(int nItem,LPCTSTR lpszItem)3670 	int InsertItem(int nItem, LPCTSTR lpszItem)
3671 	{
3672 		ATLASSERT(::IsWindow(m_hWnd));
3673 		return InsertItem(LVIF_TEXT, nItem, lpszItem, 0, 0, 0, 0);
3674 	}
3675 
InsertItem(int nItem,LPCTSTR lpszItem,int nImage)3676 	int InsertItem(int nItem, LPCTSTR lpszItem, int nImage)
3677 	{
3678 		ATLASSERT(::IsWindow(m_hWnd));
3679 		return InsertItem(LVIF_TEXT|LVIF_IMAGE, nItem, lpszItem, 0, 0, nImage, 0);
3680 	}
3681 
GetNextItem(int nItem,int nFlags)3682 	int GetNextItem(int nItem, int nFlags) const
3683 	{
3684 		ATLASSERT(::IsWindow(m_hWnd));
3685 		return (int)::SendMessage(m_hWnd, LVM_GETNEXTITEM, nItem, MAKELPARAM(nFlags, 0));
3686 	}
3687 
DeleteItem(int nItem)3688 	BOOL DeleteItem(int nItem)
3689 	{
3690 		ATLASSERT(::IsWindow(m_hWnd));
3691 		return (BOOL)::SendMessage(m_hWnd, LVM_DELETEITEM, nItem, 0L);
3692 	}
3693 
DeleteAllItems()3694 	BOOL DeleteAllItems()
3695 	{
3696 		ATLASSERT(::IsWindow(m_hWnd));
3697 		return (BOOL)::SendMessage(m_hWnd, LVM_DELETEALLITEMS, 0, 0L);
3698 	}
3699 
3700 	int FindItem(LVFINDINFO* pFindInfo, int nStart = -1) const
3701 	{
3702 		ATLASSERT(::IsWindow(m_hWnd));
3703 		return (int)::SendMessage(m_hWnd, LVM_FINDITEM, nStart, (LPARAM)pFindInfo);
3704 	}
3705 
3706 	int FindItem(LPCTSTR lpstrFind, bool bPartial = true, bool bWrap = false, int nStart = -1) const
3707 	{
3708 		ATLASSERT(::IsWindow(m_hWnd));
3709 		LVFINDINFO lvfi = { 0 };
3710 		lvfi.flags = LVFI_STRING | (bWrap ? LVFI_WRAP : 0) | (bPartial ? LVFI_PARTIAL : 0);
3711 		lvfi.psz = lpstrFind;
3712 		return (int)::SendMessage(m_hWnd, LVM_FINDITEM, nStart, (LPARAM)&lvfi);
3713 	}
3714 
HitTest(LVHITTESTINFO * pHitTestInfo)3715 	int HitTest(LVHITTESTINFO* pHitTestInfo) const
3716 	{
3717 		ATLASSERT(::IsWindow(m_hWnd));
3718 		return (int)::SendMessage(m_hWnd, LVM_HITTEST, 0, (LPARAM)pHitTestInfo);
3719 	}
3720 
HitTest(POINT pt,UINT * pFlags)3721 	int HitTest(POINT pt, UINT* pFlags) const
3722 	{
3723 		ATLASSERT(::IsWindow(m_hWnd));
3724 		LVHITTESTINFO hti = { 0 };
3725 		hti.pt = pt;
3726 		int nRes = (int)::SendMessage(m_hWnd, LVM_HITTEST, 0, (LPARAM)&hti);
3727 		if (pFlags != NULL)
3728 			*pFlags = hti.flags;
3729 		return nRes;
3730 	}
3731 
EnsureVisible(int nItem,BOOL bPartialOK)3732 	BOOL EnsureVisible(int nItem, BOOL bPartialOK)
3733 	{
3734 		ATLASSERT(::IsWindow(m_hWnd));
3735 		return (BOOL)::SendMessage(m_hWnd, LVM_ENSUREVISIBLE, nItem, MAKELPARAM(bPartialOK, 0));
3736 	}
3737 
Scroll(SIZE size)3738 	BOOL Scroll(SIZE size)
3739 	{
3740 		ATLASSERT(::IsWindow(m_hWnd));
3741 		return (BOOL)::SendMessage(m_hWnd, LVM_SCROLL, size.cx, size.cy);
3742 	}
3743 
RedrawItems(int nFirst,int nLast)3744 	BOOL RedrawItems(int nFirst, int nLast)
3745 	{
3746 		ATLASSERT(::IsWindow(m_hWnd));
3747 		return (BOOL)::SendMessage(m_hWnd, LVM_REDRAWITEMS, nFirst, nLast);
3748 	}
3749 
Arrange(UINT nCode)3750 	BOOL Arrange(UINT nCode)
3751 	{
3752 		ATLASSERT(::IsWindow(m_hWnd));
3753 		return (BOOL)::SendMessage(m_hWnd, LVM_ARRANGE, nCode, 0L);
3754 	}
3755 
EditLabel(int nItem)3756 	CEdit EditLabel(int nItem)
3757 	{
3758 		ATLASSERT(::IsWindow(m_hWnd));
3759 		return CEdit((HWND)::SendMessage(m_hWnd, LVM_EDITLABEL, nItem, 0L));
3760 	}
3761 
Update(int nItem)3762 	BOOL Update(int nItem)
3763 	{
3764 		ATLASSERT(::IsWindow(m_hWnd));
3765 		return (BOOL)::SendMessage(m_hWnd, LVM_UPDATE, nItem, 0L);
3766 	}
3767 
SortItems(PFNLVCOMPARE pfnCompare,LPARAM lParamSort)3768 	BOOL SortItems(PFNLVCOMPARE pfnCompare, LPARAM lParamSort)
3769 	{
3770 		ATLASSERT(::IsWindow(m_hWnd));
3771 		return (BOOL)::SendMessage(m_hWnd, LVM_SORTITEMS, (WPARAM)lParamSort, (LPARAM)pfnCompare);
3772 	}
3773 
RemoveImageList(int nImageList)3774 	CImageList RemoveImageList(int nImageList)
3775 	{
3776 		ATLASSERT(::IsWindow(m_hWnd));
3777 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, LVM_SETIMAGELIST, (WPARAM)nImageList, NULL));
3778 	}
3779 
CreateDragImage(int nItem,LPPOINT lpPoint)3780 	CImageList CreateDragImage(int nItem, LPPOINT lpPoint)
3781 	{
3782 		ATLASSERT(::IsWindow(m_hWnd));
3783 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, LVM_CREATEDRAGIMAGE, nItem, (LPARAM)lpPoint));
3784 	}
3785 
3786 	DWORD ApproximateViewRect(int cx = -1, int cy = -1, int nCount = -1)
3787 	{
3788 		ATLASSERT(::IsWindow(m_hWnd));
3789 		return (DWORD)::SendMessage(m_hWnd, LVM_APPROXIMATEVIEWRECT, nCount, MAKELPARAM(cx, cy));
3790 	}
3791 
SubItemHitTest(LPLVHITTESTINFO lpInfo)3792 	int SubItemHitTest(LPLVHITTESTINFO lpInfo) const
3793 	{
3794 		ATLASSERT(::IsWindow(m_hWnd));
3795 		return (int)::SendMessage(m_hWnd, LVM_SUBITEMHITTEST, 0, (LPARAM)lpInfo);
3796 	}
3797 
3798 	int AddColumn(LPCTSTR strItem, int nItem, int nSubItem = -1,
3799 			int nMask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM,
3800 			int nFmt = LVCFMT_LEFT)
3801 	{
3802 		const int cxOffset = 15;
3803 		ATLASSERT(::IsWindow(m_hWnd));
3804 		LVCOLUMN lvc = { 0 };
3805 		lvc.mask = nMask;
3806 		lvc.fmt = nFmt;
3807 		lvc.pszText = (LPTSTR)strItem;
3808 		lvc.cx = GetStringWidth(lvc.pszText) + cxOffset;
3809 		if(nMask & LVCF_SUBITEM)
3810 			lvc.iSubItem = (nSubItem != -1) ? nSubItem : nItem;
3811 		return InsertColumn(nItem, &lvc);
3812 	}
3813 
3814 	int AddItem(int nItem, int nSubItem, LPCTSTR strItem, int nImageIndex = -3)
3815 	{
3816 		ATLASSERT(::IsWindow(m_hWnd));
3817 		LVITEM lvItem = { 0 };
3818 		lvItem.mask = LVIF_TEXT;
3819 		lvItem.iItem = nItem;
3820 		lvItem.iSubItem = nSubItem;
3821 		lvItem.pszText = (LPTSTR)strItem;
3822 		if(nImageIndex != -3)
3823 		{
3824 			lvItem.mask |= LVIF_IMAGE;
3825 			lvItem.iImage = nImageIndex;
3826 		}
3827 		if(nSubItem == 0)
3828 			return InsertItem(&lvItem);
3829 		return SetItem(&lvItem) ? nItem : -1;
3830 	}
3831 
3832 #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
SortItemsEx(PFNLVCOMPARE pfnCompare,LPARAM lParamSort)3833 	BOOL SortItemsEx(PFNLVCOMPARE pfnCompare, LPARAM lParamSort)
3834 	{
3835 		ATLASSERT(::IsWindow(m_hWnd));
3836 		return (BOOL)::SendMessage(m_hWnd, LVM_SORTITEMSEX, (WPARAM)lParamSort, (LPARAM)pfnCompare);
3837 	}
3838 #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
3839 
3840 #if (_WIN32_WINNT >= 0x0501)
InsertGroup(int nItem,PLVGROUP pGroup)3841 	int InsertGroup(int nItem, PLVGROUP pGroup)
3842 	{
3843 		ATLASSERT(::IsWindow(m_hWnd));
3844 		return (int)::SendMessage(m_hWnd, LVM_INSERTGROUP, nItem, (LPARAM)pGroup);
3845 	}
3846 
AddGroup(PLVGROUP pGroup)3847 	int AddGroup(PLVGROUP pGroup)
3848 	{
3849 		return InsertGroup(-1, pGroup);
3850 	}
3851 
RemoveGroup(int nGroupID)3852 	int RemoveGroup(int nGroupID)
3853 	{
3854 		ATLASSERT(::IsWindow(m_hWnd));
3855 		return (int)::SendMessage(m_hWnd, LVM_REMOVEGROUP, nGroupID, 0L);
3856 	}
3857 
MoveGroup(int nGroupID,int nItem)3858 	void MoveGroup(int nGroupID, int nItem)
3859 	{
3860 		ATLASSERT(::IsWindow(m_hWnd));
3861 		::SendMessage(m_hWnd, LVM_MOVEGROUP, nGroupID, nItem);
3862 	}
3863 
MoveItemToGroup(int nItem,int nGroupID)3864 	void MoveItemToGroup(int nItem, int nGroupID)
3865 	{
3866 		ATLASSERT(::IsWindow(m_hWnd));
3867 		::SendMessage(m_hWnd, LVM_MOVEITEMTOGROUP, nItem, nGroupID);
3868 	}
3869 
EnableGroupView(BOOL bEnable)3870 	int EnableGroupView(BOOL bEnable)
3871 	{
3872 		ATLASSERT(::IsWindow(m_hWnd));
3873 		return (int)::SendMessage(m_hWnd, LVM_ENABLEGROUPVIEW, bEnable, 0L);
3874 	}
3875 
3876 	int SortGroups(PFNLVGROUPCOMPARE pCompareFunc, LPVOID lpVoid = NULL)
3877 	{
3878 		ATLASSERT(::IsWindow(m_hWnd));
3879 		return (int)::SendMessage(m_hWnd, LVM_SORTGROUPS, (WPARAM)pCompareFunc, (LPARAM)lpVoid);
3880 	}
3881 
InsertGroupSorted(PLVINSERTGROUPSORTED pInsertGroupSorted)3882 	void InsertGroupSorted(PLVINSERTGROUPSORTED pInsertGroupSorted)
3883 	{
3884 		ATLASSERT(::IsWindow(m_hWnd));
3885 		::SendMessage(m_hWnd, LVM_INSERTGROUPSORTED, (WPARAM)pInsertGroupSorted, 0L);
3886 	}
3887 
RemoveAllGroups()3888 	void RemoveAllGroups()
3889 	{
3890 		ATLASSERT(::IsWindow(m_hWnd));
3891 		::SendMessage(m_hWnd, LVM_REMOVEALLGROUPS, 0, 0L);
3892 	}
3893 
HasGroup(int nGroupID)3894 	BOOL HasGroup(int nGroupID)
3895 	{
3896 		ATLASSERT(::IsWindow(m_hWnd));
3897 		return (BOOL)::SendMessage(m_hWnd, LVM_HASGROUP, nGroupID, 0L);
3898 	}
3899 
InsertMarkHitTest(LPPOINT lpPoint,LPLVINSERTMARK pInsertMark)3900 	BOOL InsertMarkHitTest(LPPOINT lpPoint, LPLVINSERTMARK pInsertMark) const
3901 	{
3902 		ATLASSERT(::IsWindow(m_hWnd));
3903 		return (BOOL)::SendMessage(m_hWnd, LVM_INSERTMARKHITTEST, (WPARAM)lpPoint, (LPARAM)pInsertMark);
3904 	}
3905 
SetInfoTip(PLVSETINFOTIP pSetInfoTip)3906 	BOOL SetInfoTip(PLVSETINFOTIP pSetInfoTip)
3907 	{
3908 		ATLASSERT(::IsWindow(m_hWnd));
3909 		return (BOOL)::SendMessage(m_hWnd, LVM_SETINFOTIP, 0, (LPARAM)pSetInfoTip);
3910 	}
3911 
CancelEditLabel()3912 	void CancelEditLabel()
3913 	{
3914 		ATLASSERT(::IsWindow(m_hWnd));
3915 		::SendMessage(m_hWnd, LVM_CANCELEDITLABEL, 0, 0L);
3916 	}
3917 
MapIndexToID(int nIndex)3918 	UINT MapIndexToID(int nIndex) const
3919 	{
3920 		ATLASSERT(::IsWindow(m_hWnd));
3921 		return (UINT)::SendMessage(m_hWnd, LVM_MAPINDEXTOID, nIndex, 0L);
3922 	}
3923 
MapIDToIndex(UINT uID)3924 	int MapIDToIndex(UINT uID) const
3925 	{
3926 		ATLASSERT(::IsWindow(m_hWnd));
3927 		return (int)::SendMessage(m_hWnd, LVM_MAPIDTOINDEX, uID, 0L);
3928 	}
3929 #endif // (_WIN32_WINNT >= 0x0501)
3930 
3931 #if (_WIN32_WINNT >= 0x0600)
HitTestEx(LPLVHITTESTINFO lpHitTestInfo)3932 	int HitTestEx(LPLVHITTESTINFO lpHitTestInfo) const
3933 	{
3934 		ATLASSERT(::IsWindow(m_hWnd));
3935 		return (int)::SendMessage(m_hWnd, LVM_HITTEST, (WPARAM)-1, (LPARAM)lpHitTestInfo);
3936 	}
3937 
HitTestEx(POINT pt,UINT * pFlags)3938 	int HitTestEx(POINT pt, UINT* pFlags) const
3939 	{
3940 		ATLASSERT(::IsWindow(m_hWnd));
3941 		LVHITTESTINFO hti = { 0 };
3942 		hti.pt = pt;
3943 		int nRes = (int)::SendMessage(m_hWnd, LVM_HITTEST, (WPARAM)-1, (LPARAM)&hti);
3944 		if (pFlags != NULL)
3945 			*pFlags = hti.flags;
3946 		return nRes;
3947 	}
3948 
SubItemHitTestEx(LPLVHITTESTINFO lpHitTestInfo)3949 	int SubItemHitTestEx(LPLVHITTESTINFO lpHitTestInfo) const
3950 	{
3951 		ATLASSERT(::IsWindow(m_hWnd));
3952 		return (int)::SendMessage(m_hWnd, LVM_SUBITEMHITTEST, (WPARAM)-1, (LPARAM)lpHitTestInfo);
3953 	}
3954 #endif // (_WIN32_WINNT >= 0x0600)
3955 
3956 	// Note: selects only one item
SelectItem(int nIndex)3957 	BOOL SelectItem(int nIndex)
3958 	{
3959 		ATLASSERT(::IsWindow(m_hWnd));
3960 
3961 		// multi-selection only: de-select all items
3962 		if((GetStyle() & LVS_SINGLESEL) == 0)
3963 			SetItemState(-1, 0, LVIS_SELECTED);
3964 
3965 		BOOL bRet = SetItemState(nIndex, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
3966 		if(bRet)
3967 			bRet = EnsureVisible(nIndex, FALSE);
3968 
3969 		return bRet;
3970 	}
3971 };
3972 
3973 typedef CListViewCtrlT<ATL::CWindow>   CListViewCtrl;
3974 
3975 
3976 ///////////////////////////////////////////////////////////////////////////////
3977 // CTreeViewCtrl
3978 
3979 template <class TBase>
3980 class CTreeViewCtrlT : public TBase
3981 {
3982 public:
3983 // Constructors
TBase(hWnd)3984 	CTreeViewCtrlT(HWND hWnd = NULL) : TBase(hWnd)
3985 	{ }
3986 
3987 	CTreeViewCtrlT< TBase >& operator =(HWND hWnd)
3988 	{
3989 		m_hWnd = hWnd;
3990 		return *this;
3991 	}
3992 
3993 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
3994 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
3995 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
3996 	{
3997 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
3998 	}
3999 
4000 // Attributes
GetWndClassName()4001 	static LPCTSTR GetWndClassName()
4002 	{
4003 		return WC_TREEVIEW;
4004 	}
4005 
GetCount()4006 	UINT GetCount() const
4007 	{
4008 		ATLASSERT(::IsWindow(m_hWnd));
4009 		return (UINT)::SendMessage(m_hWnd, TVM_GETCOUNT, 0, 0L);
4010 	}
4011 
GetIndent()4012 	UINT GetIndent() const
4013 	{
4014 		ATLASSERT(::IsWindow(m_hWnd));
4015 		return (UINT)::SendMessage(m_hWnd, TVM_GETINDENT, 0, 0L);
4016 	}
4017 
SetIndent(UINT nIndent)4018 	void SetIndent(UINT nIndent)
4019 	{
4020 		ATLASSERT(::IsWindow(m_hWnd));
4021 		::SendMessage(m_hWnd, TVM_SETINDENT, nIndent, 0L);
4022 	}
4023 
4024 	CImageList GetImageList(int nImageListType = TVSIL_NORMAL) const
4025 	{
4026 		ATLASSERT(::IsWindow(m_hWnd));
4027 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TVM_GETIMAGELIST, (WPARAM)nImageListType, 0L));
4028 	}
4029 
4030 	CImageList SetImageList(HIMAGELIST hImageList, int nImageListType = TVSIL_NORMAL)
4031 	{
4032 		ATLASSERT(::IsWindow(m_hWnd));
4033 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TVM_SETIMAGELIST, (WPARAM)nImageListType, (LPARAM)hImageList));
4034 	}
4035 
GetItem(LPTVITEM pItem)4036 	BOOL GetItem(LPTVITEM pItem) const
4037 	{
4038 		ATLASSERT(::IsWindow(m_hWnd));
4039 		return (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)pItem);
4040 	}
4041 
SetItem(LPTVITEM pItem)4042 	BOOL SetItem(LPTVITEM pItem)
4043 	{
4044 		ATLASSERT(::IsWindow(m_hWnd));
4045 		return (BOOL)::SendMessage(m_hWnd, TVM_SETITEM, 0, (LPARAM)pItem);
4046 	}
4047 
SetItem(HTREEITEM hItem,UINT nMask,LPCTSTR lpszItem,int nImage,int nSelectedImage,UINT nState,UINT nStateMask,LPARAM lParam)4048 	BOOL SetItem(HTREEITEM hItem, UINT nMask, LPCTSTR lpszItem, int nImage,
4049 		int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam)
4050 	{
4051 		ATLASSERT(::IsWindow(m_hWnd));
4052 		TVITEM item = { 0 };
4053 		item.hItem = hItem;
4054 		item.mask = nMask;
4055 		item.pszText = (LPTSTR) lpszItem;
4056 		item.iImage = nImage;
4057 		item.iSelectedImage = nSelectedImage;
4058 		item.state = nState;
4059 		item.stateMask = nStateMask;
4060 		item.lParam = lParam;
4061 		return (BOOL)::SendMessage(m_hWnd, TVM_SETITEM, 0, (LPARAM)&item);
4062 	}
4063 
GetItemText(HTREEITEM hItem,LPTSTR lpstrText,int nLen)4064 	BOOL GetItemText(HTREEITEM hItem, LPTSTR lpstrText, int nLen) const
4065 	{
4066 		ATLASSERT(::IsWindow(m_hWnd));
4067 		ATLASSERT(lpstrText != NULL);
4068 
4069 		TVITEM item = { 0 };
4070 		item.hItem = hItem;
4071 		item.mask = TVIF_TEXT;
4072 		item.pszText = lpstrText;
4073 		item.cchTextMax = nLen;
4074 
4075 		return (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item);
4076 	}
4077 
4078 #ifndef _ATL_NO_COM
GetItemText(HTREEITEM hItem,BSTR & bstrText)4079 	BOOL GetItemText(HTREEITEM hItem, BSTR& bstrText) const
4080 	{
4081 		USES_CONVERSION;
4082 		ATLASSERT(::IsWindow(m_hWnd));
4083 		ATLASSERT(bstrText == NULL);
4084 		TVITEM item = { 0 };
4085 		item.hItem = hItem;
4086 		item.mask = TVIF_TEXT;
4087 
4088 		LPTSTR lpstrText = NULL;
4089 		BOOL bRet = FALSE;
4090 		for(int nLen = 256; ; nLen *= 2)
4091 		{
4092 			ATLTRY(lpstrText = new TCHAR[nLen]);
4093 			if(lpstrText == NULL)
4094 				break;
4095 			lpstrText[0] = NULL;
4096 			item.pszText = lpstrText;
4097 			item.cchTextMax = nLen;
4098 			bRet = (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item);
4099 			if(!bRet || (lstrlen(item.pszText) < nLen - 1))
4100 				break;
4101 			delete [] lpstrText;
4102 			lpstrText = NULL;
4103 		}
4104 
4105 		if(lpstrText != NULL)
4106 		{
4107 			if(bRet)
4108 				bstrText = ::SysAllocString(T2OLE(lpstrText));
4109 			delete [] lpstrText;
4110 		}
4111 
4112 		return (bstrText != NULL) ? TRUE : FALSE;
4113 	}
4114 #endif // !_ATL_NO_COM
4115 
4116 #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
GetItemText(HTREEITEM hItem,_CSTRING_NS::CString & strText)4117 	BOOL GetItemText(HTREEITEM hItem, _CSTRING_NS::CString& strText) const
4118 	{
4119 		ATLASSERT(::IsWindow(m_hWnd));
4120 		TVITEM item = { 0 };
4121 		item.hItem = hItem;
4122 		item.mask = TVIF_TEXT;
4123 
4124 		strText.Empty();
4125 		BOOL bRet = FALSE;
4126 		for(int nLen = 256; ; nLen *= 2)
4127 		{
4128 			item.pszText = strText.GetBufferSetLength(nLen);
4129 			if(item.pszText == NULL)
4130 			{
4131 				bRet = FALSE;
4132 				break;
4133 			}
4134 			item.cchTextMax = nLen;
4135 			bRet = (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item);
4136 			if(!bRet || (lstrlen(item.pszText) < nLen - 1))
4137 				break;
4138 		}
4139 		strText.ReleaseBuffer();
4140 		return bRet;
4141 	}
4142 #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
4143 
SetItemText(HTREEITEM hItem,LPCTSTR lpszItem)4144 	BOOL SetItemText(HTREEITEM hItem, LPCTSTR lpszItem)
4145 	{
4146 		ATLASSERT(::IsWindow(m_hWnd));
4147 		return SetItem(hItem, TVIF_TEXT, lpszItem, 0, 0, 0, 0, NULL);
4148 	}
4149 
GetItemImage(HTREEITEM hItem,int & nImage,int & nSelectedImage)4150 	BOOL GetItemImage(HTREEITEM hItem, int& nImage, int& nSelectedImage) const
4151 	{
4152 		ATLASSERT(::IsWindow(m_hWnd));
4153 		TVITEM item = { 0 };
4154 		item.hItem = hItem;
4155 		item.mask = TVIF_IMAGE|TVIF_SELECTEDIMAGE;
4156 		BOOL bRes = (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item);
4157 		if (bRes)
4158 		{
4159 			nImage = item.iImage;
4160 			nSelectedImage = item.iSelectedImage;
4161 		}
4162 		return bRes;
4163 	}
4164 
SetItemImage(HTREEITEM hItem,int nImage,int nSelectedImage)4165 	BOOL SetItemImage(HTREEITEM hItem, int nImage, int nSelectedImage)
4166 	{
4167 		ATLASSERT(::IsWindow(m_hWnd));
4168 		return SetItem(hItem, TVIF_IMAGE|TVIF_SELECTEDIMAGE, NULL, nImage, nSelectedImage, 0, 0, NULL);
4169 	}
4170 
GetItemState(HTREEITEM hItem,UINT nStateMask)4171 	UINT GetItemState(HTREEITEM hItem, UINT nStateMask) const
4172 	{
4173 		ATLASSERT(::IsWindow(m_hWnd));
4174 #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
4175 		return (((UINT)::SendMessage(m_hWnd, TVM_GETITEMSTATE, (WPARAM)hItem, (LPARAM)nStateMask)) & nStateMask);
4176 #else // !((_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE))
4177 		TVITEM item = { 0 };
4178 		item.hItem = hItem;
4179 		item.mask = TVIF_STATE;
4180 		item.state = 0;
4181 		item.stateMask = nStateMask;
4182 		::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item);
4183 		return (item.state & nStateMask);
4184 #endif // !((_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE))
4185 	}
4186 
SetItemState(HTREEITEM hItem,UINT nState,UINT nStateMask)4187 	BOOL SetItemState(HTREEITEM hItem, UINT nState, UINT nStateMask)
4188 	{
4189 		ATLASSERT(::IsWindow(m_hWnd));
4190 		return SetItem(hItem, TVIF_STATE, NULL, 0, 0, nState, nStateMask, NULL);
4191 	}
4192 
GetItemData(HTREEITEM hItem)4193 	DWORD_PTR GetItemData(HTREEITEM hItem) const
4194 	{
4195 		ATLASSERT(::IsWindow(m_hWnd));
4196 		TVITEM item = { 0 };
4197 		item.hItem = hItem;
4198 		item.mask = TVIF_PARAM;
4199 		BOOL bRet = (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item);
4200 		return (DWORD_PTR)(bRet ? item.lParam : NULL);
4201 	}
4202 
SetItemData(HTREEITEM hItem,DWORD_PTR dwData)4203 	BOOL SetItemData(HTREEITEM hItem, DWORD_PTR dwData)
4204 	{
4205 		ATLASSERT(::IsWindow(m_hWnd));
4206 		return SetItem(hItem, TVIF_PARAM, NULL, 0, 0, 0, 0, (LPARAM)dwData);
4207 	}
4208 
GetEditControl()4209 	CEdit GetEditControl() const
4210 	{
4211 		ATLASSERT(::IsWindow(m_hWnd));
4212 		return CEdit((HWND)::SendMessage(m_hWnd, TVM_GETEDITCONTROL, 0, 0L));
4213 	}
4214 
GetVisibleCount()4215 	UINT GetVisibleCount() const
4216 	{
4217 		ATLASSERT(::IsWindow(m_hWnd));
4218 		return (UINT)::SendMessage(m_hWnd, TVM_GETVISIBLECOUNT, 0, 0L);
4219 	}
4220 
GetItemRect(HTREEITEM hItem,LPRECT lpRect,BOOL bTextOnly)4221 	BOOL GetItemRect(HTREEITEM hItem, LPRECT lpRect, BOOL bTextOnly) const
4222 	{
4223 		ATLASSERT(::IsWindow(m_hWnd));
4224 		*(HTREEITEM*)lpRect = hItem;
4225 		return (BOOL)::SendMessage(m_hWnd, TVM_GETITEMRECT, (WPARAM)bTextOnly, (LPARAM)lpRect);
4226 	}
4227 
ItemHasChildren(HTREEITEM hItem)4228 	BOOL ItemHasChildren(HTREEITEM hItem) const
4229 	{
4230 		ATLASSERT(::IsWindow(m_hWnd));
4231 		TVITEM item = { 0 };
4232 		item.hItem = hItem;
4233 		item.mask = TVIF_CHILDREN;
4234 		::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item);
4235 		return item.cChildren;
4236 	}
4237 
4238 #ifndef _WIN32_WCE
GetToolTips()4239 	CToolTipCtrl GetToolTips() const
4240 	{
4241 		ATLASSERT(::IsWindow(m_hWnd));
4242 		return CToolTipCtrl((HWND)::SendMessage(m_hWnd, TVM_GETTOOLTIPS, 0, 0L));
4243 	}
4244 
SetToolTips(HWND hWndTT)4245 	CToolTipCtrl SetToolTips(HWND hWndTT)
4246 	{
4247 		ATLASSERT(::IsWindow(m_hWnd));
4248 		return CToolTipCtrl((HWND)::SendMessage(m_hWnd, TVM_SETTOOLTIPS, (WPARAM)hWndTT, 0L));
4249 	}
4250 #endif // !_WIN32_WCE
4251 
GetISearchString(LPTSTR lpstr)4252 	int GetISearchString(LPTSTR lpstr) const
4253 	{
4254 		ATLASSERT(::IsWindow(m_hWnd));
4255 		return (int)::SendMessage(m_hWnd, TVM_GETISEARCHSTRING, 0, (LPARAM)lpstr);
4256 	}
4257 
4258 	// checkboxes only
GetCheckState(HTREEITEM hItem)4259 	BOOL GetCheckState(HTREEITEM hItem) const
4260 	{
4261 		ATLASSERT(::IsWindow(m_hWnd));
4262 		ATLASSERT((GetStyle() & TVS_CHECKBOXES) != 0);
4263 		UINT uRet = GetItemState(hItem, TVIS_STATEIMAGEMASK);
4264 		return (uRet >> 12) - 1;
4265 	}
4266 
SetCheckState(HTREEITEM hItem,BOOL bCheck)4267 	BOOL SetCheckState(HTREEITEM hItem, BOOL bCheck)
4268 	{
4269 		int nCheck = bCheck ? 2 : 1;   // one based index
4270 		return SetItemState(hItem, INDEXTOSTATEIMAGEMASK(nCheck), TVIS_STATEIMAGEMASK);
4271 	}
4272 
4273 #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
GetBkColor()4274 	COLORREF GetBkColor() const
4275 	{
4276 		ATLASSERT(::IsWindow(m_hWnd));
4277 		return (COLORREF)::SendMessage(m_hWnd, TVM_GETBKCOLOR, 0, 0L);
4278 	}
4279 
SetBkColor(COLORREF clr)4280 	COLORREF SetBkColor(COLORREF clr)
4281 	{
4282 		ATLASSERT(::IsWindow(m_hWnd));
4283 		return (COLORREF)::SendMessage(m_hWnd, TVM_SETBKCOLOR, 0, (LPARAM)clr);
4284 	}
4285 
GetInsertMarkColor()4286 	COLORREF GetInsertMarkColor() const
4287 	{
4288 		ATLASSERT(::IsWindow(m_hWnd));
4289 		return (COLORREF)::SendMessage(m_hWnd, TVM_GETINSERTMARKCOLOR, 0, 0L);
4290 	}
4291 
SetInsertMarkColor(COLORREF clr)4292 	COLORREF SetInsertMarkColor(COLORREF clr)
4293 	{
4294 		ATLASSERT(::IsWindow(m_hWnd));
4295 		return (COLORREF)::SendMessage(m_hWnd, TVM_SETINSERTMARKCOLOR, 0, (LPARAM)clr);
4296 	}
4297 
GetItemHeight()4298 	int GetItemHeight() const
4299 	{
4300 		ATLASSERT(::IsWindow(m_hWnd));
4301 		return (int)::SendMessage(m_hWnd, TVM_GETITEMHEIGHT, 0, 0L);
4302 	}
4303 
SetItemHeight(int cyHeight)4304 	int SetItemHeight(int cyHeight)
4305 	{
4306 		ATLASSERT(::IsWindow(m_hWnd));
4307 		return (int)::SendMessage(m_hWnd, TVM_SETITEMHEIGHT, cyHeight, 0L);
4308 	}
4309 
GetScrollTime()4310 	int GetScrollTime() const
4311 	{
4312 		ATLASSERT(::IsWindow(m_hWnd));
4313 		return (int)::SendMessage(m_hWnd, TVM_GETSCROLLTIME, 0, 0L);
4314 	}
4315 
SetScrollTime(int nScrollTime)4316 	int SetScrollTime(int nScrollTime)
4317 	{
4318 		ATLASSERT(::IsWindow(m_hWnd));
4319 		return (int)::SendMessage(m_hWnd, TVM_SETSCROLLTIME, nScrollTime, 0L);
4320 	}
4321 
GetTextColor()4322 	COLORREF GetTextColor() const
4323 	{
4324 		ATLASSERT(::IsWindow(m_hWnd));
4325 		return (COLORREF)::SendMessage(m_hWnd, TVM_GETTEXTCOLOR, 0, 0L);
4326 	}
4327 
SetTextColor(COLORREF clr)4328 	COLORREF SetTextColor(COLORREF clr)
4329 	{
4330 		ATLASSERT(::IsWindow(m_hWnd));
4331 		return (COLORREF)::SendMessage(m_hWnd, TVM_SETTEXTCOLOR, 0, (LPARAM)clr);
4332 	}
4333 
GetUnicodeFormat()4334 	BOOL GetUnicodeFormat() const
4335 	{
4336 		ATLASSERT(::IsWindow(m_hWnd));
4337 		return (BOOL)::SendMessage(m_hWnd, TVM_GETUNICODEFORMAT, 0, 0L);
4338 	}
4339 
4340 	BOOL SetUnicodeFormat(BOOL bUnicode = TRUE)
4341 	{
4342 		ATLASSERT(::IsWindow(m_hWnd));
4343 		return (BOOL)::SendMessage(m_hWnd, TVM_SETUNICODEFORMAT, bUnicode, 0L);
4344 	}
4345 #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
4346 
4347 #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
GetLineColor()4348 	COLORREF GetLineColor() const
4349 	{
4350 		ATLASSERT(::IsWindow(m_hWnd));
4351 		return (COLORREF)::SendMessage(m_hWnd, TVM_GETLINECOLOR, 0, 0L);
4352 	}
4353 
SetLineColor(COLORREF clrNew)4354 	COLORREF SetLineColor(COLORREF clrNew /*= CLR_DEFAULT*/)
4355 	{
4356 		ATLASSERT(::IsWindow(m_hWnd));
4357 		return (COLORREF)::SendMessage(m_hWnd, TVM_SETLINECOLOR, 0, (LPARAM)clrNew);
4358 	}
4359 #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
4360 
4361 #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
GetItem(LPTVITEMEX pItem)4362 	BOOL GetItem(LPTVITEMEX pItem) const
4363 	{
4364 		ATLASSERT(::IsWindow(m_hWnd));
4365 		return (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)pItem);
4366 	}
4367 
SetItem(LPTVITEMEX pItem)4368 	BOOL SetItem(LPTVITEMEX pItem)
4369 	{
4370 		ATLASSERT(::IsWindow(m_hWnd));
4371 		return (BOOL)::SendMessage(m_hWnd, TVM_SETITEM, 0, (LPARAM)pItem);
4372 	}
4373 #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
4374 
GetExtendedStyle()4375 	DWORD GetExtendedStyle() const
4376 	{
4377 #ifndef TVM_GETEXTENDEDSTYLE
4378 		const UINT TVM_GETEXTENDEDSTYLE = (TV_FIRST + 45);
4379 #endif
4380 		ATLASSERT(::IsWindow(m_hWnd));
4381 		return (DWORD)::SendMessage(m_hWnd, TVM_GETEXTENDEDSTYLE, 0, 0L);
4382 	}
4383 
SetExtendedStyle(DWORD dwStyle,DWORD dwMask)4384 	DWORD SetExtendedStyle(DWORD dwStyle, DWORD dwMask)
4385 	{
4386 #ifndef TVM_SETEXTENDEDSTYLE
4387 		const UINT TVM_SETEXTENDEDSTYLE = (TV_FIRST + 44);
4388 #endif
4389 		ATLASSERT(::IsWindow(m_hWnd));
4390 		return (DWORD)::SendMessage(m_hWnd, TVM_SETEXTENDEDSTYLE, dwMask, dwStyle);
4391 	}
4392 
4393 #if (_WIN32_WINNT >= 0x0600)
SetAutoScrollInfo(UINT uPixPerSec,UINT uUpdateTime)4394 	BOOL SetAutoScrollInfo(UINT uPixPerSec, UINT uUpdateTime)
4395 	{
4396 		ATLASSERT(::IsWindow(m_hWnd));
4397 		return (BOOL)::SendMessage(m_hWnd, TVM_SETAUTOSCROLLINFO, (WPARAM)uPixPerSec, (LPARAM)uUpdateTime);
4398 	}
4399 
GetSelectedCount()4400 	DWORD GetSelectedCount() const
4401 	{
4402 		ATLASSERT(::IsWindow(m_hWnd));
4403 		return (DWORD)::SendMessage(m_hWnd, TVM_GETSELECTEDCOUNT, 0, 0L);
4404 	}
4405 
GetItemPartRect(HTREEITEM hItem,TVITEMPART partID,LPRECT lpRect)4406 	BOOL GetItemPartRect(HTREEITEM hItem, TVITEMPART partID, LPRECT lpRect) const
4407 	{
4408 		ATLASSERT(::IsWindow(m_hWnd));
4409 		TVGETITEMPARTRECTINFO gipri = { hItem, lpRect, partID };
4410 		return (BOOL)::SendMessage(m_hWnd, TVM_GETITEMPARTRECT, 0, (LPARAM)&gipri);
4411 	}
4412 #endif // (_WIN32_WINNT >= 0x0600)
4413 
4414 // Operations
InsertItem(LPTVINSERTSTRUCT lpInsertStruct)4415 	HTREEITEM InsertItem(LPTVINSERTSTRUCT lpInsertStruct)
4416 	{
4417 		ATLASSERT(::IsWindow(m_hWnd));
4418 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_INSERTITEM, 0, (LPARAM)lpInsertStruct);
4419 	}
4420 
InsertItem(LPCTSTR lpszItem,int nImage,int nSelectedImage,HTREEITEM hParent,HTREEITEM hInsertAfter)4421 	HTREEITEM InsertItem(LPCTSTR lpszItem, int nImage,
4422 		int nSelectedImage, HTREEITEM hParent, HTREEITEM hInsertAfter)
4423 	{
4424 		ATLASSERT(::IsWindow(m_hWnd));
4425 		return InsertItem(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE, lpszItem, nImage, nSelectedImage, 0, 0, 0, hParent, hInsertAfter);
4426 	}
4427 
InsertItem(LPCTSTR lpszItem,HTREEITEM hParent,HTREEITEM hInsertAfter)4428 	HTREEITEM InsertItem(LPCTSTR lpszItem, HTREEITEM hParent, HTREEITEM hInsertAfter)
4429 	{
4430 		ATLASSERT(::IsWindow(m_hWnd));
4431 		return InsertItem(TVIF_TEXT, lpszItem, 0, 0, 0, 0, 0, hParent, hInsertAfter);
4432 	}
4433 
InsertItem(UINT nMask,LPCTSTR lpszItem,int nImage,int nSelectedImage,UINT nState,UINT nStateMask,LPARAM lParam,HTREEITEM hParent,HTREEITEM hInsertAfter)4434 	HTREEITEM InsertItem(UINT nMask, LPCTSTR lpszItem, int nImage,
4435 		int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam,
4436 		HTREEITEM hParent, HTREEITEM hInsertAfter)
4437 	{
4438 		ATLASSERT(::IsWindow(m_hWnd));
4439 		TVINSERTSTRUCT tvis = { 0 };
4440 		tvis.hParent = hParent;
4441 		tvis.hInsertAfter = hInsertAfter;
4442 		tvis.item.mask = nMask;
4443 		tvis.item.pszText = (LPTSTR) lpszItem;
4444 		tvis.item.iImage = nImage;
4445 		tvis.item.iSelectedImage = nSelectedImage;
4446 		tvis.item.state = nState;
4447 		tvis.item.stateMask = nStateMask;
4448 		tvis.item.lParam = lParam;
4449 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_INSERTITEM, 0, (LPARAM)&tvis);
4450 	}
4451 
DeleteItem(HTREEITEM hItem)4452 	BOOL DeleteItem(HTREEITEM hItem)
4453 	{
4454 		ATLASSERT(::IsWindow(m_hWnd));
4455 		return (BOOL)::SendMessage(m_hWnd, TVM_DELETEITEM, 0, (LPARAM)hItem);
4456 	}
4457 
DeleteAllItems()4458 	BOOL DeleteAllItems()
4459 	{
4460 		ATLASSERT(::IsWindow(m_hWnd));
4461 		return (BOOL)::SendMessage(m_hWnd, TVM_DELETEITEM, 0, (LPARAM)TVI_ROOT);
4462 	}
4463 
4464 	BOOL Expand(HTREEITEM hItem, UINT nCode = TVE_EXPAND)
4465 	{
4466 		ATLASSERT(::IsWindow(m_hWnd));
4467 		return (BOOL)::SendMessage(m_hWnd, TVM_EXPAND, nCode, (LPARAM)hItem);
4468 	}
4469 
GetNextItem(HTREEITEM hItem,UINT nCode)4470 	HTREEITEM GetNextItem(HTREEITEM hItem, UINT nCode) const
4471 	{
4472 		ATLASSERT(::IsWindow(m_hWnd));
4473 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, nCode, (LPARAM)hItem);
4474 	}
4475 
GetChildItem(HTREEITEM hItem)4476 	HTREEITEM GetChildItem(HTREEITEM hItem) const
4477 	{
4478 		ATLASSERT(::IsWindow(m_hWnd));
4479 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_CHILD, (LPARAM)hItem);
4480 	}
4481 
GetNextSiblingItem(HTREEITEM hItem)4482 	HTREEITEM GetNextSiblingItem(HTREEITEM hItem) const
4483 	{
4484 		ATLASSERT(::IsWindow(m_hWnd));
4485 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXT, (LPARAM)hItem);
4486 	}
4487 
GetPrevSiblingItem(HTREEITEM hItem)4488 	HTREEITEM GetPrevSiblingItem(HTREEITEM hItem) const
4489 	{
4490 		ATLASSERT(::IsWindow(m_hWnd));
4491 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PREVIOUS, (LPARAM)hItem);
4492 	}
4493 
GetParentItem(HTREEITEM hItem)4494 	HTREEITEM GetParentItem(HTREEITEM hItem) const
4495 	{
4496 		ATLASSERT(::IsWindow(m_hWnd));
4497 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PARENT, (LPARAM)hItem);
4498 	}
4499 
GetFirstVisibleItem()4500 	HTREEITEM GetFirstVisibleItem() const
4501 	{
4502 		ATLASSERT(::IsWindow(m_hWnd));
4503 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_FIRSTVISIBLE, 0L);
4504 	}
4505 
GetNextVisibleItem(HTREEITEM hItem)4506 	HTREEITEM GetNextVisibleItem(HTREEITEM hItem) const
4507 	{
4508 		ATLASSERT(::IsWindow(m_hWnd));
4509 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXTVISIBLE, (LPARAM)hItem);
4510 	}
4511 
GetPrevVisibleItem(HTREEITEM hItem)4512 	HTREEITEM GetPrevVisibleItem(HTREEITEM hItem) const
4513 	{
4514 		ATLASSERT(::IsWindow(m_hWnd));
4515 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PREVIOUSVISIBLE, (LPARAM)hItem);
4516 	}
4517 
GetSelectedItem()4518 	HTREEITEM GetSelectedItem() const
4519 	{
4520 		ATLASSERT(::IsWindow(m_hWnd));
4521 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_CARET, 0L);
4522 	}
4523 
GetDropHilightItem()4524 	HTREEITEM GetDropHilightItem() const
4525 	{
4526 		ATLASSERT(::IsWindow(m_hWnd));
4527 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_DROPHILITE, 0L);
4528 	}
4529 
GetRootItem()4530 	HTREEITEM GetRootItem() const
4531 	{
4532 		ATLASSERT(::IsWindow(m_hWnd));
4533 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_ROOT, 0L);
4534 	}
4535 
4536 #if !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400)
GetLastVisibleItem()4537 	HTREEITEM GetLastVisibleItem() const
4538 	{
4539 		ATLASSERT(::IsWindow(m_hWnd));
4540 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_LASTVISIBLE, 0L);
4541 	}
4542 #endif // !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400)
4543 
4544 #if (_WIN32_IE >= 0x0600)
GetNextSelectedItem()4545 	HTREEITEM GetNextSelectedItem() const
4546 	{
4547 #ifndef TVGN_NEXTSELECTED
4548 		const WORD TVGN_NEXTSELECTED = 0x000B;
4549 #endif
4550 		ATLASSERT(::IsWindow(m_hWnd));
4551 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXTSELECTED, 0L);
4552 	}
4553 #endif // (_WIN32_IE >= 0x0600)
4554 
Select(HTREEITEM hItem,UINT nCode)4555 	BOOL Select(HTREEITEM hItem, UINT nCode)
4556 	{
4557 		ATLASSERT(::IsWindow(m_hWnd));
4558 		return (BOOL)::SendMessage(m_hWnd, TVM_SELECTITEM, nCode, (LPARAM)hItem);
4559 	}
4560 
SelectItem(HTREEITEM hItem)4561 	BOOL SelectItem(HTREEITEM hItem)
4562 	{
4563 		ATLASSERT(::IsWindow(m_hWnd));
4564 		return (BOOL)::SendMessage(m_hWnd, TVM_SELECTITEM, TVGN_CARET, (LPARAM)hItem);
4565 	}
4566 
SelectDropTarget(HTREEITEM hItem)4567 	BOOL SelectDropTarget(HTREEITEM hItem)
4568 	{
4569 		ATLASSERT(::IsWindow(m_hWnd));
4570 		return (BOOL)::SendMessage(m_hWnd, TVM_SELECTITEM, TVGN_DROPHILITE, (LPARAM)hItem);
4571 	}
4572 
SelectSetFirstVisible(HTREEITEM hItem)4573 	BOOL SelectSetFirstVisible(HTREEITEM hItem)
4574 	{
4575 		ATLASSERT(::IsWindow(m_hWnd));
4576 		return (BOOL)::SendMessage(m_hWnd, TVM_SELECTITEM, TVGN_FIRSTVISIBLE, (LPARAM)hItem);
4577 	}
4578 
EditLabel(HTREEITEM hItem)4579 	CEdit EditLabel(HTREEITEM hItem)
4580 	{
4581 		ATLASSERT(::IsWindow(m_hWnd));
4582 		return CEdit((HWND)::SendMessage(m_hWnd, TVM_EDITLABEL, 0, (LPARAM)hItem));
4583 	}
4584 
EndEditLabelNow(BOOL bCancel)4585 	BOOL EndEditLabelNow(BOOL bCancel)
4586 	{
4587 		ATLASSERT(::IsWindow(m_hWnd));
4588 		return (BOOL)::SendMessage(m_hWnd, TVM_ENDEDITLABELNOW, bCancel, 0L);
4589 	}
4590 
HitTest(TVHITTESTINFO * pHitTestInfo)4591 	HTREEITEM HitTest(TVHITTESTINFO* pHitTestInfo) const
4592 	{
4593 		ATLASSERT(::IsWindow(m_hWnd));
4594 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_HITTEST, 0, (LPARAM)pHitTestInfo);
4595 	}
4596 
HitTest(POINT pt,UINT * pFlags)4597 	HTREEITEM HitTest(POINT pt, UINT* pFlags) const
4598 	{
4599 		ATLASSERT(::IsWindow(m_hWnd));
4600 		TVHITTESTINFO hti = { 0 };
4601 		hti.pt = pt;
4602 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_HITTEST, 0, (LPARAM)&hti);
4603 		if (pFlags != NULL)
4604 			*pFlags = hti.flags;
4605 		return hTreeItem;
4606 	}
4607 
4608 	BOOL SortChildren(HTREEITEM hItem, BOOL bRecurse = FALSE)
4609 	{
4610 		ATLASSERT(::IsWindow(m_hWnd));
4611 		return (BOOL)::SendMessage(m_hWnd, TVM_SORTCHILDREN, (WPARAM)bRecurse, (LPARAM)hItem);
4612 	}
4613 
EnsureVisible(HTREEITEM hItem)4614 	BOOL EnsureVisible(HTREEITEM hItem)
4615 	{
4616 		ATLASSERT(::IsWindow(m_hWnd));
4617 		return (BOOL)::SendMessage(m_hWnd, TVM_ENSUREVISIBLE, 0, (LPARAM)hItem);
4618 	}
4619 
4620 	BOOL SortChildrenCB(LPTVSORTCB pSort, BOOL bRecurse = FALSE)
4621 	{
4622 		ATLASSERT(::IsWindow(m_hWnd));
4623 		return (BOOL)::SendMessage(m_hWnd, TVM_SORTCHILDRENCB, (WPARAM)bRecurse, (LPARAM)pSort);
4624 	}
4625 
RemoveImageList(int nImageList)4626 	CImageList RemoveImageList(int nImageList)
4627 	{
4628 		ATLASSERT(::IsWindow(m_hWnd));
4629 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TVM_SETIMAGELIST, (WPARAM)nImageList, NULL));
4630 	}
4631 
CreateDragImage(HTREEITEM hItem)4632 	CImageList CreateDragImage(HTREEITEM hItem)
4633 	{
4634 		ATLASSERT(::IsWindow(m_hWnd));
4635 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TVM_CREATEDRAGIMAGE, 0, (LPARAM)hItem));
4636 	}
4637 
4638 #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
SetInsertMark(HTREEITEM hTreeItem,BOOL bAfter)4639 	BOOL SetInsertMark(HTREEITEM hTreeItem, BOOL bAfter)
4640 	{
4641 		ATLASSERT(::IsWindow(m_hWnd));
4642 		return (BOOL)::SendMessage(m_hWnd, TVM_SETINSERTMARK, bAfter, (LPARAM)hTreeItem);
4643 	}
4644 
RemoveInsertMark()4645 	BOOL RemoveInsertMark()
4646 	{
4647 		ATLASSERT(::IsWindow(m_hWnd));
4648 		return (BOOL)::SendMessage(m_hWnd, TVM_SETINSERTMARK, 0, 0L);
4649 	}
4650 #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
4651 
4652 #if (_WIN32_WINNT >= 0x0501)
MapAccIDToHTREEITEM(UINT uID)4653 	HTREEITEM MapAccIDToHTREEITEM(UINT uID) const
4654 	{
4655 		ATLASSERT(::IsWindow(m_hWnd));
4656 		return (HTREEITEM)::SendMessage(m_hWnd, TVM_MAPACCIDTOHTREEITEM, uID, 0L);
4657 	}
4658 
MapHTREEITEMToAccID(HTREEITEM hTreeItem)4659 	UINT MapHTREEITEMToAccID(HTREEITEM hTreeItem) const
4660 	{
4661 		ATLASSERT(::IsWindow(m_hWnd));
4662 		return (UINT)::SendMessage(m_hWnd, TVM_MAPHTREEITEMTOACCID, (WPARAM)hTreeItem, 0L);
4663 	}
4664 #endif // (_WIN32_WINNT >= 0x0501)
4665 
4666 #if (_WIN32_WINNT >= 0x0600)
ShowInfoTip(HTREEITEM hItem)4667 	void ShowInfoTip(HTREEITEM hItem)
4668 	{
4669 		ATLASSERT(::IsWindow(m_hWnd));
4670 		::SendMessage(m_hWnd, TVM_SHOWINFOTIP, 0, (LPARAM)hItem);
4671 	}
4672 #endif // (_WIN32_WINNT >= 0x0600)
4673 };
4674 
4675 typedef CTreeViewCtrlT<ATL::CWindow>   CTreeViewCtrl;
4676 
4677 
4678 ///////////////////////////////////////////////////////////////////////////////
4679 // CTreeViewCtrlEx
4680 
4681 // forward declaration
4682 template <class TBase> class CTreeViewCtrlExT;
4683 
4684 // Note: TBase here is for CTreeViewCtrlExT, and not for CTreeItemT itself
4685 template <class TBase>
4686 class CTreeItemT
4687 {
4688 public:
4689 	HTREEITEM m_hTreeItem;
4690 	CTreeViewCtrlExT<TBase>* m_pTreeView;
4691 
4692 // Construction
m_hTreeItem(hTreeItem)4693 	CTreeItemT(HTREEITEM hTreeItem = NULL, CTreeViewCtrlExT<TBase>* pTreeView = NULL) : m_hTreeItem(hTreeItem), m_pTreeView(pTreeView)
4694 	{ }
4695 
CTreeItemT(const CTreeItemT<TBase> & posSrc)4696 	CTreeItemT(const CTreeItemT<TBase>& posSrc)
4697 	{
4698 		*this = posSrc;
4699 	}
4700 
HTREEITEM()4701 	operator HTREEITEM() { return m_hTreeItem; }
4702 
4703 	CTreeItemT<TBase>& operator =(const CTreeItemT<TBase>& itemSrc)
4704 	{
4705 		m_hTreeItem = itemSrc.m_hTreeItem;
4706 		m_pTreeView = itemSrc.m_pTreeView;
4707 		return *this;
4708 	}
4709 
4710 // Attributes
GetTreeView()4711 	CTreeViewCtrlExT<TBase>* GetTreeView() const { return m_pTreeView; }
4712 
4713 	BOOL operator !() const { return m_hTreeItem == NULL; }
4714 
IsNull()4715 	BOOL IsNull() const { return m_hTreeItem == NULL; }
4716 
4717 	BOOL GetRect(LPRECT lpRect, BOOL bTextOnly) const;
4718 	BOOL GetText(LPTSTR lpstrText, int nLen) const;
4719 #ifndef _ATL_NO_COM
4720 	BOOL GetText(BSTR& bstrText) const;
4721 #endif // !_ATL_NO_COM
4722 #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
4723 	BOOL GetText(_CSTRING_NS::CString& strText) const;
4724 #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
4725 	BOOL SetText(LPCTSTR lpszItem);
4726 	BOOL GetImage(int& nImage, int& nSelectedImage) const;
4727 	BOOL SetImage(int nImage, int nSelectedImage);
4728 	UINT GetState(UINT nStateMask) const;
4729 	BOOL SetState(UINT nState, UINT nStateMask);
4730 	DWORD_PTR GetData() const;
4731 	BOOL SetData(DWORD_PTR dwData);
4732 	BOOL SetItem(UINT nMask, LPCTSTR lpszItem, int nImage, int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam);
4733 
4734 // Operations
InsertAfter(LPCTSTR lpstrItem,HTREEITEM hItemAfter,int nImageIndex)4735 	CTreeItemT<TBase> InsertAfter(LPCTSTR lpstrItem, HTREEITEM hItemAfter, int nImageIndex)
4736 	{
4737 		return _Insert(lpstrItem, nImageIndex, hItemAfter);
4738 	}
4739 
AddHead(LPCTSTR lpstrItem,int nImageIndex)4740 	CTreeItemT<TBase> AddHead(LPCTSTR lpstrItem, int nImageIndex)
4741 	{
4742 		return _Insert(lpstrItem, nImageIndex, TVI_FIRST);
4743 	}
4744 
AddTail(LPCTSTR lpstrItem,int nImageIndex)4745 	CTreeItemT<TBase> AddTail(LPCTSTR lpstrItem, int nImageIndex)
4746 	{
4747 		return _Insert(lpstrItem, nImageIndex, TVI_LAST);
4748 	}
4749 
4750 	CTreeItemT<TBase> GetChild() const;
4751 	CTreeItemT<TBase> GetNext(UINT nCode) const;
4752 	CTreeItemT<TBase> GetNextSibling() const;
4753 	CTreeItemT<TBase> GetPrevSibling() const;
4754 	CTreeItemT<TBase> GetParent() const;
4755 	CTreeItemT<TBase> GetFirstVisible() const;
4756 	CTreeItemT<TBase> GetNextVisible() const;
4757 	CTreeItemT<TBase> GetPrevVisible() const;
4758 	CTreeItemT<TBase> GetSelected() const;
4759 	CTreeItemT<TBase> GetDropHilight() const;
4760 	CTreeItemT<TBase> GetRoot() const;
4761 #if !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400)
4762 	CTreeItemT<TBase> GetLastVisible() const;
4763 #endif // !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400)
4764 #if (_WIN32_IE >= 0x0600)
4765 	CTreeItemT<TBase> GetNextSelected() const;
4766 #endif // (_WIN32_IE >= 0x0600)
4767 	BOOL HasChildren() const;
4768 	BOOL Delete();
4769 	BOOL Expand(UINT nCode = TVE_EXPAND);
4770 	BOOL Select(UINT nCode);
4771 	BOOL Select();
4772 	BOOL SelectDropTarget();
4773 	BOOL SelectSetFirstVisible();
4774 	HWND EditLabel();
4775 	HIMAGELIST CreateDragImage();
4776 	BOOL SortChildren(BOOL bRecurse = FALSE);
4777 	BOOL EnsureVisible();
4778 	CTreeItemT<TBase> _Insert(LPCTSTR lpstrItem, int nImageIndex, HTREEITEM hItemAfter);
4779 	int GetImageIndex() const;
4780 #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
4781 	BOOL SetInsertMark(BOOL bAfter);
4782 #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
4783 #if (_WIN32_WINNT >= 0x0501)
4784 	UINT MapHTREEITEMToAccID() const;
4785 #endif // (_WIN32_WINNT >= 0x0501)
4786 #if (_WIN32_WINNT >= 0x0600)
4787 	void ShowInfoTip();
4788 	BOOL GetPartRect(TVITEMPART partID, LPRECT lpRect) const;
4789 #endif // (_WIN32_WINNT >= 0x0600)
4790 };
4791 
4792 typedef CTreeItemT<ATL::CWindow>   CTreeItem;
4793 
4794 
4795 template <class TBase>
4796 class CTreeViewCtrlExT : public CTreeViewCtrlT< TBase >
4797 {
4798 public:
4799 // Constructors
4800 	CTreeViewCtrlExT(HWND hWnd = NULL) : CTreeViewCtrlT< TBase >(hWnd)
4801 	{ }
4802 
4803 	CTreeViewCtrlExT< TBase >& operator =(HWND hWnd)
4804 	{
4805 		m_hWnd = hWnd;
4806 		return *this;
4807 	}
4808 
4809 // Operations (overides that return CTreeItem)
InsertItem(LPTVINSERTSTRUCT lpInsertStruct)4810 	CTreeItemT<TBase> InsertItem(LPTVINSERTSTRUCT lpInsertStruct)
4811 	{
4812 		ATLASSERT(::IsWindow(m_hWnd));
4813 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_INSERTITEM, 0, (LPARAM)lpInsertStruct);
4814 		return CTreeItemT<TBase>(hTreeItem, this);
4815 	}
4816 
InsertItem(LPCTSTR lpszItem,int nImage,int nSelectedImage,HTREEITEM hParent,HTREEITEM hInsertAfter)4817 	CTreeItemT<TBase> InsertItem(LPCTSTR lpszItem, int nImage,
4818 		int nSelectedImage, HTREEITEM hParent, HTREEITEM hInsertAfter)
4819 	{
4820 		ATLASSERT(::IsWindow(m_hWnd));
4821 		return InsertItem(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE, lpszItem, nImage, nSelectedImage, 0, 0, 0, hParent, hInsertAfter);
4822 	}
4823 
InsertItem(LPCTSTR lpszItem,HTREEITEM hParent,HTREEITEM hInsertAfter)4824 	CTreeItemT<TBase> InsertItem(LPCTSTR lpszItem, HTREEITEM hParent, HTREEITEM hInsertAfter)
4825 	{
4826 		ATLASSERT(::IsWindow(m_hWnd));
4827 		return InsertItem(TVIF_TEXT, lpszItem, 0, 0, 0, 0, 0, hParent, hInsertAfter);
4828 	}
4829 
GetNextItem(HTREEITEM hItem,UINT nCode)4830 	CTreeItemT<TBase> GetNextItem(HTREEITEM hItem, UINT nCode) const
4831 	{
4832 		ATLASSERT(::IsWindow(m_hWnd));
4833 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, nCode, (LPARAM)hItem);
4834 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);
4835 	}
4836 
GetChildItem(HTREEITEM hItem)4837 	CTreeItemT<TBase> GetChildItem(HTREEITEM hItem) const
4838 	{
4839 		ATLASSERT(::IsWindow(m_hWnd));
4840 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_CHILD, (LPARAM)hItem);
4841 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);
4842 	}
4843 
GetNextSiblingItem(HTREEITEM hItem)4844 	CTreeItemT<TBase> GetNextSiblingItem(HTREEITEM hItem) const
4845 	{
4846 		ATLASSERT(::IsWindow(m_hWnd));
4847 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXT, (LPARAM)hItem);
4848 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);
4849 	}
4850 
GetPrevSiblingItem(HTREEITEM hItem)4851 	CTreeItemT<TBase> GetPrevSiblingItem(HTREEITEM hItem) const
4852 	{
4853 		ATLASSERT(::IsWindow(m_hWnd));
4854 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PREVIOUS, (LPARAM)hItem);
4855 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);
4856 	}
4857 
GetParentItem(HTREEITEM hItem)4858 	CTreeItemT<TBase> GetParentItem(HTREEITEM hItem) const
4859 	{
4860 		ATLASSERT(::IsWindow(m_hWnd));
4861 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PARENT, (LPARAM)hItem);
4862 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);
4863 	}
4864 
GetFirstVisibleItem()4865 	CTreeItemT<TBase> GetFirstVisibleItem() const
4866 	{
4867 		ATLASSERT(::IsWindow(m_hWnd));
4868 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_FIRSTVISIBLE, 0L);
4869 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);
4870 	}
4871 
GetNextVisibleItem(HTREEITEM hItem)4872 	CTreeItemT<TBase> GetNextVisibleItem(HTREEITEM hItem) const
4873 	{
4874 		ATLASSERT(::IsWindow(m_hWnd));
4875 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXTVISIBLE, (LPARAM)hItem);
4876 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);
4877 	}
4878 
GetPrevVisibleItem(HTREEITEM hItem)4879 	CTreeItemT<TBase> GetPrevVisibleItem(HTREEITEM hItem) const
4880 	{
4881 		ATLASSERT(::IsWindow(m_hWnd));
4882 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PREVIOUSVISIBLE, (LPARAM)hItem);
4883 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);
4884 	}
4885 
GetSelectedItem()4886 	CTreeItemT<TBase> GetSelectedItem() const
4887 	{
4888 		ATLASSERT(::IsWindow(m_hWnd));
4889 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_CARET, 0L);
4890 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);
4891 	}
4892 
GetDropHilightItem()4893 	CTreeItemT<TBase> GetDropHilightItem() const
4894 	{
4895 		ATLASSERT(::IsWindow(m_hWnd));
4896 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_DROPHILITE, 0L);
4897 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);
4898 	}
4899 
GetRootItem()4900 	CTreeItemT<TBase> GetRootItem() const
4901 	{
4902 		ATLASSERT(::IsWindow(m_hWnd));
4903 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_ROOT, 0L);
4904 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);
4905 	}
4906 
4907 #if !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400)
GetLastVisibleItem()4908 	CTreeItemT<TBase> GetLastVisibleItem() const
4909 	{
4910 		ATLASSERT(::IsWindow(m_hWnd));
4911 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_LASTVISIBLE, 0L);
4912 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);
4913 	}
4914 #endif // !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400)
4915 
4916 #if (_WIN32_IE >= 0x0600)
GetNextSelectedItem()4917 	CTreeItemT<TBase> GetNextSelectedItem() const
4918 	{
4919 #ifndef TVGN_NEXTSELECTED
4920 		const WORD TVGN_NEXTSELECTED = 0x000B;
4921 #endif
4922 		ATLASSERT(::IsWindow(m_hWnd));
4923 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXTSELECTED, 0L);
4924 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);
4925 	}
4926 #endif // (_WIN32_IE >= 0x0600)
4927 
HitTest(TVHITTESTINFO * pHitTestInfo)4928 	CTreeItemT<TBase> HitTest(TVHITTESTINFO* pHitTestInfo) const
4929 	{
4930 		ATLASSERT(::IsWindow(m_hWnd));
4931 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_HITTEST, 0, (LPARAM)pHitTestInfo);
4932 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);
4933 	}
4934 
InsertItem(UINT nMask,LPCTSTR lpszItem,int nImage,int nSelectedImage,UINT nState,UINT nStateMask,LPARAM lParam,HTREEITEM hParent,HTREEITEM hInsertAfter)4935 	CTreeItemT<TBase> InsertItem(UINT nMask, LPCTSTR lpszItem, int nImage,
4936 		int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam,
4937 		HTREEITEM hParent, HTREEITEM hInsertAfter)
4938 	{
4939 		ATLASSERT(::IsWindow(m_hWnd));
4940 		TVINSERTSTRUCT tvis = { 0 };
4941 		tvis.hParent = hParent;
4942 		tvis.hInsertAfter = hInsertAfter;
4943 		tvis.item.mask = nMask;
4944 		tvis.item.pszText = (LPTSTR) lpszItem;
4945 		tvis.item.iImage = nImage;
4946 		tvis.item.iSelectedImage = nSelectedImage;
4947 		tvis.item.state = nState;
4948 		tvis.item.stateMask = nStateMask;
4949 		tvis.item.lParam = lParam;
4950 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_INSERTITEM, 0, (LPARAM)&tvis);
4951 		return CTreeItemT<TBase>(hTreeItem, this);
4952 	}
4953 
HitTest(POINT pt,UINT * pFlags)4954 	CTreeItemT<TBase> HitTest(POINT pt, UINT* pFlags) const
4955 	{
4956 		ATLASSERT(::IsWindow(m_hWnd));
4957 		TVHITTESTINFO hti = { 0 };
4958 		hti.pt = pt;
4959 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_HITTEST, 0, (LPARAM)&hti);
4960 		if (pFlags != NULL)
4961 			*pFlags = hti.flags;
4962 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);
4963 	}
4964 
4965 #if (_WIN32_WINNT >= 0x0501)
MapAccIDToHTREEITEM(UINT uID)4966 	CTreeItemT<TBase> MapAccIDToHTREEITEM(UINT uID) const
4967 	{
4968 		ATLASSERT(::IsWindow(m_hWnd));
4969 		HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_MAPACCIDTOHTREEITEM, uID, 0L);
4970 		return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);
4971 	}
4972 #endif // (_WIN32_WINNT >= 0x0501)
4973 };
4974 
4975 typedef CTreeViewCtrlExT<ATL::CWindow>   CTreeViewCtrlEx;
4976 
4977 
4978 // CTreeItem inline methods
4979 template <class TBase>
GetRect(LPRECT lpRect,BOOL bTextOnly)4980 inline BOOL CTreeItemT<TBase>::GetRect(LPRECT lpRect, BOOL bTextOnly) const
4981 {
4982 	ATLASSERT(m_pTreeView != NULL);
4983 	return m_pTreeView->GetItemRect(m_hTreeItem,lpRect,bTextOnly);
4984 }
4985 
4986 template <class TBase>
GetNext(UINT nCode)4987 inline CTreeItemT<TBase> CTreeItemT<TBase>::GetNext(UINT nCode) const
4988 {
4989 	ATLASSERT(m_pTreeView != NULL);
4990 	return m_pTreeView->GetNextItem(m_hTreeItem,nCode);
4991 }
4992 
4993 template <class TBase>
GetChild()4994 inline CTreeItemT<TBase> CTreeItemT<TBase>::GetChild() const
4995 {
4996 	ATLASSERT(m_pTreeView != NULL);
4997 	return m_pTreeView->GetChildItem(m_hTreeItem);
4998 }
4999 
5000 template <class TBase>
GetNextSibling()5001 inline CTreeItemT<TBase> CTreeItemT<TBase>::GetNextSibling() const
5002 {
5003 	ATLASSERT(m_pTreeView != NULL);
5004 	return m_pTreeView->GetNextSiblingItem(m_hTreeItem);
5005 }
5006 
5007 template <class TBase>
GetPrevSibling()5008 inline CTreeItemT<TBase> CTreeItemT<TBase>::GetPrevSibling() const
5009 {
5010 	ATLASSERT(m_pTreeView != NULL);
5011 	return m_pTreeView->GetPrevSiblingItem(m_hTreeItem);
5012 }
5013 
5014 template <class TBase>
GetParent()5015 inline CTreeItemT<TBase> CTreeItemT<TBase>::GetParent() const
5016 {
5017 	ATLASSERT(m_pTreeView != NULL);
5018 	return m_pTreeView->GetParentItem(m_hTreeItem);
5019 }
5020 
5021 template <class TBase>
GetFirstVisible()5022 inline CTreeItemT<TBase> CTreeItemT<TBase>::GetFirstVisible() const
5023 {
5024 	ATLASSERT(m_pTreeView != NULL);
5025 	return m_pTreeView->GetFirstVisibleItem();
5026 }
5027 
5028 template <class TBase>
GetNextVisible()5029 inline CTreeItemT<TBase> CTreeItemT<TBase>::GetNextVisible() const
5030 {
5031 	ATLASSERT(m_pTreeView != NULL);
5032 	return m_pTreeView->GetNextVisibleItem(m_hTreeItem);
5033 }
5034 
5035 template <class TBase>
GetPrevVisible()5036 inline CTreeItemT<TBase> CTreeItemT<TBase>::GetPrevVisible() const
5037 {
5038 	ATLASSERT(m_pTreeView != NULL);
5039 	return m_pTreeView->GetPrevVisibleItem(m_hTreeItem);
5040 }
5041 
5042 template <class TBase>
GetSelected()5043 inline CTreeItemT<TBase> CTreeItemT<TBase>::GetSelected() const
5044 {
5045 	ATLASSERT(m_pTreeView != NULL);
5046 	return m_pTreeView->GetSelectedItem();
5047 }
5048 
5049 template <class TBase>
GetDropHilight()5050 inline CTreeItemT<TBase> CTreeItemT<TBase>::GetDropHilight() const
5051 {
5052 	ATLASSERT(m_pTreeView != NULL);
5053 	return m_pTreeView->GetDropHilightItem();
5054 }
5055 
5056 template <class TBase>
GetRoot()5057 inline CTreeItemT<TBase> CTreeItemT<TBase>::GetRoot() const
5058 {
5059 	ATLASSERT(m_pTreeView != NULL);
5060 	return m_pTreeView->GetRootItem();
5061 }
5062 
5063 #if !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400)
5064 template <class TBase>
GetLastVisible()5065 inline CTreeItemT<TBase> CTreeItemT<TBase>::GetLastVisible() const
5066 {
5067 	ATLASSERT(m_pTreeView != NULL);
5068 	return m_pTreeView->GetLastVisibleItem();
5069 }
5070 #endif // !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400)
5071 
5072 #if (_WIN32_IE >= 0x0600)
5073 template <class TBase>
GetNextSelected()5074 inline CTreeItemT<TBase> CTreeItemT<TBase>::GetNextSelected() const
5075 {
5076 	ATLASSERT(m_pTreeView != NULL);
5077 	return m_pTreeView->GetNextSelectedItem();
5078 }
5079 #endif // (_WIN32_IE >= 0x0600)
5080 
5081 template <class TBase>
GetText(LPTSTR lpstrText,int nLen)5082 inline BOOL CTreeItemT<TBase>::GetText(LPTSTR lpstrText, int nLen) const
5083 {
5084 	ATLASSERT(m_pTreeView != NULL);
5085 	return m_pTreeView->GetItemText(m_hTreeItem, lpstrText, nLen);
5086 }
5087 
5088 #ifndef _ATL_NO_COM
5089 #ifdef _OLEAUTO_H_
5090 template <class TBase>
GetText(BSTR & bstrText)5091 inline BOOL CTreeItemT<TBase>::GetText(BSTR& bstrText) const
5092 {
5093 	ATLASSERT(m_pTreeView != NULL);
5094 	return m_pTreeView->GetItemText(m_hTreeItem, bstrText);
5095 }
5096 #endif // _OLEAUTO_H_
5097 #endif // !_ATL_NO_COM
5098 
5099 #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
5100 template <class TBase>
GetText(_CSTRING_NS::CString & strText)5101 inline BOOL CTreeItemT<TBase>::GetText(_CSTRING_NS::CString& strText) const
5102 {
5103 	ATLASSERT(m_pTreeView != NULL);
5104 	return m_pTreeView->GetItemText(m_hTreeItem, strText);
5105 }
5106 #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
5107 
5108 template <class TBase>
GetImage(int & nImage,int & nSelectedImage)5109 inline BOOL CTreeItemT<TBase>::GetImage(int& nImage, int& nSelectedImage) const
5110 {
5111 	ATLASSERT(m_pTreeView != NULL);
5112 	return m_pTreeView->GetItemImage(m_hTreeItem,nImage,nSelectedImage);
5113 }
5114 
5115 template <class TBase>
GetState(UINT nStateMask)5116 inline UINT CTreeItemT<TBase>::GetState(UINT nStateMask) const
5117 {
5118 	ATLASSERT(m_pTreeView != NULL);
5119 	return m_pTreeView->GetItemState(m_hTreeItem,nStateMask);
5120 }
5121 
5122 template <class TBase>
GetData()5123 inline DWORD_PTR CTreeItemT<TBase>::GetData() const
5124 {
5125 	ATLASSERT(m_pTreeView != NULL);
5126 	return m_pTreeView->GetItemData(m_hTreeItem);
5127 }
5128 
5129 template <class TBase>
SetItem(UINT nMask,LPCTSTR lpszItem,int nImage,int nSelectedImage,UINT nState,UINT nStateMask,LPARAM lParam)5130 inline BOOL CTreeItemT<TBase>::SetItem(UINT nMask, LPCTSTR lpszItem, int nImage,
5131 		int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam)
5132 {
5133 	ATLASSERT(m_pTreeView != NULL);
5134 	return m_pTreeView->SetItem(m_hTreeItem, nMask, lpszItem, nImage, nSelectedImage, nState, nStateMask, lParam);
5135 }
5136 
5137 template <class TBase>
SetText(LPCTSTR lpszItem)5138 inline BOOL CTreeItemT<TBase>::SetText(LPCTSTR lpszItem)
5139 {
5140 	ATLASSERT(m_pTreeView != NULL);
5141 	return m_pTreeView->SetItemText(m_hTreeItem,lpszItem);
5142 }
5143 
5144 template <class TBase>
SetImage(int nImage,int nSelectedImage)5145 inline BOOL CTreeItemT<TBase>::SetImage(int nImage, int nSelectedImage)
5146 {
5147 	ATLASSERT(m_pTreeView != NULL);
5148 	return m_pTreeView->SetItemImage(m_hTreeItem,nImage,nSelectedImage);
5149 }
5150 
5151 template <class TBase>
SetState(UINT nState,UINT nStateMask)5152 inline BOOL CTreeItemT<TBase>::SetState(UINT nState, UINT nStateMask)
5153 {
5154 	ATLASSERT(m_pTreeView != NULL);
5155 	return m_pTreeView->SetItemState(m_hTreeItem,nState,nStateMask);
5156 }
5157 
5158 template <class TBase>
SetData(DWORD_PTR dwData)5159 inline BOOL CTreeItemT<TBase>::SetData(DWORD_PTR dwData)
5160 {
5161 	ATLASSERT(m_pTreeView != NULL);
5162 	return m_pTreeView->SetItemData(m_hTreeItem,dwData);
5163 }
5164 
5165 template <class TBase>
HasChildren()5166 inline BOOL CTreeItemT<TBase>::HasChildren() const
5167 {
5168 	ATLASSERT(m_pTreeView != NULL);
5169 	return m_pTreeView->ItemHasChildren(m_hTreeItem);
5170 }
5171 
5172 template <class TBase>
Delete()5173 inline BOOL CTreeItemT<TBase>::Delete()
5174 {
5175 	ATLASSERT(m_pTreeView != NULL);
5176 	return m_pTreeView->DeleteItem(m_hTreeItem);
5177 }
5178 
5179 template <class TBase>
Expand(UINT nCode)5180 inline BOOL CTreeItemT<TBase>::Expand(UINT nCode /*= TVE_EXPAND*/)
5181 {
5182 	ATLASSERT(m_pTreeView != NULL);
5183 	return m_pTreeView->Expand(m_hTreeItem,nCode);
5184 }
5185 
5186 template <class TBase>
Select(UINT nCode)5187 inline BOOL CTreeItemT<TBase>::Select(UINT nCode)
5188 {
5189 	ATLASSERT(m_pTreeView != NULL);
5190 	return m_pTreeView->Select(m_hTreeItem,nCode);
5191 }
5192 
5193 template <class TBase>
Select()5194 inline BOOL CTreeItemT<TBase>::Select()
5195 {
5196 	ATLASSERT(m_pTreeView != NULL);
5197 	return m_pTreeView->SelectItem(m_hTreeItem);
5198 }
5199 
5200 template <class TBase>
SelectDropTarget()5201 inline BOOL CTreeItemT<TBase>::SelectDropTarget()
5202 {
5203 	ATLASSERT(m_pTreeView != NULL);
5204 	return m_pTreeView->SelectDropTarget(m_hTreeItem);
5205 }
5206 
5207 template <class TBase>
SelectSetFirstVisible()5208 inline BOOL CTreeItemT<TBase>::SelectSetFirstVisible()
5209 {
5210 	ATLASSERT(m_pTreeView != NULL);
5211 	return m_pTreeView->SelectSetFirstVisible(m_hTreeItem);
5212 }
5213 
5214 template <class TBase>
EditLabel()5215 inline HWND CTreeItemT<TBase>::EditLabel()
5216 {
5217 	ATLASSERT(m_pTreeView != NULL);
5218 	return m_pTreeView->EditLabel(m_hTreeItem);
5219 }
5220 
5221 template <class TBase>
CreateDragImage()5222 inline HIMAGELIST CTreeItemT<TBase>::CreateDragImage()
5223 {
5224 	ATLASSERT(m_pTreeView != NULL);
5225 	return m_pTreeView->CreateDragImage(m_hTreeItem);
5226 }
5227 
5228 template <class TBase>
SortChildren(BOOL bRecurse)5229 inline BOOL CTreeItemT<TBase>::SortChildren(BOOL bRecurse /*= FALSE*/)
5230 {
5231 	ATLASSERT(m_pTreeView != NULL);
5232 	return m_pTreeView->SortChildren(m_hTreeItem, bRecurse);
5233 }
5234 
5235 template <class TBase>
EnsureVisible()5236 inline BOOL CTreeItemT<TBase>::EnsureVisible()
5237 {
5238 	ATLASSERT(m_pTreeView != NULL);
5239 	return m_pTreeView->EnsureVisible(m_hTreeItem);
5240 }
5241 
5242 template <class TBase>
_Insert(LPCTSTR lpstrItem,int nImageIndex,HTREEITEM hItemAfter)5243 inline CTreeItemT<TBase> CTreeItemT<TBase>::_Insert(LPCTSTR lpstrItem, int nImageIndex, HTREEITEM hItemAfter)
5244 {
5245 	ATLASSERT(m_pTreeView != NULL);
5246 	TVINSERTSTRUCT ins = { 0 };
5247 	ins.hParent = m_hTreeItem;
5248 	ins.hInsertAfter = hItemAfter;
5249 	ins.item.mask = TVIF_TEXT;
5250 	ins.item.pszText = (LPTSTR)lpstrItem;
5251 	if(nImageIndex != -1)
5252 	{
5253 		ins.item.mask |= TVIF_IMAGE | TVIF_SELECTEDIMAGE;
5254 		ins.item.iImage = nImageIndex;
5255 		ins.item.iSelectedImage = nImageIndex;
5256 	}
5257 	return CTreeItemT<TBase>(m_pTreeView->InsertItem(&ins), m_pTreeView);
5258 }
5259 
5260 template <class TBase>
GetImageIndex()5261 inline int CTreeItemT<TBase>::GetImageIndex() const
5262 {
5263 	ATLASSERT(m_pTreeView != NULL);
5264 	TVITEM item = { 0 };
5265 	item.mask = TVIF_HANDLE | TVIF_IMAGE;
5266 	item.hItem = m_hTreeItem;
5267 	m_pTreeView->GetItem(&item);
5268 	return item.iImage;
5269 }
5270 
5271 #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
5272 template <class TBase>
SetInsertMark(BOOL bAfter)5273 inline BOOL CTreeItemT<TBase>::SetInsertMark(BOOL bAfter)
5274 {
5275 	ATLASSERT(m_pTreeView != NULL);
5276 	return m_pTreeView->SetInsertMark(m_hTreeItem, bAfter);
5277 }
5278 #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
5279 
5280 #if (_WIN32_WINNT >= 0x0501)
5281 template <class TBase>
MapHTREEITEMToAccID()5282 inline UINT CTreeItemT<TBase>::MapHTREEITEMToAccID() const
5283 {
5284 	ATLASSERT(m_pTreeView != NULL);
5285 	return m_pTreeView->MapHTREEITEMToAccID(m_hTreeItem);
5286 }
5287 #endif // (_WIN32_WINNT >= 0x0501)
5288 
5289 #if (_WIN32_WINNT >= 0x0600)
5290 template <class TBase>
ShowInfoTip()5291 inline void CTreeItemT<TBase>::ShowInfoTip()
5292 {
5293 	ATLASSERT(m_pTreeView != NULL);
5294 	m_pTreeView->ShowInfoTip(m_hTreeItem);
5295 }
5296 
5297 template <class TBase>
GetPartRect(TVITEMPART partID,LPRECT lpRect)5298 inline BOOL CTreeItemT<TBase>::GetPartRect(TVITEMPART partID, LPRECT lpRect) const
5299 {
5300 	ATLASSERT(m_pTreeView != NULL);
5301 	return m_pTreeView->GetItemPartRect(m_hTreeItem, partID, lpRect);
5302 }
5303 #endif // (_WIN32_WINNT >= 0x0600)
5304 
5305 
5306 ///////////////////////////////////////////////////////////////////////////////
5307 // CToolBarCtrl
5308 
5309 template <class TBase>
5310 class CToolBarCtrlT : public TBase
5311 {
5312 public:
5313 // Construction
TBase(hWnd)5314 	CToolBarCtrlT(HWND hWnd = NULL) : TBase(hWnd)
5315 	{ }
5316 
5317 	CToolBarCtrlT< TBase >& operator =(HWND hWnd)
5318 	{
5319 		m_hWnd = hWnd;
5320 		return *this;
5321 	}
5322 
5323 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
5324 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
5325 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
5326 	{
5327 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
5328 	}
5329 
5330 // Attributes
GetWndClassName()5331 	static LPCTSTR GetWndClassName()
5332 	{
5333 		return TOOLBARCLASSNAME;
5334 	}
5335 
IsButtonEnabled(int nID)5336 	BOOL IsButtonEnabled(int nID) const
5337 	{
5338 		ATLASSERT(::IsWindow(m_hWnd));
5339 		return (BOOL)::SendMessage(m_hWnd, TB_ISBUTTONENABLED, nID, 0L);
5340 	}
5341 
IsButtonChecked(int nID)5342 	BOOL IsButtonChecked(int nID) const
5343 	{
5344 		ATLASSERT(::IsWindow(m_hWnd));
5345 		return (BOOL)::SendMessage(m_hWnd, TB_ISBUTTONCHECKED, nID, 0L);
5346 	}
5347 
IsButtonPressed(int nID)5348 	BOOL IsButtonPressed(int nID) const
5349 	{
5350 		ATLASSERT(::IsWindow(m_hWnd));
5351 		return (BOOL)::SendMessage(m_hWnd, TB_ISBUTTONPRESSED, nID, 0L);
5352 	}
5353 
IsButtonHidden(int nID)5354 	BOOL IsButtonHidden(int nID) const
5355 	{
5356 		ATLASSERT(::IsWindow(m_hWnd));
5357 		return(BOOL) ::SendMessage(m_hWnd, TB_ISBUTTONHIDDEN, nID, 0L);
5358 	}
5359 
IsButtonIndeterminate(int nID)5360 	BOOL IsButtonIndeterminate(int nID) const
5361 	{
5362 		ATLASSERT(::IsWindow(m_hWnd));
5363 		return (BOOL)::SendMessage(m_hWnd, TB_ISBUTTONINDETERMINATE, nID, 0L);
5364 	}
5365 
GetState(int nID)5366 	int GetState(int nID) const
5367 	{
5368 		ATLASSERT(::IsWindow(m_hWnd));
5369 		return (int)::SendMessage(m_hWnd, TB_GETSTATE, nID, 0L);
5370 	}
5371 
SetState(int nID,UINT nState)5372 	BOOL SetState(int nID, UINT nState)
5373 	{
5374 		ATLASSERT(::IsWindow(m_hWnd));
5375 		return (BOOL)::SendMessage(m_hWnd, TB_SETSTATE, nID, MAKELPARAM(nState, 0));
5376 	}
5377 
GetButton(int nIndex,LPTBBUTTON lpButton)5378 	BOOL GetButton(int nIndex, LPTBBUTTON lpButton) const
5379 	{
5380 		ATLASSERT(::IsWindow(m_hWnd));
5381 		return (BOOL)::SendMessage(m_hWnd, TB_GETBUTTON, nIndex, (LPARAM)lpButton);
5382 	}
5383 
GetButtonCount()5384 	int GetButtonCount() const
5385 	{
5386 		ATLASSERT(::IsWindow(m_hWnd));
5387 		return (int)::SendMessage(m_hWnd, TB_BUTTONCOUNT, 0, 0L);
5388 	}
5389 
GetItemRect(int nIndex,LPRECT lpRect)5390 	BOOL GetItemRect(int nIndex, LPRECT lpRect) const
5391 	{
5392 		ATLASSERT(::IsWindow(m_hWnd));
5393 		return (BOOL)::SendMessage(m_hWnd, TB_GETITEMRECT, nIndex, (LPARAM)lpRect);
5394 	}
5395 
5396 	void SetButtonStructSize(int nSize = sizeof(TBBUTTON))
5397 	{
5398 		ATLASSERT(::IsWindow(m_hWnd));
5399 		::SendMessage(m_hWnd, TB_BUTTONSTRUCTSIZE, nSize, 0L);
5400 	}
5401 
SetButtonSize(SIZE size)5402 	BOOL SetButtonSize(SIZE size)
5403 	{
5404 		ATLASSERT(::IsWindow(m_hWnd));
5405 		return (BOOL)::SendMessage(m_hWnd, TB_SETBUTTONSIZE, 0, MAKELPARAM(size.cx, size.cy));
5406 	}
5407 
SetButtonSize(int cx,int cy)5408 	BOOL SetButtonSize(int cx, int cy)
5409 	{
5410 		ATLASSERT(::IsWindow(m_hWnd));
5411 		return (BOOL)::SendMessage(m_hWnd, TB_SETBUTTONSIZE, 0, MAKELPARAM(cx, cy));
5412 	}
5413 
SetBitmapSize(SIZE size)5414 	BOOL SetBitmapSize(SIZE size)
5415 	{
5416 		ATLASSERT(::IsWindow(m_hWnd));
5417 		return (BOOL)::SendMessage(m_hWnd, TB_SETBITMAPSIZE, 0, MAKELPARAM(size.cx, size.cy));
5418 	}
5419 
SetBitmapSize(int cx,int cy)5420 	BOOL SetBitmapSize(int cx, int cy)
5421 	{
5422 		ATLASSERT(::IsWindow(m_hWnd));
5423 		return (BOOL)::SendMessage(m_hWnd, TB_SETBITMAPSIZE, 0, MAKELPARAM(cx, cy));
5424 	}
5425 
5426 #ifndef _WIN32_WCE
GetToolTips()5427 	CToolTipCtrl GetToolTips() const
5428 	{
5429 		ATLASSERT(::IsWindow(m_hWnd));
5430 		return CToolTipCtrl((HWND)::SendMessage(m_hWnd, TB_GETTOOLTIPS, 0, 0L));
5431 	}
5432 
SetToolTips(HWND hWndToolTip)5433 	void SetToolTips(HWND hWndToolTip)
5434 	{
5435 		ATLASSERT(::IsWindow(m_hWnd));
5436 		::SendMessage(m_hWnd, TB_SETTOOLTIPS, (WPARAM)hWndToolTip, 0L);
5437 	}
5438 #endif // !_WIN32_WCE
5439 
SetNotifyWnd(HWND hWnd)5440 	void SetNotifyWnd(HWND hWnd)
5441 	{
5442 		ATLASSERT(::IsWindow(m_hWnd));
5443 		::SendMessage(m_hWnd, TB_SETPARENT, (WPARAM)hWnd, 0L);
5444 	}
5445 
GetRows()5446 	int GetRows() const
5447 	{
5448 		ATLASSERT(::IsWindow(m_hWnd));
5449 		return (int)::SendMessage(m_hWnd, TB_GETROWS, 0, 0L);
5450 	}
5451 
SetRows(int nRows,BOOL bLarger,LPRECT lpRect)5452 	void SetRows(int nRows, BOOL bLarger, LPRECT lpRect)
5453 	{
5454 		ATLASSERT(::IsWindow(m_hWnd));
5455 		::SendMessage(m_hWnd, TB_SETROWS, MAKELPARAM(nRows, bLarger), (LPARAM)lpRect);
5456 	}
5457 
SetCmdID(int nIndex,UINT nID)5458 	BOOL SetCmdID(int nIndex, UINT nID)
5459 	{
5460 		ATLASSERT(::IsWindow(m_hWnd));
5461 		return (BOOL)::SendMessage(m_hWnd, TB_SETCMDID, nIndex, nID);
5462 	}
5463 
GetBitmapFlags()5464 	DWORD GetBitmapFlags() const
5465 	{
5466 		ATLASSERT(::IsWindow(m_hWnd));
5467 		return (DWORD)::SendMessage(m_hWnd, TB_GETBITMAPFLAGS, 0, 0L);
5468 	}
5469 
GetBitmap(int nID)5470 	int GetBitmap(int nID) const
5471 	{
5472 		ATLASSERT(::IsWindow(m_hWnd));
5473 		return (int)::SendMessage(m_hWnd, TB_GETBITMAP, nID, 0L);
5474 	}
5475 
GetButtonText(int nID,LPTSTR lpstrText)5476 	int GetButtonText(int nID, LPTSTR lpstrText) const
5477 	{
5478 		ATLASSERT(::IsWindow(m_hWnd));
5479 		return (int)::SendMessage(m_hWnd, TB_GETBUTTONTEXT, nID, (LPARAM)lpstrText);
5480 	}
5481 
5482 	// nIndex - IE5 or higher only
5483 	CImageList GetImageList(int nIndex = 0) const
5484 	{
5485 		ATLASSERT(::IsWindow(m_hWnd));
5486 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_GETIMAGELIST, nIndex, 0L));
5487 	}
5488 
5489 	// nIndex - IE5 or higher only
5490 	CImageList SetImageList(HIMAGELIST hImageList, int nIndex = 0)
5491 	{
5492 		ATLASSERT(::IsWindow(m_hWnd));
5493 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_SETIMAGELIST, nIndex, (LPARAM)hImageList));
5494 	}
5495 
5496 	// nIndex - IE5 or higher only
5497 	CImageList GetDisabledImageList(int nIndex = 0) const
5498 	{
5499 		ATLASSERT(::IsWindow(m_hWnd));
5500 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_GETDISABLEDIMAGELIST, nIndex, 0L));
5501 	}
5502 
5503 	// nIndex - IE5 or higher only
5504 	CImageList SetDisabledImageList(HIMAGELIST hImageList, int nIndex = 0)
5505 	{
5506 		ATLASSERT(::IsWindow(m_hWnd));
5507 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_SETDISABLEDIMAGELIST, nIndex, (LPARAM)hImageList));
5508 	}
5509 
5510 #ifndef _WIN32_WCE
5511 	// nIndex - IE5 or higher only
5512 	CImageList GetHotImageList(int nIndex = 0) const
5513 	{
5514 		ATLASSERT(::IsWindow(m_hWnd));
5515 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_GETHOTIMAGELIST, nIndex, 0L));
5516 	}
5517 
5518 	// nIndex - IE5 or higher only
5519 	CImageList SetHotImageList(HIMAGELIST hImageList, int nIndex = 0)
5520 	{
5521 		ATLASSERT(::IsWindow(m_hWnd));
5522 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_SETHOTIMAGELIST, nIndex, (LPARAM)hImageList));
5523 	}
5524 #endif // !_WIN32_WCE
5525 
GetStyle()5526 	DWORD GetStyle() const
5527 	{
5528 		ATLASSERT(::IsWindow(m_hWnd));
5529 		return (DWORD)::SendMessage(m_hWnd, TB_GETSTYLE, 0, 0L);
5530 	}
5531 
SetStyle(DWORD dwStyle)5532 	void SetStyle(DWORD dwStyle)
5533 	{
5534 		ATLASSERT(::IsWindow(m_hWnd));
5535 		::SendMessage(m_hWnd, TB_SETSTYLE, 0, dwStyle);
5536 	}
5537 
GetButtonSize()5538 	DWORD GetButtonSize() const
5539 	{
5540 		ATLASSERT(::IsWindow(m_hWnd));
5541 		return (DWORD)::SendMessage(m_hWnd, TB_GETBUTTONSIZE, 0, 0L);
5542 	}
5543 
GetButtonSize(SIZE & size)5544 	void GetButtonSize(SIZE& size) const
5545 	{
5546 		ATLASSERT(::IsWindow(m_hWnd));
5547 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, TB_GETBUTTONSIZE, 0, 0L);
5548 		size.cx = LOWORD(dwRet);
5549 		size.cy = HIWORD(dwRet);
5550 	}
5551 
GetRect(int nID,LPRECT lpRect)5552 	BOOL GetRect(int nID, LPRECT lpRect) const
5553 	{
5554 		ATLASSERT(::IsWindow(m_hWnd));
5555 		return (BOOL)::SendMessage(m_hWnd, TB_GETRECT, nID, (LPARAM)lpRect);
5556 	}
5557 
GetTextRows()5558 	int GetTextRows() const
5559 	{
5560 		ATLASSERT(::IsWindow(m_hWnd));
5561 		return (int)::SendMessage(m_hWnd, TB_GETTEXTROWS, 0, 0L);
5562 	}
5563 
SetButtonWidth(int cxMin,int cxMax)5564 	BOOL SetButtonWidth(int cxMin, int cxMax)
5565 	{
5566 		ATLASSERT(::IsWindow(m_hWnd));
5567 		return (BOOL)::SendMessage(m_hWnd, TB_SETBUTTONWIDTH, 0, MAKELPARAM(cxMin, cxMax));
5568 	}
5569 
SetIndent(int nIndent)5570 	BOOL SetIndent(int nIndent)
5571 	{
5572 		ATLASSERT(::IsWindow(m_hWnd));
5573 		return (BOOL)::SendMessage(m_hWnd, TB_SETINDENT, nIndent, 0L);
5574 	}
5575 
SetMaxTextRows(int nMaxTextRows)5576 	BOOL SetMaxTextRows(int nMaxTextRows)
5577 	{
5578 		ATLASSERT(::IsWindow(m_hWnd));
5579 		return (BOOL)::SendMessage(m_hWnd, TB_SETMAXTEXTROWS, nMaxTextRows, 0L);
5580 	}
5581 
5582 #if (_WIN32_IE >= 0x0400)
5583 #ifndef _WIN32_WCE
GetAnchorHighlight()5584 	BOOL GetAnchorHighlight() const
5585 	{
5586 		ATLASSERT(::IsWindow(m_hWnd));
5587 		return (BOOL)::SendMessage(m_hWnd, TB_GETANCHORHIGHLIGHT, 0, 0L);
5588 	}
5589 
5590 	BOOL SetAnchorHighlight(BOOL bEnable = TRUE)
5591 	{
5592 		ATLASSERT(::IsWindow(m_hWnd));
5593 		return (BOOL)::SendMessage(m_hWnd, TB_SETANCHORHIGHLIGHT, bEnable, 0L);
5594 	}
5595 #endif // !_WIN32_WCE
5596 
GetButtonInfo(int nID,LPTBBUTTONINFO lptbbi)5597 	int GetButtonInfo(int nID, LPTBBUTTONINFO lptbbi) const
5598 	{
5599 		ATLASSERT(::IsWindow(m_hWnd));
5600 		return (int)::SendMessage(m_hWnd, TB_GETBUTTONINFO, nID, (LPARAM)lptbbi);
5601 	}
5602 
SetButtonInfo(int nID,LPTBBUTTONINFO lptbbi)5603 	BOOL SetButtonInfo(int nID, LPTBBUTTONINFO lptbbi)
5604 	{
5605 		ATLASSERT(::IsWindow(m_hWnd));
5606 		return (BOOL)::SendMessage(m_hWnd, TB_SETBUTTONINFO, nID, (LPARAM)lptbbi);
5607 	}
5608 
SetButtonInfo(int nID,DWORD dwMask,BYTE Style,BYTE State,LPCTSTR lpszItem,int iImage,WORD cx,int iCommand,DWORD_PTR lParam)5609 	BOOL SetButtonInfo(int nID, DWORD dwMask, BYTE Style, BYTE State, LPCTSTR lpszItem,
5610 	                   int iImage, WORD cx, int iCommand, DWORD_PTR lParam)
5611 	{
5612 		ATLASSERT(::IsWindow(m_hWnd));
5613 		TBBUTTONINFO tbbi = { 0 };
5614 		tbbi.cbSize = sizeof(TBBUTTONINFO);
5615 		tbbi.dwMask = dwMask;
5616 		tbbi.idCommand = iCommand;
5617 		tbbi.iImage = iImage;
5618 		tbbi.fsState = State;
5619 		tbbi.fsStyle = Style;
5620 		tbbi.cx = cx;
5621 		tbbi.pszText = (LPTSTR) lpszItem;
5622 		tbbi.lParam = lParam;
5623 		return (BOOL)::SendMessage(m_hWnd, TB_SETBUTTONINFO, nID, (LPARAM)&tbbi);
5624 	}
5625 
5626 #ifndef _WIN32_WCE
GetHotItem()5627 	int GetHotItem() const
5628 	{
5629 		ATLASSERT(::IsWindow(m_hWnd));
5630 		return (int)::SendMessage(m_hWnd, TB_GETHOTITEM, 0, 0L);
5631 	}
5632 
SetHotItem(int nItem)5633 	int SetHotItem(int nItem)
5634 	{
5635 		ATLASSERT(::IsWindow(m_hWnd));
5636 		return (int)::SendMessage(m_hWnd, TB_SETHOTITEM, nItem, 0L);
5637 	}
5638 #endif // !_WIN32_WCE
5639 
IsButtonHighlighted(int nButtonID)5640 	BOOL IsButtonHighlighted(int nButtonID) const
5641 	{
5642 		ATLASSERT(::IsWindow(m_hWnd));
5643 		return (BOOL)::SendMessage(m_hWnd, TB_ISBUTTONHIGHLIGHTED, nButtonID, 0L);
5644 	}
5645 
SetDrawTextFlags(DWORD dwMask,DWORD dwFlags)5646 	DWORD SetDrawTextFlags(DWORD dwMask, DWORD dwFlags)
5647 	{
5648 		ATLASSERT(::IsWindow(m_hWnd));
5649 		return (DWORD)::SendMessage(m_hWnd, TB_SETDRAWTEXTFLAGS, dwMask, dwFlags);
5650 	}
5651 
5652 #ifndef _WIN32_WCE
GetColorScheme(LPCOLORSCHEME lpcs)5653 	BOOL GetColorScheme(LPCOLORSCHEME lpcs) const
5654 	{
5655 		ATLASSERT(::IsWindow(m_hWnd));
5656 		return (BOOL)::SendMessage(m_hWnd, TB_GETCOLORSCHEME, 0, (LPARAM)lpcs);
5657 	}
5658 
SetColorScheme(LPCOLORSCHEME lpcs)5659 	void SetColorScheme(LPCOLORSCHEME lpcs)
5660 	{
5661 		ATLASSERT(::IsWindow(m_hWnd));
5662 		::SendMessage(m_hWnd, TB_SETCOLORSCHEME, 0, (LPARAM)lpcs);
5663 	}
5664 
GetExtendedStyle()5665 	DWORD GetExtendedStyle() const
5666 	{
5667 		ATLASSERT(::IsWindow(m_hWnd));
5668 		return (DWORD)::SendMessage(m_hWnd, TB_GETEXTENDEDSTYLE, 0, 0L);
5669 	}
5670 
SetExtendedStyle(DWORD dwStyle)5671 	DWORD SetExtendedStyle(DWORD dwStyle)
5672 	{
5673 		ATLASSERT(::IsWindow(m_hWnd));
5674 		return (DWORD)::SendMessage(m_hWnd, TB_SETEXTENDEDSTYLE, 0, dwStyle);
5675 	}
5676 
GetInsertMark(LPTBINSERTMARK lptbim)5677 	void GetInsertMark(LPTBINSERTMARK lptbim) const
5678 	{
5679 		ATLASSERT(::IsWindow(m_hWnd));
5680 		::SendMessage(m_hWnd, TB_GETINSERTMARK, 0, (LPARAM)lptbim);
5681 	}
5682 
SetInsertMark(LPTBINSERTMARK lptbim)5683 	void SetInsertMark(LPTBINSERTMARK lptbim)
5684 	{
5685 		ATLASSERT(::IsWindow(m_hWnd));
5686 		::SendMessage(m_hWnd, TB_SETINSERTMARK, 0, (LPARAM)lptbim);
5687 	}
5688 
GetInsertMarkColor()5689 	COLORREF GetInsertMarkColor() const
5690 	{
5691 		ATLASSERT(::IsWindow(m_hWnd));
5692 		return (COLORREF)::SendMessage(m_hWnd, TB_GETINSERTMARKCOLOR, 0, 0L);
5693 	}
5694 
SetInsertMarkColor(COLORREF clr)5695 	COLORREF SetInsertMarkColor(COLORREF clr)
5696 	{
5697 		ATLASSERT(::IsWindow(m_hWnd));
5698 		return (COLORREF)::SendMessage(m_hWnd, TB_SETINSERTMARKCOLOR, 0, (LPARAM)clr);
5699 	}
5700 
GetMaxSize(LPSIZE lpSize)5701 	BOOL GetMaxSize(LPSIZE lpSize) const
5702 	{
5703 		ATLASSERT(::IsWindow(m_hWnd));
5704 		return (BOOL)::SendMessage(m_hWnd, TB_GETMAXSIZE, 0, (LPARAM)lpSize);
5705 	}
5706 
GetPadding(LPSIZE lpSizePadding)5707 	void GetPadding(LPSIZE lpSizePadding) const
5708 	{
5709 		ATLASSERT(::IsWindow(m_hWnd));
5710 		ATLASSERT(lpSizePadding != NULL);
5711 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, TB_GETPADDING, 0, 0L);
5712 		lpSizePadding->cx = GET_X_LPARAM(dwRet);
5713 		lpSizePadding->cy = GET_Y_LPARAM(dwRet);
5714 	}
5715 
5716 	void SetPadding(int cx, int cy, LPSIZE lpSizePadding = NULL)
5717 	{
5718 		ATLASSERT(::IsWindow(m_hWnd));
5719 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, TB_SETPADDING, 0, MAKELPARAM(cx, cy));
5720 		if(lpSizePadding != NULL)
5721 		{
5722 			lpSizePadding->cx = GET_X_LPARAM(dwRet);
5723 			lpSizePadding->cy = GET_Y_LPARAM(dwRet);
5724 		}
5725 	}
5726 
GetUnicodeFormat()5727 	BOOL GetUnicodeFormat() const
5728 	{
5729 		ATLASSERT(::IsWindow(m_hWnd));
5730 		return (BOOL)::SendMessage(m_hWnd, TB_GETUNICODEFORMAT, 0, 0L);
5731 	}
5732 
5733 	BOOL SetUnicodeFormat(BOOL bUnicode = TRUE)
5734 	{
5735 		ATLASSERT(::IsWindow(m_hWnd));
5736 		return (BOOL)::SendMessage(m_hWnd, TB_SETUNICODEFORMAT, bUnicode, 0L);
5737 	}
5738 #endif // !_WIN32_WCE
5739 #endif // (_WIN32_IE >= 0x0400)
5740 
5741 #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
GetString(int nString,LPTSTR lpstrString,int cchMaxLen)5742 	int GetString(int nString, LPTSTR lpstrString, int cchMaxLen) const
5743 	{
5744 		ATLASSERT(::IsWindow(m_hWnd));
5745 		return (int)::SendMessage(m_hWnd, TB_GETSTRING, MAKEWPARAM(cchMaxLen, nString), (LPARAM)lpstrString);
5746 	}
5747 
GetStringBSTR(int nString,BSTR & bstrString)5748 	int GetStringBSTR(int nString, BSTR& bstrString) const
5749 	{
5750 		USES_CONVERSION;
5751 		ATLASSERT(::IsWindow(m_hWnd));
5752 		ATLASSERT(bstrString == NULL);
5753 		int nLength = (int)(short)LOWORD(::SendMessage(m_hWnd, TB_GETSTRING, MAKEWPARAM(0, nString), NULL));
5754 		if(nLength != -1)
5755 		{
5756 			CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;
5757 			LPTSTR lpstrText = buff.Allocate(nLength + 1);
5758 			if(lpstrText != NULL)
5759 			{
5760 				nLength = (int)::SendMessage(m_hWnd, TB_GETSTRING, MAKEWPARAM(nLength + 1, nString), (LPARAM)lpstrText);
5761 				if(nLength != -1)
5762 					bstrString = ::SysAllocString(T2OLE(lpstrText));
5763 			}
5764 			else
5765 			{
5766 				nLength = -1;
5767 			}
5768 		}
5769 
5770 		return nLength;
5771 	}
5772 
5773 #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
GetString(int nString,_CSTRING_NS::CString & str)5774 	int GetString(int nString, _CSTRING_NS::CString& str) const
5775 	{
5776 		ATLASSERT(::IsWindow(m_hWnd));
5777 		int nLength = (int)(short)LOWORD(::SendMessage(m_hWnd, TB_GETSTRING, MAKEWPARAM(0, nString), NULL));
5778 		if(nLength != -1)
5779 		{
5780 			LPTSTR lpstr = str.GetBufferSetLength(nLength + 1);
5781 			if(lpstr != NULL)
5782 				nLength = (int)::SendMessage(m_hWnd, TB_GETSTRING, MAKEWPARAM(nLength + 1, nString), (LPARAM)lpstr);
5783 			else
5784 				nLength = -1;
5785 			str.ReleaseBuffer();
5786 		}
5787 		return nLength;
5788 	}
5789 #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
5790 #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
5791 
5792 #if (_WIN32_WINNT >= 0x0501)
GetMetrics(LPTBMETRICS lptbm)5793 	void GetMetrics(LPTBMETRICS lptbm) const
5794 	{
5795 		ATLASSERT(::IsWindow(m_hWnd));
5796 		::SendMessage(m_hWnd, TB_GETMETRICS, 0, (LPARAM)lptbm);
5797 	}
5798 
SetMetrics(LPTBMETRICS lptbm)5799 	void SetMetrics(LPTBMETRICS lptbm)
5800 	{
5801 		ATLASSERT(::IsWindow(m_hWnd));
5802 		::SendMessage(m_hWnd, TB_SETMETRICS, 0, (LPARAM)lptbm);
5803 	}
5804 
SetWindowTheme(LPCWSTR lpstrTheme)5805 	void SetWindowTheme(LPCWSTR lpstrTheme)
5806 	{
5807 		ATLASSERT(::IsWindow(m_hWnd));
5808 		::SendMessage(m_hWnd, TB_SETWINDOWTHEME, 0, (LPARAM)lpstrTheme);
5809 	}
5810 #endif // (_WIN32_WINNT >= 0x0501)
5811 
5812 #if (_WIN32_WINNT >= 0x0600)
5813 	CImageList GetPressedImageList(int nIndex = 0) const
5814 	{
5815 		ATLASSERT(::IsWindow(m_hWnd));
5816 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_GETPRESSEDIMAGELIST, nIndex, 0L));
5817 	}
5818 
5819 	CImageList SetPressedImageList(HIMAGELIST hImageList, int nIndex = 0)
5820 	{
5821 		ATLASSERT(::IsWindow(m_hWnd));
5822 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_SETPRESSEDIMAGELIST, nIndex, (LPARAM)hImageList));
5823 	}
5824 
GetItemDropDownRect(int nIndex,LPRECT lpRect)5825 	void GetItemDropDownRect(int nIndex, LPRECT lpRect) const
5826 	{
5827 #ifndef TB_GETITEMDROPDOWNRECT
5828 		const int TB_GETITEMDROPDOWNRECT = WM_USER + 103;
5829 #endif
5830 		ATLASSERT(::IsWindow(m_hWnd));
5831 		BOOL bRet = (BOOL)::SendMessage(m_hWnd, TB_GETITEMDROPDOWNRECT, nIndex, (LPARAM)lpRect);
5832 		bRet;   // avoid level 4 warning
5833 		ATLASSERT(bRet != FALSE);
5834 	}
5835 #endif // (_WIN32_WINNT >= 0x0600)
5836 
5837 // Operations
5838 	BOOL EnableButton(int nID, BOOL bEnable = TRUE)
5839 	{
5840 		ATLASSERT(::IsWindow(m_hWnd));
5841 		return (BOOL)::SendMessage(m_hWnd, TB_ENABLEBUTTON, nID, MAKELPARAM(bEnable, 0));
5842 	}
5843 
5844 	BOOL CheckButton(int nID, BOOL bCheck = TRUE)
5845 	{
5846 		ATLASSERT(::IsWindow(m_hWnd));
5847 		return (BOOL)::SendMessage(m_hWnd, TB_CHECKBUTTON, nID, MAKELPARAM(bCheck, 0));
5848 	}
5849 
5850 	BOOL PressButton(int nID, BOOL bPress = TRUE)
5851 	{
5852 		ATLASSERT(::IsWindow(m_hWnd));
5853 		return (BOOL)::SendMessage(m_hWnd, TB_PRESSBUTTON, nID, MAKELPARAM(bPress, 0));
5854 	}
5855 
5856 	BOOL HideButton(int nID, BOOL bHide = TRUE)
5857 	{
5858 		ATLASSERT(::IsWindow(m_hWnd));
5859 		return (BOOL)::SendMessage(m_hWnd, TB_HIDEBUTTON, nID, MAKELPARAM(bHide, 0));
5860 	}
5861 
5862 	BOOL Indeterminate(int nID, BOOL bIndeterminate = TRUE)
5863 	{
5864 		ATLASSERT(::IsWindow(m_hWnd));
5865 		return (BOOL)::SendMessage(m_hWnd, TB_INDETERMINATE, nID, MAKELPARAM(bIndeterminate, 0));
5866 	}
5867 
AddBitmap(int nNumButtons,UINT nBitmapID)5868 	int AddBitmap(int nNumButtons, UINT nBitmapID)
5869 	{
5870 		ATLASSERT(::IsWindow(m_hWnd));
5871 		TBADDBITMAP tbab = { 0 };
5872 		tbab.hInst = ModuleHelper::GetResourceInstance();
5873 		ATLASSERT(tbab.hInst != NULL);
5874 		tbab.nID = nBitmapID;
5875 		return (int)::SendMessage(m_hWnd, TB_ADDBITMAP, (WPARAM)nNumButtons, (LPARAM)&tbab);
5876 	}
5877 
AddBitmap(int nNumButtons,HBITMAP hBitmap)5878 	int AddBitmap(int nNumButtons, HBITMAP hBitmap)
5879 	{
5880 		ATLASSERT(::IsWindow(m_hWnd));
5881 		TBADDBITMAP tbab = { 0 };
5882 		tbab.hInst = NULL;
5883 		tbab.nID = (UINT_PTR)hBitmap;
5884 		return (int)::SendMessage(m_hWnd, TB_ADDBITMAP, (WPARAM)nNumButtons, (LPARAM)&tbab);
5885 	}
5886 
AddButtons(int nNumButtons,LPTBBUTTON lpButtons)5887 	BOOL AddButtons(int nNumButtons, LPTBBUTTON lpButtons)
5888 	{
5889 		ATLASSERT(::IsWindow(m_hWnd));
5890 		return (BOOL)::SendMessage(m_hWnd, TB_ADDBUTTONS, nNumButtons, (LPARAM)lpButtons);
5891 	}
5892 
InsertButton(int nIndex,LPTBBUTTON lpButton)5893 	BOOL InsertButton(int nIndex, LPTBBUTTON lpButton)
5894 	{
5895 		ATLASSERT(::IsWindow(m_hWnd));
5896 		return (BOOL)::SendMessage(m_hWnd, TB_INSERTBUTTON, nIndex, (LPARAM)lpButton);
5897 	}
5898 
InsertButton(int nIndex,int iCommand,BYTE Style,BYTE State,int iBitmap,INT_PTR iString,DWORD_PTR lParam)5899 	BOOL InsertButton(int nIndex, int iCommand, BYTE Style, BYTE State, int iBitmap,
5900 	                  INT_PTR iString, DWORD_PTR lParam)
5901 	{
5902 		ATLASSERT(::IsWindow(m_hWnd));
5903 		TBBUTTON tbb = { 0 };
5904 		tbb.fsStyle = Style;
5905 		tbb.fsState = State;
5906 		tbb.idCommand = iCommand;
5907 		tbb.iBitmap = iBitmap;
5908 		tbb.iString = iString;
5909 		tbb.dwData = lParam;
5910 		return (BOOL)::SendMessage(m_hWnd, TB_INSERTBUTTON, nIndex, (LPARAM)&tbb);
5911 	}
5912 
InsertButton(int nIndex,int iCommand,BYTE Style,BYTE State,int iBitmap,LPCTSTR lpszItem,DWORD_PTR lParam)5913 	BOOL InsertButton(int nIndex, int iCommand, BYTE Style, BYTE State, int iBitmap,
5914 	                  LPCTSTR lpszItem, DWORD_PTR lParam)
5915 	{
5916 		return InsertButton(nIndex, iCommand, Style, State, iBitmap, (INT_PTR)lpszItem, lParam);
5917 	}
5918 
AddButton(LPTBBUTTON lpButton)5919 	BOOL AddButton(LPTBBUTTON lpButton)
5920 	{
5921 		return InsertButton(-1, lpButton);
5922 	}
5923 
AddButton(int iCommand,BYTE Style,BYTE State,int iBitmap,INT_PTR iString,DWORD_PTR lParam)5924 	BOOL AddButton(int iCommand, BYTE Style, BYTE State, int iBitmap, INT_PTR iString, DWORD_PTR lParam)
5925 	{
5926 		return InsertButton(-1, iCommand, Style, State, iBitmap, iString, lParam);
5927 	}
5928 
AddButton(int iCommand,BYTE Style,BYTE State,int iBitmap,LPCTSTR lpszItem,DWORD_PTR lParam)5929 	BOOL AddButton(int iCommand, BYTE Style, BYTE State, int iBitmap, LPCTSTR lpszItem, DWORD_PTR lParam)
5930 	{
5931 		return InsertButton(-1, iCommand, Style, State, iBitmap, lpszItem, lParam);
5932 	}
5933 
DeleteButton(int nIndex)5934 	BOOL DeleteButton(int nIndex)
5935 	{
5936 		ATLASSERT(::IsWindow(m_hWnd));
5937 		return (BOOL)::SendMessage(m_hWnd, TB_DELETEBUTTON, nIndex, 0L);
5938 	}
5939 
5940 	BOOL InsertSeparator(int nIndex, int cxWidth = 8)
5941 	{
5942 		return InsertButton(nIndex, 0, BTNS_SEP, 0, cxWidth, (INT_PTR)0, 0);
5943 	}
5944 
5945 	BOOL AddSeparator(int cxWidth = 8)
5946 	{
5947 		return AddButton(0, BTNS_SEP, 0, cxWidth, (INT_PTR)0, 0);
5948 	}
5949 
CommandToIndex(UINT nID)5950 	int CommandToIndex(UINT nID) const
5951 	{
5952 		ATLASSERT(::IsWindow(m_hWnd));
5953 		return (int)::SendMessage(m_hWnd, TB_COMMANDTOINDEX, nID, 0L);
5954 	}
5955 
5956 #ifndef _WIN32_WCE
SaveState(HKEY hKeyRoot,LPCTSTR lpszSubKey,LPCTSTR lpszValueName)5957 	void SaveState(HKEY hKeyRoot, LPCTSTR lpszSubKey, LPCTSTR lpszValueName)
5958 	{
5959 		ATLASSERT(::IsWindow(m_hWnd));
5960 		TBSAVEPARAMS tbs = { 0 };
5961 		tbs.hkr = hKeyRoot;
5962 		tbs.pszSubKey = lpszSubKey;
5963 		tbs.pszValueName = lpszValueName;
5964 		::SendMessage(m_hWnd, TB_SAVERESTORE, (WPARAM)TRUE, (LPARAM)&tbs);
5965 	}
5966 
RestoreState(HKEY hKeyRoot,LPCTSTR lpszSubKey,LPCTSTR lpszValueName)5967 	void RestoreState(HKEY hKeyRoot, LPCTSTR lpszSubKey, LPCTSTR lpszValueName)
5968 	{
5969 		ATLASSERT(::IsWindow(m_hWnd));
5970 		TBSAVEPARAMS tbs = { 0 };
5971 		tbs.hkr = hKeyRoot;
5972 		tbs.pszSubKey = lpszSubKey;
5973 		tbs.pszValueName = lpszValueName;
5974 		::SendMessage(m_hWnd, TB_SAVERESTORE, (WPARAM)FALSE, (LPARAM)&tbs);
5975 	}
5976 
Customize()5977 	void Customize()
5978 	{
5979 		ATLASSERT(::IsWindow(m_hWnd));
5980 		::SendMessage(m_hWnd, TB_CUSTOMIZE, 0, 0L);
5981 	}
5982 #endif // !_WIN32_WCE
5983 
AddString(UINT nStringID)5984 	int AddString(UINT nStringID)
5985 	{
5986 		ATLASSERT(::IsWindow(m_hWnd));
5987 		return (int)::SendMessage(m_hWnd, TB_ADDSTRING, (WPARAM)ModuleHelper::GetResourceInstance(), (LPARAM)nStringID);
5988 	}
5989 
AddStrings(LPCTSTR lpszStrings)5990 	int AddStrings(LPCTSTR lpszStrings)
5991 	{
5992 		ATLASSERT(::IsWindow(m_hWnd));
5993 		return (int)::SendMessage(m_hWnd, TB_ADDSTRING, 0, (LPARAM)lpszStrings);
5994 	}
5995 
AutoSize()5996 	void AutoSize()
5997 	{
5998 		ATLASSERT(::IsWindow(m_hWnd));
5999 		::SendMessage(m_hWnd, TB_AUTOSIZE, 0, 0L);
6000 	}
6001 
ChangeBitmap(int nID,int nBitmap)6002 	BOOL ChangeBitmap(int nID, int nBitmap)
6003 	{
6004 		ATLASSERT(::IsWindow(m_hWnd));
6005 		return (BOOL)::SendMessage(m_hWnd, TB_CHANGEBITMAP, nID, MAKELPARAM(nBitmap, 0));
6006 	}
6007 
LoadImages(int nBitmapID)6008 	int LoadImages(int nBitmapID)
6009 	{
6010 		ATLASSERT(::IsWindow(m_hWnd));
6011 		return (int)::SendMessage(m_hWnd, TB_LOADIMAGES, nBitmapID, (LPARAM)ModuleHelper::GetResourceInstance());
6012 	}
6013 
LoadStdImages(int nBitmapID)6014 	int LoadStdImages(int nBitmapID)
6015 	{
6016 		ATLASSERT(::IsWindow(m_hWnd));
6017 		return (int)::SendMessage(m_hWnd, TB_LOADIMAGES, nBitmapID, (LPARAM)HINST_COMMCTRL);
6018 	}
6019 
ReplaceBitmap(LPTBREPLACEBITMAP ptbrb)6020 	BOOL ReplaceBitmap(LPTBREPLACEBITMAP ptbrb)
6021 	{
6022 		ATLASSERT(::IsWindow(m_hWnd));
6023 		return (BOOL)::SendMessage(m_hWnd, TB_REPLACEBITMAP, 0, (LPARAM)ptbrb);
6024 	}
6025 
6026 #if (_WIN32_IE >= 0x0400)
HitTest(LPPOINT lpPoint)6027 	int HitTest(LPPOINT lpPoint) const
6028 	{
6029 		ATLASSERT(::IsWindow(m_hWnd));
6030 		return (int)::SendMessage(m_hWnd, TB_HITTEST, 0, (LPARAM)lpPoint);
6031 	}
6032 
6033 #ifndef _WIN32_WCE
InsertMarkHitTest(LPPOINT lpPoint,LPTBINSERTMARK lptbim)6034 	BOOL InsertMarkHitTest(LPPOINT lpPoint, LPTBINSERTMARK lptbim) const
6035 	{
6036 		ATLASSERT(::IsWindow(m_hWnd));
6037 		return (BOOL)::SendMessage(m_hWnd, TB_INSERTMARKHITTEST, (WPARAM)lpPoint, (LPARAM)lptbim);
6038 	}
6039 
InsertMarkHitTest(int x,int y,LPTBINSERTMARK lptbim)6040 	BOOL InsertMarkHitTest(int x, int y, LPTBINSERTMARK lptbim) const
6041 	{
6042 		ATLASSERT(::IsWindow(m_hWnd));
6043 		POINT pt = { x, y };
6044 		return (BOOL)::SendMessage(m_hWnd, TB_INSERTMARKHITTEST, (WPARAM)&pt, (LPARAM)lptbim);
6045 	}
6046 
MapAccelerator(TCHAR chAccel,int & nID)6047 	BOOL MapAccelerator(TCHAR chAccel, int& nID) const
6048 	{
6049 		ATLASSERT(::IsWindow(m_hWnd));
6050 		return (BOOL)::SendMessage(m_hWnd, TB_MAPACCELERATOR, (WPARAM)chAccel, (LPARAM)&nID);
6051 	}
6052 
6053 	BOOL MarkButton(int nID, BOOL bHighlight = TRUE)
6054 	{
6055 		ATLASSERT(::IsWindow(m_hWnd));
6056 		return (BOOL)::SendMessage(m_hWnd, TB_MARKBUTTON, nID, MAKELPARAM(bHighlight, 0));
6057 	}
6058 
MoveButton(int nOldPos,int nNewPos)6059 	BOOL MoveButton(int nOldPos, int nNewPos)
6060 	{
6061 		ATLASSERT(::IsWindow(m_hWnd));
6062 		return (BOOL)::SendMessage(m_hWnd, TB_MOVEBUTTON, nOldPos, nNewPos);
6063 	}
6064 
GetObject(REFIID iid,LPVOID * ppvObject)6065 	HRESULT GetObject(REFIID iid, LPVOID* ppvObject)
6066 	{
6067 		ATLASSERT(::IsWindow(m_hWnd));
6068 		return (HRESULT)::SendMessage(m_hWnd, TB_GETOBJECT, (WPARAM)&iid, (LPARAM)ppvObject);
6069 	}
6070 #endif // !_WIN32_WCE
6071 #endif // (_WIN32_IE >= 0x0400)
6072 };
6073 
6074 typedef CToolBarCtrlT<ATL::CWindow>   CToolBarCtrl;
6075 
6076 
6077 ///////////////////////////////////////////////////////////////////////////////
6078 // CStatusBarCtrl
6079 
6080 template <class TBase>
6081 class CStatusBarCtrlT : public TBase
6082 {
6083 public:
6084 // Constructors
TBase(hWnd)6085 	CStatusBarCtrlT(HWND hWnd = NULL) : TBase(hWnd)
6086 	{ }
6087 
6088 	CStatusBarCtrlT< TBase >& operator =(HWND hWnd)
6089 	{
6090 		m_hWnd = hWnd;
6091 		return *this;
6092 	}
6093 
6094 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
6095 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
6096 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
6097 	{
6098 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
6099 	}
6100 
6101 // Methods
GetWndClassName()6102 	static LPCTSTR GetWndClassName()
6103 	{
6104 		return STATUSCLASSNAME;
6105 	}
6106 
GetParts(int nParts,int * pParts)6107 	int GetParts(int nParts, int* pParts) const
6108 	{
6109 		ATLASSERT(::IsWindow(m_hWnd));
6110 		return (int)::SendMessage(m_hWnd, SB_GETPARTS, nParts, (LPARAM)pParts);
6111 	}
6112 
SetParts(int nParts,int * pWidths)6113 	BOOL SetParts(int nParts, int* pWidths)
6114 	{
6115 		ATLASSERT(::IsWindow(m_hWnd));
6116 		return (BOOL)::SendMessage(m_hWnd, SB_SETPARTS, nParts, (LPARAM)pWidths);
6117 	}
6118 
6119 	int GetTextLength(int nPane, int* pType = NULL) const
6120 	{
6121 		ATLASSERT(::IsWindow(m_hWnd));
6122 		ATLASSERT(nPane < 256);
6123 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, SB_GETTEXTLENGTH, (WPARAM)nPane, 0L);
6124 		if (pType != NULL)
6125 			*pType = (int)(short)HIWORD(dwRet);
6126 		return (int)(short)LOWORD(dwRet);
6127 	}
6128 
6129 	int GetText(int nPane, LPTSTR lpszText, int* pType = NULL) const
6130 	{
6131 		ATLASSERT(::IsWindow(m_hWnd));
6132 		ATLASSERT(nPane < 256);
6133 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, SB_GETTEXT, (WPARAM)nPane, (LPARAM)lpszText);
6134 		if(pType != NULL)
6135 			*pType = (int)(short)HIWORD(dwRet);
6136 		return (int)(short)LOWORD(dwRet);
6137 	}
6138 
6139 #ifndef _ATL_NO_COM
6140 	BOOL GetTextBSTR(int nPane, BSTR& bstrText, int* pType = NULL) const
6141 	{
6142 		USES_CONVERSION;
6143 		ATLASSERT(::IsWindow(m_hWnd));
6144 		ATLASSERT(nPane < 256);
6145 		ATLASSERT(bstrText == NULL);
6146 		int nLength = (int)(short)LOWORD(::SendMessage(m_hWnd, SB_GETTEXTLENGTH, (WPARAM)nPane, 0L));
6147 		if(nLength == 0)
6148 			return FALSE;
6149 
6150 		CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;
6151 		LPTSTR lpstrText = buff.Allocate(nLength + 1);
6152 		if(lpstrText == NULL)
6153 			return FALSE;
6154 
6155 		if(!GetText(nPane, lpstrText, pType))
6156 			return FALSE;
6157 
6158 		bstrText = ::SysAllocString(T2OLE(lpstrText));
6159 		return (bstrText != NULL) ? TRUE : FALSE;
6160 	}
6161 #endif // !_ATL_NO_COM
6162 
6163 #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
6164 	int GetText(int nPane, _CSTRING_NS::CString& strText, int* pType = NULL) const
6165 	{
6166 		ATLASSERT(::IsWindow(m_hWnd));
6167 		ATLASSERT(nPane < 256);
6168 		int nLength = (int)(short)LOWORD(::SendMessage(m_hWnd, SB_GETTEXTLENGTH, (WPARAM)nPane, 0L));
6169 		if(nLength == 0)
6170 			return 0;
6171 
6172 		LPTSTR lpstr = strText.GetBufferSetLength(nLength);
6173 		if(lpstr == NULL)
6174 			return 0;
6175 		return GetText(nPane, lpstr, pType);
6176 	}
6177 #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
6178 
6179 	BOOL SetText(int nPane, LPCTSTR lpszText, int nType = 0)
6180 	{
6181 		ATLASSERT(::IsWindow(m_hWnd));
6182 		ATLASSERT(nPane < 256);
6183 		return (BOOL)::SendMessage(m_hWnd, SB_SETTEXT, (nPane | nType), (LPARAM)lpszText);
6184 	}
6185 
GetRect(int nPane,LPRECT lpRect)6186 	BOOL GetRect(int nPane, LPRECT lpRect) const
6187 	{
6188 		ATLASSERT(::IsWindow(m_hWnd));
6189 		ATLASSERT(nPane < 256);
6190 		return (BOOL)::SendMessage(m_hWnd, SB_GETRECT, nPane, (LPARAM)lpRect);
6191 	}
6192 
GetBorders(int * pBorders)6193 	BOOL GetBorders(int* pBorders) const
6194 	{
6195 		ATLASSERT(::IsWindow(m_hWnd));
6196 		return (BOOL)::SendMessage(m_hWnd, SB_GETBORDERS, 0, (LPARAM)pBorders);
6197 	}
6198 
GetBorders(int & nHorz,int & nVert,int & nSpacing)6199 	BOOL GetBorders(int& nHorz, int& nVert, int& nSpacing) const
6200 	{
6201 		ATLASSERT(::IsWindow(m_hWnd));
6202 		int borders[3] = { 0, 0, 0 };
6203 		BOOL bResult = (BOOL)::SendMessage(m_hWnd, SB_GETBORDERS, 0, (LPARAM)&borders);
6204 		if(bResult)
6205 		{
6206 			nHorz = borders[0];
6207 			nVert = borders[1];
6208 			nSpacing = borders[2];
6209 		}
6210 		return bResult;
6211 	}
6212 
SetMinHeight(int nMin)6213 	void SetMinHeight(int nMin)
6214 	{
6215 		ATLASSERT(::IsWindow(m_hWnd));
6216 		::SendMessage(m_hWnd, SB_SETMINHEIGHT, nMin, 0L);
6217 	}
6218 
6219 	BOOL SetSimple(BOOL bSimple = TRUE)
6220 	{
6221 		ATLASSERT(::IsWindow(m_hWnd));
6222 		return (BOOL)::SendMessage(m_hWnd, SB_SIMPLE, bSimple, 0L);
6223 	}
6224 
IsSimple()6225 	BOOL IsSimple() const
6226 	{
6227 		ATLASSERT(::IsWindow(m_hWnd));
6228 		return (BOOL)::SendMessage(m_hWnd, SB_ISSIMPLE, 0, 0L);
6229 	}
6230 
6231 #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
GetUnicodeFormat()6232 	BOOL GetUnicodeFormat() const
6233 	{
6234 		ATLASSERT(::IsWindow(m_hWnd));
6235 		return (BOOL)::SendMessage(m_hWnd, SB_GETUNICODEFORMAT, 0, 0L);
6236 	}
6237 
6238 	BOOL SetUnicodeFormat(BOOL bUnicode = TRUE)
6239 	{
6240 		ATLASSERT(::IsWindow(m_hWnd));
6241 		return (BOOL)::SendMessage(m_hWnd, SB_SETUNICODEFORMAT, bUnicode, 0L);
6242 	}
6243 
GetTipText(int nPane,LPTSTR lpstrText,int nSize)6244 	void GetTipText(int nPane, LPTSTR lpstrText, int nSize) const
6245 	{
6246 		ATLASSERT(::IsWindow(m_hWnd));
6247 		ATLASSERT(nPane < 256);
6248 		::SendMessage(m_hWnd, SB_GETTIPTEXT, MAKEWPARAM(nPane, nSize), (LPARAM)lpstrText);
6249 	}
6250 
SetTipText(int nPane,LPCTSTR lpstrText)6251 	void SetTipText(int nPane, LPCTSTR lpstrText)
6252 	{
6253 		ATLASSERT(::IsWindow(m_hWnd));
6254 		ATLASSERT(nPane < 256);
6255 		::SendMessage(m_hWnd, SB_SETTIPTEXT, nPane, (LPARAM)lpstrText);
6256 	}
6257 #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
6258 
6259 #if ((_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 0x0500))
SetBkColor(COLORREF clrBk)6260 	COLORREF SetBkColor(COLORREF clrBk)
6261 	{
6262 		ATLASSERT(::IsWindow(m_hWnd));
6263 		return (COLORREF)::SendMessage(m_hWnd, SB_SETBKCOLOR, 0, (LPARAM)clrBk);
6264 	}
6265 
GetIcon(int nPane)6266 	HICON GetIcon(int nPane) const
6267 	{
6268 		ATLASSERT(::IsWindow(m_hWnd));
6269 		ATLASSERT(nPane < 256);
6270 		return (HICON)::SendMessage(m_hWnd, SB_GETICON, nPane, 0L);
6271 	}
6272 
SetIcon(int nPane,HICON hIcon)6273 	BOOL SetIcon(int nPane, HICON hIcon)
6274 	{
6275 		ATLASSERT(::IsWindow(m_hWnd));
6276 		ATLASSERT(nPane < 256);
6277 		return (BOOL)::SendMessage(m_hWnd, SB_SETICON, nPane, (LPARAM)hIcon);
6278 	}
6279 #endif // ((_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 0x0500))
6280 };
6281 
6282 typedef CStatusBarCtrlT<ATL::CWindow>   CStatusBarCtrl;
6283 
6284 
6285 ///////////////////////////////////////////////////////////////////////////////
6286 // CTabCtrl
6287 
6288 template <class TBase>
6289 class CTabCtrlT : public TBase
6290 {
6291 public:
6292 // Constructors
TBase(hWnd)6293 	CTabCtrlT(HWND hWnd = NULL) : TBase(hWnd)
6294 	{ }
6295 
6296 	CTabCtrlT< TBase >& operator =(HWND hWnd)
6297 	{
6298 		m_hWnd = hWnd;
6299 		return *this;
6300 	}
6301 
6302 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
6303 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
6304 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
6305 	{
6306 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
6307 	}
6308 
6309 // Attributes
GetWndClassName()6310 	static LPCTSTR GetWndClassName()
6311 	{
6312 		return WC_TABCONTROL;
6313 	}
6314 
GetImageList()6315 	CImageList GetImageList() const
6316 	{
6317 		ATLASSERT(::IsWindow(m_hWnd));
6318 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TCM_GETIMAGELIST, 0, 0L));
6319 	}
6320 
SetImageList(HIMAGELIST hImageList)6321 	CImageList SetImageList(HIMAGELIST hImageList)
6322 	{
6323 		ATLASSERT(::IsWindow(m_hWnd));
6324 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TCM_SETIMAGELIST, 0, (LPARAM)hImageList));
6325 	}
6326 
GetItemCount()6327 	int GetItemCount() const
6328 	{
6329 		ATLASSERT(::IsWindow(m_hWnd));
6330 		return (int)::SendMessage(m_hWnd, TCM_GETITEMCOUNT, 0, 0L);
6331 	}
6332 
GetItem(int nItem,LPTCITEM pTabCtrlItem)6333 	BOOL GetItem(int nItem, LPTCITEM pTabCtrlItem) const
6334 	{
6335 		ATLASSERT(::IsWindow(m_hWnd));
6336 		return (BOOL)::SendMessage(m_hWnd, TCM_GETITEM, nItem, (LPARAM)pTabCtrlItem);
6337 	}
6338 
SetItem(int nItem,LPTCITEM pTabCtrlItem)6339 	BOOL SetItem(int nItem, LPTCITEM pTabCtrlItem)
6340 	{
6341 		ATLASSERT(::IsWindow(m_hWnd));
6342 		return (BOOL)::SendMessage(m_hWnd, TCM_SETITEM, nItem, (LPARAM)pTabCtrlItem);
6343 	}
6344 
SetItem(int nItem,UINT mask,LPCTSTR lpszItem,DWORD dwState,DWORD dwStateMask,int iImage,LPARAM lParam)6345 	int SetItem(int nItem, UINT mask, LPCTSTR lpszItem, DWORD dwState, DWORD dwStateMask, int iImage, LPARAM lParam)
6346 	{
6347 		ATLASSERT(::IsWindow(m_hWnd));
6348 		TCITEM tci = { 0 };
6349 		tci.mask = mask;
6350 		tci.pszText = (LPTSTR) lpszItem;
6351 		tci.dwState = dwState;
6352 		tci.dwStateMask = dwStateMask;
6353 		tci.iImage = iImage;
6354 		tci.lParam = lParam;
6355 		return (int)::SendMessage(m_hWnd, TCM_SETITEM, nItem, (LPARAM)&tci);
6356 	}
6357 
GetItemRect(int nItem,LPRECT lpRect)6358 	BOOL GetItemRect(int nItem, LPRECT lpRect) const
6359 	{
6360 		ATLASSERT(::IsWindow(m_hWnd));
6361 		return (BOOL)::SendMessage(m_hWnd, TCM_GETITEMRECT, nItem, (LPARAM)lpRect);
6362 	}
6363 
GetCurSel()6364 	int GetCurSel() const
6365 	{
6366 		ATLASSERT(::IsWindow(m_hWnd));
6367 		return (int)::SendMessage(m_hWnd, TCM_GETCURSEL, 0, 0L);
6368 	}
6369 
SetCurSel(int nItem)6370 	int SetCurSel(int nItem)
6371 	{
6372 		ATLASSERT(::IsWindow(m_hWnd));
6373 		return (int)::SendMessage(m_hWnd, TCM_SETCURSEL, nItem, 0L);
6374 	}
6375 
SetItemSize(SIZE size)6376 	SIZE SetItemSize(SIZE size)
6377 	{
6378 		ATLASSERT(::IsWindow(m_hWnd));
6379 		DWORD dwSize = (DWORD)::SendMessage(m_hWnd, TCM_SETITEMSIZE, 0, MAKELPARAM(size.cx, size.cy));
6380 		SIZE sizeRet = { GET_X_LPARAM(dwSize), GET_Y_LPARAM(dwSize) };
6381 		return sizeRet;
6382 	}
6383 
SetItemSize(int cx,int cy)6384 	void SetItemSize(int cx, int cy)
6385 	{
6386 		ATLASSERT(::IsWindow(m_hWnd));
6387 		::SendMessage(m_hWnd, TCM_SETITEMSIZE, 0, MAKELPARAM(cx, cy));
6388 	}
6389 
SetPadding(SIZE size)6390 	void SetPadding(SIZE size)
6391 	{
6392 		ATLASSERT(::IsWindow(m_hWnd));
6393 		::SendMessage(m_hWnd, TCM_SETPADDING, 0, MAKELPARAM(size.cx, size.cy));
6394 	}
6395 
GetRowCount()6396 	int GetRowCount() const
6397 	{
6398 		ATLASSERT(::IsWindow(m_hWnd));
6399 		return (int)::SendMessage(m_hWnd, TCM_GETROWCOUNT, 0, 0L);
6400 	}
6401 
6402 #ifndef _WIN32_WCE
GetToolTips()6403 	CToolTipCtrl GetToolTips() const
6404 	{
6405 		ATLASSERT(::IsWindow(m_hWnd));
6406 		return CToolTipCtrl((HWND)::SendMessage(m_hWnd, TCM_GETTOOLTIPS, 0, 0L));
6407 	}
6408 
6409 	// this method is deprecated, please use GetToolTips
GetTooltips()6410 	CToolTipCtrl GetTooltips() const { return GetToolTips(); }
6411 
SetToolTips(HWND hWndToolTip)6412 	void SetToolTips(HWND hWndToolTip)
6413 	{
6414 		ATLASSERT(::IsWindow(m_hWnd));
6415 		::SendMessage(m_hWnd, TCM_SETTOOLTIPS, (WPARAM)hWndToolTip, 0L);
6416 	}
6417 
6418 	// this method is deprecated, please use SetToolTips
SetTooltips(HWND hWndToolTip)6419 	void SetTooltips(HWND hWndToolTip) { SetToolTips(hWndToolTip); }
6420 
6421 #endif // !_WIN32_WCE
6422 
GetCurFocus()6423 	int GetCurFocus() const
6424 	{
6425 		ATLASSERT(::IsWindow(m_hWnd));
6426 		return (int)::SendMessage(m_hWnd, TCM_GETCURFOCUS, 0, 0L);
6427 	}
6428 
SetCurFocus(int nItem)6429 	void SetCurFocus(int nItem)
6430 	{
6431 		ATLASSERT(::IsWindow(m_hWnd));
6432 		::SendMessage(m_hWnd, TCM_SETCURFOCUS, nItem, 0L);
6433 	}
6434 
SetItemExtra(int cbExtra)6435 	BOOL SetItemExtra(int cbExtra)
6436 	{
6437 		ATLASSERT(::IsWindow(m_hWnd));
6438 		ATLASSERT(GetItemCount() == 0);   // must be empty
6439 		return (BOOL)::SendMessage(m_hWnd, TCM_SETITEMEXTRA, cbExtra, 0L);
6440 	}
6441 
6442 	int SetMinTabWidth(int nWidth = -1)
6443 	{
6444 		ATLASSERT(::IsWindow(m_hWnd));
6445 		return (int)::SendMessage(m_hWnd, TCM_SETMINTABWIDTH, 0, nWidth);
6446 	}
6447 
6448 #if (_WIN32_IE >= 0x0400)
GetExtendedStyle()6449 	DWORD GetExtendedStyle() const
6450 	{
6451 		ATLASSERT(::IsWindow(m_hWnd));
6452 		return (DWORD)::SendMessage(m_hWnd, TCM_GETEXTENDEDSTYLE, 0, 0L);
6453 	}
6454 
SetExtendedStyle(DWORD dwExMask,DWORD dwExStyle)6455 	DWORD SetExtendedStyle(DWORD dwExMask, DWORD dwExStyle)
6456 	{
6457 		ATLASSERT(::IsWindow(m_hWnd));
6458 		return (DWORD)::SendMessage(m_hWnd, TCM_SETEXTENDEDSTYLE, dwExMask, dwExStyle);
6459 	}
6460 
6461 #ifndef _WIN32_WCE
GetUnicodeFormat()6462 	BOOL GetUnicodeFormat() const
6463 	{
6464 		ATLASSERT(::IsWindow(m_hWnd));
6465 		return (BOOL)::SendMessage(m_hWnd, TCM_GETUNICODEFORMAT, 0, 0L);
6466 	}
6467 
6468 	BOOL SetUnicodeFormat(BOOL bUnicode = TRUE)
6469 	{
6470 		ATLASSERT(::IsWindow(m_hWnd));
6471 		return (BOOL)::SendMessage(m_hWnd, TCM_SETUNICODEFORMAT, bUnicode, 0L);
6472 	}
6473 #endif // !_WIN32_WCE
6474 #endif // (_WIN32_IE >= 0x0400)
6475 
6476 // Operations
InsertItem(int nItem,LPTCITEM pTabCtrlItem)6477 	int InsertItem(int nItem, LPTCITEM pTabCtrlItem)
6478 	{
6479 		ATLASSERT(::IsWindow(m_hWnd));
6480 		return (int)::SendMessage(m_hWnd, TCM_INSERTITEM, nItem, (LPARAM)pTabCtrlItem);
6481 	}
6482 
InsertItem(int nItem,UINT mask,LPCTSTR lpszItem,int iImage,LPARAM lParam)6483 	int InsertItem(int nItem, UINT mask, LPCTSTR lpszItem, int iImage, LPARAM lParam)
6484 	{
6485 		ATLASSERT(::IsWindow(m_hWnd));
6486 		TCITEM tci = { 0 };
6487 		tci.mask = mask;
6488 		tci.pszText = (LPTSTR) lpszItem;
6489 		tci.iImage = iImage;
6490 		tci.lParam = lParam;
6491 		return (int)::SendMessage(m_hWnd, TCM_INSERTITEM, nItem, (LPARAM)&tci);
6492 	}
6493 
InsertItem(int nItem,LPCTSTR lpszItem)6494 	int InsertItem(int nItem, LPCTSTR lpszItem)
6495 	{
6496 		ATLASSERT(::IsWindow(m_hWnd));
6497 		TCITEM tci = { 0 };
6498 		tci.mask = TCIF_TEXT;
6499 		tci.pszText = (LPTSTR) lpszItem;
6500 		return (int)::SendMessage(m_hWnd, TCM_INSERTITEM, nItem, (LPARAM)&tci);
6501 	}
6502 
AddItem(LPTCITEM pTabCtrlItem)6503 	int AddItem(LPTCITEM pTabCtrlItem)
6504 	{
6505 		return InsertItem(GetItemCount(), pTabCtrlItem);
6506 	}
6507 
AddItem(UINT mask,LPCTSTR lpszItem,int iImage,LPARAM lParam)6508 	int AddItem(UINT mask, LPCTSTR lpszItem, int iImage, LPARAM lParam)
6509 	{
6510 		return InsertItem(GetItemCount(), mask, lpszItem, iImage, lParam);
6511 	}
6512 
AddItem(LPCTSTR lpszItem)6513 	int AddItem(LPCTSTR lpszItem)
6514 	{
6515 		return InsertItem(GetItemCount(), lpszItem);
6516 	}
6517 
DeleteItem(int nItem)6518 	BOOL DeleteItem(int nItem)
6519 	{
6520 		ATLASSERT(::IsWindow(m_hWnd));
6521 		return (BOOL)::SendMessage(m_hWnd, TCM_DELETEITEM, nItem, 0L);
6522 	}
6523 
DeleteAllItems()6524 	BOOL DeleteAllItems()
6525 	{
6526 		ATLASSERT(::IsWindow(m_hWnd));
6527 		return (BOOL)::SendMessage(m_hWnd, TCM_DELETEALLITEMS, 0, 0L);
6528 	}
6529 
AdjustRect(BOOL bLarger,LPRECT lpRect)6530 	void AdjustRect(BOOL bLarger, LPRECT lpRect)
6531 	{
6532 		ATLASSERT(::IsWindow(m_hWnd));
6533 		::SendMessage(m_hWnd, TCM_ADJUSTRECT, bLarger, (LPARAM)lpRect);
6534 	}
6535 
RemoveImage(int nImage)6536 	void RemoveImage(int nImage)
6537 	{
6538 		ATLASSERT(::IsWindow(m_hWnd));
6539 		::SendMessage(m_hWnd, TCM_REMOVEIMAGE, nImage, 0L);
6540 	}
6541 
HitTest(TC_HITTESTINFO * pHitTestInfo)6542 	int HitTest(TC_HITTESTINFO* pHitTestInfo) const
6543 	{
6544 		ATLASSERT(::IsWindow(m_hWnd));
6545 		return (int)::SendMessage(m_hWnd, TCM_HITTEST, 0, (LPARAM)pHitTestInfo);
6546 	}
6547 
6548 	void DeselectAll(BOOL bExcludeFocus = TRUE)
6549 	{
6550 		ATLASSERT(::IsWindow(m_hWnd));
6551 		::SendMessage(m_hWnd, TCM_DESELECTALL, bExcludeFocus, 0L);
6552 	}
6553 
6554 #if (_WIN32_IE >= 0x0400)
6555 	BOOL HighlightItem(int nIndex, BOOL bHighlight = TRUE)
6556 	{
6557 		ATLASSERT(::IsWindow(m_hWnd));
6558 		return (BOOL)::SendMessage(m_hWnd, TCM_HIGHLIGHTITEM, nIndex, MAKELPARAM(bHighlight, 0));
6559 	}
6560 #endif // (_WIN32_IE >= 0x0400)
6561 };
6562 
6563 typedef CTabCtrlT<ATL::CWindow>   CTabCtrl;
6564 
6565 
6566 ///////////////////////////////////////////////////////////////////////////////
6567 // CTrackBarCtrl
6568 
6569 template <class TBase>
6570 class CTrackBarCtrlT : public TBase
6571 {
6572 public:
6573 // Constructors
TBase(hWnd)6574 	CTrackBarCtrlT(HWND hWnd = NULL) : TBase(hWnd)
6575 	{ }
6576 
6577 	CTrackBarCtrlT< TBase >& operator =(HWND hWnd)
6578 	{
6579 		m_hWnd = hWnd;
6580 		return *this;
6581 	}
6582 
6583 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
6584 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
6585 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
6586 	{
6587 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
6588 	}
6589 
6590 // Attributes
GetWndClassName()6591 	static LPCTSTR GetWndClassName()
6592 	{
6593 		return TRACKBAR_CLASS;
6594 	}
6595 
GetLineSize()6596 	int GetLineSize() const
6597 	{
6598 		ATLASSERT(::IsWindow(m_hWnd));
6599 		return (int)::SendMessage(m_hWnd, TBM_GETLINESIZE, 0, 0L);
6600 	}
6601 
SetLineSize(int nSize)6602 	int SetLineSize(int nSize)
6603 	{
6604 		ATLASSERT(::IsWindow(m_hWnd));
6605 		return (int)::SendMessage(m_hWnd, TBM_SETLINESIZE, 0, nSize);
6606 	}
6607 
GetPageSize()6608 	int GetPageSize() const
6609 	{
6610 		ATLASSERT(::IsWindow(m_hWnd));
6611 		return (int)::SendMessage(m_hWnd, TBM_GETPAGESIZE, 0, 0L);
6612 	}
6613 
SetPageSize(int nSize)6614 	int SetPageSize(int nSize)
6615 	{
6616 		ATLASSERT(::IsWindow(m_hWnd));
6617 		return (int)::SendMessage(m_hWnd, TBM_SETPAGESIZE, 0, nSize);
6618 	}
6619 
GetRangeMin()6620 	int GetRangeMin() const
6621 	{
6622 		ATLASSERT(::IsWindow(m_hWnd));
6623 		return (int)::SendMessage(m_hWnd, TBM_GETRANGEMIN, 0, 0L);
6624 	}
6625 
6626 	void SetRangeMin(int nMin, BOOL bRedraw = FALSE)
6627 	{
6628 		ATLASSERT(::IsWindow(m_hWnd));
6629 		::SendMessage(m_hWnd, TBM_SETRANGEMIN, bRedraw, nMin);
6630 	}
6631 
GetRangeMax()6632 	int GetRangeMax() const
6633 	{
6634 		ATLASSERT(::IsWindow(m_hWnd));
6635 		return (int)::SendMessage(m_hWnd, TBM_GETRANGEMAX, 0, 0L);
6636 	}
6637 
6638 	void SetRangeMax(int nMax, BOOL bRedraw = FALSE)
6639 	{
6640 		ATLASSERT(::IsWindow(m_hWnd));
6641 		::SendMessage(m_hWnd, TBM_SETRANGEMAX, bRedraw, nMax);
6642 	}
6643 
GetRange(int & nMin,int & nMax)6644 	void GetRange(int& nMin, int& nMax) const
6645 	{
6646 		nMin = GetRangeMin();
6647 		nMax = GetRangeMax();
6648 	}
6649 
6650 	void SetRange(int nMin, int nMax, BOOL bRedraw = TRUE)
6651 	{
6652 		ATLASSERT(::IsWindow(m_hWnd));
6653 		::SendMessage(m_hWnd, TBM_SETRANGE, bRedraw, MAKELPARAM(nMin, nMax));
6654 	}
6655 
GetSelStart()6656 	int GetSelStart() const
6657 	{
6658 		ATLASSERT(::IsWindow(m_hWnd));
6659 		return (int)::SendMessage(m_hWnd, TBM_GETSELSTART, 0, 0L);
6660 	}
6661 
6662 	void SetSelStart(int nMin, BOOL bRedraw = FALSE)
6663 	{
6664 		ATLASSERT(::IsWindow(m_hWnd));
6665 		::SendMessage(m_hWnd, TBM_SETSELSTART, bRedraw, (LPARAM)nMin);
6666 	}
6667 
GetSelEnd()6668 	int GetSelEnd() const
6669 	{
6670 		ATLASSERT(::IsWindow(m_hWnd));
6671 		return (int)::SendMessage(m_hWnd, TBM_GETSELEND, 0, 0L);
6672 	}
6673 
6674 	void SetSelEnd(int nMax, BOOL bRedraw = FALSE)
6675 	{
6676 		ATLASSERT(::IsWindow(m_hWnd));
6677 		::SendMessage(m_hWnd, TBM_SETSELEND, bRedraw, (LPARAM)nMax);
6678 	}
6679 
GetSelection(int & nMin,int & nMax)6680 	void GetSelection(int& nMin, int& nMax) const
6681 	{
6682 		nMin = GetSelStart();
6683 		nMax = GetSelEnd();
6684 	}
6685 
6686 	void SetSelection(int nMin, int nMax, BOOL bRedraw = TRUE)
6687 	{
6688 		SetSelStart(nMin, FALSE);
6689 		SetSelEnd(nMax, bRedraw);
6690 	}
6691 
GetChannelRect(LPRECT lprc)6692 	void GetChannelRect(LPRECT lprc) const
6693 	{
6694 		ATLASSERT(::IsWindow(m_hWnd));
6695 		::SendMessage(m_hWnd, TBM_GETCHANNELRECT, 0, (LPARAM)lprc);
6696 	}
6697 
GetThumbRect(LPRECT lprc)6698 	void GetThumbRect(LPRECT lprc) const
6699 	{
6700 		ATLASSERT(::IsWindow(m_hWnd));
6701 		::SendMessage(m_hWnd, TBM_GETTHUMBRECT, 0, (LPARAM)lprc);
6702 	}
6703 
GetPos()6704 	int GetPos() const
6705 	{
6706 		ATLASSERT(::IsWindow(m_hWnd));
6707 		return (int)::SendMessage(m_hWnd, TBM_GETPOS, 0, 0L);
6708 	}
6709 
SetPos(int nPos)6710 	void SetPos(int nPos)
6711 	{
6712 		ATLASSERT(::IsWindow(m_hWnd));
6713 		::SendMessage(m_hWnd, TBM_SETPOS, TRUE, nPos);
6714 	}
6715 
GetNumTics()6716 	UINT GetNumTics() const
6717 	{
6718 		ATLASSERT(::IsWindow(m_hWnd));
6719 		return (UINT)::SendMessage(m_hWnd, TBM_GETNUMTICS, 0, 0L);
6720 	}
6721 
GetTicArray()6722 	DWORD* GetTicArray() const
6723 	{
6724 		ATLASSERT(::IsWindow(m_hWnd));
6725 		return (DWORD*)::SendMessage(m_hWnd, TBM_GETPTICS, 0, 0L);
6726 	}
6727 
GetTic(int nTic)6728 	int GetTic(int nTic) const
6729 	{
6730 		ATLASSERT(::IsWindow(m_hWnd));
6731 		return (int)::SendMessage(m_hWnd, TBM_GETTIC, nTic, 0L);
6732 	}
6733 
SetTic(int nTic)6734 	BOOL SetTic(int nTic)
6735 	{
6736 		ATLASSERT(::IsWindow(m_hWnd));
6737 		return (BOOL)::SendMessage(m_hWnd, TBM_SETTIC, 0, nTic);
6738 	}
6739 
GetTicPos(int nTic)6740 	int GetTicPos(int nTic) const
6741 	{
6742 		ATLASSERT(::IsWindow(m_hWnd));
6743 		return (int)::SendMessage(m_hWnd, TBM_GETTICPOS, nTic, 0L);
6744 	}
6745 
SetTicFreq(int nFreq)6746 	void SetTicFreq(int nFreq)
6747 	{
6748 		ATLASSERT(::IsWindow(m_hWnd));
6749 		::SendMessage(m_hWnd, TBM_SETTICFREQ, nFreq, 0L);
6750 	}
6751 
GetThumbLength()6752 	int GetThumbLength() const
6753 	{
6754 		ATLASSERT(::IsWindow(m_hWnd));
6755 		return (int)::SendMessage(m_hWnd, TBM_GETTHUMBLENGTH, 0, 0L);
6756 	}
6757 
SetThumbLength(int nLength)6758 	void SetThumbLength(int nLength)
6759 	{
6760 		ATLASSERT(::IsWindow(m_hWnd));
6761 		::SendMessage(m_hWnd, TBM_SETTHUMBLENGTH, nLength, 0L);
6762 	}
6763 
6764 	void SetSel(int nStart, int nEnd, BOOL bRedraw = TRUE)
6765 	{
6766 		ATLASSERT(::IsWindow(m_hWnd));
6767 		ATLASSERT((GetStyle() & TBS_ENABLESELRANGE) != 0);
6768 		::SendMessage(m_hWnd, TBM_SETSEL, bRedraw, MAKELPARAM(nStart, nEnd));
6769 	}
6770 
6771 	ATL::CWindow GetBuddy(BOOL bLeft = TRUE) const
6772 	{
6773 		ATLASSERT(::IsWindow(m_hWnd));
6774 		return ATL::CWindow((HWND)::SendMessage(m_hWnd, TBM_GETBUDDY, bLeft, 0L));
6775 	}
6776 
6777 	ATL::CWindow SetBuddy(HWND hWndBuddy, BOOL bLeft = TRUE)
6778 	{
6779 		ATLASSERT(::IsWindow(m_hWnd));
6780 		return ATL::CWindow((HWND)::SendMessage(m_hWnd, TBM_SETBUDDY, bLeft, (LPARAM)hWndBuddy));
6781 	}
6782 
6783 #ifndef _WIN32_WCE
GetToolTips()6784 	CToolTipCtrl GetToolTips() const
6785 	{
6786 		ATLASSERT(::IsWindow(m_hWnd));
6787 		return CToolTipCtrl((HWND)::SendMessage(m_hWnd, TBM_GETTOOLTIPS, 0, 0L));
6788 	}
6789 
SetToolTips(HWND hWndTT)6790 	void SetToolTips(HWND hWndTT)
6791 	{
6792 		ATLASSERT(::IsWindow(m_hWnd));
6793 		::SendMessage(m_hWnd, TBM_SETTOOLTIPS, (WPARAM)hWndTT, 0L);
6794 	}
6795 
SetTipSide(int nSide)6796 	int SetTipSide(int nSide)
6797 	{
6798 		ATLASSERT(::IsWindow(m_hWnd));
6799 		return (int)::SendMessage(m_hWnd, TBM_SETTIPSIDE, nSide, 0L);
6800 	}
6801 #endif // !_WIN32_WCE
6802 
6803 #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
GetUnicodeFormat()6804 	BOOL GetUnicodeFormat() const
6805 	{
6806 		ATLASSERT(::IsWindow(m_hWnd));
6807 		return (BOOL)::SendMessage(m_hWnd, TBM_GETUNICODEFORMAT, 0, 0L);
6808 	}
6809 
6810 	BOOL SetUnicodeFormat(BOOL bUnicode = TRUE)
6811 	{
6812 		ATLASSERT(::IsWindow(m_hWnd));
6813 		return (BOOL)::SendMessage(m_hWnd, TBM_SETUNICODEFORMAT, bUnicode, 0L);
6814 	}
6815 #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
6816 
6817 // Operations
6818 	void ClearSel(BOOL bRedraw = FALSE)
6819 	{
6820 		ATLASSERT(::IsWindow(m_hWnd));
6821 		::SendMessage(m_hWnd, TBM_CLEARSEL, bRedraw, 0L);
6822 	}
6823 
VerifyPos()6824 	void VerifyPos()
6825 	{
6826 		ATLASSERT(::IsWindow(m_hWnd));
6827 		::SendMessage(m_hWnd, TBM_SETPOS, FALSE, 0L);
6828 	}
6829 
6830 	void ClearTics(BOOL bRedraw = FALSE)
6831 	{
6832 		ATLASSERT(::IsWindow(m_hWnd));
6833 		::SendMessage(m_hWnd, TBM_CLEARTICS, bRedraw, 0L);
6834 	}
6835 };
6836 
6837 typedef CTrackBarCtrlT<ATL::CWindow>   CTrackBarCtrl;
6838 
6839 
6840 ///////////////////////////////////////////////////////////////////////////////
6841 // CUpDownCtrl
6842 
6843 template <class TBase>
6844 class CUpDownCtrlT : public TBase
6845 {
6846 public:
6847 // Constructors
TBase(hWnd)6848 	CUpDownCtrlT(HWND hWnd = NULL) : TBase(hWnd)
6849 	{ }
6850 
6851 	CUpDownCtrlT< TBase >& operator =(HWND hWnd)
6852 	{
6853 		m_hWnd = hWnd;
6854 		return *this;
6855 	}
6856 
6857 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
6858 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
6859 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
6860 	{
6861 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
6862 	}
6863 
6864 // Attributes
GetWndClassName()6865 	static LPCTSTR GetWndClassName()
6866 	{
6867 		return UPDOWN_CLASS;
6868 	}
6869 
GetAccel(int nAccel,UDACCEL * pAccel)6870 	UINT GetAccel(int nAccel, UDACCEL* pAccel) const
6871 	{
6872 		ATLASSERT(::IsWindow(m_hWnd));
6873 		return (UINT)LOWORD(::SendMessage(m_hWnd, UDM_GETACCEL, nAccel, (LPARAM)pAccel));
6874 	}
6875 
SetAccel(int nAccel,UDACCEL * pAccel)6876 	BOOL SetAccel(int nAccel, UDACCEL* pAccel)
6877 	{
6878 		ATLASSERT(::IsWindow(m_hWnd));
6879 		return (BOOL)LOWORD(::SendMessage(m_hWnd, UDM_SETACCEL, nAccel, (LPARAM)pAccel));
6880 	}
6881 
GetBase()6882 	UINT GetBase() const
6883 	{
6884 		ATLASSERT(::IsWindow(m_hWnd));
6885 		return (UINT)LOWORD(::SendMessage(m_hWnd, UDM_GETBASE, 0, 0L));
6886 	}
6887 
SetBase(int nBase)6888 	int SetBase(int nBase)
6889 	{
6890 		ATLASSERT(::IsWindow(m_hWnd));
6891 		return (int)::SendMessage(m_hWnd, UDM_SETBASE, nBase, 0L);
6892 	}
6893 
GetBuddy()6894 	ATL::CWindow GetBuddy() const
6895 	{
6896 		ATLASSERT(::IsWindow(m_hWnd));
6897 		return ATL::CWindow((HWND)::SendMessage(m_hWnd, UDM_GETBUDDY, 0, 0L));
6898 	}
6899 
SetBuddy(HWND hWndBuddy)6900 	ATL::CWindow SetBuddy(HWND hWndBuddy)
6901 	{
6902 		ATLASSERT(::IsWindow(m_hWnd));
6903 		return ATL::CWindow((HWND)::SendMessage(m_hWnd, UDM_SETBUDDY, (WPARAM)hWndBuddy, 0L));
6904 	}
6905 
6906 	int GetPos(LPBOOL lpbError = NULL) const
6907 	{
6908 		ATLASSERT(::IsWindow(m_hWnd));
6909 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, UDM_GETPOS, 0, 0L);
6910 		// Note: Seems that Windows always sets error to TRUE if
6911 		// UDS_SETBUDDYINT style is not used
6912 		if(lpbError != NULL)
6913 			*lpbError = (HIWORD(dwRet) != 0) ? TRUE : FALSE;
6914 		return (int)(short)LOWORD(dwRet);
6915 	}
6916 
SetPos(int nPos)6917 	int SetPos(int nPos)
6918 	{
6919 		ATLASSERT(::IsWindow(m_hWnd));
6920 		return (int)(short)LOWORD(::SendMessage(m_hWnd, UDM_SETPOS, 0, MAKELPARAM(nPos, 0)));
6921 	}
6922 
GetRange()6923 	DWORD GetRange() const
6924 	{
6925 		ATLASSERT(::IsWindow(m_hWnd));
6926 		return (DWORD)::SendMessage(m_hWnd, UDM_GETRANGE, 0, 0L);
6927 	}
6928 
GetRange(int & nLower,int & nUpper)6929 	void GetRange(int& nLower, int& nUpper) const
6930 	{
6931 		ATLASSERT(::IsWindow(m_hWnd));
6932 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, UDM_GETRANGE, 0, 0L);
6933 		nLower = (int)(short)HIWORD(dwRet);
6934 		nUpper = (int)(short)LOWORD(dwRet);
6935 	}
6936 
SetRange(int nLower,int nUpper)6937 	void SetRange(int nLower, int nUpper)
6938 	{
6939 		ATLASSERT(::IsWindow(m_hWnd));
6940 		::SendMessage(m_hWnd, UDM_SETRANGE, 0, MAKELPARAM(nUpper, nLower));
6941 	}
6942 
6943 #if (_WIN32_IE >= 0x0400)
SetRange32(int nLower,int nUpper)6944 	void SetRange32(int nLower, int nUpper)
6945 	{
6946 		ATLASSERT(::IsWindow(m_hWnd));
6947 		::SendMessage(m_hWnd, UDM_SETRANGE32, nLower, nUpper);
6948 	}
6949 
GetRange32(int & nLower,int & nUpper)6950 	void GetRange32(int& nLower, int& nUpper) const
6951 	{
6952 		ATLASSERT(::IsWindow(m_hWnd));
6953 		::SendMessage(m_hWnd, UDM_GETRANGE32, (WPARAM)&nLower, (LPARAM)&nUpper);
6954 	}
6955 
6956 #ifndef _WIN32_WCE
GetUnicodeFormat()6957 	BOOL GetUnicodeFormat() const
6958 	{
6959 		ATLASSERT(::IsWindow(m_hWnd));
6960 		return (BOOL)::SendMessage(m_hWnd, UDM_GETUNICODEFORMAT, 0, 0L);
6961 	}
6962 
6963 	BOOL SetUnicodeFormat(BOOL bUnicode = TRUE)
6964 	{
6965 		ATLASSERT(::IsWindow(m_hWnd));
6966 		return (BOOL)::SendMessage(m_hWnd, UDM_SETUNICODEFORMAT, bUnicode, 0L);
6967 	}
6968 #endif // !_WIN32_WCE
6969 #endif // (_WIN32_IE >= 0x0400)
6970 
6971 #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
6972 	int GetPos32(LPBOOL lpbError = NULL) const
6973 	{
6974 		ATLASSERT(::IsWindow(m_hWnd));
6975 		// Note: Seems that Windows always sets error to TRUE if
6976 		// UDS_SETBUDDYINT style is not used
6977 		return (int)::SendMessage(m_hWnd, UDM_GETPOS32, 0, (LPARAM)lpbError);
6978 	}
6979 
SetPos32(int nPos)6980 	int SetPos32(int nPos)
6981 	{
6982 		ATLASSERT(::IsWindow(m_hWnd));
6983 		return (int)::SendMessage(m_hWnd, UDM_SETPOS32, 0, (LPARAM)nPos);
6984 	}
6985 #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
6986 };
6987 
6988 typedef CUpDownCtrlT<ATL::CWindow>   CUpDownCtrl;
6989 
6990 
6991 ///////////////////////////////////////////////////////////////////////////////
6992 // CProgressBarCtrl
6993 
6994 template <class TBase>
6995 class CProgressBarCtrlT : public TBase
6996 {
6997 public:
6998 // Constructors
TBase(hWnd)6999 	CProgressBarCtrlT(HWND hWnd = NULL) : TBase(hWnd)
7000 	{ }
7001 
7002 	CProgressBarCtrlT< TBase >& operator =(HWND hWnd)
7003 	{
7004 		m_hWnd = hWnd;
7005 		return *this;
7006 	}
7007 
7008 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
7009 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
7010 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
7011 	{
7012 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
7013 	}
7014 
7015 // Attributes
GetWndClassName()7016 	static LPCTSTR GetWndClassName()
7017 	{
7018 		return PROGRESS_CLASS;
7019 	}
7020 
SetRange(int nLower,int nUpper)7021 	DWORD SetRange(int nLower, int nUpper)
7022 	{
7023 		ATLASSERT(::IsWindow(m_hWnd));
7024 		return (DWORD)::SendMessage(m_hWnd, PBM_SETRANGE, 0, MAKELPARAM(nLower, nUpper));
7025 	}
7026 
SetPos(int nPos)7027 	int SetPos(int nPos)
7028 	{
7029 		ATLASSERT(::IsWindow(m_hWnd));
7030 		return (int)(short)LOWORD(::SendMessage(m_hWnd, PBM_SETPOS, nPos, 0L));
7031 	}
7032 
OffsetPos(int nPos)7033 	int OffsetPos(int nPos)
7034 	{
7035 		ATLASSERT(::IsWindow(m_hWnd));
7036 		return (int)(short)LOWORD(::SendMessage(m_hWnd, PBM_DELTAPOS, nPos, 0L));
7037 	}
7038 
SetStep(int nStep)7039 	int SetStep(int nStep)
7040 	{
7041 		ATLASSERT(::IsWindow(m_hWnd));
7042 		return (int)(short)LOWORD(::SendMessage(m_hWnd, PBM_SETSTEP, nStep, 0L));
7043 	}
7044 
GetPos()7045 	UINT GetPos() const
7046 	{
7047 		ATLASSERT(::IsWindow(m_hWnd));
7048 		return (UINT)::SendMessage(m_hWnd, PBM_GETPOS, 0, 0L);
7049 	}
7050 
GetRange(PPBRANGE pPBRange)7051 	void GetRange(PPBRANGE pPBRange) const
7052 	{
7053 		ATLASSERT(::IsWindow(m_hWnd));
7054 		ATLASSERT(pPBRange != NULL);
7055 		::SendMessage(m_hWnd, PBM_GETRANGE, TRUE, (LPARAM)pPBRange);
7056 	}
7057 
GetRange(int & nLower,int & nUpper)7058 	void GetRange(int& nLower, int& nUpper) const
7059 	{
7060 		ATLASSERT(::IsWindow(m_hWnd));
7061 		PBRANGE range = { 0 };
7062 		::SendMessage(m_hWnd, PBM_GETRANGE, TRUE, (LPARAM)&range);
7063 		nLower = range.iLow;
7064 		nUpper = range.iHigh;
7065 	}
7066 
GetRangeLimit(BOOL bLowLimit)7067 	int GetRangeLimit(BOOL bLowLimit) const
7068 	{
7069 		ATLASSERT(::IsWindow(m_hWnd));
7070 		return (int)::SendMessage(m_hWnd, PBM_GETRANGE, bLowLimit, (LPARAM)NULL);
7071 	}
7072 
SetRange32(int nMin,int nMax)7073 	DWORD SetRange32(int nMin, int nMax)
7074 	{
7075 		ATLASSERT(::IsWindow(m_hWnd));
7076 		return (DWORD)::SendMessage(m_hWnd, PBM_SETRANGE32, nMin, nMax);
7077 	}
7078 
7079 #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
SetBarColor(COLORREF clr)7080 	COLORREF SetBarColor(COLORREF clr)
7081 	{
7082 		ATLASSERT(::IsWindow(m_hWnd));
7083 		return (COLORREF)::SendMessage(m_hWnd, PBM_SETBARCOLOR, 0, (LPARAM)clr);
7084 	}
7085 
SetBkColor(COLORREF clr)7086 	COLORREF SetBkColor(COLORREF clr)
7087 	{
7088 		ATLASSERT(::IsWindow(m_hWnd));
7089 		return (COLORREF)::SendMessage(m_hWnd, PBM_SETBKCOLOR, 0, (LPARAM)clr);
7090 	}
7091 #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
7092 
7093 #if (_WIN32_WINNT >= 0x0501) && defined(PBM_SETMARQUEE)
7094 	BOOL SetMarquee(BOOL bMarquee, UINT uUpdateTime = 0U)
7095 	{
7096 		ATLASSERT(::IsWindow(m_hWnd));
7097 		return (BOOL)::SendMessage(m_hWnd, PBM_SETMARQUEE, (WPARAM)bMarquee, (LPARAM)uUpdateTime);
7098 	}
7099 #endif // (_WIN32_WINNT >= 0x0501) && defined(PBM_SETMARQUEE)
7100 
7101 #if (_WIN32_WINNT >= 0x0600)
GetStep()7102 	int GetStep() const
7103 	{
7104 		ATLASSERT(::IsWindow(m_hWnd));
7105 		return (int)::SendMessage(m_hWnd, PBM_GETSTEP, 0, 0L);
7106 	}
7107 
GetBkColor()7108 	COLORREF GetBkColor() const
7109 	{
7110 		ATLASSERT(::IsWindow(m_hWnd));
7111 		return (COLORREF)::SendMessage(m_hWnd, PBM_GETBKCOLOR, 0, 0L);
7112 	}
7113 
GetBarColor()7114 	COLORREF GetBarColor() const
7115 	{
7116 		ATLASSERT(::IsWindow(m_hWnd));
7117 		return (COLORREF)::SendMessage(m_hWnd, PBM_GETBARCOLOR, 0, 0L);
7118 	}
7119 
GetState()7120 	int GetState() const
7121 	{
7122 		ATLASSERT(::IsWindow(m_hWnd));
7123 		return (int)::SendMessage(m_hWnd, PBM_GETSTATE, 0, 0L);
7124 	}
7125 
SetState(int nState)7126 	int SetState(int nState)
7127 	{
7128 		ATLASSERT(::IsWindow(m_hWnd));
7129 		return (int)::SendMessage(m_hWnd, PBM_SETSTATE, nState, 0L);
7130 	}
7131 #endif // (_WIN32_WINNT >= 0x0600)
7132 
7133 // Operations
StepIt()7134 	int StepIt()
7135 	{
7136 		ATLASSERT(::IsWindow(m_hWnd));
7137 		return (int)(short)LOWORD(::SendMessage(m_hWnd, PBM_STEPIT, 0, 0L));
7138 	}
7139 };
7140 
7141 typedef CProgressBarCtrlT<ATL::CWindow>   CProgressBarCtrl;
7142 
7143 
7144 ///////////////////////////////////////////////////////////////////////////////
7145 // CHotKeyCtrl
7146 
7147 #ifndef _WIN32_WCE
7148 
7149 template <class TBase>
7150 class CHotKeyCtrlT : public TBase
7151 {
7152 public:
7153 // Constructors
TBase(hWnd)7154 	CHotKeyCtrlT(HWND hWnd = NULL) : TBase(hWnd)
7155 	{ }
7156 
7157 	CHotKeyCtrlT< TBase >& operator =(HWND hWnd)
7158 	{
7159 		m_hWnd = hWnd;
7160 		return *this;
7161 	}
7162 
7163 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
7164 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
7165 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
7166 	{
7167 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
7168 	}
7169 
7170 // Attributes
GetWndClassName()7171 	static LPCTSTR GetWndClassName()
7172 	{
7173 		return HOTKEY_CLASS;
7174 	}
7175 
GetHotKey()7176 	DWORD GetHotKey() const
7177 	{
7178 		ATLASSERT(::IsWindow(m_hWnd));
7179 		return (DWORD)::SendMessage(m_hWnd, HKM_GETHOTKEY, 0, 0L);
7180 	}
7181 
GetHotKey(WORD & wVirtualKeyCode,WORD & wModifiers)7182 	void GetHotKey(WORD &wVirtualKeyCode, WORD &wModifiers) const
7183 	{
7184 		ATLASSERT(::IsWindow(m_hWnd));
7185 		DWORD dw = (DWORD)::SendMessage(m_hWnd, HKM_GETHOTKEY, 0, 0L);
7186 		wVirtualKeyCode = LOBYTE(LOWORD(dw));
7187 		wModifiers = HIBYTE(LOWORD(dw));
7188 	}
7189 
SetHotKey(WORD wVirtualKeyCode,WORD wModifiers)7190 	void SetHotKey(WORD wVirtualKeyCode, WORD wModifiers)
7191 	{
7192 		ATLASSERT(::IsWindow(m_hWnd));
7193 		::SendMessage(m_hWnd, HKM_SETHOTKEY, MAKEWORD(wVirtualKeyCode, wModifiers), 0L);
7194 	}
7195 
SetRules(WORD wInvalidComb,WORD wModifiers)7196 	void SetRules(WORD wInvalidComb, WORD wModifiers)
7197 	{
7198 		ATLASSERT(::IsWindow(m_hWnd));
7199 		::SendMessage(m_hWnd, HKM_SETRULES, wInvalidComb, MAKELPARAM(wModifiers, 0));
7200 	}
7201 };
7202 
7203 typedef CHotKeyCtrlT<ATL::CWindow>   CHotKeyCtrl;
7204 
7205 #endif // !_WIN32_WCE
7206 
7207 
7208 ///////////////////////////////////////////////////////////////////////////////
7209 // CAnimateCtrl
7210 
7211 #ifndef _WIN32_WCE
7212 
7213 template <class TBase>
7214 class CAnimateCtrlT : public TBase
7215 {
7216 public:
7217 // Constructors
TBase(hWnd)7218 	CAnimateCtrlT(HWND hWnd = NULL) : TBase(hWnd)
7219 	{ }
7220 
7221 	CAnimateCtrlT< TBase >& operator =(HWND hWnd)
7222 	{
7223 		m_hWnd = hWnd;
7224 		return *this;
7225 	}
7226 
7227 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
7228 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
7229 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
7230 	{
7231 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
7232 	}
7233 
7234 // Attributes
GetWndClassName()7235 	static LPCTSTR GetWndClassName()
7236 	{
7237 		return ANIMATE_CLASS;
7238 	}
7239 
7240 // Operations
Open(ATL::_U_STRINGorID FileName)7241 	BOOL Open(ATL::_U_STRINGorID FileName)
7242 	{
7243 		ATLASSERT(::IsWindow(m_hWnd));
7244 		return (BOOL)::SendMessage(m_hWnd, ACM_OPEN, 0, (LPARAM)FileName.m_lpstr);
7245 	}
7246 
Play(UINT nFrom,UINT nTo,UINT nRep)7247 	BOOL Play(UINT nFrom, UINT nTo, UINT nRep)
7248 	{
7249 		ATLASSERT(::IsWindow(m_hWnd));
7250 		return (BOOL)::SendMessage(m_hWnd, ACM_PLAY, nRep, MAKELPARAM(nFrom, nTo));
7251 	}
7252 
Stop()7253 	BOOL Stop()
7254 	{
7255 		ATLASSERT(::IsWindow(m_hWnd));
7256 		return (BOOL)::SendMessage(m_hWnd, ACM_STOP, 0, 0L);
7257 	}
7258 
Close()7259 	BOOL Close()
7260 	{
7261 		ATLASSERT(::IsWindow(m_hWnd));
7262 		return (BOOL)::SendMessage(m_hWnd, ACM_OPEN, 0, 0L);
7263 	}
7264 
Seek(UINT nTo)7265 	BOOL Seek(UINT nTo)
7266 	{
7267 		ATLASSERT(::IsWindow(m_hWnd));
7268 		return (BOOL)::SendMessage(m_hWnd, ACM_PLAY, 0, MAKELPARAM(nTo, nTo));
7269 	}
7270 
7271 	// Vista only
IsPlaying()7272 	BOOL IsPlaying() const
7273 	{
7274 #ifndef ACM_ISPLAYING
7275 		const UINT ACM_ISPLAYING = (WM_USER+104);
7276 #endif
7277 		ATLASSERT(::IsWindow(m_hWnd));
7278 		return (BOOL)::SendMessage(m_hWnd, ACM_ISPLAYING, 0, 0L);
7279 	}
7280 };
7281 
7282 typedef CAnimateCtrlT<ATL::CWindow>   CAnimateCtrl;
7283 
7284 #endif // !_WIN32_WCE
7285 
7286 
7287 ///////////////////////////////////////////////////////////////////////////////
7288 // CRichEditCtrl
7289 
7290 #ifndef _WIN32_WCE
7291 
7292 #if defined(_UNICODE) && (_RICHEDIT_VER == 0x0100)
7293   #undef RICHEDIT_CLASS
7294   #define RICHEDIT_CLASS	L"RICHEDIT"
7295 #endif
7296 
7297 #if !defined(_UNICODE) && (_RICHEDIT_VER >= 0x0500)
7298   #undef MSFTEDIT_CLASS
7299   #define MSFTEDIT_CLASS	"RICHEDIT50W"
7300 #endif
7301 
7302 template <class TBase>
7303 class CRichEditCtrlT : public TBase
7304 {
7305 public:
7306 // Constructors
TBase(hWnd)7307 	CRichEditCtrlT(HWND hWnd = NULL) : TBase(hWnd)
7308 	{ }
7309 
7310 	CRichEditCtrlT< TBase >& operator =(HWND hWnd)
7311 	{
7312 		m_hWnd = hWnd;
7313 		return *this;
7314 	}
7315 
7316 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
7317 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
7318 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
7319 	{
7320 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
7321 	}
7322 
7323 // Attributes
GetWndClassName()7324 	static LPCTSTR GetWndClassName()
7325 	{
7326 #if (_RICHEDIT_VER >= 0x0500)
7327 		return MSFTEDIT_CLASS;
7328 #else
7329 		return RICHEDIT_CLASS;
7330 #endif
7331 	}
7332 
GetLibraryName()7333 	static LPCTSTR GetLibraryName()
7334 	{
7335 #if (_RICHEDIT_VER >= 0x0500)
7336 		return _T("MSFTEDIT.DLL");
7337 #elif (_RICHEDIT_VER >= 0x0200)
7338 		return _T("RICHED20.DLL");
7339 #else
7340 		return _T("RICHED32.DLL");
7341 #endif
7342 	}
7343 
GetLineCount()7344 	int GetLineCount() const
7345 	{
7346 		ATLASSERT(::IsWindow(m_hWnd));
7347 		return (int)::SendMessage(m_hWnd, EM_GETLINECOUNT, 0, 0L);
7348 	}
7349 
GetModify()7350 	BOOL GetModify() const
7351 	{
7352 		ATLASSERT(::IsWindow(m_hWnd));
7353 		return (BOOL)::SendMessage(m_hWnd, EM_GETMODIFY, 0, 0L);
7354 	}
7355 
7356 	void SetModify(BOOL bModified = TRUE)
7357 	{
7358 		ATLASSERT(::IsWindow(m_hWnd));
7359 		::SendMessage(m_hWnd, EM_SETMODIFY, bModified, 0L);
7360 	}
7361 
GetRect(LPRECT lpRect)7362 	void GetRect(LPRECT lpRect) const
7363 	{
7364 		ATLASSERT(::IsWindow(m_hWnd));
7365 		::SendMessage(m_hWnd, EM_GETRECT, 0, (LPARAM)lpRect);
7366 	}
7367 
GetOptions()7368 	DWORD GetOptions() const
7369 	{
7370 		ATLASSERT(::IsWindow(m_hWnd));
7371 		return (DWORD)::SendMessage(m_hWnd, EM_GETOPTIONS, 0, 0L);
7372 	}
7373 
SetOptions(WORD wOperation,DWORD dwOptions)7374 	DWORD SetOptions(WORD wOperation, DWORD dwOptions)
7375 	{
7376 		ATLASSERT(::IsWindow(m_hWnd));
7377 		return (DWORD)::SendMessage(m_hWnd, EM_SETOPTIONS, wOperation, dwOptions);
7378 	}
7379 
7380 	// NOTE: first word in lpszBuffer must contain the size of the buffer!
GetLine(int nIndex,LPTSTR lpszBuffer)7381 	int GetLine(int nIndex, LPTSTR lpszBuffer) const
7382 	{
7383 		ATLASSERT(::IsWindow(m_hWnd));
7384 		return (int)::SendMessage(m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer);
7385 	}
7386 
GetLine(int nIndex,LPTSTR lpszBuffer,int nMaxLength)7387 	int GetLine(int nIndex, LPTSTR lpszBuffer, int nMaxLength) const
7388 	{
7389 		ATLASSERT(::IsWindow(m_hWnd));
7390 		*(LPWORD)lpszBuffer = (WORD)nMaxLength;
7391 		return (int)::SendMessage(m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer);
7392 	}
7393 
CanUndo()7394 	BOOL CanUndo() const
7395 	{
7396 		ATLASSERT(::IsWindow(m_hWnd));
7397 		return (BOOL)::SendMessage(m_hWnd, EM_CANUNDO, 0, 0L);
7398 	}
7399 
7400 	BOOL CanPaste(UINT nFormat = 0) const
7401 	{
7402 		ATLASSERT(::IsWindow(m_hWnd));
7403 		return (BOOL)::SendMessage(m_hWnd, EM_CANPASTE, nFormat, 0L);
7404 	}
7405 
GetSel(LONG & nStartChar,LONG & nEndChar)7406 	void GetSel(LONG& nStartChar, LONG& nEndChar) const
7407 	{
7408 		ATLASSERT(::IsWindow(m_hWnd));
7409 		CHARRANGE cr = { 0, 0 };
7410 		::SendMessage(m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr);
7411 		nStartChar = cr.cpMin;
7412 		nEndChar = cr.cpMax;
7413 	}
7414 
GetSel(CHARRANGE & cr)7415 	void GetSel(CHARRANGE &cr) const
7416 	{
7417 		ATLASSERT(::IsWindow(m_hWnd));
7418 		::SendMessage(m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr);
7419 	}
7420 
SetSel(LONG nStartChar,LONG nEndChar)7421 	int SetSel(LONG nStartChar, LONG nEndChar)
7422 	{
7423 		ATLASSERT(::IsWindow(m_hWnd));
7424 		CHARRANGE cr = { nStartChar, nEndChar };
7425 		return (int)::SendMessage(m_hWnd, EM_EXSETSEL, 0, (LPARAM)&cr);
7426 	}
7427 
SetSel(CHARRANGE & cr)7428 	int SetSel(CHARRANGE &cr)
7429 	{
7430 		ATLASSERT(::IsWindow(m_hWnd));
7431 		return (int)::SendMessage(m_hWnd, EM_EXSETSEL, 0, (LPARAM)&cr);
7432 	}
7433 
SetSelAll()7434 	int SetSelAll()
7435 	{
7436 		return SetSel(0, -1);
7437 	}
7438 
SetSelNone()7439 	int SetSelNone()
7440 	{
7441 		return SetSel(-1, 0);
7442 	}
7443 
GetDefaultCharFormat(CHARFORMAT & cf)7444 	DWORD GetDefaultCharFormat(CHARFORMAT& cf) const
7445 	{
7446 		ATLASSERT(::IsWindow(m_hWnd));
7447 		cf.cbSize = sizeof(CHARFORMAT);
7448 		return (DWORD)::SendMessage(m_hWnd, EM_GETCHARFORMAT, 0, (LPARAM)&cf);
7449 	}
7450 
GetSelectionCharFormat(CHARFORMAT & cf)7451 	DWORD GetSelectionCharFormat(CHARFORMAT& cf) const
7452 	{
7453 		ATLASSERT(::IsWindow(m_hWnd));
7454 		cf.cbSize = sizeof(CHARFORMAT);
7455 		return (DWORD)::SendMessage(m_hWnd, EM_GETCHARFORMAT, 1, (LPARAM)&cf);
7456 	}
7457 
GetEventMask()7458 	DWORD GetEventMask() const
7459 	{
7460 		ATLASSERT(::IsWindow(m_hWnd));
7461 		return (DWORD)::SendMessage(m_hWnd, EM_GETEVENTMASK, 0, 0L);
7462 	}
7463 
GetLimitText()7464 	LONG GetLimitText() const
7465 	{
7466 		ATLASSERT(::IsWindow(m_hWnd));
7467 		return (LONG)::SendMessage(m_hWnd, EM_GETLIMITTEXT, 0, 0L);
7468 	}
7469 
GetParaFormat(PARAFORMAT & pf)7470 	DWORD GetParaFormat(PARAFORMAT& pf) const
7471 	{
7472 		ATLASSERT(::IsWindow(m_hWnd));
7473 		pf.cbSize = sizeof(PARAFORMAT);
7474 		return (DWORD)::SendMessage(m_hWnd, EM_GETPARAFORMAT, 0, (LPARAM)&pf);
7475 	}
7476 
7477 #if (_RICHEDIT_VER >= 0x0200)
GetSelText(LPTSTR lpstrBuff)7478 	LONG GetSelText(LPTSTR lpstrBuff) const
7479 	{
7480 		ATLASSERT(::IsWindow(m_hWnd));
7481 		return (LONG)::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrBuff);
7482 	}
7483 #else // !(_RICHEDIT_VER >= 0x0200)
7484 	// RichEdit 1.0 EM_GETSELTEXT is ANSI only
GetSelText(LPSTR lpstrBuff)7485 	LONG GetSelText(LPSTR lpstrBuff) const
7486 	{
7487 		ATLASSERT(::IsWindow(m_hWnd));
7488 		return (LONG)::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrBuff);
7489 	}
7490 #endif // !(_RICHEDIT_VER >= 0x0200)
7491 
7492 #ifndef _ATL_NO_COM
GetSelTextBSTR(BSTR & bstrText)7493 	BOOL GetSelTextBSTR(BSTR& bstrText) const
7494 	{
7495 		USES_CONVERSION;
7496 		ATLASSERT(::IsWindow(m_hWnd));
7497 		ATLASSERT(bstrText == NULL);
7498 
7499 		CHARRANGE cr = { 0, 0 };
7500 		::SendMessage(m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr);
7501 
7502 #if (_RICHEDIT_VER >= 0x0200)
7503 		CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;
7504 		LPTSTR lpstrText = buff.Allocate(cr.cpMax - cr.cpMin + 1);
7505 		if(lpstrText == NULL)
7506 			return FALSE;
7507 		if(::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrText) == 0)
7508 			return FALSE;
7509 
7510 		bstrText = ::SysAllocString(T2W(lpstrText));
7511 #else // !(_RICHEDIT_VER >= 0x0200)
7512 		CTempBuffer<char, _WTL_STACK_ALLOC_THRESHOLD> buff;
7513 		LPSTR lpstrText = buff.Allocate(cr.cpMax - cr.cpMin + 1);
7514 		if(lpstrText == NULL)
7515 			return FALSE;
7516 		if(::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrText) == 0)
7517 			return FALSE;
7518 
7519 		bstrText = ::SysAllocString(A2W(lpstrText));
7520 #endif // !(_RICHEDIT_VER >= 0x0200)
7521 
7522 		return (bstrText != NULL) ? TRUE : FALSE;
7523 	}
7524 #endif // !_ATL_NO_COM
7525 
7526 #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
GetSelText(_CSTRING_NS::CString & strText)7527 	LONG GetSelText(_CSTRING_NS::CString& strText) const
7528 	{
7529 		ATLASSERT(::IsWindow(m_hWnd));
7530 
7531 		CHARRANGE cr = { 0, 0 };
7532 		::SendMessage(m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr);
7533 
7534 #if (_RICHEDIT_VER >= 0x0200)
7535 		LONG lLen = 0;
7536 		LPTSTR lpstrText = strText.GetBufferSetLength(cr.cpMax - cr.cpMin);
7537 		if(lpstrText != NULL)
7538 		{
7539 			lLen = (LONG)::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrText);
7540 			strText.ReleaseBuffer();
7541 		}
7542 #else // !(_RICHEDIT_VER >= 0x0200)
7543 		CTempBuffer<char, _WTL_STACK_ALLOC_THRESHOLD> buff;
7544 		LPSTR lpstrText = buff.Allocate(cr.cpMax - cr.cpMin + 1);
7545 		if(lpstrText == NULL)
7546 			return 0;
7547 		LONG lLen = (LONG)::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrText);
7548 		if(lLen == 0)
7549 			return 0;
7550 
7551 		USES_CONVERSION;
7552 		strText = A2T(lpstrText);
7553 #endif // !(_RICHEDIT_VER >= 0x0200)
7554 
7555 		return lLen;
7556 	}
7557 #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
7558 
GetSelectionType()7559 	WORD GetSelectionType() const
7560 	{
7561 		ATLASSERT(::IsWindow(m_hWnd));
7562 		return (WORD)::SendMessage(m_hWnd, EM_SELECTIONTYPE, 0, 0L);
7563 	}
7564 
SetBackgroundColor(COLORREF cr)7565 	COLORREF SetBackgroundColor(COLORREF cr)
7566 	{
7567 		ATLASSERT(::IsWindow(m_hWnd));
7568 		return (COLORREF)::SendMessage(m_hWnd, EM_SETBKGNDCOLOR, 0, cr);
7569 	}
7570 
SetBackgroundColor()7571 	COLORREF SetBackgroundColor()   // sets to system background
7572 	{
7573 		ATLASSERT(::IsWindow(m_hWnd));
7574 		return (COLORREF)::SendMessage(m_hWnd, EM_SETBKGNDCOLOR, 1, 0);
7575 	}
7576 
SetCharFormat(CHARFORMAT & cf,WORD wFlags)7577 	BOOL SetCharFormat(CHARFORMAT& cf, WORD wFlags)
7578 	{
7579 		ATLASSERT(::IsWindow(m_hWnd));
7580 		cf.cbSize = sizeof(CHARFORMAT);
7581 		return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, (WPARAM)wFlags, (LPARAM)&cf);
7582 	}
7583 
SetDefaultCharFormat(CHARFORMAT & cf)7584 	BOOL SetDefaultCharFormat(CHARFORMAT& cf)
7585 	{
7586 		ATLASSERT(::IsWindow(m_hWnd));
7587 		cf.cbSize = sizeof(CHARFORMAT);
7588 		return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, 0, (LPARAM)&cf);
7589 	}
7590 
SetSelectionCharFormat(CHARFORMAT & cf)7591 	BOOL SetSelectionCharFormat(CHARFORMAT& cf)
7592 	{
7593 		ATLASSERT(::IsWindow(m_hWnd));
7594 		cf.cbSize = sizeof(CHARFORMAT);
7595 		return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
7596 	}
7597 
SetWordCharFormat(CHARFORMAT & cf)7598 	BOOL SetWordCharFormat(CHARFORMAT& cf)
7599 	{
7600 		ATLASSERT(::IsWindow(m_hWnd));
7601 		cf.cbSize = sizeof(CHARFORMAT);
7602 		return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, SCF_SELECTION | SCF_WORD, (LPARAM)&cf);
7603 	}
7604 
SetEventMask(DWORD dwEventMask)7605 	DWORD SetEventMask(DWORD dwEventMask)
7606 	{
7607 		ATLASSERT(::IsWindow(m_hWnd));
7608 		return (DWORD)::SendMessage(m_hWnd, EM_SETEVENTMASK, 0, dwEventMask);
7609 	}
7610 
SetParaFormat(PARAFORMAT & pf)7611 	BOOL SetParaFormat(PARAFORMAT& pf)
7612 	{
7613 		ATLASSERT(::IsWindow(m_hWnd));
7614 		pf.cbSize = sizeof(PARAFORMAT);
7615 		return (BOOL)::SendMessage(m_hWnd, EM_SETPARAFORMAT, 0, (LPARAM)&pf);
7616 	}
7617 
SetTargetDevice(HDC hDC,int cxLineWidth)7618 	BOOL SetTargetDevice(HDC hDC, int cxLineWidth)
7619 	{
7620 		ATLASSERT(::IsWindow(m_hWnd));
7621 		return (BOOL)::SendMessage(m_hWnd, EM_SETTARGETDEVICE, (WPARAM)hDC, cxLineWidth);
7622 	}
7623 
GetTextLength()7624 	int GetTextLength() const
7625 	{
7626 		ATLASSERT(::IsWindow(m_hWnd));
7627 		return (int)::SendMessage(m_hWnd, WM_GETTEXTLENGTH, 0, 0L);
7628 	}
7629 
7630 	BOOL SetReadOnly(BOOL bReadOnly = TRUE)
7631 	{
7632 		ATLASSERT(::IsWindow(m_hWnd));
7633 		return (BOOL)::SendMessage(m_hWnd, EM_SETREADONLY, bReadOnly, 0L);
7634 	}
7635 
GetFirstVisibleLine()7636 	int GetFirstVisibleLine() const
7637 	{
7638 		ATLASSERT(::IsWindow(m_hWnd));
7639 		return (int)::SendMessage(m_hWnd, EM_GETFIRSTVISIBLELINE, 0, 0L);
7640 	}
7641 
GetTextRange(TEXTRANGE * pTextRange)7642 	int GetTextRange(TEXTRANGE* pTextRange) const
7643 	{
7644 		ATLASSERT(::IsWindow(m_hWnd));
7645 		return (int)::SendMessage(m_hWnd, EM_GETTEXTRANGE, 0, (LPARAM)pTextRange);
7646 	}
7647 
7648 #if (_RICHEDIT_VER < 0x0200)
GetWordBreakProcEx()7649 	EDITWORDBREAKPROCEX GetWordBreakProcEx() const
7650 	{
7651 		ATLASSERT(::IsWindow(m_hWnd));
7652 		return (EDITWORDBREAKPROCEX)::SendMessage(m_hWnd, EM_GETWORDBREAKPROCEX, 0, 0L);
7653 	}
7654 
SetWordBreakProcEx(EDITWORDBREAKPROCEX pfnEditWordBreakProcEx)7655 	EDITWORDBREAKPROCEX SetWordBreakProcEx(EDITWORDBREAKPROCEX pfnEditWordBreakProcEx)
7656 	{
7657 		ATLASSERT(::IsWindow(m_hWnd));
7658 		return (EDITWORDBREAKPROCEX)::SendMessage(m_hWnd, EM_SETWORDBREAKPROCEX, 0, (LPARAM)pfnEditWordBreakProcEx);
7659 	}
7660 #endif // (_RICHEDIT_VER < 0x0200)
7661 
7662 #if (_RICHEDIT_VER >= 0x0200)
GetTextRange(LONG nStartChar,LONG nEndChar,LPTSTR lpstrText)7663 	int GetTextRange(LONG nStartChar, LONG nEndChar, LPTSTR lpstrText) const
7664 	{
7665 		ATLASSERT(::IsWindow(m_hWnd));
7666 		TEXTRANGE tr = { 0 };
7667 		tr.chrg.cpMin = nStartChar;
7668 		tr.chrg.cpMax = nEndChar;
7669 		tr.lpstrText = lpstrText;
7670 		return (int)::SendMessage(m_hWnd, EM_GETTEXTRANGE, 0, (LPARAM)&tr);
7671 	}
7672 #else // !(_RICHEDIT_VER >= 0x0200)
GetTextRange(LONG nStartChar,LONG nEndChar,LPSTR lpstrText)7673 	int GetTextRange(LONG nStartChar, LONG nEndChar, LPSTR lpstrText) const
7674 	{
7675 		ATLASSERT(::IsWindow(m_hWnd));
7676 		TEXTRANGE tr = { 0 };
7677 		tr.chrg.cpMin = nStartChar;
7678 		tr.chrg.cpMax = nEndChar;
7679 		tr.lpstrText = lpstrText;
7680 		return (int)::SendMessage(m_hWnd, EM_GETTEXTRANGE, 0, (LPARAM)&tr);
7681 	}
7682 #endif // !(_RICHEDIT_VER >= 0x0200)
7683 
7684 #if (_RICHEDIT_VER >= 0x0200)
GetDefaultCharFormat(CHARFORMAT2 & cf)7685 	DWORD GetDefaultCharFormat(CHARFORMAT2& cf) const
7686 	{
7687 		ATLASSERT(::IsWindow(m_hWnd));
7688 		cf.cbSize = sizeof(CHARFORMAT2);
7689 		return (DWORD)::SendMessage(m_hWnd, EM_GETCHARFORMAT, 0, (LPARAM)&cf);
7690 	}
7691 
SetCharFormat(CHARFORMAT2 & cf,WORD wFlags)7692 	BOOL SetCharFormat(CHARFORMAT2& cf, WORD wFlags)
7693 	{
7694 		ATLASSERT(::IsWindow(m_hWnd));
7695 		cf.cbSize = sizeof(CHARFORMAT2);
7696 		return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, (WPARAM)wFlags, (LPARAM)&cf);
7697 	}
7698 
SetDefaultCharFormat(CHARFORMAT2 & cf)7699 	BOOL SetDefaultCharFormat(CHARFORMAT2& cf)
7700 	{
7701 		ATLASSERT(::IsWindow(m_hWnd));
7702 		cf.cbSize = sizeof(CHARFORMAT2);
7703 		return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, 0, (LPARAM)&cf);
7704 	}
7705 
GetSelectionCharFormat(CHARFORMAT2 & cf)7706 	DWORD GetSelectionCharFormat(CHARFORMAT2& cf) const
7707 	{
7708 		ATLASSERT(::IsWindow(m_hWnd));
7709 		cf.cbSize = sizeof(CHARFORMAT2);
7710 		return (DWORD)::SendMessage(m_hWnd, EM_GETCHARFORMAT, 1, (LPARAM)&cf);
7711 	}
7712 
SetSelectionCharFormat(CHARFORMAT2 & cf)7713 	BOOL SetSelectionCharFormat(CHARFORMAT2& cf)
7714 	{
7715 		ATLASSERT(::IsWindow(m_hWnd));
7716 		cf.cbSize = sizeof(CHARFORMAT2);
7717 		return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
7718 	}
7719 
SetWordCharFormat(CHARFORMAT2 & cf)7720 	BOOL SetWordCharFormat(CHARFORMAT2& cf)
7721 	{
7722 		ATLASSERT(::IsWindow(m_hWnd));
7723 		cf.cbSize = sizeof(CHARFORMAT2);
7724 		return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, SCF_SELECTION | SCF_WORD, (LPARAM)&cf);
7725 	}
7726 
GetParaFormat(PARAFORMAT2 & pf)7727 	DWORD GetParaFormat(PARAFORMAT2& pf) const
7728 	{
7729 		ATLASSERT(::IsWindow(m_hWnd));
7730 		pf.cbSize = sizeof(PARAFORMAT2);
7731 		return (DWORD)::SendMessage(m_hWnd, EM_GETPARAFORMAT, 0, (LPARAM)&pf);
7732 	}
7733 
SetParaFormat(PARAFORMAT2 & pf)7734 	BOOL SetParaFormat(PARAFORMAT2& pf)
7735 	{
7736 		ATLASSERT(::IsWindow(m_hWnd));
7737 		pf.cbSize = sizeof(PARAFORMAT2);
7738 		return (BOOL)::SendMessage(m_hWnd, EM_SETPARAFORMAT, 0, (LPARAM)&pf);
7739 	}
7740 
GetTextMode()7741 	TEXTMODE GetTextMode() const
7742 	{
7743 		ATLASSERT(::IsWindow(m_hWnd));
7744 		return (TEXTMODE)::SendMessage(m_hWnd, EM_GETTEXTMODE, 0, 0L);
7745 	}
7746 
SetTextMode(TEXTMODE enumTextMode)7747 	BOOL SetTextMode(TEXTMODE enumTextMode)
7748 	{
7749 		ATLASSERT(::IsWindow(m_hWnd));
7750 		return !(BOOL)::SendMessage(m_hWnd, EM_SETTEXTMODE, enumTextMode, 0L);
7751 	}
7752 
GetUndoName()7753 	UNDONAMEID GetUndoName() const
7754 	{
7755 		ATLASSERT(::IsWindow(m_hWnd));
7756 		return (UNDONAMEID)::SendMessage(m_hWnd, EM_GETUNDONAME, 0, 0L);
7757 	}
7758 
GetRedoName()7759 	UNDONAMEID GetRedoName() const
7760 	{
7761 		ATLASSERT(::IsWindow(m_hWnd));
7762 		return (UNDONAMEID)::SendMessage(m_hWnd, EM_GETREDONAME, 0, 0L);
7763 	}
7764 
CanRedo()7765 	BOOL CanRedo() const
7766 	{
7767 		ATLASSERT(::IsWindow(m_hWnd));
7768 		return (BOOL)::SendMessage(m_hWnd, EM_CANREDO, 0, 0L);
7769 	}
7770 
GetAutoURLDetect()7771 	BOOL GetAutoURLDetect() const
7772 	{
7773 		ATLASSERT(::IsWindow(m_hWnd));
7774 		return (BOOL)::SendMessage(m_hWnd, EM_GETAUTOURLDETECT, 0, 0L);
7775 	}
7776 
7777 	BOOL SetAutoURLDetect(BOOL bAutoDetect = TRUE)
7778 	{
7779 		ATLASSERT(::IsWindow(m_hWnd));
7780 		return !(BOOL)::SendMessage(m_hWnd, EM_AUTOURLDETECT, bAutoDetect, 0L);
7781 	}
7782 
7783 	// this method is deprecated, please use SetAutoURLDetect
7784 	BOOL EnableAutoURLDetect(BOOL bEnable = TRUE) { return SetAutoURLDetect(bEnable); }
7785 
SetUndoLimit(UINT uUndoLimit)7786 	UINT SetUndoLimit(UINT uUndoLimit)
7787 	{
7788 		ATLASSERT(::IsWindow(m_hWnd));
7789 		return (UINT)::SendMessage(m_hWnd, EM_SETUNDOLIMIT, uUndoLimit, 0L);
7790 	}
7791 
SetPalette(HPALETTE hPalette)7792 	void SetPalette(HPALETTE hPalette)
7793 	{
7794 		ATLASSERT(::IsWindow(m_hWnd));
7795 		::SendMessage(m_hWnd, EM_SETPALETTE, (WPARAM)hPalette, 0L);
7796 	}
7797 
GetTextEx(GETTEXTEX * pGetTextEx,LPTSTR lpstrText)7798 	int GetTextEx(GETTEXTEX* pGetTextEx, LPTSTR lpstrText) const
7799 	{
7800 		ATLASSERT(::IsWindow(m_hWnd));
7801 		return (int)::SendMessage(m_hWnd, EM_GETTEXTEX, (WPARAM)pGetTextEx, (LPARAM)lpstrText);
7802 	}
7803 
7804 	int GetTextEx(LPTSTR lpstrText, int nTextLen, DWORD dwFlags = GT_DEFAULT, UINT uCodePage = CP_ACP, LPCSTR lpDefaultChar = NULL, LPBOOL lpUsedDefChar = NULL) const
7805 	{
7806 		ATLASSERT(::IsWindow(m_hWnd));
7807 		GETTEXTEX gte = { 0 };
7808 		gte.cb = nTextLen * sizeof(TCHAR);
7809 		gte.codepage = uCodePage;
7810 		gte.flags = dwFlags;
7811 		gte.lpDefaultChar = lpDefaultChar;
7812 		gte.lpUsedDefChar = lpUsedDefChar;
7813 		return (int)::SendMessage(m_hWnd, EM_GETTEXTEX, (WPARAM)&gte, (LPARAM)lpstrText);
7814 	}
7815 
GetTextLengthEx(GETTEXTLENGTHEX * pGetTextLengthEx)7816 	int GetTextLengthEx(GETTEXTLENGTHEX* pGetTextLengthEx) const
7817 	{
7818 		ATLASSERT(::IsWindow(m_hWnd));
7819 		return (int)::SendMessage(m_hWnd, EM_GETTEXTLENGTHEX, (WPARAM)pGetTextLengthEx, 0L);
7820 	}
7821 
7822 	int GetTextLengthEx(DWORD dwFlags = GTL_DEFAULT, UINT uCodePage = CP_ACP) const
7823 	{
7824 		ATLASSERT(::IsWindow(m_hWnd));
7825 		GETTEXTLENGTHEX gtle = { 0 };
7826 		gtle.codepage = uCodePage;
7827 		gtle.flags = dwFlags;
7828 		return (int)::SendMessage(m_hWnd, EM_GETTEXTLENGTHEX, (WPARAM)&gtle, 0L);
7829 	}
7830 
GetWordBreakProc()7831 	EDITWORDBREAKPROC GetWordBreakProc() const
7832 	{
7833 		ATLASSERT(::IsWindow(m_hWnd));
7834 		return (EDITWORDBREAKPROC)::SendMessage(m_hWnd, EM_GETWORDBREAKPROC, 0, 0L);
7835 	}
7836 
SetWordBreakProc(EDITWORDBREAKPROC ewbprc)7837 	void SetWordBreakProc(EDITWORDBREAKPROC ewbprc)
7838 	{
7839 		ATLASSERT(::IsWindow(m_hWnd));
7840 		::SendMessage(m_hWnd, EM_SETWORDBREAKPROC, 0, (LPARAM)ewbprc);
7841 	}
7842 #endif // (_RICHEDIT_VER >= 0x0200)
7843 
7844 #if (_RICHEDIT_VER >= 0x0300)
SetTextEx(SETTEXTEX * pSetTextEx,LPCTSTR lpstrText)7845 	int SetTextEx(SETTEXTEX* pSetTextEx, LPCTSTR lpstrText)
7846 	{
7847 		ATLASSERT(::IsWindow(m_hWnd));
7848 		return (int)::SendMessage(m_hWnd, EM_SETTEXTEX, (WPARAM)pSetTextEx, (LPARAM)lpstrText);
7849 	}
7850 
7851 	int SetTextEx(LPCTSTR lpstrText, DWORD dwFlags = ST_DEFAULT, UINT uCodePage = CP_ACP)
7852 	{
7853 		ATLASSERT(::IsWindow(m_hWnd));
7854 		SETTEXTEX ste = { 0 };
7855 		ste.flags = dwFlags;
7856 		ste.codepage = uCodePage;
7857 		return (int)::SendMessage(m_hWnd, EM_SETTEXTEX, (WPARAM)&ste, (LPARAM)lpstrText);
7858 	}
7859 
GetEditStyle()7860 	int GetEditStyle() const
7861 	{
7862 		ATLASSERT(::IsWindow(m_hWnd));
7863 		return (int)::SendMessage(m_hWnd, EM_GETEDITSTYLE, 0, 0L);
7864 	}
7865 
7866 	int SetEditStyle(int nStyle, int nMask = -1)
7867 	{
7868 		ATLASSERT(::IsWindow(m_hWnd));
7869 		if(nMask == -1)
7870 			nMask = nStyle;   // set everything specified
7871 		return (int)::SendMessage(m_hWnd, EM_SETEDITSTYLE, nStyle, nMask);
7872 	}
7873 
SetFontSize(int nFontSizeDelta)7874 	BOOL SetFontSize(int nFontSizeDelta)
7875 	{
7876 		ATLASSERT(::IsWindow(m_hWnd));
7877 		ATLASSERT(nFontSizeDelta >= -1637 && nFontSizeDelta <= 1638);
7878 		return (BOOL)::SendMessage(m_hWnd, EM_SETFONTSIZE, nFontSizeDelta, 0L);
7879 	}
7880 
GetScrollPos(LPPOINT lpPoint)7881 	void GetScrollPos(LPPOINT lpPoint) const
7882 	{
7883 		ATLASSERT(::IsWindow(m_hWnd));
7884 		ATLASSERT(lpPoint != NULL);
7885 		::SendMessage(m_hWnd, EM_GETSCROLLPOS, 0, (LPARAM)lpPoint);
7886 	}
7887 
SetScrollPos(LPPOINT lpPoint)7888 	void SetScrollPos(LPPOINT lpPoint)
7889 	{
7890 		ATLASSERT(::IsWindow(m_hWnd));
7891 		ATLASSERT(lpPoint != NULL);
7892 		::SendMessage(m_hWnd, EM_SETSCROLLPOS, 0, (LPARAM)lpPoint);
7893 	}
7894 
GetZoom(int & nNum,int & nDen)7895 	BOOL GetZoom(int& nNum, int& nDen) const
7896 	{
7897 		ATLASSERT(::IsWindow(m_hWnd));
7898 		return (BOOL)::SendMessage(m_hWnd, EM_GETZOOM, (WPARAM)&nNum, (LPARAM)&nDen);
7899 	}
7900 
SetZoom(int nNum,int nDen)7901 	BOOL SetZoom(int nNum, int nDen)
7902 	{
7903 		ATLASSERT(::IsWindow(m_hWnd));
7904 		ATLASSERT(nNum >= 0 && nNum <= 64);
7905 		ATLASSERT(nDen >= 0 && nDen <= 64);
7906 		return (BOOL)::SendMessage(m_hWnd, EM_SETZOOM, nNum, nDen);
7907 	}
7908 
SetZoomOff()7909 	BOOL SetZoomOff()
7910 	{
7911 		ATLASSERT(::IsWindow(m_hWnd));
7912 		return (BOOL)::SendMessage(m_hWnd, EM_SETZOOM, 0, 0L);
7913 	}
7914 
7915 	void SetMargins(UINT nLeft, UINT nRight, WORD wFlags = EC_LEFTMARGIN | EC_RIGHTMARGIN)
7916 	{
7917 		ATLASSERT(::IsWindow(m_hWnd));
7918 		::SendMessage(m_hWnd, EM_SETMARGINS, wFlags, MAKELONG(nLeft, nRight));
7919 	}
7920 #endif // (_RICHEDIT_VER >= 0x0300)
7921 
7922 // Operations
7923 	void LimitText(LONG nChars = 0)
7924 	{
7925 		ATLASSERT(::IsWindow(m_hWnd));
7926 		::SendMessage(m_hWnd, EM_EXLIMITTEXT, 0, nChars);
7927 	}
7928 
LineFromChar(LONG nIndex)7929 	int LineFromChar(LONG nIndex) const
7930 	{
7931 		ATLASSERT(::IsWindow(m_hWnd));
7932 		return (int)::SendMessage(m_hWnd, EM_EXLINEFROMCHAR, 0, nIndex);
7933 	}
7934 
PosFromChar(LONG nChar)7935 	POINT PosFromChar(LONG nChar) const
7936 	{
7937 		ATLASSERT(::IsWindow(m_hWnd));
7938 		POINT point = { 0, 0 };
7939 		::SendMessage(m_hWnd, EM_POSFROMCHAR, (WPARAM)&point, nChar);
7940 		return point;
7941 	}
7942 
CharFromPos(POINT pt)7943 	int CharFromPos(POINT pt) const
7944 	{
7945 		ATLASSERT(::IsWindow(m_hWnd));
7946 		POINTL ptl = { pt.x, pt.y };
7947 		return (int)::SendMessage(m_hWnd, EM_CHARFROMPOS, 0, (LPARAM)&ptl);
7948 	}
7949 
EmptyUndoBuffer()7950 	void EmptyUndoBuffer()
7951 	{
7952 		ATLASSERT(::IsWindow(m_hWnd));
7953 		::SendMessage(m_hWnd, EM_EMPTYUNDOBUFFER, 0, 0L);
7954 	}
7955 
7956 	int LineIndex(int nLine = -1) const
7957 	{
7958 		ATLASSERT(::IsWindow(m_hWnd));
7959 		return (int)::SendMessage(m_hWnd, EM_LINEINDEX, nLine, 0L);
7960 	}
7961 
7962 	int LineLength(int nLine = -1) const
7963 	{
7964 		ATLASSERT(::IsWindow(m_hWnd));
7965 		return (int)::SendMessage(m_hWnd, EM_LINELENGTH, nLine, 0L);
7966 	}
7967 
LineScroll(int nLines)7968 	BOOL LineScroll(int nLines)
7969 	{
7970 		ATLASSERT(::IsWindow(m_hWnd));
7971 		return (BOOL)::SendMessage(m_hWnd, EM_LINESCROLL, 0, nLines);
7972 	}
7973 
7974 	void ReplaceSel(LPCTSTR lpszNewText, BOOL bCanUndo = FALSE)
7975 	{
7976 		ATLASSERT(::IsWindow(m_hWnd));
7977 		::SendMessage(m_hWnd, EM_REPLACESEL, (WPARAM) bCanUndo, (LPARAM)lpszNewText);
7978 	}
7979 
SetRect(LPCRECT lpRect)7980 	void SetRect(LPCRECT lpRect)
7981 	{
7982 		ATLASSERT(::IsWindow(m_hWnd));
7983 		::SendMessage(m_hWnd, EM_SETRECT, 0, (LPARAM)lpRect);
7984 	}
7985 
DisplayBand(LPRECT pDisplayRect)7986 	BOOL DisplayBand(LPRECT pDisplayRect)
7987 	{
7988 		ATLASSERT(::IsWindow(m_hWnd));
7989 		return (BOOL)::SendMessage(m_hWnd, EM_DISPLAYBAND, 0, (LPARAM)pDisplayRect);
7990 	}
7991 
FindText(DWORD dwFlags,FINDTEXT & ft)7992 	LONG FindText(DWORD dwFlags, FINDTEXT& ft) const
7993 	{
7994 		ATLASSERT(::IsWindow(m_hWnd));
7995 #if (_RICHEDIT_VER >= 0x0200) && defined(_UNICODE)
7996 		return (LONG)::SendMessage(m_hWnd, EM_FINDTEXTW, dwFlags, (LPARAM)&ft);
7997 #else
7998 		return (LONG)::SendMessage(m_hWnd, EM_FINDTEXT, dwFlags, (LPARAM)&ft);
7999 #endif
8000 	}
8001 
FindText(DWORD dwFlags,FINDTEXTEX & ft)8002 	LONG FindText(DWORD dwFlags, FINDTEXTEX& ft) const
8003 	{
8004 		ATLASSERT(::IsWindow(m_hWnd));
8005 #if (_RICHEDIT_VER >= 0x0200) && defined(_UNICODE)
8006 		return (LONG)::SendMessage(m_hWnd, EM_FINDTEXTEXW, dwFlags, (LPARAM)&ft);
8007 #else
8008 		return (LONG)::SendMessage(m_hWnd, EM_FINDTEXTEX, dwFlags, (LPARAM)&ft);
8009 #endif
8010 	}
8011 
8012 	LONG FormatRange(FORMATRANGE& fr, BOOL bDisplay = TRUE)
8013 	{
8014 		ATLASSERT(::IsWindow(m_hWnd));
8015 		return (LONG)::SendMessage(m_hWnd, EM_FORMATRANGE, bDisplay, (LPARAM)&fr);
8016 	}
8017 
8018 	LONG FormatRange(FORMATRANGE* pFormatRange, BOOL bDisplay = TRUE)
8019 	{
8020 		ATLASSERT(::IsWindow(m_hWnd));
8021 		return (LONG)::SendMessage(m_hWnd, EM_FORMATRANGE, bDisplay, (LPARAM)pFormatRange);
8022 	}
8023 
8024 	void HideSelection(BOOL bHide = TRUE, BOOL bChangeStyle = FALSE)
8025 	{
8026 		ATLASSERT(::IsWindow(m_hWnd));
8027 		::SendMessage(m_hWnd, EM_HIDESELECTION, bHide, bChangeStyle);
8028 	}
8029 
8030 	void PasteSpecial(UINT uClipFormat, DWORD dwAspect = 0, HMETAFILE hMF = 0)
8031 	{
8032 		ATLASSERT(::IsWindow(m_hWnd));
8033 		REPASTESPECIAL reps = { dwAspect, (DWORD_PTR)hMF };
8034 		::SendMessage(m_hWnd, EM_PASTESPECIAL, uClipFormat, (LPARAM)&reps);
8035 	}
8036 
RequestResize()8037 	void RequestResize()
8038 	{
8039 		ATLASSERT(::IsWindow(m_hWnd));
8040 		::SendMessage(m_hWnd, EM_REQUESTRESIZE, 0, 0L);
8041 	}
8042 
StreamIn(UINT uFormat,EDITSTREAM & es)8043 	LONG StreamIn(UINT uFormat, EDITSTREAM& es)
8044 	{
8045 		ATLASSERT(::IsWindow(m_hWnd));
8046 		return (LONG)::SendMessage(m_hWnd, EM_STREAMIN, uFormat, (LPARAM)&es);
8047 	}
8048 
StreamOut(UINT uFormat,EDITSTREAM & es)8049 	LONG StreamOut(UINT uFormat, EDITSTREAM& es)
8050 	{
8051 		ATLASSERT(::IsWindow(m_hWnd));
8052 		return (LONG)::SendMessage(m_hWnd, EM_STREAMOUT, uFormat, (LPARAM)&es);
8053 	}
8054 
FindWordBreak(int nCode,LONG nStartChar)8055 	DWORD FindWordBreak(int nCode, LONG nStartChar)
8056 	{
8057 		ATLASSERT(::IsWindow(m_hWnd));
8058 		return (DWORD)::SendMessage(m_hWnd, EM_FINDWORDBREAK, nCode, nStartChar);
8059 	}
8060 
8061 	// Additional operations
ScrollCaret()8062 	void ScrollCaret()
8063 	{
8064 		ATLASSERT(::IsWindow(m_hWnd));
8065 		::SendMessage(m_hWnd, EM_SCROLLCARET, 0, 0L);
8066 	}
8067 
8068 	int InsertText(long nInsertAfterChar, LPCTSTR lpstrText, BOOL bCanUndo = FALSE)
8069 	{
8070 		int nRet = SetSel(nInsertAfterChar, nInsertAfterChar);
8071 		ReplaceSel(lpstrText, bCanUndo);
8072 		return nRet;
8073 	}
8074 
8075 	int AppendText(LPCTSTR lpstrText, BOOL bCanUndo = FALSE)
8076 	{
8077 		return InsertText(GetWindowTextLength(), lpstrText, bCanUndo);
8078 	}
8079 
8080 	// Clipboard operations
Undo()8081 	BOOL Undo()
8082 	{
8083 		ATLASSERT(::IsWindow(m_hWnd));
8084 		return (BOOL)::SendMessage(m_hWnd, EM_UNDO, 0, 0L);
8085 	}
8086 
Clear()8087 	void Clear()
8088 	{
8089 		ATLASSERT(::IsWindow(m_hWnd));
8090 		::SendMessage(m_hWnd, WM_CLEAR, 0, 0L);
8091 	}
8092 
Copy()8093 	void Copy()
8094 	{
8095 		ATLASSERT(::IsWindow(m_hWnd));
8096 		::SendMessage(m_hWnd, WM_COPY, 0, 0L);
8097 	}
8098 
Cut()8099 	void Cut()
8100 	{
8101 		ATLASSERT(::IsWindow(m_hWnd));
8102 		::SendMessage(m_hWnd, WM_CUT, 0, 0L);
8103 	}
8104 
Paste()8105 	void Paste()
8106 	{
8107 		ATLASSERT(::IsWindow(m_hWnd));
8108 		::SendMessage(m_hWnd, WM_PASTE, 0, 0L);
8109 	}
8110 
8111 	// OLE support
GetOleInterface()8112 	IRichEditOle* GetOleInterface() const
8113 	{
8114 		ATLASSERT(::IsWindow(m_hWnd));
8115 		IRichEditOle *pRichEditOle = NULL;
8116 		::SendMessage(m_hWnd, EM_GETOLEINTERFACE, 0, (LPARAM)&pRichEditOle);
8117 		return pRichEditOle;
8118 	}
8119 
SetOleCallback(IRichEditOleCallback * pCallback)8120 	BOOL SetOleCallback(IRichEditOleCallback* pCallback)
8121 	{
8122 		ATLASSERT(::IsWindow(m_hWnd));
8123 		return (BOOL)::SendMessage(m_hWnd, EM_SETOLECALLBACK, 0, (LPARAM)pCallback);
8124 	}
8125 
8126 #if (_RICHEDIT_VER >= 0x0200)
Redo()8127 	BOOL Redo()
8128 	{
8129 		ATLASSERT(::IsWindow(m_hWnd));
8130 		return (BOOL)::SendMessage(m_hWnd, EM_REDO, 0, 0L);
8131 	}
8132 
StopGroupTyping()8133 	void StopGroupTyping()
8134 	{
8135 		ATLASSERT(::IsWindow(m_hWnd));
8136 		::SendMessage(m_hWnd, EM_STOPGROUPTYPING, 0, 0L);
8137 	}
8138 
8139 	void ShowScrollBar(int nBarType, BOOL bVisible = TRUE)
8140 	{
8141 		ATLASSERT(::IsWindow(m_hWnd));
8142 		::SendMessage(m_hWnd, EM_SHOWSCROLLBAR, nBarType, bVisible);
8143 	}
8144 #endif // (_RICHEDIT_VER >= 0x0200)
8145 
8146 #if (_RICHEDIT_VER >= 0x0300)
SetTabStops(int nTabStops,LPINT rgTabStops)8147 	BOOL SetTabStops(int nTabStops, LPINT rgTabStops)
8148 	{
8149 		ATLASSERT(::IsWindow(m_hWnd));
8150 		return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, nTabStops, (LPARAM)rgTabStops);
8151 	}
8152 
SetTabStops()8153 	BOOL SetTabStops()
8154 	{
8155 		ATLASSERT(::IsWindow(m_hWnd));
8156 		return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, 0, 0L);
8157 	}
8158 
SetTabStops(const int & cxEachStop)8159 	BOOL SetTabStops(const int& cxEachStop)    // takes an 'int'
8160 	{
8161 		ATLASSERT(::IsWindow(m_hWnd));
8162 		return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, 1, (LPARAM)(LPINT)&cxEachStop);
8163 	}
8164 #endif // (_RICHEDIT_VER >= 0x0300)
8165 
8166 #if (_RICHEDIT_VER >= 0x0800)
GetAutoCorrectProc()8167 	AutoCorrectProc GetAutoCorrectProc() const
8168 	{
8169 		ATLASSERT(::IsWindow(m_hWnd));
8170 		return (AutoCorrectProc)::SendMessage(m_hWnd, EM_GETAUTOCORRECTPROC, 0, 0L);
8171 	}
8172 
SetAutoCorrectProc(AutoCorrectProc pfn)8173 	BOOL SetAutoCorrectProc(AutoCorrectProc pfn)
8174 	{
8175 		ATLASSERT(::IsWindow(m_hWnd));
8176 		return (BOOL)::SendMessage(m_hWnd, EM_SETAUTOCORRECTPROC, (WPARAM)pfn, 0L);
8177 	}
8178 
CallAutoCorrectProc(WCHAR ch)8179 	BOOL CallAutoCorrectProc(WCHAR ch)
8180 	{
8181 		ATLASSERT(::IsWindow(m_hWnd));
8182 		return (BOOL)::SendMessage(m_hWnd, EM_CALLAUTOCORRECTPROC, (WPARAM)ch, 0L);
8183 	}
8184 
GetEditStyleEx()8185 	DWORD GetEditStyleEx() const
8186 	{
8187 		ATLASSERT(::IsWindow(m_hWnd));
8188 		return (DWORD)::SendMessage(m_hWnd, EM_GETEDITSTYLEEX, 0, 0L);
8189 	}
8190 
SetEditStyleEx(DWORD dwStyleEx,DWORD dwMask)8191 	DWORD SetEditStyleEx(DWORD dwStyleEx, DWORD dwMask)
8192 	{
8193 		ATLASSERT(::IsWindow(m_hWnd));
8194 		return (DWORD)::SendMessage(m_hWnd, EM_SETEDITSTYLEEX, dwStyleEx, dwMask);
8195 	}
8196 
GetStoryType(int nStoryIndex)8197 	DWORD GetStoryType(int nStoryIndex) const
8198 	{
8199 		ATLASSERT(::IsWindow(m_hWnd));
8200 		return (DWORD)::SendMessage(m_hWnd, EM_GETSTORYTYPE, nStoryIndex, 0L);
8201 	}
8202 
SetStoryType(int nStoryIndex,DWORD dwStoryType)8203 	DWORD SetStoryType(int nStoryIndex, DWORD dwStoryType)
8204 	{
8205 		ATLASSERT(::IsWindow(m_hWnd));
8206 		return (DWORD)::SendMessage(m_hWnd, EM_SETSTORYTYPE, nStoryIndex, dwStoryType);
8207 	}
8208 
GetEllipsisMode()8209 	DWORD GetEllipsisMode() const
8210 	{
8211 		ATLASSERT(::IsWindow(m_hWnd));
8212 
8213 		DWORD dwMode = 0;
8214 		BOOL bRet = (BOOL)::SendMessage(m_hWnd, EM_GETELLIPSISMODE, 0, (LPARAM)&dwMode);
8215 		bRet;   // avoid level 4 warning
8216 		ATLASSERT(bRet != FALSE);
8217 
8218 		return dwMode;
8219 	}
8220 
SetEllipsisMode(DWORD dwEllipsisMode)8221 	BOOL SetEllipsisMode(DWORD dwEllipsisMode)
8222 	{
8223 		ATLASSERT(::IsWindow(m_hWnd));
8224 		return (BOOL)::SendMessage(m_hWnd, EM_SETELLIPSISMODE, 0, dwEllipsisMode);
8225 	}
8226 
GetEllipsisState()8227 	BOOL GetEllipsisState() const
8228 	{
8229 		ATLASSERT(::IsWindow(m_hWnd));
8230 		return (BOOL)::SendMessage(m_hWnd, EM_GETELLIPSISSTATE, 0, 0L);
8231 	}
8232 
GetTouchOptions(int nTouchOptions)8233 	BOOL GetTouchOptions(int nTouchOptions) const
8234 	{
8235 		ATLASSERT(::IsWindow(m_hWnd));
8236 		return (BOOL)::SendMessage(m_hWnd, EM_GETTOUCHOPTIONS, nTouchOptions, 0L);
8237 	}
8238 
SetTouchOptions(int nTouchOptions,BOOL bEnable)8239 	void SetTouchOptions(int nTouchOptions, BOOL bEnable)
8240 	{
8241 		ATLASSERT(::IsWindow(m_hWnd));
8242 		::SendMessage(m_hWnd, EM_SETTOUCHOPTIONS, nTouchOptions, bEnable);
8243 	}
8244 
InsertTable(TABLEROWPARMS * pRowParams,TABLECELLPARMS * pCellParams)8245 	HRESULT InsertTable(TABLEROWPARMS* pRowParams, TABLECELLPARMS* pCellParams)
8246 	{
8247 		ATLASSERT(::IsWindow(m_hWnd));
8248 		return (HRESULT)::SendMessage(m_hWnd, EM_INSERTTABLE, (WPARAM)pRowParams, (LPARAM)pCellParams);
8249 	}
8250 
GetTableParams(TABLEROWPARMS * pRowParams,TABLECELLPARMS * pCellParams)8251 	HRESULT GetTableParams(TABLEROWPARMS* pRowParams, TABLECELLPARMS* pCellParams) const
8252 	{
8253 		ATLASSERT(::IsWindow(m_hWnd));
8254 		return (HRESULT)::SendMessage(m_hWnd, EM_GETTABLEPARMS, (WPARAM)pRowParams, (LPARAM)pCellParams);
8255 	}
8256 
SetTableParams(TABLEROWPARMS * pRowParams,TABLECELLPARMS * pCellParams)8257 	HRESULT SetTableParams(TABLEROWPARMS* pRowParams, TABLECELLPARMS* pCellParams)
8258 	{
8259 		ATLASSERT(::IsWindow(m_hWnd));
8260 		return (HRESULT)::SendMessage(m_hWnd, EM_SETTABLEPARMS, (WPARAM)pRowParams, (LPARAM)pCellParams);
8261 	}
8262 
InsertImage(RICHEDIT_IMAGE_PARAMETERS * pParams)8263 	HRESULT InsertImage(RICHEDIT_IMAGE_PARAMETERS* pParams)
8264 	{
8265 		ATLASSERT(::IsWindow(m_hWnd));
8266 		return (HRESULT)::SendMessage(m_hWnd, EM_INSERTIMAGE, 0, (LPARAM)pParams);
8267 	}
8268 
SetUiaName(LPCTSTR lpstrName)8269 	BOOL SetUiaName(LPCTSTR lpstrName)
8270 	{
8271 		ATLASSERT(::IsWindow(m_hWnd));
8272 		return (BOOL)::SendMessage(m_hWnd, EM_SETUIANAME, 0, (LPARAM)lpstrName);
8273 	}
8274 #endif // (_RICHEDIT_VER >= 0x0800)
8275 };
8276 
8277 typedef CRichEditCtrlT<ATL::CWindow>   CRichEditCtrl;
8278 
8279 #endif // !_WIN32_WCE
8280 
8281 
8282 ///////////////////////////////////////////////////////////////////////////////
8283 // CRichEditCommands - message handlers for standard EDIT commands
8284 
8285 #ifndef _WIN32_WCE
8286 
8287 // Chain to CRichEditCommands message map. Your class must also derive from CRichEditCtrl.
8288 // Example:
8289 // class CMyRichEdit : public CWindowImpl<CMyRichEdit, CRichEditCtrl>,
8290 //                     public CRichEditCommands<CMyRichEdit>
8291 // {
8292 // public:
8293 //      BEGIN_MSG_MAP(CMyRichEdit)
8294 //              // your handlers...
8295 //              CHAIN_MSG_MAP_ALT(CRichEditCommands<CMyRichEdit>, 1)
8296 //      END_MSG_MAP()
8297 //      // other stuff...
8298 // };
8299 
8300 template <class T>
8301 class CRichEditCommands : public CEditCommands< T >
8302 {
8303 public:
BEGIN_MSG_MAP(CRichEditCommands<T>)8304 	BEGIN_MSG_MAP(CRichEditCommands< T >)
8305 	ALT_MSG_MAP(1)
8306 		COMMAND_ID_HANDLER(ID_EDIT_CLEAR, CEditCommands< T >::OnEditClear)
8307 		COMMAND_ID_HANDLER(ID_EDIT_CLEAR_ALL, CEditCommands< T >::OnEditClearAll)
8308 		COMMAND_ID_HANDLER(ID_EDIT_COPY, CEditCommands< T >::OnEditCopy)
8309 		COMMAND_ID_HANDLER(ID_EDIT_CUT, CEditCommands< T >::OnEditCut)
8310 		COMMAND_ID_HANDLER(ID_EDIT_PASTE, CEditCommands< T >::OnEditPaste)
8311 		COMMAND_ID_HANDLER(ID_EDIT_SELECT_ALL, CEditCommands< T >::OnEditSelectAll)
8312 		COMMAND_ID_HANDLER(ID_EDIT_UNDO, CEditCommands< T >::OnEditUndo)
8313 #if (_RICHEDIT_VER >= 0x0200)
8314 		COMMAND_ID_HANDLER(ID_EDIT_REDO, OnEditRedo)
8315 #endif // (_RICHEDIT_VER >= 0x0200)
8316 	END_MSG_MAP()
8317 
8318 #if (_RICHEDIT_VER >= 0x0200)
8319 	LRESULT OnEditRedo(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
8320 	{
8321 		T* pT = static_cast<T*>(this);
8322 		pT->Redo();
8323 		return 0;
8324 	}
8325 #endif // (_RICHEDIT_VER >= 0x0200)
8326 
8327 // State (update UI) helpers
CanCut()8328 	BOOL CanCut() const
8329 	{ return HasSelection(); }
8330 
CanCopy()8331 	BOOL CanCopy() const
8332 	{ return HasSelection(); }
8333 
CanClear()8334 	BOOL CanClear() const
8335 	{ return HasSelection(); }
8336 
8337 // Implementation
HasSelection()8338 	BOOL HasSelection() const
8339 	{
8340 		const T* pT = static_cast<const T*>(this);
8341 		return (pT->GetSelectionType() != SEL_EMPTY);
8342 	}
8343 };
8344 
8345 #endif // _WIN32_WCE
8346 
8347 
8348 ///////////////////////////////////////////////////////////////////////////////
8349 // CDragListBox
8350 
8351 #ifndef _WIN32_WCE
8352 
8353 template <class TBase>
8354 class CDragListBoxT : public CListBoxT< TBase >
8355 {
8356 public:
8357 // Constructors
8358 	CDragListBoxT(HWND hWnd = NULL) : CListBoxT< TBase >(hWnd)
8359 	{ }
8360 
8361 	CDragListBoxT< TBase >& operator =(HWND hWnd)
8362 	{
8363 		m_hWnd = hWnd;
8364 		return *this;
8365 	}
8366 
8367 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
8368 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
8369 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
8370 	{
8371 		HWND hWnd = TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
8372 		if(hWnd != NULL)
8373 			MakeDragList();
8374 		return hWnd;
8375 	}
8376 
8377 // Operations
MakeDragList()8378 	BOOL MakeDragList()
8379 	{
8380 		ATLASSERT(::IsWindow(m_hWnd));
8381 		ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) == 0);
8382 		return ::MakeDragList(m_hWnd);
8383 	}
8384 
8385 	int LBItemFromPt(POINT pt, BOOL bAutoScroll = TRUE)
8386 	{
8387 		ATLASSERT(::IsWindow(m_hWnd));
8388 		return ::LBItemFromPt(m_hWnd, pt, bAutoScroll);
8389 	}
8390 
DrawInsert(int nItem)8391 	void DrawInsert(int nItem)
8392 	{
8393 		ATLASSERT(::IsWindow(m_hWnd));
8394 		::DrawInsert(GetParent(), m_hWnd, nItem);
8395 	}
8396 
GetDragListMessage()8397 	static UINT GetDragListMessage()
8398 	{
8399 		static UINT uDragListMessage = 0;
8400 		if(uDragListMessage == 0)
8401 		{
8402 			CStaticDataInitCriticalSectionLock lock;
8403 			if(FAILED(lock.Lock()))
8404 			{
8405 				ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CDragListBox::GetDragListMessage.\n"));
8406 				ATLASSERT(FALSE);
8407 				return 0;
8408 			}
8409 
8410 			if(uDragListMessage == 0)
8411 				uDragListMessage = ::RegisterWindowMessage(DRAGLISTMSGSTRING);
8412 
8413 			lock.Unlock();
8414 		}
8415 		ATLASSERT(uDragListMessage != 0);
8416 		return uDragListMessage;
8417 	}
8418 };
8419 
8420 typedef CDragListBoxT<ATL::CWindow>   CDragListBox;
8421 
8422 template <class T>
8423 class CDragListNotifyImpl
8424 {
8425 public:
BEGIN_MSG_MAP(CDragListNotifyImpl<T>)8426 	BEGIN_MSG_MAP(CDragListNotifyImpl< T >)
8427 		MESSAGE_HANDLER(CDragListBox::GetDragListMessage(), OnDragListNotify)
8428 	END_MSG_MAP()
8429 
8430 	LRESULT OnDragListNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
8431 	{
8432 		uMsg;   // avoid level 4 warning
8433 		ATLASSERT(uMsg == CDragListBox::GetDragListMessage());
8434 		T* pT = static_cast<T*>(this);
8435 		LPDRAGLISTINFO lpDragListInfo = (LPDRAGLISTINFO)lParam;
8436 		LRESULT lRet = 0;
8437 		switch(lpDragListInfo->uNotification)
8438 		{
8439 		case DL_BEGINDRAG:
8440 			lRet = (LPARAM)pT->OnBeginDrag((int)wParam, lpDragListInfo->hWnd, lpDragListInfo->ptCursor);
8441 			break;
8442 		case DL_CANCELDRAG:
8443 			pT->OnCancelDrag((int)wParam, lpDragListInfo->hWnd, lpDragListInfo->ptCursor);
8444 			break;
8445 		case DL_DRAGGING:
8446 			lRet = (LPARAM)pT->OnDragging((int)wParam, lpDragListInfo->hWnd, lpDragListInfo->ptCursor);
8447 			break;
8448 		case DL_DROPPED:
8449 			pT->OnDropped((int)wParam, lpDragListInfo->hWnd, lpDragListInfo->ptCursor);
8450 			break;
8451 		default:
8452 			ATLTRACE2(atlTraceUI, 0, _T("Unknown DragListBox notification\n"));
8453 			bHandled = FALSE;   // don't handle it
8454 			break;
8455 		}
8456 		return lRet;
8457 	}
8458 
8459 // Overrideables
OnBeginDrag(int,HWND,POINT)8460 	BOOL OnBeginDrag(int /*nCtlID*/, HWND /*hWndDragList*/, POINT /*ptCursor*/)
8461 	{
8462 		return TRUE;   // allow dragging
8463 	}
8464 
OnCancelDrag(int,HWND,POINT)8465 	void OnCancelDrag(int /*nCtlID*/, HWND /*hWndDragList*/, POINT /*ptCursor*/)
8466 	{
8467 		// nothing to do
8468 	}
8469 
OnDragging(int,HWND,POINT)8470 	int OnDragging(int /*nCtlID*/, HWND /*hWndDragList*/, POINT /*ptCursor*/)
8471 	{
8472 		return 0;   // don't change cursor
8473 	}
8474 
OnDropped(int,HWND,POINT)8475 	void OnDropped(int /*nCtlID*/, HWND /*hWndDragList*/, POINT /*ptCursor*/)
8476 	{
8477 		// nothing to do
8478 	}
8479 };
8480 
8481 #endif // _WIN32_WCE
8482 
8483 
8484 ///////////////////////////////////////////////////////////////////////////////
8485 // CReBarCtrl
8486 
8487 template <class TBase>
8488 class CReBarCtrlT : public TBase
8489 {
8490 public:
8491 // Constructors
TBase(hWnd)8492 	CReBarCtrlT(HWND hWnd = NULL) : TBase(hWnd)
8493 	{ }
8494 
8495 	CReBarCtrlT< TBase >& operator =(HWND hWnd)
8496 	{
8497 		m_hWnd = hWnd;
8498 		return *this;
8499 	}
8500 
8501 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
8502 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
8503 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
8504 	{
8505 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
8506 	}
8507 
8508 // Attributes
GetWndClassName()8509 	static LPCTSTR GetWndClassName()
8510 	{
8511 		return REBARCLASSNAME;
8512 	}
8513 
GetBandCount()8514 	UINT GetBandCount() const
8515 	{
8516 		ATLASSERT(::IsWindow(m_hWnd));
8517 		return (UINT)::SendMessage(m_hWnd, RB_GETBANDCOUNT, 0, 0L);
8518 	}
8519 
GetBandInfo(int nBand,LPREBARBANDINFO lprbbi)8520 	BOOL GetBandInfo(int nBand, LPREBARBANDINFO lprbbi) const
8521 	{
8522 		ATLASSERT(::IsWindow(m_hWnd));
8523 		return (BOOL)::SendMessage(m_hWnd, RB_GETBANDINFO, nBand, (LPARAM)lprbbi);
8524 	}
8525 
SetBandInfo(int nBand,LPREBARBANDINFO lprbbi)8526 	BOOL SetBandInfo(int nBand, LPREBARBANDINFO lprbbi)
8527 	{
8528 		ATLASSERT(::IsWindow(m_hWnd));
8529 		return (BOOL)::SendMessage(m_hWnd, RB_SETBANDINFO, nBand, (LPARAM)lprbbi);
8530 	}
8531 
GetBarInfo(LPREBARINFO lprbi)8532 	BOOL GetBarInfo(LPREBARINFO lprbi) const
8533 	{
8534 		ATLASSERT(::IsWindow(m_hWnd));
8535 		return (BOOL)::SendMessage(m_hWnd, RB_GETBARINFO, 0, (LPARAM)lprbi);
8536 	}
8537 
SetBarInfo(LPREBARINFO lprbi)8538 	BOOL SetBarInfo(LPREBARINFO lprbi)
8539 	{
8540 		ATLASSERT(::IsWindow(m_hWnd));
8541 		return (BOOL)::SendMessage(m_hWnd, RB_SETBARINFO, 0, (LPARAM)lprbi);
8542 	}
8543 
GetImageList()8544 	CImageList GetImageList() const
8545 	{
8546 		ATLASSERT(::IsWindow(m_hWnd));
8547 		REBARINFO rbi = { 0 };
8548 		rbi.cbSize = sizeof(REBARINFO);
8549 		rbi.fMask = RBIM_IMAGELIST;
8550 		BOOL bRet = (BOOL)::SendMessage(m_hWnd, RB_GETBARINFO, 0, (LPARAM)&rbi);
8551 		return CImageList((bRet != FALSE) ? rbi.himl : NULL);
8552 	}
8553 
SetImageList(HIMAGELIST hImageList)8554 	BOOL SetImageList(HIMAGELIST hImageList)
8555 	{
8556 		ATLASSERT(::IsWindow(m_hWnd));
8557 		REBARINFO rbi = { 0 };
8558 		rbi.cbSize = sizeof(REBARINFO);
8559 		rbi.fMask = RBIM_IMAGELIST;
8560 		rbi.himl = hImageList;
8561 		return (BOOL)::SendMessage(m_hWnd, RB_SETBARINFO, 0, (LPARAM)&rbi);
8562 	}
8563 
GetRowCount()8564 	UINT GetRowCount() const
8565 	{
8566 		ATLASSERT(::IsWindow(m_hWnd));
8567 		return (UINT)::SendMessage(m_hWnd, RB_GETROWCOUNT, 0, 0L);
8568 	}
8569 
GetRowHeight(int nBand)8570 	UINT GetRowHeight(int nBand) const
8571 	{
8572 		ATLASSERT(::IsWindow(m_hWnd));
8573 		return (UINT)::SendMessage(m_hWnd, RB_GETROWHEIGHT, nBand, 0L);
8574 	}
8575 
8576 #if (_WIN32_IE >= 0x0400)
GetTextColor()8577 	COLORREF GetTextColor() const
8578 	{
8579 		ATLASSERT(::IsWindow(m_hWnd));
8580 		return (COLORREF)::SendMessage(m_hWnd, RB_GETTEXTCOLOR, 0, 0L);
8581 	}
8582 
SetTextColor(COLORREF clr)8583 	COLORREF SetTextColor(COLORREF clr)
8584 	{
8585 		ATLASSERT(::IsWindow(m_hWnd));
8586 		return (COLORREF)::SendMessage(m_hWnd, RB_SETTEXTCOLOR, 0, (LPARAM)clr);
8587 	}
8588 
GetBkColor()8589 	COLORREF GetBkColor() const
8590 	{
8591 		ATLASSERT(::IsWindow(m_hWnd));
8592 		return (COLORREF)::SendMessage(m_hWnd, RB_GETBKCOLOR, 0, 0L);
8593 	}
8594 
SetBkColor(COLORREF clr)8595 	COLORREF SetBkColor(COLORREF clr)
8596 	{
8597 		ATLASSERT(::IsWindow(m_hWnd));
8598 		return (COLORREF)::SendMessage(m_hWnd, RB_SETBKCOLOR, 0, (LPARAM)clr);
8599 	}
8600 
GetBarHeight()8601 	UINT GetBarHeight() const
8602 	{
8603 		ATLASSERT(::IsWindow(m_hWnd));
8604 		return (UINT)::SendMessage(m_hWnd, RB_GETBARHEIGHT, 0, 0L);
8605 	}
8606 
GetRect(int nBand,LPRECT lpRect)8607 	BOOL GetRect(int nBand, LPRECT lpRect) const
8608 	{
8609 		ATLASSERT(::IsWindow(m_hWnd));
8610 		return (BOOL)::SendMessage(m_hWnd, RB_GETRECT, nBand, (LPARAM)lpRect);
8611 	}
8612 
8613 #ifndef _WIN32_WCE
GetToolTips()8614 	CToolTipCtrl GetToolTips() const
8615 	{
8616 		ATLASSERT(::IsWindow(m_hWnd));
8617 		return CToolTipCtrl((HWND)::SendMessage(m_hWnd, RB_GETTOOLTIPS, 0, 0L));
8618 	}
8619 
SetToolTips(HWND hwndToolTip)8620 	void SetToolTips(HWND hwndToolTip)
8621 	{
8622 		ATLASSERT(::IsWindow(m_hWnd));
8623 		::SendMessage(m_hWnd, RB_SETTOOLTIPS, (WPARAM)hwndToolTip, 0L);
8624 	}
8625 #endif // !_WIN32_WCE
8626 
GetBandBorders(int nBand,LPRECT lpRect)8627 	void GetBandBorders(int nBand, LPRECT lpRect) const
8628 	{
8629 		ATLASSERT(::IsWindow(m_hWnd));
8630 		ATLASSERT(lpRect != NULL);
8631 		::SendMessage(m_hWnd, RB_GETBANDBORDERS, nBand, (LPARAM)lpRect);
8632 	}
8633 
8634 #ifndef _WIN32_WCE
GetColorScheme(LPCOLORSCHEME lpColorScheme)8635 	BOOL GetColorScheme(LPCOLORSCHEME lpColorScheme) const
8636 	{
8637 		ATLASSERT(::IsWindow(m_hWnd));
8638 		ATLASSERT(lpColorScheme != NULL);
8639 		return (BOOL)::SendMessage(m_hWnd, RB_GETCOLORSCHEME, 0, (LPARAM)lpColorScheme);
8640 	}
8641 
SetColorScheme(LPCOLORSCHEME lpColorScheme)8642 	void SetColorScheme(LPCOLORSCHEME lpColorScheme)
8643 	{
8644 		ATLASSERT(::IsWindow(m_hWnd));
8645 		ATLASSERT(lpColorScheme != NULL);
8646 		::SendMessage(m_hWnd, RB_SETCOLORSCHEME, 0, (LPARAM)lpColorScheme);
8647 	}
8648 
GetPalette()8649 	HPALETTE GetPalette() const
8650 	{
8651 		ATLASSERT(::IsWindow(m_hWnd));
8652 		return (HPALETTE)::SendMessage(m_hWnd, RB_GETPALETTE, 0, 0L);
8653 	}
8654 
SetPalette(HPALETTE hPalette)8655 	HPALETTE SetPalette(HPALETTE hPalette)
8656 	{
8657 		ATLASSERT(::IsWindow(m_hWnd));
8658 		return (HPALETTE)::SendMessage(m_hWnd, RB_SETPALETTE, 0, (LPARAM)hPalette);
8659 	}
8660 
GetUnicodeFormat()8661 	BOOL GetUnicodeFormat() const
8662 	{
8663 		ATLASSERT(::IsWindow(m_hWnd));
8664 		return (BOOL)::SendMessage(m_hWnd, RB_GETUNICODEFORMAT, 0, 0L);
8665 	}
8666 
8667 	BOOL SetUnicodeFormat(BOOL bUnicode = TRUE)
8668 	{
8669 		ATLASSERT(::IsWindow(m_hWnd));
8670 		return (BOOL)::SendMessage(m_hWnd, RB_SETUNICODEFORMAT, bUnicode, 0L);
8671 	}
8672 #endif // !_WIN32_WCE
8673 #endif // (_WIN32_IE >= 0x0400)
8674 
8675 #if (_WIN32_WINNT >= 0x0501)
8676 	// requires uxtheme.h to be included to use MARGINS struct
8677 #ifndef _UXTHEME_H_
8678 	typedef struct _MARGINS*   PMARGINS;
8679 #endif // !_UXTHEME_H_
GetBandMargins(PMARGINS pMargins)8680 	void GetBandMargins(PMARGINS pMargins) const
8681 	{
8682 		ATLASSERT(::IsWindow(m_hWnd));
8683 		::SendMessage(m_hWnd, RB_GETBANDMARGINS, 0, (LPARAM)pMargins);
8684 	}
8685 
SetWindowTheme(LPCWSTR lpstrTheme)8686 	void SetWindowTheme(LPCWSTR lpstrTheme)
8687 	{
8688 		ATLASSERT(::IsWindow(m_hWnd));
8689 		::SendMessage(m_hWnd, RB_SETWINDOWTHEME, 0, (LPARAM)lpstrTheme);
8690 	}
8691 #endif // (_WIN32_WINNT >= 0x0501)
8692 
8693 #if (_WIN32_IE >= 0x0600)
GetExtendedStyle()8694 	DWORD GetExtendedStyle() const
8695 	{
8696 #ifndef RB_GETEXTENDEDSTYLE
8697 	const UINT RB_GETEXTENDEDSTYLE = WM_USER + 42;
8698 #endif
8699 		ATLASSERT(::IsWindow(m_hWnd));
8700 		return (DWORD)::SendMessage(m_hWnd, RB_GETEXTENDEDSTYLE, 0, 0L);
8701 	}
8702 
SetExtendedStyle(DWORD dwStyle,DWORD dwMask)8703 	DWORD SetExtendedStyle(DWORD dwStyle, DWORD dwMask)
8704 	{
8705 #ifndef RB_SETEXTENDEDSTYLE
8706 		const UINT RB_SETEXTENDEDSTYLE = WM_USER + 41;
8707 #endif
8708 		ATLASSERT(::IsWindow(m_hWnd));
8709 		return (DWORD)::SendMessage(m_hWnd, RB_SETEXTENDEDSTYLE, dwMask, dwStyle);
8710 	}
8711 #endif // (_WIN32_IE >= 0x0600)
8712 
8713 // Operations
InsertBand(int nBand,LPREBARBANDINFO lprbbi)8714 	BOOL InsertBand(int nBand, LPREBARBANDINFO lprbbi)
8715 	{
8716 		ATLASSERT(::IsWindow(m_hWnd));
8717 		return (BOOL)::SendMessage(m_hWnd, RB_INSERTBAND, nBand, (LPARAM)lprbbi);
8718 	}
8719 
AddBand(LPREBARBANDINFO lprbbi)8720 	BOOL AddBand(LPREBARBANDINFO lprbbi)
8721 	{
8722 		return InsertBand(-1, lprbbi);
8723 	}
8724 
DeleteBand(int nBand)8725 	BOOL DeleteBand(int nBand)
8726 	{
8727 		ATLASSERT(::IsWindow(m_hWnd));
8728 		return (BOOL)::SendMessage(m_hWnd, RB_DELETEBAND, nBand, 0L);
8729 	}
8730 
SetNotifyWnd(HWND hWnd)8731 	ATL::CWindow SetNotifyWnd(HWND hWnd)
8732 	{
8733 		ATLASSERT(::IsWindow(m_hWnd));
8734 		return ATL::CWindow((HWND)::SendMessage(m_hWnd, RB_SETPARENT, (WPARAM)hWnd, 0L));
8735 	}
8736 
8737 #if (_WIN32_IE >= 0x0400)
BeginDrag(int nBand,DWORD dwPos)8738 	void BeginDrag(int nBand, DWORD dwPos)
8739 	{
8740 		ATLASSERT(::IsWindow(m_hWnd));
8741 		::SendMessage(m_hWnd, RB_BEGINDRAG, nBand, dwPos);
8742 	}
8743 
BeginDrag(int nBand,int xPos,int yPos)8744 	void BeginDrag(int nBand, int xPos, int yPos)
8745 	{
8746 		ATLASSERT(::IsWindow(m_hWnd));
8747 		::SendMessage(m_hWnd, RB_BEGINDRAG, nBand, MAKELPARAM(xPos, yPos));
8748 	}
8749 
EndDrag()8750 	void EndDrag()
8751 	{
8752 		ATLASSERT(::IsWindow(m_hWnd));
8753 		::SendMessage(m_hWnd, RB_ENDDRAG, 0, 0L);
8754 	}
8755 
DragMove(DWORD dwPos)8756 	void DragMove(DWORD dwPos)
8757 	{
8758 		ATLASSERT(::IsWindow(m_hWnd));
8759 		::SendMessage(m_hWnd, RB_DRAGMOVE, 0, dwPos);
8760 	}
8761 
DragMove(int xPos,int yPos)8762 	void DragMove(int xPos, int yPos)
8763 	{
8764 		ATLASSERT(::IsWindow(m_hWnd));
8765 		::SendMessage(m_hWnd, RB_DRAGMOVE, 0, MAKELPARAM(xPos, yPos));
8766 	}
8767 
8768 #ifndef _WIN32_WCE
GetDropTarget(IDropTarget ** ppDropTarget)8769 	void GetDropTarget(IDropTarget** ppDropTarget) const
8770 	{
8771 		ATLASSERT(::IsWindow(m_hWnd));
8772 		::SendMessage(m_hWnd, RB_GETDROPTARGET, 0, (LPARAM)ppDropTarget);
8773 	}
8774 #endif // !_WIN32_WCE
8775 
8776 	void MaximizeBand(int nBand, BOOL bIdeal = FALSE)
8777 	{
8778 		ATLASSERT(::IsWindow(m_hWnd));
8779 		::SendMessage(m_hWnd, RB_MAXIMIZEBAND, nBand, bIdeal);
8780 	}
8781 
MinimizeBand(int nBand)8782 	void MinimizeBand(int nBand)
8783 	{
8784 		ATLASSERT(::IsWindow(m_hWnd));
8785 		::SendMessage(m_hWnd, RB_MINIMIZEBAND, nBand, 0L);
8786 	}
8787 
SizeToRect(LPRECT lpRect)8788 	BOOL SizeToRect(LPRECT lpRect)
8789 	{
8790 		ATLASSERT(::IsWindow(m_hWnd));
8791 		return (BOOL)::SendMessage(m_hWnd, RB_SIZETORECT, 0, (LPARAM)lpRect);
8792 	}
8793 
IdToIndex(UINT uBandID)8794 	int IdToIndex(UINT uBandID) const
8795 	{
8796 		ATLASSERT(::IsWindow(m_hWnd));
8797 		return (int)::SendMessage(m_hWnd, RB_IDTOINDEX, uBandID, 0L);
8798 	}
8799 
HitTest(LPRBHITTESTINFO lprbht)8800 	int HitTest(LPRBHITTESTINFO lprbht) const
8801 	{
8802 		ATLASSERT(::IsWindow(m_hWnd));
8803 		return (int)::SendMessage(m_hWnd, RB_HITTEST, 0, (LPARAM)lprbht);
8804 	}
8805 
ShowBand(int nBand,BOOL bShow)8806 	BOOL ShowBand(int nBand, BOOL bShow)
8807 	{
8808 		ATLASSERT(::IsWindow(m_hWnd));
8809 		return (BOOL)::SendMessage(m_hWnd, RB_SHOWBAND, nBand, bShow);
8810 	}
8811 
8812 #ifndef _WIN32_WCE
MoveBand(int nBand,int nNewPos)8813 	BOOL MoveBand(int nBand, int nNewPos)
8814 	{
8815 		ATLASSERT(::IsWindow(m_hWnd));
8816 		ATLASSERT(nNewPos >= 0 && nNewPos <= ((int)GetBandCount() - 1));
8817 		return (BOOL)::SendMessage(m_hWnd, RB_MOVEBAND, nBand, nNewPos);
8818 	}
8819 #endif // !_WIN32_WCE
8820 #endif // (_WIN32_IE >= 0x0400)
8821 
8822 #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
PushChevron(int nBand,LPARAM lAppValue)8823 	void PushChevron(int nBand, LPARAM lAppValue)
8824 	{
8825 		ATLASSERT(::IsWindow(m_hWnd));
8826 		::SendMessage(m_hWnd, RB_PUSHCHEVRON, nBand, lAppValue);
8827 	}
8828 #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
8829 
8830 // Extra operations
8831 #if (_WIN32_IE >= 0x0400)
LockBands(bool bLock)8832 	void LockBands(bool bLock)
8833 	{
8834 		int nBandCount = GetBandCount();
8835 		for(int i =0; i < nBandCount; i++)
8836 		{
8837 			REBARBANDINFO rbbi = { RunTimeHelper::SizeOf_REBARBANDINFO() };
8838 			rbbi.fMask = RBBIM_STYLE;
8839 			BOOL bRet = GetBandInfo(i, &rbbi);
8840 			ATLASSERT(bRet);
8841 
8842 			if((rbbi.fStyle & RBBS_GRIPPERALWAYS) == 0)
8843 			{
8844 				rbbi.fStyle |= RBBS_GRIPPERALWAYS;
8845 				bRet = SetBandInfo(i, &rbbi);
8846 				ATLASSERT(bRet);
8847 				rbbi.fStyle &= ~RBBS_GRIPPERALWAYS;
8848 			}
8849 
8850 			if(bLock)
8851 				rbbi.fStyle |= RBBS_NOGRIPPER;
8852 			else
8853 				rbbi.fStyle &= ~RBBS_NOGRIPPER;
8854 
8855 			bRet = SetBandInfo(i, &rbbi);
8856 			ATLASSERT(bRet);
8857 		}
8858 	}
8859 #endif // (_WIN32_IE >= 0x0400)
8860 
8861 #if (_WIN32_WINNT >= 0x0600)
SetBandWidth(int nBand,int cxWidth)8862 	BOOL SetBandWidth(int nBand, int cxWidth)
8863 	{
8864 		ATLASSERT(::IsWindow(m_hWnd));
8865 		return (BOOL)::SendMessage(m_hWnd, RB_SETBANDWIDTH, nBand, cxWidth);
8866 	}
8867 #endif // (_WIN32_WINNT >= 0x0600)
8868 };
8869 
8870 typedef CReBarCtrlT<ATL::CWindow>   CReBarCtrl;
8871 
8872 
8873 ///////////////////////////////////////////////////////////////////////////////
8874 // CComboBoxEx
8875 
8876 #ifndef _WIN32_WCE
8877 
8878 template <class TBase>
8879 class CComboBoxExT : public CComboBoxT< TBase >
8880 {
8881 public:
8882 // Constructors
8883 	CComboBoxExT(HWND hWnd = NULL) : CComboBoxT< TBase >(hWnd)
8884 	{ }
8885 
8886 	CComboBoxExT< TBase >& operator =(HWND hWnd)
8887 	{
8888 		m_hWnd = hWnd;
8889 		return *this;
8890 	}
8891 
8892 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
8893 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
8894 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
8895 	{
8896 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
8897 	}
8898 
8899 // Attributes
GetWndClassName()8900 	static LPCTSTR GetWndClassName()
8901 	{
8902 		return WC_COMBOBOXEX;
8903 	}
8904 
GetImageList()8905 	CImageList GetImageList() const
8906 	{
8907 		ATLASSERT(::IsWindow(m_hWnd));
8908 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, CBEM_GETIMAGELIST, 0, 0L));
8909 	}
8910 
SetImageList(HIMAGELIST hImageList)8911 	CImageList SetImageList(HIMAGELIST hImageList)
8912 	{
8913 		ATLASSERT(::IsWindow(m_hWnd));
8914 		return CImageList((HIMAGELIST)::SendMessage(m_hWnd, CBEM_SETIMAGELIST, 0, (LPARAM)hImageList));
8915 	}
8916 
8917 #if (_WIN32_IE >= 0x0400)
GetExtendedStyle()8918 	DWORD GetExtendedStyle() const
8919 	{
8920 		ATLASSERT(::IsWindow(m_hWnd));
8921 		return (DWORD)::SendMessage(m_hWnd, CBEM_GETEXTENDEDSTYLE, 0, 0L);
8922 	}
8923 
SetExtendedStyle(DWORD dwExMask,DWORD dwExStyle)8924 	DWORD SetExtendedStyle(DWORD dwExMask, DWORD dwExStyle)
8925 	{
8926 		ATLASSERT(::IsWindow(m_hWnd));
8927 		return (DWORD)::SendMessage(m_hWnd, CBEM_SETEXTENDEDSTYLE, dwExMask, dwExStyle);
8928 	}
8929 
GetUnicodeFormat()8930 	BOOL GetUnicodeFormat() const
8931 	{
8932 		ATLASSERT(::IsWindow(m_hWnd));
8933 		return (BOOL)::SendMessage(m_hWnd, CBEM_GETUNICODEFORMAT, 0, 0L);
8934 	}
8935 
8936 	BOOL SetUnicodeFormat(BOOL bUnicode = TRUE)
8937 	{
8938 		ATLASSERT(::IsWindow(m_hWnd));
8939 		return (BOOL)::SendMessage(m_hWnd, CBEM_SETUNICODEFORMAT, bUnicode, 0L);
8940 	}
8941 #endif // (_WIN32_IE >= 0x0400)
8942 
8943 #if (_WIN32_WINNT >= 0x0501)
SetWindowTheme(LPCWSTR lpstrTheme)8944 	void SetWindowTheme(LPCWSTR lpstrTheme)
8945 	{
8946 		ATLASSERT(::IsWindow(m_hWnd));
8947 		::SendMessage(m_hWnd, CBEM_SETWINDOWTHEME, 0, (LPARAM)lpstrTheme);
8948 	}
8949 #endif // (_WIN32_WINNT >= 0x0501)
8950 
8951 // Operations
InsertItem(const COMBOBOXEXITEM * lpcCBItem)8952 	int InsertItem(const COMBOBOXEXITEM* lpcCBItem)
8953 	{
8954 		ATLASSERT(::IsWindow(m_hWnd));
8955 		return (int)::SendMessage(m_hWnd, CBEM_INSERTITEM, 0, (LPARAM)lpcCBItem);
8956 	}
8957 
InsertItem(UINT nMask,int nIndex,LPCTSTR lpszItem,int nImage,int nSelImage,int iIndent,int iOverlay,LPARAM lParam)8958 	int InsertItem(UINT nMask, int nIndex, LPCTSTR lpszItem, int nImage, int nSelImage,
8959 	               int iIndent, int iOverlay, LPARAM lParam)
8960 	{
8961 		ATLASSERT(::IsWindow(m_hWnd));
8962 		COMBOBOXEXITEM cbex = { 0 };
8963 		cbex.mask = nMask;
8964 		cbex.iItem = nIndex;
8965 		cbex.pszText = (LPTSTR) lpszItem;
8966 		cbex.iImage = nImage;
8967 		cbex.iSelectedImage = nSelImage;
8968 		cbex.iIndent = iIndent;
8969 		cbex.iOverlay = iOverlay;
8970 		cbex.lParam = lParam;
8971 		return (int)::SendMessage(m_hWnd, CBEM_INSERTITEM, 0, (LPARAM)&cbex);
8972 	}
8973 
8974 	int InsertItem(int nIndex, LPCTSTR lpszItem, int nImage, int nSelImage, int iIndent, LPARAM lParam = 0)
8975 	{
8976 		ATLASSERT(::IsWindow(m_hWnd));
8977 		COMBOBOXEXITEM cbex = { 0 };
8978 		cbex.mask = CBEIF_TEXT | CBEIF_IMAGE | CBEIF_SELECTEDIMAGE | CBEIF_INDENT | CBEIF_LPARAM;
8979 		cbex.iItem = nIndex;
8980 		cbex.pszText = (LPTSTR) lpszItem;
8981 		cbex.iImage = nImage;
8982 		cbex.iSelectedImage = nSelImage;
8983 		cbex.iIndent = iIndent;
8984 		cbex.lParam = lParam;
8985 		return (int)::SendMessage(m_hWnd, CBEM_INSERTITEM, 0, (LPARAM)&cbex);
8986 	}
8987 
AddItem(UINT nMask,LPCTSTR lpszItem,int nImage,int nSelImage,int iIndent,int iOverlay,LPARAM lParam)8988 	int AddItem(UINT nMask, LPCTSTR lpszItem, int nImage, int nSelImage, int iIndent, int iOverlay, LPARAM lParam)
8989 	{
8990 		return InsertItem(nMask, -1, lpszItem, nImage, nSelImage, iIndent, iOverlay, lParam);
8991 	}
8992 
8993 	int AddItem(LPCTSTR lpszItem, int nImage, int nSelImage, int iIndent, LPARAM lParam = 0)
8994 	{
8995 		return InsertItem(-1, lpszItem, nImage, nSelImage, iIndent, lParam);
8996 	}
8997 
DeleteItem(int nIndex)8998 	int DeleteItem(int nIndex)
8999 	{
9000 		ATLASSERT(::IsWindow(m_hWnd));
9001 		return (int)::SendMessage(m_hWnd, CBEM_DELETEITEM, nIndex, 0L);
9002 	}
9003 
GetItem(PCOMBOBOXEXITEM pCBItem)9004 	BOOL GetItem(PCOMBOBOXEXITEM pCBItem) const
9005 	{
9006 		ATLASSERT(::IsWindow(m_hWnd));
9007 		return (BOOL)::SendMessage(m_hWnd, CBEM_GETITEM, 0, (LPARAM)pCBItem);
9008 	}
9009 
SetItem(const COMBOBOXEXITEM * lpcCBItem)9010 	BOOL SetItem(const COMBOBOXEXITEM* lpcCBItem)
9011 	{
9012 		ATLASSERT(::IsWindow(m_hWnd));
9013 		return (BOOL)::SendMessage(m_hWnd, CBEM_SETITEM, 0, (LPARAM)lpcCBItem);
9014 	}
9015 
SetItem(int nIndex,UINT nMask,LPCTSTR lpszItem,int nImage,int nSelImage,int iIndent,int iOverlay,LPARAM lParam)9016 	int SetItem(int nIndex, UINT nMask, LPCTSTR lpszItem, int nImage, int nSelImage,
9017 	            int iIndent, int iOverlay, LPARAM lParam)
9018 	{
9019 		ATLASSERT(::IsWindow(m_hWnd));
9020 		COMBOBOXEXITEM cbex = { 0 };
9021 		cbex.mask = nMask;
9022 		cbex.iItem = nIndex;
9023 		cbex.pszText = (LPTSTR) lpszItem;
9024 		cbex.iImage = nImage;
9025 		cbex.iSelectedImage = nSelImage;
9026 		cbex.iIndent = iIndent;
9027 		cbex.iOverlay = iOverlay;
9028 		cbex.lParam = lParam;
9029 		return (int)::SendMessage(m_hWnd, CBEM_SETITEM, 0, (LPARAM)&cbex);
9030 	}
9031 
GetItemText(int nIndex,LPTSTR lpszItem,int nLen)9032 	BOOL GetItemText(int nIndex, LPTSTR lpszItem, int nLen) const
9033 	{
9034 		ATLASSERT(::IsWindow(m_hWnd));
9035 		ATLASSERT(lpszItem != NULL);
9036 
9037 		COMBOBOXEXITEM cbex = { 0 };
9038 		cbex.mask = CBEIF_TEXT;
9039 		cbex.iItem = nIndex;
9040 		cbex.pszText = lpszItem;
9041 		cbex.cchTextMax = nLen;
9042 
9043 		return (BOOL)::SendMessage(m_hWnd, CBEM_GETITEM, 0, (LPARAM)&cbex);
9044 	}
9045 
9046 #ifndef _ATL_NO_COM
GetItemText(int nIndex,BSTR & bstrText)9047 	BOOL GetItemText(int nIndex, BSTR& bstrText) const
9048 	{
9049 		USES_CONVERSION;
9050 		ATLASSERT(::IsWindow(m_hWnd));
9051 		ATLASSERT(bstrText == NULL);
9052 
9053 		COMBOBOXEXITEM cbex = { 0 };
9054 		cbex.mask = CBEIF_TEXT;
9055 		cbex.iItem = nIndex;
9056 
9057 		LPTSTR lpstrText = NULL;
9058 		BOOL bRet = FALSE;
9059 		for(int nLen = 256; ; nLen *= 2)
9060 		{
9061 			ATLTRY(lpstrText = new TCHAR[nLen]);
9062 			if(lpstrText == NULL)
9063 				break;
9064 			lpstrText[0] = NULL;
9065 			cbex.pszText = lpstrText;
9066 			cbex.cchTextMax = nLen;
9067 			bRet = (BOOL)::SendMessage(m_hWnd, CBEM_GETITEM, 0, (LPARAM)&cbex);
9068 			if(!bRet || (lstrlen(cbex.pszText) < nLen - 1))
9069 				break;
9070 			delete [] lpstrText;
9071 			lpstrText = NULL;
9072 		}
9073 
9074 		if(lpstrText != NULL)
9075 		{
9076 			if(bRet)
9077 				bstrText = ::SysAllocString(T2OLE(lpstrText));
9078 			delete [] lpstrText;
9079 		}
9080 
9081 		return (bstrText != NULL) ? TRUE : FALSE;
9082 	}
9083 #endif // !_ATL_NO_COM
9084 
9085 #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
GetItemText(int nIndex,_CSTRING_NS::CString & strText)9086 	BOOL GetItemText(int nIndex, _CSTRING_NS::CString& strText) const
9087 	{
9088 		ATLASSERT(::IsWindow(m_hWnd));
9089 
9090 		COMBOBOXEXITEM cbex = { 0 };
9091 		cbex.mask = CBEIF_TEXT;
9092 		cbex.iItem = nIndex;
9093 
9094 		strText.Empty();
9095 		BOOL bRet = FALSE;
9096 		for(int nLen = 256; ; nLen *= 2)
9097 		{
9098 			cbex.pszText = strText.GetBufferSetLength(nLen);
9099 			if(cbex.pszText == NULL)
9100 			{
9101 				bRet = FALSE;
9102 				break;
9103 			}
9104 			cbex.cchTextMax = nLen;
9105 			bRet = (BOOL)::SendMessage(m_hWnd, CBEM_GETITEM, 0, (LPARAM)&cbex);
9106 			if(!bRet || (lstrlen(cbex.pszText) < nLen - 1))
9107 				break;
9108 		}
9109 		strText.ReleaseBuffer();
9110 		return bRet;
9111 	}
9112 #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
9113 
SetItemText(int nIndex,LPCTSTR lpszItem)9114 	BOOL SetItemText(int nIndex, LPCTSTR lpszItem)
9115 	{
9116 		ATLASSERT(::IsWindow(m_hWnd));
9117 		return SetItem(nIndex, CBEIF_TEXT, lpszItem, 0, 0, 0, 0, 0);
9118 	}
9119 
GetComboCtrl()9120 	CComboBox GetComboCtrl() const
9121 	{
9122 		ATLASSERT(::IsWindow(m_hWnd));
9123 		return CComboBox((HWND)::SendMessage(m_hWnd, CBEM_GETCOMBOCONTROL, 0, 0L));
9124 	}
9125 
GetEditCtrl()9126 	CEdit GetEditCtrl() const
9127 	{
9128 		ATLASSERT(::IsWindow(m_hWnd));
9129 		return CEdit((HWND)::SendMessage(m_hWnd, CBEM_GETEDITCONTROL, 0, 0L));
9130 	}
9131 
HasEditChanged()9132 	BOOL HasEditChanged() const
9133 	{
9134 		ATLASSERT(::IsWindow(m_hWnd));
9135 		return (BOOL)::SendMessage(m_hWnd, CBEM_HASEDITCHANGED, 0, 0L);
9136 	}
9137 
9138 // Non-functional
AddString(LPCTSTR)9139 	int AddString(LPCTSTR /*lpszItem*/)
9140 	{
9141 		ATLASSERT(FALSE);  // Not available in CComboBoxEx; use InsertItem
9142 		return 0;
9143 	}
9144 
InsertString(int,LPCTSTR)9145 	int InsertString(int /*nIndex*/, LPCTSTR /*lpszString*/)
9146 	{
9147 		ATLASSERT(FALSE);  // Not available in CComboBoxEx; use InsertItem
9148 		return 0;
9149 	}
9150 
Dir(UINT,LPCTSTR)9151 	int Dir(UINT /*attr*/, LPCTSTR /*lpszWildCard*/)
9152 	{
9153 		ATLASSERT(FALSE);  // Not available in CComboBoxEx
9154 		return 0;
9155 	}
9156 
FindString(int,LPCTSTR)9157 	int FindString(int /*nStartAfter*/, LPCTSTR /*lpszString*/) const
9158 	{
9159 		ATLASSERT(FALSE);  // Not available in CComboBoxEx; try FindStringExact
9160 		return 0;
9161 	}
9162 };
9163 
9164 typedef CComboBoxExT<ATL::CWindow>   CComboBoxEx;
9165 
9166 #endif // !_WIN32_WCE
9167 
9168 
9169 ///////////////////////////////////////////////////////////////////////////////
9170 // CMonthCalendarCtrl
9171 
9172 template <class TBase>
9173 class CMonthCalendarCtrlT : public TBase
9174 {
9175 public:
9176 // Constructors
TBase(hWnd)9177 	CMonthCalendarCtrlT(HWND hWnd = NULL) : TBase(hWnd)
9178 	{ }
9179 
9180 	CMonthCalendarCtrlT< TBase >& operator =(HWND hWnd)
9181 	{
9182 		m_hWnd = hWnd;
9183 		return *this;
9184 	}
9185 
9186 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
9187 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
9188 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
9189 	{
9190 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
9191 	}
9192 
9193 // Attributes
GetWndClassName()9194 	static LPCTSTR GetWndClassName()
9195 	{
9196 		return MONTHCAL_CLASS;
9197 	}
9198 
GetColor(int nColorType)9199 	COLORREF GetColor(int nColorType) const
9200 	{
9201 		ATLASSERT(::IsWindow(m_hWnd));
9202 		return (COLORREF)::SendMessage(m_hWnd, MCM_GETCOLOR, nColorType, 0L);
9203 	}
9204 
SetColor(int nColorType,COLORREF clr)9205 	COLORREF SetColor(int nColorType, COLORREF clr)
9206 	{
9207 		ATLASSERT(::IsWindow(m_hWnd));
9208 		return (COLORREF)::SendMessage(m_hWnd, MCM_SETCOLOR, nColorType, clr);
9209 	}
9210 
GetCurSel(LPSYSTEMTIME lpSysTime)9211 	BOOL GetCurSel(LPSYSTEMTIME lpSysTime) const
9212 	{
9213 		ATLASSERT(::IsWindow(m_hWnd));
9214 		return (BOOL)::SendMessage(m_hWnd, MCM_GETCURSEL, 0, (LPARAM)lpSysTime);
9215 	}
9216 
SetCurSel(LPSYSTEMTIME lpSysTime)9217 	BOOL SetCurSel(LPSYSTEMTIME lpSysTime)
9218 	{
9219 		ATLASSERT(::IsWindow(m_hWnd));
9220 		return (BOOL)::SendMessage(m_hWnd, MCM_SETCURSEL, 0, (LPARAM)lpSysTime);
9221 	}
9222 
9223 	int GetFirstDayOfWeek(BOOL* pbLocaleVal = NULL) const
9224 	{
9225 		ATLASSERT(::IsWindow(m_hWnd));
9226 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, MCM_GETFIRSTDAYOFWEEK, 0, 0L);
9227 		if(pbLocaleVal != NULL)
9228 			*pbLocaleVal = (BOOL)HIWORD(dwRet);
9229 		return (int)(short)LOWORD(dwRet);
9230 	}
9231 
9232 	int SetFirstDayOfWeek(int nDay, BOOL* pbLocaleVal = NULL)
9233 	{
9234 		ATLASSERT(::IsWindow(m_hWnd));
9235 		DWORD dwRet = (DWORD)::SendMessage(m_hWnd, MCM_SETFIRSTDAYOFWEEK, 0, nDay);
9236 		if(pbLocaleVal != NULL)
9237 			*pbLocaleVal = (BOOL)HIWORD(dwRet);
9238 		return (int)(short)LOWORD(dwRet);
9239 	}
9240 
GetMaxSelCount()9241 	int GetMaxSelCount() const
9242 	{
9243 		ATLASSERT(::IsWindow(m_hWnd));
9244 		return (int)::SendMessage(m_hWnd, MCM_GETMAXSELCOUNT, 0, 0L);
9245 	}
9246 
SetMaxSelCount(int nMax)9247 	BOOL SetMaxSelCount(int nMax)
9248 	{
9249 		ATLASSERT(::IsWindow(m_hWnd));
9250 		return (BOOL)::SendMessage(m_hWnd, MCM_SETMAXSELCOUNT, nMax, 0L);
9251 	}
9252 
GetMonthDelta()9253 	int GetMonthDelta() const
9254 	{
9255 		ATLASSERT(::IsWindow(m_hWnd));
9256 		return (int)::SendMessage(m_hWnd, MCM_GETMONTHDELTA, 0, 0L);
9257 	}
9258 
SetMonthDelta(int nDelta)9259 	int SetMonthDelta(int nDelta)
9260 	{
9261 		ATLASSERT(::IsWindow(m_hWnd));
9262 		return (int)::SendMessage(m_hWnd, MCM_SETMONTHDELTA, nDelta, 0L);
9263 	}
9264 
GetRange(LPSYSTEMTIME lprgSysTimeArray)9265 	DWORD GetRange(LPSYSTEMTIME lprgSysTimeArray) const
9266 	{
9267 		ATLASSERT(::IsWindow(m_hWnd));
9268 		return (DWORD)::SendMessage(m_hWnd, MCM_GETRANGE, 0, (LPARAM)lprgSysTimeArray);
9269 	}
9270 
SetRange(DWORD dwFlags,LPSYSTEMTIME lprgSysTimeArray)9271 	BOOL SetRange(DWORD dwFlags, LPSYSTEMTIME lprgSysTimeArray)
9272 	{
9273 		ATLASSERT(::IsWindow(m_hWnd));
9274 		return (BOOL)::SendMessage(m_hWnd, MCM_SETRANGE, dwFlags, (LPARAM)lprgSysTimeArray);
9275 	}
9276 
GetSelRange(LPSYSTEMTIME lprgSysTimeArray)9277 	BOOL GetSelRange(LPSYSTEMTIME lprgSysTimeArray) const
9278 	{
9279 		ATLASSERT(::IsWindow(m_hWnd));
9280 		return (BOOL)::SendMessage(m_hWnd, MCM_GETSELRANGE, 0, (LPARAM)lprgSysTimeArray);
9281 	}
9282 
SetSelRange(LPSYSTEMTIME lprgSysTimeArray)9283 	BOOL SetSelRange(LPSYSTEMTIME lprgSysTimeArray)
9284 	{
9285 		ATLASSERT(::IsWindow(m_hWnd));
9286 		return (BOOL)::SendMessage(m_hWnd, MCM_SETSELRANGE, 0, (LPARAM)lprgSysTimeArray);
9287 	}
9288 
GetToday(LPSYSTEMTIME lpSysTime)9289 	BOOL GetToday(LPSYSTEMTIME lpSysTime) const
9290 	{
9291 		ATLASSERT(::IsWindow(m_hWnd));
9292 		return (BOOL)::SendMessage(m_hWnd, MCM_GETTODAY, 0, (LPARAM)lpSysTime);
9293 	}
9294 
SetToday(LPSYSTEMTIME lpSysTime)9295 	void SetToday(LPSYSTEMTIME lpSysTime)
9296 	{
9297 		ATLASSERT(::IsWindow(m_hWnd));
9298 		::SendMessage(m_hWnd, MCM_SETTODAY, 0, (LPARAM)lpSysTime);
9299 	}
9300 
GetMinReqRect(LPRECT lpRectInfo)9301 	BOOL GetMinReqRect(LPRECT lpRectInfo) const
9302 	{
9303 		ATLASSERT(::IsWindow(m_hWnd));
9304 		return (BOOL)::SendMessage(m_hWnd, MCM_GETMINREQRECT, 0, (LPARAM)lpRectInfo);
9305 	}
9306 
GetMaxTodayWidth()9307 	int GetMaxTodayWidth() const
9308 	{
9309 		ATLASSERT(::IsWindow(m_hWnd));
9310 		return (int)::SendMessage(m_hWnd, MCM_GETMAXTODAYWIDTH, 0, 0L);
9311 	}
9312 
9313 #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
GetUnicodeFormat()9314 	BOOL GetUnicodeFormat() const
9315 	{
9316 		ATLASSERT(::IsWindow(m_hWnd));
9317 		return (BOOL)::SendMessage(m_hWnd, MCM_GETUNICODEFORMAT, 0, 0L);
9318 	}
9319 
9320 	BOOL SetUnicodeFormat(BOOL bUnicode = TRUE)
9321 	{
9322 		ATLASSERT(::IsWindow(m_hWnd));
9323 		return (BOOL)::SendMessage(m_hWnd, MCM_SETUNICODEFORMAT, bUnicode, 0L);
9324 	}
9325 #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
9326 
9327 #if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)
GetCurrentView()9328 	DWORD GetCurrentView() const
9329 	{
9330 		ATLASSERT(::IsWindow(m_hWnd));
9331 		return (DWORD)::SendMessage(m_hWnd, MCM_GETCURRENTVIEW, 0, 0L);
9332 	}
9333 
SetCurrentView(DWORD dwView)9334 	BOOL SetCurrentView(DWORD dwView)
9335 	{
9336 		ATLASSERT(::IsWindow(m_hWnd));
9337 		return (BOOL)::SendMessage(m_hWnd, MCM_SETCURRENTVIEW, 0, dwView);
9338 	}
9339 
GetCalendarCount()9340 	DWORD GetCalendarCount() const
9341 	{
9342 		ATLASSERT(::IsWindow(m_hWnd));
9343 		return (DWORD)::SendMessage(m_hWnd, MCM_GETCALENDARCOUNT, 0, 0L);
9344 	}
9345 
GetCalendarGridInfo(PMCGRIDINFO pGridInfo)9346 	BOOL GetCalendarGridInfo(PMCGRIDINFO pGridInfo) const
9347 	{
9348 		ATLASSERT(::IsWindow(m_hWnd));
9349 		return (BOOL)::SendMessage(m_hWnd, MCM_GETCALENDARGRIDINFO, 0, (LPARAM)pGridInfo);
9350 	}
9351 
GetCALID()9352 	CALID GetCALID() const
9353 	{
9354 		ATLASSERT(::IsWindow(m_hWnd));
9355 		return (CALID)::SendMessage(m_hWnd, MCM_GETCALID, 0, 0L);
9356 	}
9357 
SetCALID(CALID calid)9358 	void SetCALID(CALID calid)
9359 	{
9360 		ATLASSERT(::IsWindow(m_hWnd));
9361 		::SendMessage(m_hWnd, MCM_SETCALID, (LPARAM)calid, 0L);
9362 	}
9363 
GetCalendarBorder()9364 	int GetCalendarBorder() const
9365 	{
9366 		ATLASSERT(::IsWindow(m_hWnd));
9367 		return (int)::SendMessage(m_hWnd, MCM_GETCALENDARBORDER, 0, 0L);
9368 	}
9369 
9370 	void SetCalendarBorder(int cxyBorder, BOOL bSet = TRUE)
9371 	{
9372 		ATLASSERT(::IsWindow(m_hWnd));
9373 		::SendMessage(m_hWnd, MCM_SETCALENDARBORDER, (WPARAM)bSet, (LPARAM)cxyBorder);
9374 	}
9375 #endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)
9376 
9377 // Operations
GetMonthRange(DWORD dwFlags,LPSYSTEMTIME lprgSysTimeArray)9378 	int GetMonthRange(DWORD dwFlags, LPSYSTEMTIME lprgSysTimeArray) const
9379 	{
9380 		ATLASSERT(::IsWindow(m_hWnd));
9381 		return (int)::SendMessage(m_hWnd, MCM_GETMONTHRANGE, dwFlags, (LPARAM)lprgSysTimeArray);
9382 	}
9383 
SetDayState(int nMonths,LPMONTHDAYSTATE lpDayStateArray)9384 	BOOL SetDayState(int nMonths, LPMONTHDAYSTATE lpDayStateArray)
9385 	{
9386 		ATLASSERT(::IsWindow(m_hWnd));
9387 		return (BOOL)::SendMessage(m_hWnd, MCM_SETDAYSTATE, nMonths, (LPARAM)lpDayStateArray);
9388 	}
9389 
HitTest(PMCHITTESTINFO pMCHitTest)9390 	DWORD HitTest(PMCHITTESTINFO pMCHitTest) const
9391 	{
9392 		ATLASSERT(::IsWindow(m_hWnd));
9393 		return (DWORD)::SendMessage(m_hWnd, MCM_HITTEST, 0, (LPARAM)pMCHitTest);
9394 	}
9395 
9396 #if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)
SizeRectToMin(LPRECT lpRect)9397 	void SizeRectToMin(LPRECT lpRect)
9398 	{
9399 		ATLASSERT(::IsWindow(m_hWnd));
9400 		::SendMessage(m_hWnd, MCM_SIZERECTTOMIN, 0, (LPARAM)lpRect);
9401 	}
9402 #endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)
9403 };
9404 
9405 typedef CMonthCalendarCtrlT<ATL::CWindow>   CMonthCalendarCtrl;
9406 
9407 
9408 ///////////////////////////////////////////////////////////////////////////////
9409 // CDateTimePickerCtrl
9410 
9411 template <class TBase>
9412 class CDateTimePickerCtrlT : public TBase
9413 {
9414 public:
9415 // Constructors
TBase(hWnd)9416 	CDateTimePickerCtrlT(HWND hWnd = NULL) : TBase(hWnd)
9417 	{ }
9418 
9419 	CDateTimePickerCtrlT< TBase >& operator =(HWND hWnd)
9420 	{
9421 		m_hWnd = hWnd;
9422 		return *this;
9423 	}
9424 
9425 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
9426 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
9427 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
9428 	{
9429 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
9430 	}
9431 
9432 // Operations
GetWndClassName()9433 	static LPCTSTR GetWndClassName()
9434 	{
9435 		return DATETIMEPICK_CLASS;
9436 	}
9437 
SetFormat(LPCTSTR lpszFormat)9438 	BOOL SetFormat(LPCTSTR lpszFormat)
9439 	{
9440 		ATLASSERT(::IsWindow(m_hWnd));
9441 		return (BOOL)::SendMessage(m_hWnd, DTM_SETFORMAT, 0, (LPARAM)lpszFormat);
9442 	}
9443 
GetMonthCalColor(int nColorType)9444 	COLORREF GetMonthCalColor(int nColorType) const
9445 	{
9446 		ATLASSERT(::IsWindow(m_hWnd));
9447 		return (COLORREF)::SendMessage(m_hWnd, DTM_GETMCCOLOR, nColorType, 0L);
9448 	}
9449 
SetMonthCalColor(int nColorType,COLORREF clr)9450 	COLORREF SetMonthCalColor(int nColorType, COLORREF clr)
9451 	{
9452 		ATLASSERT(::IsWindow(m_hWnd));
9453 		return (COLORREF)::SendMessage(m_hWnd, DTM_SETMCCOLOR, nColorType, clr);
9454 	}
9455 
GetRange(LPSYSTEMTIME lpSysTimeArray)9456 	DWORD GetRange(LPSYSTEMTIME lpSysTimeArray) const
9457 	{
9458 		ATLASSERT(::IsWindow(m_hWnd));
9459 		return (DWORD)::SendMessage(m_hWnd, DTM_GETRANGE, 0, (LPARAM)lpSysTimeArray);
9460 	}
9461 
SetRange(DWORD dwFlags,LPSYSTEMTIME lpSysTimeArray)9462 	BOOL SetRange(DWORD dwFlags, LPSYSTEMTIME lpSysTimeArray)
9463 	{
9464 		ATLASSERT(::IsWindow(m_hWnd));
9465 		return (BOOL)::SendMessage(m_hWnd, DTM_SETRANGE, dwFlags, (LPARAM)lpSysTimeArray);
9466 	}
9467 
GetSystemTime(LPSYSTEMTIME lpSysTime)9468 	DWORD GetSystemTime(LPSYSTEMTIME lpSysTime) const
9469 	{
9470 		ATLASSERT(::IsWindow(m_hWnd));
9471 		return (DWORD)::SendMessage(m_hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)lpSysTime);
9472 	}
9473 
SetSystemTime(DWORD dwFlags,LPSYSTEMTIME lpSysTime)9474 	BOOL SetSystemTime(DWORD dwFlags, LPSYSTEMTIME lpSysTime)
9475 	{
9476 		ATLASSERT(::IsWindow(m_hWnd));
9477 		return (BOOL)::SendMessage(m_hWnd, DTM_SETSYSTEMTIME, dwFlags, (LPARAM)lpSysTime);
9478 	}
9479 
GetMonthCal()9480 	CMonthCalendarCtrl GetMonthCal() const
9481 	{
9482 		ATLASSERT(::IsWindow(m_hWnd));
9483 		return CMonthCalendarCtrl((HWND)::SendMessage(m_hWnd, DTM_GETMONTHCAL, 0, 0L));
9484 	}
9485 
9486 #if (_WIN32_IE >= 0x0400)
GetMonthCalFont()9487 	CFontHandle GetMonthCalFont() const
9488 	{
9489 		ATLASSERT(::IsWindow(m_hWnd));
9490 		return CFontHandle((HFONT)::SendMessage(m_hWnd, DTM_GETMCFONT, 0, 0L));
9491 	}
9492 
9493 	void SetMonthCalFont(HFONT hFont, BOOL bRedraw = TRUE)
9494 	{
9495 		ATLASSERT(::IsWindow(m_hWnd));
9496 		::SendMessage(m_hWnd, DTM_SETMCFONT, (WPARAM)hFont, MAKELPARAM(bRedraw, 0));
9497 	}
9498 #endif // (_WIN32_IE >= 0x0400)
9499 
9500 #if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)
GetMonthCalStyle()9501 	DWORD GetMonthCalStyle() const
9502 	{
9503 		ATLASSERT(::IsWindow(m_hWnd));
9504 		return (DWORD)::SendMessage(m_hWnd, DTM_GETMCSTYLE, 0, 0L);
9505 	}
9506 
SetMonthCalStyle(DWORD dwStyle)9507 	DWORD SetMonthCalStyle(DWORD dwStyle)
9508 	{
9509 		ATLASSERT(::IsWindow(m_hWnd));
9510 		return (DWORD)::SendMessage(m_hWnd, DTM_SETMCSTYLE, 0, (LPARAM)dwStyle);
9511 	}
9512 
GetDateTimePickerInfo(LPDATETIMEPICKERINFO lpPickerInfo)9513 	void GetDateTimePickerInfo(LPDATETIMEPICKERINFO lpPickerInfo) const
9514 	{
9515 		ATLASSERT(::IsWindow(m_hWnd));
9516 		::SendMessage(m_hWnd, DTM_GETDATETIMEPICKERINFO, 0, (LPARAM)lpPickerInfo);
9517 	}
9518 
GetIdealSize(LPSIZE lpSize)9519 	BOOL GetIdealSize(LPSIZE lpSize) const
9520 	{
9521 		ATLASSERT(::IsWindow(m_hWnd));
9522 		return (BOOL)::SendMessage(m_hWnd, DTM_GETIDEALSIZE, 0, (LPARAM)lpSize);
9523 	}
9524 
CloseMonthCal()9525 	void CloseMonthCal()
9526 	{
9527 		ATLASSERT(::IsWindow(m_hWnd));
9528 		::SendMessage(m_hWnd, DTM_CLOSEMONTHCAL, 0, 0L);
9529 	}
9530 #endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)
9531 };
9532 
9533 typedef CDateTimePickerCtrlT<ATL::CWindow>   CDateTimePickerCtrl;
9534 
9535 
9536 ///////////////////////////////////////////////////////////////////////////////
9537 // CFlatScrollBarImpl - support for flat scroll bars
9538 
9539 #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
9540 
9541 template <class T>
9542 class CFlatScrollBarImpl
9543 {
9544 public:
9545 // Initialization
FlatSB_Initialize()9546 	BOOL FlatSB_Initialize()
9547 	{
9548 		T* pT = static_cast<T*>(this);
9549 		ATLASSERT(::IsWindow(pT->m_hWnd));
9550 		return ::InitializeFlatSB(pT->m_hWnd);
9551 	}
9552 
FlatSB_Uninitialize()9553 	HRESULT FlatSB_Uninitialize()
9554 	{
9555 		T* pT = static_cast<T*>(this);
9556 		ATLASSERT(::IsWindow(pT->m_hWnd));
9557 		return ::UninitializeFlatSB(pT->m_hWnd);
9558 	}
9559 
9560 // Flat scroll bar properties
FlatSB_GetScrollProp(UINT uIndex,LPINT lpnValue)9561 	BOOL FlatSB_GetScrollProp(UINT uIndex, LPINT lpnValue) const
9562 	{
9563 		const T* pT = static_cast<const T*>(this);
9564 		ATLASSERT(::IsWindow(pT->m_hWnd));
9565 		return ::FlatSB_GetScrollProp(pT->m_hWnd, uIndex, lpnValue);
9566 	}
9567 
9568 	BOOL FlatSB_SetScrollProp(UINT uIndex, int nValue, BOOL bRedraw = TRUE)
9569 	{
9570 		T* pT = static_cast<T*>(this);
9571 		ATLASSERT(::IsWindow(pT->m_hWnd));
9572 		return ::FlatSB_SetScrollProp(pT->m_hWnd, uIndex, nValue, bRedraw);
9573 	}
9574 
9575 // Attributes
FlatSB_GetScrollPos(int nBar)9576 	int FlatSB_GetScrollPos(int nBar) const
9577 	{
9578 		const T* pT = static_cast<const T*>(this);
9579 		ATLASSERT(::IsWindow(pT->m_hWnd));
9580 		return ::FlatSB_GetScrollPos(pT->m_hWnd, nBar);
9581 	}
9582 
9583 	int FlatSB_SetScrollPos(int nBar, int nPos, BOOL bRedraw = TRUE)
9584 	{
9585 		T* pT = static_cast<T*>(this);
9586 		ATLASSERT(::IsWindow(pT->m_hWnd));
9587 		return ::FlatSB_SetScrollPos(pT->m_hWnd, nBar, nPos, bRedraw);
9588 	}
9589 
FlatSB_GetScrollRange(int nBar,LPINT lpMinPos,LPINT lpMaxPos)9590 	BOOL FlatSB_GetScrollRange(int nBar, LPINT lpMinPos, LPINT lpMaxPos) const
9591 	{
9592 		const T* pT = static_cast<const T*>(this);
9593 		ATLASSERT(::IsWindow(pT->m_hWnd));
9594 		return ::FlatSB_GetScrollRange(pT->m_hWnd, nBar, lpMinPos, lpMaxPos);
9595 	}
9596 
9597 	BOOL FlatSB_SetScrollRange(int nBar, int nMinPos, int nMaxPos, BOOL bRedraw = TRUE)
9598 	{
9599 		T* pT = static_cast<T*>(this);
9600 		ATLASSERT(::IsWindow(pT->m_hWnd));
9601 		return ::FlatSB_SetScrollRange(pT->m_hWnd, nBar, nMinPos, nMaxPos, bRedraw);
9602 	}
9603 
FlatSB_GetScrollInfo(int nBar,LPSCROLLINFO lpScrollInfo)9604 	BOOL FlatSB_GetScrollInfo(int nBar, LPSCROLLINFO lpScrollInfo) const
9605 	{
9606 		const T* pT = static_cast<const T*>(this);
9607 		ATLASSERT(::IsWindow(pT->m_hWnd));
9608 		return ::FlatSB_GetScrollInfo(pT->m_hWnd, nBar, lpScrollInfo);
9609 	}
9610 
9611 	int FlatSB_SetScrollInfo(int nBar, LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE)
9612 	{
9613 		T* pT = static_cast<T*>(this);
9614 		ATLASSERT(::IsWindow(pT->m_hWnd));
9615 		return ::FlatSB_SetScrollInfo(pT->m_hWnd, nBar, lpScrollInfo, bRedraw);
9616 	}
9617 
9618 // Operations
9619 	BOOL FlatSB_ShowScrollBar(UINT nBar, BOOL bShow = TRUE)
9620 	{
9621 		T* pT = static_cast<T*>(this);
9622 		ATLASSERT(::IsWindow(pT->m_hWnd));
9623 		return ::FlatSB_ShowScrollBar(pT->m_hWnd, nBar, bShow);
9624 	}
9625 
9626 	BOOL FlatSB_EnableScrollBar(UINT uSBFlags, UINT uArrowFlags = ESB_ENABLE_BOTH)
9627 	{
9628 		T* pT = static_cast<T*>(this);
9629 		ATLASSERT(::IsWindow(pT->m_hWnd));
9630 		return ::FlatSB_EnableScrollBar(pT->m_hWnd, uSBFlags, uArrowFlags);
9631 	}
9632 };
9633 
9634 template <class TBase>
9635 class CFlatScrollBarT : public TBase, public CFlatScrollBarImpl<CFlatScrollBarT< TBase > >
9636 {
9637 public:
TBase(hWnd)9638 	CFlatScrollBarT(HWND hWnd = NULL) : TBase(hWnd)
9639 	{ }
9640 
9641 	CFlatScrollBarT< TBase >& operator =(HWND hWnd)
9642 	{
9643 		m_hWnd = hWnd;
9644 		return *this;
9645 	}
9646 };
9647 
9648 typedef CFlatScrollBarT<ATL::CWindow>   CFlatScrollBar;
9649 
9650 #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
9651 
9652 
9653 ///////////////////////////////////////////////////////////////////////////////
9654 // CIPAddressCtrl
9655 
9656 #if (_WIN32_IE >= 0x0400)
9657 
9658 template <class TBase>
9659 class CIPAddressCtrlT : public TBase
9660 {
9661 public:
9662 // Constructors
TBase(hWnd)9663 	CIPAddressCtrlT(HWND hWnd = NULL) : TBase(hWnd)
9664 	{ }
9665 
9666 	CIPAddressCtrlT< TBase >& operator =(HWND hWnd)
9667 	{
9668 		m_hWnd = hWnd;
9669 		return *this;
9670 	}
9671 
9672 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
9673 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
9674 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
9675 	{
9676 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
9677 	}
9678 
9679 // Atteributes
GetWndClassName()9680 	static LPCTSTR GetWndClassName()
9681 	{
9682 		return WC_IPADDRESS;
9683 	}
9684 
IsBlank()9685 	BOOL IsBlank() const
9686 	{
9687 		ATLASSERT(::IsWindow(m_hWnd));
9688 		return (BOOL)::SendMessage(m_hWnd, IPM_ISBLANK, 0, 0L);
9689 	}
9690 
GetAddress(LPDWORD lpdwAddress)9691 	int GetAddress(LPDWORD lpdwAddress) const
9692 	{
9693 		ATLASSERT(::IsWindow(m_hWnd));
9694 		return (int)::SendMessage(m_hWnd, IPM_GETADDRESS, 0, (LPARAM)lpdwAddress);
9695 	}
9696 
SetAddress(DWORD dwAddress)9697 	void SetAddress(DWORD dwAddress)
9698 	{
9699 		ATLASSERT(::IsWindow(m_hWnd));
9700 		::SendMessage(m_hWnd, IPM_SETADDRESS, 0, dwAddress);
9701 	}
9702 
ClearAddress()9703 	void ClearAddress()
9704 	{
9705 		ATLASSERT(::IsWindow(m_hWnd));
9706 		::SendMessage(m_hWnd, IPM_CLEARADDRESS, 0, 0L);
9707 	}
9708 
SetRange(int nField,WORD wRange)9709 	void SetRange(int nField, WORD wRange)
9710 	{
9711 		ATLASSERT(::IsWindow(m_hWnd));
9712 		::SendMessage(m_hWnd, IPM_SETRANGE, nField, wRange);
9713 	}
9714 
SetRange(int nField,BYTE nMin,BYTE nMax)9715 	void SetRange(int nField, BYTE nMin, BYTE nMax)
9716 	{
9717 		ATLASSERT(::IsWindow(m_hWnd));
9718 		::SendMessage(m_hWnd, IPM_SETRANGE, nField, MAKEIPRANGE(nMin, nMax));
9719 	}
9720 
SetFocus(int nField)9721 	void SetFocus(int nField)
9722 	{
9723 		ATLASSERT(::IsWindow(m_hWnd));
9724 		::SendMessage(m_hWnd, IPM_SETFOCUS, nField, 0L);
9725 	}
9726 };
9727 
9728 typedef CIPAddressCtrlT<ATL::CWindow>   CIPAddressCtrl;
9729 
9730 #endif // (_WIN32_IE >= 0x0400)
9731 
9732 
9733 ///////////////////////////////////////////////////////////////////////////////
9734 // CPagerCtrl
9735 
9736 #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
9737 
9738 template <class TBase>
9739 class CPagerCtrlT : public TBase
9740 {
9741 public:
9742 // Constructors
TBase(hWnd)9743 	CPagerCtrlT(HWND hWnd = NULL) : TBase(hWnd)
9744 	{ }
9745 
9746 	CPagerCtrlT< TBase >& operator =(HWND hWnd)
9747 	{
9748 		m_hWnd = hWnd;
9749 		return *this;
9750 	}
9751 
9752 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
9753 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
9754 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
9755 	{
9756 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
9757 	}
9758 
9759 // Attributes
GetWndClassName()9760 	static LPCTSTR GetWndClassName()
9761 	{
9762 		return WC_PAGESCROLLER;
9763 	}
9764 
GetButtonSize()9765 	int GetButtonSize() const
9766 	{
9767 		ATLASSERT(::IsWindow(m_hWnd));
9768 		return (int)::SendMessage(m_hWnd, PGM_GETBUTTONSIZE, 0, 0L);
9769 	}
9770 
SetButtonSize(int nButtonSize)9771 	int SetButtonSize(int nButtonSize)
9772 	{
9773 		ATLASSERT(::IsWindow(m_hWnd));
9774 		return (int)::SendMessage(m_hWnd, PGM_SETBUTTONSIZE, 0, nButtonSize);
9775 	}
9776 
GetButtonState(int nButton)9777 	DWORD GetButtonState(int nButton) const
9778 	{
9779 		ATLASSERT(::IsWindow(m_hWnd));
9780 		ATLASSERT(nButton == PGB_TOPORLEFT || nButton == PGB_BOTTOMORRIGHT);
9781 		return (DWORD)::SendMessage(m_hWnd, PGM_GETBUTTONSTATE, 0, nButton);
9782 	}
9783 
GetBkColor()9784 	COLORREF GetBkColor() const
9785 	{
9786 		ATLASSERT(::IsWindow(m_hWnd));
9787 		return (COLORREF)::SendMessage(m_hWnd, PGM_GETBKCOLOR, 0, 0L);
9788 	}
9789 
SetBkColor(COLORREF clrBk)9790 	COLORREF SetBkColor(COLORREF clrBk)
9791 	{
9792 		ATLASSERT(::IsWindow(m_hWnd));
9793 		return (COLORREF)::SendMessage(m_hWnd, PGM_SETBKCOLOR, 0, (LPARAM)clrBk);
9794 	}
9795 
GetBorder()9796 	int GetBorder() const
9797 	{
9798 		ATLASSERT(::IsWindow(m_hWnd));
9799 		return (int)::SendMessage(m_hWnd, PGM_GETBORDER, 0, 0L);
9800 	}
9801 
SetBorder(int nBorderSize)9802 	int SetBorder(int nBorderSize)
9803 	{
9804 		ATLASSERT(::IsWindow(m_hWnd));
9805 		return (int)::SendMessage(m_hWnd, PGM_SETBORDER, 0, nBorderSize);
9806 	}
9807 
GetPos()9808 	int GetPos() const
9809 	{
9810 		ATLASSERT(::IsWindow(m_hWnd));
9811 		return (int)::SendMessage(m_hWnd, PGM_GETPOS, 0, 0L);
9812 	}
9813 
SetPos(int nPos)9814 	int SetPos(int nPos)
9815 	{
9816 		ATLASSERT(::IsWindow(m_hWnd));
9817 		return (int)::SendMessage(m_hWnd, PGM_SETPOS, 0, nPos);
9818 	}
9819 
9820 // Operations
SetChild(HWND hWndChild)9821 	void SetChild(HWND hWndChild)
9822 	{
9823 		ATLASSERT(::IsWindow(m_hWnd));
9824 		::SendMessage(m_hWnd, PGM_SETCHILD, 0, (LPARAM)hWndChild);
9825 	}
9826 
9827 	void ForwardMouse(BOOL bForward = TRUE)
9828 	{
9829 		ATLASSERT(::IsWindow(m_hWnd));
9830 		::SendMessage(m_hWnd, PGM_FORWARDMOUSE, bForward, 0L);
9831 	}
9832 
RecalcSize()9833 	void RecalcSize()
9834 	{
9835 		ATLASSERT(::IsWindow(m_hWnd));
9836 		::SendMessage(m_hWnd, PGM_RECALCSIZE, 0, 0L);
9837 	}
9838 
GetDropTarget(IDropTarget ** ppDropTarget)9839 	void GetDropTarget(IDropTarget** ppDropTarget)
9840 	{
9841 		ATLASSERT(::IsWindow(m_hWnd));
9842 		ATLASSERT(ppDropTarget != NULL);
9843 		::SendMessage(m_hWnd, PGM_GETDROPTARGET, 0, (LPARAM)ppDropTarget);
9844 	}
9845 };
9846 
9847 typedef CPagerCtrlT<ATL::CWindow>   CPagerCtrl;
9848 
9849 #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
9850 
9851 
9852 ///////////////////////////////////////////////////////////////////////////////
9853 // CLinkCtrl - Windows SYSLINK control
9854 
9855 #if (_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE)
9856 
9857 template <class TBase>
9858 class CLinkCtrlT : public TBase
9859 {
9860 public:
9861 // Constructors
TBase(hWnd)9862 	CLinkCtrlT(HWND hWnd = NULL) : TBase(hWnd)
9863 	{ }
9864 
9865 	CLinkCtrlT< TBase >& operator =(HWND hWnd)
9866 	{
9867 		m_hWnd = hWnd;
9868 		return *this;
9869 	}
9870 
9871 	HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
9872 			DWORD dwStyle = 0, DWORD dwExStyle = 0,
9873 			ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
9874 	{
9875 		return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
9876 	}
9877 
9878 // Attributes
GetWndClassName()9879 	static LPCTSTR GetWndClassName()
9880 	{
9881 #ifdef _UNICODE
9882 		return WC_LINK;
9883 #else // !_UNICODE
9884 		return "SysLink";
9885 #endif // !_UNICODE
9886 	}
9887 
9888 	int GetIdealHeight(int cxMaxWidth = 0) const
9889 	{
9890 		ATLASSERT(::IsWindow(m_hWnd));
9891 		return (int)::SendMessage(m_hWnd, LM_GETIDEALHEIGHT, cxMaxWidth, 0L);
9892 	}
9893 
GetItem(PLITEM pLItem)9894 	BOOL GetItem(PLITEM pLItem) const
9895 	{
9896 		ATLASSERT(::IsWindow(m_hWnd));
9897 		return (BOOL)::SendMessage(m_hWnd, LM_GETITEM, 0, (LPARAM)pLItem);
9898 	}
9899 
SetItem(PLITEM pLItem)9900 	BOOL SetItem(PLITEM pLItem)
9901 	{
9902 		ATLASSERT(::IsWindow(m_hWnd));
9903 		return (BOOL)::SendMessage(m_hWnd, LM_SETITEM, 0, (LPARAM)pLItem);
9904 	}
9905 
9906 	// Vista only
9907 	int GetIdealSize(SIZE& size, int cxMaxWidth = 0) const
9908 	{
9909 #ifndef LM_GETIDEALSIZE
9910 		const UINT LM_GETIDEALSIZE = LM_GETIDEALHEIGHT;
9911 #endif
9912 		ATLASSERT(::IsWindow(m_hWnd));
9913 		return (int)::SendMessage(m_hWnd, LM_GETIDEALSIZE, cxMaxWidth, (LPARAM)&size);
9914 	}
9915 
9916 // Operations
HitTest(PLHITTESTINFO pLHitTestInfo)9917 	BOOL HitTest(PLHITTESTINFO pLHitTestInfo) const
9918 	{
9919 		ATLASSERT(::IsWindow(m_hWnd));
9920 		return (BOOL)::SendMessage(m_hWnd, LM_HITTEST, 0, (LPARAM)pLHitTestInfo);
9921 	}
9922 };
9923 
9924 typedef CLinkCtrlT<ATL::CWindow>   CLinkCtrl;
9925 
9926 #endif // (_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE)
9927 
9928 
9929 ///////////////////////////////////////////////////////////////////////////////
9930 // CCustomDraw - MI class for custom-draw support
9931 
9932 template <class T>
9933 class CCustomDraw
9934 {
9935 public:
9936 #if (_ATL_VER < 0x0700)
9937 	BOOL m_bHandledCD;
9938 
IsMsgHandled()9939 	BOOL IsMsgHandled() const
9940 	{
9941 		return m_bHandledCD;
9942 	}
9943 
SetMsgHandled(BOOL bHandled)9944 	void SetMsgHandled(BOOL bHandled)
9945 	{
9946 		m_bHandledCD = bHandled;
9947 	}
9948 #endif // !(_ATL_VER < 0x0700)
9949 
9950 // Message map and handlers
9951 	BEGIN_MSG_MAP(CCustomDraw< T >)
NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW,OnCustomDraw)9952 		NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnCustomDraw)
9953 	ALT_MSG_MAP(1)
9954 		REFLECTED_NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnCustomDraw)
9955 	END_MSG_MAP()
9956 
9957 // message handler
9958 	LRESULT OnCustomDraw(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
9959 	{
9960 		T* pT = static_cast<T*>(this);
9961 		pT->SetMsgHandled(TRUE);
9962 		LPNMCUSTOMDRAW lpNMCustomDraw = (LPNMCUSTOMDRAW)pnmh;
9963 		DWORD dwRet = 0;
9964 		switch(lpNMCustomDraw->dwDrawStage)
9965 		{
9966 		case CDDS_PREPAINT:
9967 			dwRet = pT->OnPrePaint(idCtrl, lpNMCustomDraw);
9968 			break;
9969 		case CDDS_POSTPAINT:
9970 			dwRet = pT->OnPostPaint(idCtrl, lpNMCustomDraw);
9971 			break;
9972 		case CDDS_PREERASE:
9973 			dwRet = pT->OnPreErase(idCtrl, lpNMCustomDraw);
9974 			break;
9975 		case CDDS_POSTERASE:
9976 			dwRet = pT->OnPostErase(idCtrl, lpNMCustomDraw);
9977 			break;
9978 		case CDDS_ITEMPREPAINT:
9979 			dwRet = pT->OnItemPrePaint(idCtrl, lpNMCustomDraw);
9980 			break;
9981 		case CDDS_ITEMPOSTPAINT:
9982 			dwRet = pT->OnItemPostPaint(idCtrl, lpNMCustomDraw);
9983 			break;
9984 		case CDDS_ITEMPREERASE:
9985 			dwRet = pT->OnItemPreErase(idCtrl, lpNMCustomDraw);
9986 			break;
9987 		case CDDS_ITEMPOSTERASE:
9988 			dwRet = pT->OnItemPostErase(idCtrl, lpNMCustomDraw);
9989 			break;
9990 #if (_WIN32_IE >= 0x0400)
9991 		case (CDDS_ITEMPREPAINT | CDDS_SUBITEM):
9992 			dwRet = pT->OnSubItemPrePaint(idCtrl, lpNMCustomDraw);
9993 			break;
9994 #endif // (_WIN32_IE >= 0x0400)
9995 		default:
9996 			pT->SetMsgHandled(FALSE);
9997 			break;
9998 		}
9999 		bHandled = pT->IsMsgHandled();
10000 		return dwRet;
10001 	}
10002 
10003 // Overrideables
OnPrePaint(int,LPNMCUSTOMDRAW)10004 	DWORD OnPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)
10005 	{
10006 		return CDRF_DODEFAULT;
10007 	}
10008 
OnPostPaint(int,LPNMCUSTOMDRAW)10009 	DWORD OnPostPaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)
10010 	{
10011 		return CDRF_DODEFAULT;
10012 	}
10013 
OnPreErase(int,LPNMCUSTOMDRAW)10014 	DWORD OnPreErase(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)
10015 	{
10016 		return CDRF_DODEFAULT;
10017 	}
10018 
OnPostErase(int,LPNMCUSTOMDRAW)10019 	DWORD OnPostErase(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)
10020 	{
10021 		return CDRF_DODEFAULT;
10022 	}
10023 
OnItemPrePaint(int,LPNMCUSTOMDRAW)10024 	DWORD OnItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)
10025 	{
10026 		return CDRF_DODEFAULT;
10027 	}
10028 
OnItemPostPaint(int,LPNMCUSTOMDRAW)10029 	DWORD OnItemPostPaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)
10030 	{
10031 		return CDRF_DODEFAULT;
10032 	}
10033 
OnItemPreErase(int,LPNMCUSTOMDRAW)10034 	DWORD OnItemPreErase(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)
10035 	{
10036 		return CDRF_DODEFAULT;
10037 	}
10038 
OnItemPostErase(int,LPNMCUSTOMDRAW)10039 	DWORD OnItemPostErase(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)
10040 	{
10041 		return CDRF_DODEFAULT;
10042 	}
10043 
10044 #if (_WIN32_IE >= 0x0400)
OnSubItemPrePaint(int,LPNMCUSTOMDRAW)10045 	DWORD OnSubItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)
10046 	{
10047 		return CDRF_DODEFAULT;
10048 	}
10049 #endif // (_WIN32_IE >= 0x0400)
10050 };
10051 
10052 
10053 // --- Windows CE common controls ---
10054 
10055 #ifdef _WIN32_WCE
10056 
10057 ///////////////////////////////////////////////////////////////////////////////
10058 // CCECommandBarCtrl
10059 
10060 template <class TBase>
10061 class CCECommandBarCtrlT : public TBase
10062 {
10063 public:
10064 // Constructors
TBase(hWnd)10065 	CCECommandBarCtrlT(HWND hWnd = NULL) : TBase(hWnd) { }
10066 
10067 	CCECommandBarCtrlT< TBase >& operator=(HWND hWnd)
10068 	{
10069 		m_hWnd = hWnd;
10070 		return *this;
10071 	}
10072 
10073 // Attributes
IsVisible()10074 	BOOL IsVisible() const
10075 	{
10076 		return IsWindowVisible();
10077 	}
10078 
GetHeight()10079 	int GetHeight() const
10080 	{
10081 		ATLASSERT(::IsWindow(m_hWnd));
10082 		return ::CommandBar_Height(m_hWnd);
10083 	}
10084 
GetMenu(WORD wButton)10085 	HMENU GetMenu(WORD wButton) const
10086 	{
10087 		ATLASSERT(::IsWindow(m_hWnd));
10088 		return ::CommandBar_GetMenu(m_hWnd, wButton);
10089 	}
10090 
10091 // Operations
Create(HWND hWndParent,int nCmdBarID)10092 	HWND Create(HWND hWndParent, int nCmdBarID)
10093 	{
10094 		m_hWnd = ::CommandBar_Create(ModuleHelper::GetModuleInstance(), hWndParent, nCmdBarID);
10095 		ATLASSERT(::IsWindow(m_hWnd));
10096 		return m_hWnd;
10097 	}
10098 
Destroy()10099 	void Destroy()
10100 	{
10101 		DestroyWindow();
10102 	}
10103 
10104 	BOOL Show(BOOL bShow = TRUE)
10105 	{
10106 		ATLASSERT(::IsWindow(m_hWnd));
10107 		return ::CommandBar_Show(m_hWnd, bShow);
10108 	}
10109 
DrawMenuBar(WORD wButton)10110 	BOOL DrawMenuBar(WORD wButton)
10111 	{
10112 		ATLASSERT(::IsWindow(m_hWnd));
10113 		return ::CommandBar_DrawMenuBar(m_hWnd, wButton);
10114 	}
10115 
10116 	BOOL AddAdornments(DWORD dwFlags = 0)
10117 	{
10118 		ATLASSERT(::IsWindow(m_hWnd));
10119 		return ::CommandBar_AddAdornments(m_hWnd, dwFlags, 0);
10120 	}
10121 
AddBitmap(int nBitmapID,int nNumImages)10122 	int AddBitmap(int nBitmapID, int nNumImages)
10123 	{
10124 		ATLASSERT(::IsWindow(m_hWnd));
10125 		return ::CommandBar_AddBitmap(m_hWnd, ModuleHelper::GetResourceInstance(), nBitmapID, nNumImages, 16, 16);
10126 	}
10127 
AddButtons(UINT uNumButtons,LPTBBUTTON lpButtons)10128 	BOOL AddButtons(UINT uNumButtons, LPTBBUTTON lpButtons)
10129 	{
10130 		ATLASSERT(::IsWindow(m_hWnd));
10131 		return CommandBar_AddButtons(m_hWnd, uNumButtons, lpButtons);
10132 	}
10133 
AddToolTips(UINT uNumToolTips,LPTSTR lpToolTips)10134 	BOOL AddToolTips(UINT uNumToolTips, LPTSTR lpToolTips)
10135 	{
10136 		ATLASSERT(::IsWindow(m_hWnd));
10137 		return CommandBar_AddToolTips(m_hWnd, uNumToolTips, lpToolTips);
10138 	}
10139 
InsertButton(int nButton,LPTBBUTTON lpButton)10140 	BOOL InsertButton(int nButton, LPTBBUTTON lpButton)
10141 	{
10142 		ATLASSERT(::IsWindow(m_hWnd));
10143 		return CommandBar_InsertButton(m_hWnd, nButton, lpButton);
10144 	}
10145 
InsertComboBox(int nWidth,UINT dwStyle,WORD wComboBoxID,WORD wButton)10146 	HWND InsertComboBox(int nWidth, UINT dwStyle, WORD wComboBoxID, WORD wButton)
10147 	{
10148 		ATLASSERT(::IsWindow(m_hWnd));
10149 		return ::CommandBar_InsertComboBox(m_hWnd, ModuleHelper::GetModuleInstance(), nWidth, dwStyle, wComboBoxID, wButton);
10150 	}
10151 
InsertMenubar(WORD wMenuID,WORD wButton)10152 	BOOL InsertMenubar(WORD wMenuID, WORD wButton)
10153 	{
10154 		ATLASSERT(::IsWindow(m_hWnd));
10155 		return ::CommandBar_InsertMenubar(m_hWnd, ModuleHelper::GetResourceInstance(), wMenuID, wButton);
10156 	}
10157 
InsertMenubarEx(ATL::_U_STRINGorID menu,WORD wButton)10158 	BOOL InsertMenubarEx(ATL::_U_STRINGorID menu, WORD wButton)
10159 	{
10160 		ATLASSERT(::IsWindow(m_hWnd));
10161 		return ::CommandBar_InsertMenubarEx(m_hWnd, ModuleHelper::GetResourceInstance(), (LPTSTR)menu.m_lpstr, wButton);
10162 	}
10163 
IsCommandBarMessage(LPMSG lpMsg)10164 	BOOL IsCommandBarMessage(LPMSG lpMsg)
10165 	{
10166 		ATLASSERT(::IsWindow(m_hWnd));
10167 		return ::IsCommandBarMessage(m_hWnd, lpMsg);
10168 	}
10169 };
10170 
10171 #if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC MenuBar
10172 	typedef CCECommandBarCtrlT<CToolBarCtrl>	CMenuBarCtrl;
10173 #else
10174 	typedef CCECommandBarCtrlT<CToolBarCtrl>	CCECommandBarCtrl;
10175 #endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__)
10176 
10177 ///////////////////////////////////////////////////////////////////////////////
10178 // CCECommandBandsCtrl
10179 
10180 template <class TBase>
10181 class CCECommandBandsCtrlT : public TBase
10182 {
10183 public:
10184 // Constructors
TBase(hWnd)10185 	CCECommandBandsCtrlT(HWND hWnd = NULL) : TBase(hWnd) { }
10186 
10187 	CCECommandBandsCtrlT< TBase >& operator=(HWND hWnd)
10188 	{
10189 		m_hWnd = hWnd;
10190 		return *this;
10191 	}
10192 
10193 // Attributes
IsVisible()10194 	BOOL IsVisible() const
10195 	{
10196 		return IsWindowVisible();
10197 	}
10198 
10199 #if (_WIN32_IE >= 0x0400)
GetHeight()10200 	UINT GetHeight() const
10201 	{
10202 		ATLASSERT(::IsWindow(m_hWnd));
10203 		return CommandBands_Height(m_hWnd);
10204 	}
10205 #endif // (_WIN32_IE >= 0x0400)
10206 
GetCommandBar(UINT uBand)10207 	HWND GetCommandBar(UINT uBand) const
10208 	{
10209 		ATLASSERT(::IsWindow(m_hWnd));
10210 		return ::CommandBands_GetCommandBar(m_hWnd, uBand);
10211 	}
10212 
GetRestoreInformation(UINT uBand,LPCOMMANDBANDSRESTOREINFO pcbr)10213 	BOOL GetRestoreInformation(UINT uBand, LPCOMMANDBANDSRESTOREINFO pcbr) const
10214 	{
10215 		ATLASSERT(::IsWindow(m_hWnd));
10216 		return ::CommandBands_GetRestoreInformation(m_hWnd, uBand, pcbr);
10217 	}
10218 
10219 // Operations
10220 	HWND Create(HWND hWndParent, UINT wID, DWORD dwStyles, HIMAGELIST hImageList = NULL)
10221 	{
10222 		m_hWnd = ::CommandBands_Create(ModuleHelper::GetModuleInstance(), hWndParent, wID, dwStyles, hImageList);
10223 		ATLASSERT(::IsWindow(m_hWnd));
10224 		return m_hWnd;
10225 	}
10226 
10227 	BOOL AddAdornments(DWORD dwFlags = 0, LPREBARBANDINFO prbbi = NULL)
10228 	{
10229 		ATLASSERT(::IsWindow(m_hWnd));
10230 		return ::CommandBands_AddAdornments(m_hWnd, ModuleHelper::GetModuleInstance(), dwFlags, prbbi);
10231 	}
10232 
AddBands(UINT uBandCount,LPREBARBANDINFO prbbi)10233 	BOOL AddBands(UINT uBandCount, LPREBARBANDINFO prbbi)
10234 	{
10235 		ATLASSERT(::IsWindow(m_hWnd));
10236 		return ::CommandBands_AddBands(m_hWnd, ModuleHelper::GetModuleInstance(), uBandCount, prbbi);
10237 	}
10238 
10239 	BOOL Show(BOOL bShow = TRUE)
10240 	{
10241 		ATLASSERT(::IsWindow(m_hWnd));
10242 		return ::CommandBands_Show(m_hWnd, bShow);
10243 	}
10244 };
10245 
10246 typedef CCECommandBandsCtrlT<ATL::CWindow>	CCECommandBandsCtrl;
10247 
10248 #endif // _WIN32_WCE
10249 
10250 }; // namespace WTL
10251 
10252 #endif // __ATLCTRLS_H__
10253