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