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