comparison foosdk/wtl/Include/atlctrls.h @ 1:20d02a178406 default tip

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