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