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