1 // Windows Template Library - WTL version 9.0
2 // Copyright (C) Microsoft Corporation, WTL Team. All rights reserved.
4 // This file is a part of the Windows Template Library.
5 // The use and distribution terms for this software are covered by the
6 // Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
7 // which can be found in the file CPL.TXT at the root of this distribution.
8 // By using this software in any fashion, you are agreeing to be bound by
9 // the terms of this license. You must not remove this notice, or
10 // any other, from this software.
12 #ifndef __ATLCTRLS_H__
13 #define __ATLCTRLS_H__
18 #error atlctrls.h requires atlapp.h to be included first
22 #error atlctrls.h requires atlwin.h to be included first
28 #elif defined(WIN32_PLATFORM_WFSP) && !defined(_WINUSERM_H_)
32 // protect template members from windowsx.h macros
36 #endif // _INC_WINDOWSX
39 ///////////////////////////////////////////////////////////////////////////////
40 // Classes in this file:
42 // CStaticT<TBase> - CStatic
43 // CButtonT<TBase> - CButton
44 // CListBoxT<TBase> - CListBox
45 // CComboBoxT<TBase> - CComboBox
46 // CEditT<TBase> - CEdit
48 // CScrollBarT<TBase> - CScrollBar
50 // CImageListT<t_bManaged> - CImageList, CImageListManaged
51 // CListViewCtrlT<TBase> - CListViewCtrl
52 // CTreeViewCtrlT<TBase> - CTreeViewCtrl
53 // CTreeItemT<TBase> - CTreeItem
54 // CTreeViewCtrlExT<TBase> - CTreeViewCtrlEx
55 // CHeaderCtrlT<TBase> - CHeaderCtrl
56 // CToolBarCtrlT<TBase> - CToolBarCtrl
57 // CStatusBarCtrlT<TBase> - CStatusBarCtrl
58 // CTabCtrlT<TBase> - CTabCtrl
60 // CToolTipCtrlT<TBase> - CToolTipCtrl
61 // CTrackBarCtrlT<TBase> - CTrackBarCtrl
62 // CUpDownCtrlT<TBase> - CUpDownCtrl
63 // CProgressBarCtrlT<TBase> - CProgressBarCtrl
64 // CHotKeyCtrlT<TBase> - CHotKeyCtrl
65 // CAnimateCtrlT<TBase> - CAnimateCtrl
66 // CRichEditCtrlT<TBase> - CRichEditCtrl
67 // CRichEditCommands<T>
68 // CDragListBoxT<TBase> - CDragListBox
69 // CDragListNotifyImpl<T>
70 // CReBarCtrlT<TBase> - CReBarCtrl
71 // CComboBoxExT<TBase> - CComboBoxEx
72 // CDateTimePickerCtrlT<TBase> - CDateTimePickerCtrl
73 // CMonthCalendarCtrlT<TBase> - CMonthCalendarCtrl
74 // CFlatScrollBarImpl<T>
75 // CFlatScrollBarT<TBase> - CFlatScrollBar
76 // CIPAddressCtrlT<TBase> - CIPAddressCtrl
77 // CPagerCtrlT<TBase> - CPagerCtrl
78 // CLinkCtrlT<TBase> - CLinkCtrl
82 // CCECommandBarCtrlT<TBase> - CCECommandBarCtrl
83 // CCECommandBandsCtrlT<TBase> - CCECommandBandsCtrl
89 // These are wrapper classes for Windows standard and common controls.
90 // To implement a window based on a control, use following:
91 // Example: Implementing a window based on a list box
93 // class CMyListBox : CWindowImpl<CMyListBox, CListBox>
96 // BEGIN_MSG_MAP(CMyListBox)
97 // // put your message handler entries here
103 // --- Standard Windows controls ---
105 ///////////////////////////////////////////////////////////////////////////////
106 // CStatic - client side for a Windows STATIC control
108 template <class TBase
>
109 class CStaticT
: public TBase
113 CStaticT(HWND hWnd
= NULL
) : TBase(hWnd
)
116 CStaticT
< TBase
>& operator =(HWND hWnd
)
122 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
123 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
124 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
126 return TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
130 static LPCTSTR
GetWndClassName()
136 HICON
GetIcon() const
138 ATLASSERT(::IsWindow(m_hWnd
));
139 return (HICON
)::SendMessage(m_hWnd
, STM_GETICON
, 0, 0L);
142 HICON
SetIcon(HICON hIcon
)
144 ATLASSERT(::IsWindow(m_hWnd
));
145 return (HICON
)::SendMessage(m_hWnd
, STM_SETICON
, (WPARAM
)hIcon
, 0L);
148 HENHMETAFILE
GetEnhMetaFile() const
150 ATLASSERT(::IsWindow(m_hWnd
));
151 return (HENHMETAFILE
)::SendMessage(m_hWnd
, STM_GETIMAGE
, IMAGE_ENHMETAFILE
, 0L);
154 HENHMETAFILE
SetEnhMetaFile(HENHMETAFILE hMetaFile
)
156 ATLASSERT(::IsWindow(m_hWnd
));
157 return (HENHMETAFILE
)::SendMessage(m_hWnd
, STM_SETIMAGE
, IMAGE_ENHMETAFILE
, (LPARAM
)hMetaFile
);
160 HICON
GetIcon() const
162 ATLASSERT(::IsWindow(m_hWnd
));
163 return (HICON
)::SendMessage(m_hWnd
, STM_GETIMAGE
, IMAGE_ICON
, 0L);
166 HICON
SetIcon(HICON hIcon
)
168 ATLASSERT(::IsWindow(m_hWnd
));
169 return (HICON
)::SendMessage(m_hWnd
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)hIcon
);
173 CBitmapHandle
GetBitmap() const
175 ATLASSERT(::IsWindow(m_hWnd
));
176 return CBitmapHandle((HBITMAP
)::SendMessage(m_hWnd
, STM_GETIMAGE
, IMAGE_BITMAP
, 0L));
179 CBitmapHandle
SetBitmap(HBITMAP hBitmap
)
181 ATLASSERT(::IsWindow(m_hWnd
));
182 return CBitmapHandle((HBITMAP
)::SendMessage(m_hWnd
, STM_SETIMAGE
, IMAGE_BITMAP
, (LPARAM
)hBitmap
));
185 HCURSOR
GetCursor() const
187 ATLASSERT(::IsWindow(m_hWnd
));
188 return (HCURSOR
)::SendMessage(m_hWnd
, STM_GETIMAGE
, IMAGE_CURSOR
, 0L);
191 HCURSOR
SetCursor(HCURSOR hCursor
)
193 ATLASSERT(::IsWindow(m_hWnd
));
194 return (HCURSOR
)::SendMessage(m_hWnd
, STM_SETIMAGE
, IMAGE_CURSOR
, (LPARAM
)hCursor
);
198 typedef CStaticT
<ATL::CWindow
> CStatic
;
201 ///////////////////////////////////////////////////////////////////////////////
202 // CButton - client side for a Windows BUTTON control
204 template <class TBase
>
205 class CButtonT
: public TBase
209 CButtonT(HWND hWnd
= NULL
) : TBase(hWnd
)
212 CButtonT
< TBase
>& operator =(HWND hWnd
)
218 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
219 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
220 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
222 return TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
226 static LPCTSTR
GetWndClassName()
231 UINT
GetState() const
233 ATLASSERT(::IsWindow(m_hWnd
));
234 return (UINT
)::SendMessage(m_hWnd
, BM_GETSTATE
, 0, 0L);
237 void SetState(BOOL bHighlight
)
239 ATLASSERT(::IsWindow(m_hWnd
));
240 ::SendMessage(m_hWnd
, BM_SETSTATE
, bHighlight
, 0L);
245 ATLASSERT(::IsWindow(m_hWnd
));
246 return (int)::SendMessage(m_hWnd
, BM_GETCHECK
, 0, 0L);
249 void SetCheck(int nCheck
)
251 ATLASSERT(::IsWindow(m_hWnd
));
252 ::SendMessage(m_hWnd
, BM_SETCHECK
, nCheck
, 0L);
255 UINT
GetButtonStyle() const
257 ATLASSERT(::IsWindow(m_hWnd
));
258 return (UINT
)::GetWindowLong(m_hWnd
, GWL_STYLE
) & 0xFFFF;
261 void SetButtonStyle(UINT nStyle
, BOOL bRedraw
= TRUE
)
263 ATLASSERT(::IsWindow(m_hWnd
));
264 ::SendMessage(m_hWnd
, BM_SETSTYLE
, nStyle
, (LPARAM
)bRedraw
);
268 HICON
GetIcon() const
270 ATLASSERT(::IsWindow(m_hWnd
));
271 return (HICON
)::SendMessage(m_hWnd
, BM_GETIMAGE
, IMAGE_ICON
, 0L);
274 HICON
SetIcon(HICON hIcon
)
276 ATLASSERT(::IsWindow(m_hWnd
));
277 return (HICON
)::SendMessage(m_hWnd
, BM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)hIcon
);
280 CBitmapHandle
GetBitmap() const
282 ATLASSERT(::IsWindow(m_hWnd
));
283 return CBitmapHandle((HBITMAP
)::SendMessage(m_hWnd
, BM_GETIMAGE
, IMAGE_BITMAP
, 0L));
286 CBitmapHandle
SetBitmap(HBITMAP hBitmap
)
288 ATLASSERT(::IsWindow(m_hWnd
));
289 return CBitmapHandle((HBITMAP
)::SendMessage(m_hWnd
, BM_SETIMAGE
, IMAGE_BITMAP
, (LPARAM
)hBitmap
));
291 #endif // !_WIN32_WCE
293 #if (_WIN32_WINNT >= 0x0501)
294 BOOL
GetIdealSize(LPSIZE lpSize
) const
296 ATLASSERT(::IsWindow(m_hWnd
));
297 return (BOOL
)::SendMessage(m_hWnd
, BCM_GETIDEALSIZE
, 0, (LPARAM
)lpSize
);
300 BOOL
GetImageList(PBUTTON_IMAGELIST pButtonImagelist
) const
302 ATLASSERT(::IsWindow(m_hWnd
));
303 return (BOOL
)::SendMessage(m_hWnd
, BCM_GETIMAGELIST
, 0, (LPARAM
)pButtonImagelist
);
306 BOOL
SetImageList(PBUTTON_IMAGELIST pButtonImagelist
)
308 ATLASSERT(::IsWindow(m_hWnd
));
309 return (BOOL
)::SendMessage(m_hWnd
, BCM_SETIMAGELIST
, 0, (LPARAM
)pButtonImagelist
);
312 BOOL
GetTextMargin(LPRECT lpRect
) const
314 ATLASSERT(::IsWindow(m_hWnd
));
315 return (BOOL
)::SendMessage(m_hWnd
, BCM_GETTEXTMARGIN
, 0, (LPARAM
)lpRect
);
318 BOOL
SetTextMargin(LPRECT lpRect
)
320 ATLASSERT(::IsWindow(m_hWnd
));
321 return (BOOL
)::SendMessage(m_hWnd
, BCM_SETTEXTMARGIN
, 0, (LPARAM
)lpRect
);
323 #endif // (_WIN32_WINNT >= 0x0501)
325 #if (WINVER >= 0x0600)
326 void SetDontClick(BOOL bDontClick
)
328 ATLASSERT(::IsWindow(m_hWnd
));
329 ::SendMessage(m_hWnd
, BM_SETDONTCLICK
, (WPARAM
)bDontClick
, 0L);
331 #endif // (WINVER >= 0x0600)
333 #if (_WIN32_WINNT >= 0x0600)
334 BOOL
SetDropDownState(BOOL bDropDown
)
336 ATLASSERT(::IsWindow(m_hWnd
));
337 ATLASSERT((GetStyle() & (BS_SPLITBUTTON
| BS_DEFSPLITBUTTON
)) != 0);
338 return (BOOL
)::SendMessage(m_hWnd
, BCM_SETDROPDOWNSTATE
, (WPARAM
)bDropDown
, 0L);
341 BOOL
GetSplitInfo(PBUTTON_SPLITINFO pSplitInfo
) const
343 ATLASSERT(::IsWindow(m_hWnd
));
344 ATLASSERT((GetStyle() & (BS_SPLITBUTTON
| BS_DEFSPLITBUTTON
)) != 0);
345 return (BOOL
)::SendMessage(m_hWnd
, BCM_GETSPLITINFO
, 0, (LPARAM
)pSplitInfo
);
348 BOOL
SetSplitInfo(PBUTTON_SPLITINFO pSplitInfo
)
350 ATLASSERT(::IsWindow(m_hWnd
));
351 ATLASSERT((GetStyle() & (BS_SPLITBUTTON
| BS_DEFSPLITBUTTON
)) != 0);
352 return (BOOL
)::SendMessage(m_hWnd
, BCM_SETSPLITINFO
, 0, (LPARAM
)pSplitInfo
);
355 int GetNoteLength() const
357 ATLASSERT(::IsWindow(m_hWnd
));
358 ATLASSERT((GetStyle() & (BS_COMMANDLINK
| BS_DEFCOMMANDLINK
)) != 0);
359 return (int)::SendMessage(m_hWnd
, BCM_GETNOTELENGTH
, 0, 0L);
362 BOOL
GetNote(LPWSTR lpstrNoteText
, int cchNoteText
) const
364 ATLASSERT(::IsWindow(m_hWnd
));
365 ATLASSERT((GetStyle() & (BS_COMMANDLINK
| BS_DEFCOMMANDLINK
)) != 0);
366 return (BOOL
)::SendMessage(m_hWnd
, BCM_GETNOTE
, cchNoteText
, (LPARAM
)lpstrNoteText
);
369 BOOL
SetNote(LPCWSTR lpstrNoteText
)
371 ATLASSERT(::IsWindow(m_hWnd
));
372 ATLASSERT((GetStyle() & (BS_COMMANDLINK
| BS_DEFCOMMANDLINK
)) != 0);
373 return (BOOL
)::SendMessage(m_hWnd
, BCM_SETNOTE
, 0, (LPARAM
)lpstrNoteText
);
376 LRESULT
SetElevationRequiredState(BOOL bSet
)
378 ATLASSERT(::IsWindow(m_hWnd
));
379 return ::SendMessage(m_hWnd
, BCM_SETSHIELD
, 0, (LPARAM
)bSet
);
381 #endif // (_WIN32_WINNT >= 0x0600)
386 ATLASSERT(::IsWindow(m_hWnd
));
387 ::SendMessage(m_hWnd
, BM_CLICK
, 0, 0L);
391 typedef CButtonT
<ATL::CWindow
> CButton
;
394 ///////////////////////////////////////////////////////////////////////////////
395 // CListBox - client side for a Windows LISTBOX control
397 template <class TBase
>
398 class CListBoxT
: public TBase
402 CListBoxT(HWND hWnd
= NULL
) : TBase(hWnd
)
405 CListBoxT
< TBase
>& operator =(HWND hWnd
)
411 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
412 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
413 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
415 return TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
419 static LPCTSTR
GetWndClassName()
421 return _T("LISTBOX");
424 // for entire listbox
427 ATLASSERT(::IsWindow(m_hWnd
));
428 return (int)::SendMessage(m_hWnd
, LB_GETCOUNT
, 0, 0L);
432 int SetCount(int cItems
)
434 ATLASSERT(::IsWindow(m_hWnd
));
435 ATLASSERT(((GetStyle() & LBS_NODATA
) != 0) && ((GetStyle() & LBS_HASSTRINGS
) == 0));
436 return (int)::SendMessage(m_hWnd
, LB_SETCOUNT
, cItems
, 0L);
438 #endif // !_WIN32_WCE
440 int GetHorizontalExtent() const
442 ATLASSERT(::IsWindow(m_hWnd
));
443 return (int)::SendMessage(m_hWnd
, LB_GETHORIZONTALEXTENT
, 0, 0L);
446 void SetHorizontalExtent(int cxExtent
)
448 ATLASSERT(::IsWindow(m_hWnd
));
449 ::SendMessage(m_hWnd
, LB_SETHORIZONTALEXTENT
, cxExtent
, 0L);
452 int GetTopIndex() const
454 ATLASSERT(::IsWindow(m_hWnd
));
455 return (int)::SendMessage(m_hWnd
, LB_GETTOPINDEX
, 0, 0L);
458 int SetTopIndex(int nIndex
)
460 ATLASSERT(::IsWindow(m_hWnd
));
461 return (int)::SendMessage(m_hWnd
, LB_SETTOPINDEX
, nIndex
, 0L);
464 LCID
GetLocale() const
466 ATLASSERT(::IsWindow(m_hWnd
));
467 return (LCID
)::SendMessage(m_hWnd
, LB_GETLOCALE
, 0, 0L);
470 LCID
SetLocale(LCID nNewLocale
)
472 ATLASSERT(::IsWindow(m_hWnd
));
473 return (LCID
)::SendMessage(m_hWnd
, LB_SETLOCALE
, (WPARAM
)nNewLocale
, 0L);
476 #if (WINVER >= 0x0500) && !defined(_WIN32_WCE)
477 DWORD
GetListBoxInfo() const
479 ATLASSERT(::IsWindow(m_hWnd
));
480 #if (_WIN32_WINNT >= 0x0501)
481 return (DWORD
)::SendMessage(m_hWnd
, LB_GETLISTBOXINFO
, 0, 0L);
482 #else // !(_WIN32_WINNT >= 0x0501)
483 return ::GetListBoxInfo(m_hWnd
);
484 #endif // !(_WIN32_WINNT >= 0x0501)
486 #endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE)
488 // for single-selection listboxes
489 int GetCurSel() const
491 ATLASSERT(::IsWindow(m_hWnd
));
492 ATLASSERT((GetStyle() & (LBS_MULTIPLESEL
| LBS_EXTENDEDSEL
)) == 0);
493 return (int)::SendMessage(m_hWnd
, LB_GETCURSEL
, 0, 0L);
496 int SetCurSel(int nSelect
)
498 ATLASSERT(::IsWindow(m_hWnd
));
499 ATLASSERT((GetStyle() & (LBS_MULTIPLESEL
| LBS_EXTENDEDSEL
)) == 0);
500 return (int)::SendMessage(m_hWnd
, LB_SETCURSEL
, nSelect
, 0L);
503 // for multiple-selection listboxes
504 int GetSel(int nIndex
) const // also works for single-selection
506 ATLASSERT(::IsWindow(m_hWnd
));
507 return (int)::SendMessage(m_hWnd
, LB_GETSEL
, nIndex
, 0L);
510 int SetSel(int nIndex
, BOOL bSelect
= TRUE
)
512 ATLASSERT(::IsWindow(m_hWnd
));
513 ATLASSERT((GetStyle() & (LBS_MULTIPLESEL
| LBS_EXTENDEDSEL
)) != 0);
514 return (int)::SendMessage(m_hWnd
, LB_SETSEL
, bSelect
, nIndex
);
517 int GetSelCount() const
519 ATLASSERT(::IsWindow(m_hWnd
));
520 ATLASSERT((GetStyle() & (LBS_MULTIPLESEL
| LBS_EXTENDEDSEL
)) != 0);
521 return (int)::SendMessage(m_hWnd
, LB_GETSELCOUNT
, 0, 0L);
524 int GetSelItems(int nMaxItems
, LPINT rgIndex
) const
526 ATLASSERT(::IsWindow(m_hWnd
));
527 ATLASSERT((GetStyle() & (LBS_MULTIPLESEL
| LBS_EXTENDEDSEL
)) != 0);
528 return (int)::SendMessage(m_hWnd
, LB_GETSELITEMS
, nMaxItems
, (LPARAM
)rgIndex
);
531 int GetAnchorIndex() const
533 ATLASSERT(::IsWindow(m_hWnd
));
534 ATLASSERT((GetStyle() & (LBS_MULTIPLESEL
| LBS_EXTENDEDSEL
)) != 0);
535 return (int)::SendMessage(m_hWnd
, LB_GETANCHORINDEX
, 0, 0L);
538 void SetAnchorIndex(int nIndex
)
540 ATLASSERT(::IsWindow(m_hWnd
));
541 ATLASSERT((GetStyle() & (LBS_MULTIPLESEL
| LBS_EXTENDEDSEL
)) != 0);
542 ::SendMessage(m_hWnd
, LB_SETANCHORINDEX
, nIndex
, 0L);
545 int GetCaretIndex() const
547 ATLASSERT(::IsWindow(m_hWnd
));
548 return (int)::SendMessage(m_hWnd
, LB_GETCARETINDEX
, 0, 0);
551 int SetCaretIndex(int nIndex
, BOOL bScroll
= TRUE
)
553 ATLASSERT(::IsWindow(m_hWnd
));
554 return (int)::SendMessage(m_hWnd
, LB_SETCARETINDEX
, nIndex
, MAKELONG(bScroll
, 0));
558 DWORD_PTR
GetItemData(int nIndex
) const
560 ATLASSERT(::IsWindow(m_hWnd
));
561 return (DWORD_PTR
)::SendMessage(m_hWnd
, LB_GETITEMDATA
, nIndex
, 0L);
564 int SetItemData(int nIndex
, DWORD_PTR dwItemData
)
566 ATLASSERT(::IsWindow(m_hWnd
));
567 return (int)::SendMessage(m_hWnd
, LB_SETITEMDATA
, nIndex
, (LPARAM
)dwItemData
);
570 void* GetItemDataPtr(int nIndex
) const
572 ATLASSERT(::IsWindow(m_hWnd
));
573 return (void*)::SendMessage(m_hWnd
, LB_GETITEMDATA
, nIndex
, 0L);
576 int SetItemDataPtr(int nIndex
, void* pData
)
578 ATLASSERT(::IsWindow(m_hWnd
));
579 return SetItemData(nIndex
, (DWORD_PTR
)pData
);
582 int GetItemRect(int nIndex
, LPRECT lpRect
) const
584 ATLASSERT(::IsWindow(m_hWnd
));
585 return (int)::SendMessage(m_hWnd
, LB_GETITEMRECT
, nIndex
, (LPARAM
)lpRect
);
588 int GetText(int nIndex
, LPTSTR lpszBuffer
) const
590 ATLASSERT(::IsWindow(m_hWnd
));
591 return (int)::SendMessage(m_hWnd
, LB_GETTEXT
, nIndex
, (LPARAM
)lpszBuffer
);
596 BOOL
GetTextBSTR(int nIndex
, BSTR
& bstrText
) const
599 ATLASSERT(::IsWindow(m_hWnd
));
600 ATLASSERT(bstrText
== NULL
);
602 int nLen
= GetTextLen(nIndex
);
606 CTempBuffer
<TCHAR
, _WTL_STACK_ALLOC_THRESHOLD
> buff
;
607 LPTSTR lpstrText
= buff
.Allocate(nLen
+ 1);
608 if(lpstrText
== NULL
)
611 if(GetText(nIndex
, lpstrText
) == LB_ERR
)
614 bstrText
= ::SysAllocString(T2OLE(lpstrText
));
615 return (bstrText
!= NULL
) ? TRUE
: FALSE
;
617 #endif // _OLEAUTO_H_
618 #endif // !_ATL_NO_COM
620 #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
621 int GetText(int nIndex
, _CSTRING_NS::CString
& strText
) const
623 ATLASSERT(::IsWindow(m_hWnd
));
624 int cchLen
= GetTextLen(nIndex
);
628 LPTSTR lpstr
= strText
.GetBufferSetLength(cchLen
);
631 nRet
= GetText(nIndex
, lpstr
);
632 strText
.ReleaseBuffer();
636 #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
638 int GetTextLen(int nIndex
) const
640 ATLASSERT(::IsWindow(m_hWnd
));
641 return (int)::SendMessage(m_hWnd
, LB_GETTEXTLEN
, nIndex
, 0L);
644 int GetItemHeight(int nIndex
) const
646 ATLASSERT(::IsWindow(m_hWnd
));
647 return (int)::SendMessage(m_hWnd
, LB_GETITEMHEIGHT
, nIndex
, 0L);
650 int SetItemHeight(int nIndex
, UINT cyItemHeight
)
652 ATLASSERT(::IsWindow(m_hWnd
));
653 return (int)::SendMessage(m_hWnd
, LB_SETITEMHEIGHT
, nIndex
, MAKELONG(cyItemHeight
, 0));
656 // Settable only attributes
657 void SetColumnWidth(int cxWidth
)
659 ATLASSERT(::IsWindow(m_hWnd
));
660 ::SendMessage(m_hWnd
, LB_SETCOLUMNWIDTH
, cxWidth
, 0L);
663 BOOL
SetTabStops(int nTabStops
, LPINT rgTabStops
)
665 ATLASSERT(::IsWindow(m_hWnd
));
666 ATLASSERT((GetStyle() & LBS_USETABSTOPS
) != 0);
667 return (BOOL
)::SendMessage(m_hWnd
, LB_SETTABSTOPS
, nTabStops
, (LPARAM
)rgTabStops
);
672 ATLASSERT(::IsWindow(m_hWnd
));
673 ATLASSERT((GetStyle() & LBS_USETABSTOPS
) != 0);
674 return (BOOL
)::SendMessage(m_hWnd
, LB_SETTABSTOPS
, 0, 0L);
677 BOOL
SetTabStops(const int& cxEachStop
) // takes an 'int'
679 ATLASSERT(::IsWindow(m_hWnd
));
680 ATLASSERT((GetStyle() & LBS_USETABSTOPS
) != 0);
681 return (BOOL
)::SendMessage(m_hWnd
, LB_SETTABSTOPS
, 1, (LPARAM
)(LPINT
)&cxEachStop
);
685 int InitStorage(int nItems
, UINT nBytes
)
687 ATLASSERT(::IsWindow(m_hWnd
));
688 return (int)::SendMessage(m_hWnd
, LB_INITSTORAGE
, (WPARAM
)nItems
, nBytes
);
693 ATLASSERT(::IsWindow(m_hWnd
));
694 ::SendMessage(m_hWnd
, LB_RESETCONTENT
, 0, 0L);
697 UINT
ItemFromPoint(POINT pt
, BOOL
& bOutside
) const
699 ATLASSERT(::IsWindow(m_hWnd
));
700 DWORD dw
= (DWORD
)::SendMessage(m_hWnd
, LB_ITEMFROMPOINT
, 0, MAKELPARAM(pt
.x
, pt
.y
));
701 bOutside
= (BOOL
)HIWORD(dw
);
702 return (UINT
)LOWORD(dw
);
705 // manipulating listbox items
706 int AddString(LPCTSTR lpszItem
)
708 ATLASSERT(::IsWindow(m_hWnd
));
709 return (int)::SendMessage(m_hWnd
, LB_ADDSTRING
, 0, (LPARAM
)lpszItem
);
712 int DeleteString(UINT nIndex
)
714 ATLASSERT(::IsWindow(m_hWnd
));
715 return (int)::SendMessage(m_hWnd
, LB_DELETESTRING
, nIndex
, 0L);
718 int InsertString(int nIndex
, LPCTSTR lpszItem
)
720 ATLASSERT(::IsWindow(m_hWnd
));
721 return (int)::SendMessage(m_hWnd
, LB_INSERTSTRING
, nIndex
, (LPARAM
)lpszItem
);
725 int Dir(UINT attr
, LPCTSTR lpszWildCard
)
727 ATLASSERT(::IsWindow(m_hWnd
));
728 return (int)::SendMessage(m_hWnd
, LB_DIR
, attr
, (LPARAM
)lpszWildCard
);
731 int AddFile(LPCTSTR lpstrFileName
)
733 ATLASSERT(::IsWindow(m_hWnd
));
734 return (int)::SendMessage(m_hWnd
, LB_ADDFILE
, 0, (LPARAM
)lpstrFileName
);
736 #endif // !_WIN32_WCE
739 int FindString(int nStartAfter
, LPCTSTR lpszItem
) const
741 ATLASSERT(::IsWindow(m_hWnd
));
742 return (int)::SendMessage(m_hWnd
, LB_FINDSTRING
, nStartAfter
, (LPARAM
)lpszItem
);
745 int FindStringExact(int nIndexStart
, LPCTSTR lpszFind
) const
747 ATLASSERT(::IsWindow(m_hWnd
));
748 return (int)::SendMessage(m_hWnd
, LB_FINDSTRINGEXACT
, nIndexStart
, (LPARAM
)lpszFind
);
751 int SelectString(int nStartAfter
, LPCTSTR lpszItem
)
753 ATLASSERT(::IsWindow(m_hWnd
));
754 return (int)::SendMessage(m_hWnd
, LB_SELECTSTRING
, nStartAfter
, (LPARAM
)lpszItem
);
757 int SelItemRange(BOOL bSelect
, int nFirstItem
, int nLastItem
)
759 ATLASSERT(::IsWindow(m_hWnd
));
760 ATLASSERT((GetStyle() & (LBS_MULTIPLESEL
| LBS_EXTENDEDSEL
)) != 0);
761 ATLASSERT(nFirstItem
<= nLastItem
);
762 return bSelect
? (int)::SendMessage(m_hWnd
, LB_SELITEMRANGEEX
, nFirstItem
, nLastItem
) : (int)::SendMessage(m_hWnd
, LB_SELITEMRANGEEX
, nLastItem
, nFirstItem
);
765 #ifdef WIN32_PLATFORM_WFSP // SmartPhone only messages
766 DWORD
GetInputMode(BOOL bCurrentMode
= TRUE
)
768 return SendMessage(LB_GETINPUTMODE
, 0, (LPARAM
)bCurrentMode
);
771 BOOL
SetInputMode(DWORD dwMode
)
773 return SendMessage(LB_SETINPUTMODE
, 0, (LPARAM
)dwMode
);
775 #endif // WIN32_PLATFORM_WFSP
778 typedef CListBoxT
<ATL::CWindow
> CListBox
;
781 ///////////////////////////////////////////////////////////////////////////////
782 // CComboBox - client side for a Windows COMBOBOX control
784 #ifndef WIN32_PLATFORM_WFSP // No COMBOBOX on SmartPhones
786 template <class TBase
>
787 class CComboBoxT
: public TBase
791 CComboBoxT(HWND hWnd
= NULL
) : TBase(hWnd
)
794 CComboBoxT
< TBase
>& operator =(HWND hWnd
)
800 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
801 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
802 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
804 return TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
808 static LPCTSTR
GetWndClassName()
810 return _T("COMBOBOX");
813 // for entire combo box
816 ATLASSERT(::IsWindow(m_hWnd
));
817 return (int)::SendMessage(m_hWnd
, CB_GETCOUNT
, 0, 0L);
820 int GetCurSel() const
822 ATLASSERT(::IsWindow(m_hWnd
));
823 return (int)::SendMessage(m_hWnd
, CB_GETCURSEL
, 0, 0L);
826 int SetCurSel(int nSelect
)
828 ATLASSERT(::IsWindow(m_hWnd
));
829 return (int)::SendMessage(m_hWnd
, CB_SETCURSEL
, nSelect
, 0L);
832 LCID
GetLocale() const
834 ATLASSERT(::IsWindow(m_hWnd
));
835 return (LCID
)::SendMessage(m_hWnd
, CB_GETLOCALE
, 0, 0L);
838 LCID
SetLocale(LCID nNewLocale
)
840 ATLASSERT(::IsWindow(m_hWnd
));
841 return (LCID
)::SendMessage(m_hWnd
, CB_SETLOCALE
, (WPARAM
)nNewLocale
, 0L);
844 int GetTopIndex() const
846 ATLASSERT(::IsWindow(m_hWnd
));
847 return (int)::SendMessage(m_hWnd
, CB_GETTOPINDEX
, 0, 0L);
850 int SetTopIndex(int nIndex
)
852 ATLASSERT(::IsWindow(m_hWnd
));
853 return (int)::SendMessage(m_hWnd
, CB_SETTOPINDEX
, nIndex
, 0L);
856 UINT
GetHorizontalExtent() const
858 ATLASSERT(::IsWindow(m_hWnd
));
859 return (UINT
)::SendMessage(m_hWnd
, CB_GETHORIZONTALEXTENT
, 0, 0L);
862 void SetHorizontalExtent(UINT nExtent
)
864 ATLASSERT(::IsWindow(m_hWnd
));
865 ::SendMessage(m_hWnd
, CB_SETHORIZONTALEXTENT
, nExtent
, 0L);
868 int GetDroppedWidth() const
870 ATLASSERT(::IsWindow(m_hWnd
));
871 return (int)::SendMessage(m_hWnd
, CB_GETDROPPEDWIDTH
, 0, 0L);
874 int SetDroppedWidth(UINT nWidth
)
876 ATLASSERT(::IsWindow(m_hWnd
));
877 return (int)::SendMessage(m_hWnd
, CB_SETDROPPEDWIDTH
, nWidth
, 0L);
880 #if ((WINVER >= 0x0500) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420))
881 BOOL
GetComboBoxInfo(PCOMBOBOXINFO pComboBoxInfo
) const
883 ATLASSERT(::IsWindow(m_hWnd
));
884 #if ((_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420))
885 return (BOOL
)::SendMessage(m_hWnd
, CB_GETCOMBOBOXINFO
, 0, (LPARAM
)pComboBoxInfo
);
886 #else // !((_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420))
887 return ::GetComboBoxInfo(m_hWnd
, pComboBoxInfo
);
888 #endif // !((_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420))
890 #endif // ((WINVER >= 0x0500) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420))
893 DWORD
GetEditSel() const
895 ATLASSERT(::IsWindow(m_hWnd
));
896 return (DWORD
)::SendMessage(m_hWnd
, CB_GETEDITSEL
, 0, 0L);
899 BOOL
SetEditSel(int nStartChar
, int nEndChar
)
901 ATLASSERT(::IsWindow(m_hWnd
));
902 return (BOOL
)::SendMessage(m_hWnd
, CB_SETEDITSEL
, 0, MAKELONG(nStartChar
, nEndChar
));
906 DWORD_PTR
GetItemData(int nIndex
) const
908 ATLASSERT(::IsWindow(m_hWnd
));
909 return (DWORD_PTR
)::SendMessage(m_hWnd
, CB_GETITEMDATA
, nIndex
, 0L);
912 int SetItemData(int nIndex
, DWORD_PTR dwItemData
)
914 ATLASSERT(::IsWindow(m_hWnd
));
915 return (int)::SendMessage(m_hWnd
, CB_SETITEMDATA
, nIndex
, (LPARAM
)dwItemData
);
918 void* GetItemDataPtr(int nIndex
) const
920 ATLASSERT(::IsWindow(m_hWnd
));
921 return (void*)GetItemData(nIndex
);
924 int SetItemDataPtr(int nIndex
, void* pData
)
926 ATLASSERT(::IsWindow(m_hWnd
));
927 return SetItemData(nIndex
, (DWORD_PTR
)pData
);
930 int GetLBText(int nIndex
, LPTSTR lpszText
) const
932 ATLASSERT(::IsWindow(m_hWnd
));
933 return (int)::SendMessage(m_hWnd
, CB_GETLBTEXT
, nIndex
, (LPARAM
)lpszText
);
937 BOOL
GetLBTextBSTR(int nIndex
, BSTR
& bstrText
) const
940 ATLASSERT(::IsWindow(m_hWnd
));
941 ATLASSERT(bstrText
== NULL
);
943 int nLen
= GetLBTextLen(nIndex
);
947 CTempBuffer
<TCHAR
, _WTL_STACK_ALLOC_THRESHOLD
> buff
;
948 LPTSTR lpstrText
= buff
.Allocate(nLen
+ 1);
949 if(lpstrText
== NULL
)
952 if(GetLBText(nIndex
, lpstrText
) == CB_ERR
)
955 bstrText
= ::SysAllocString(T2OLE(lpstrText
));
956 return (bstrText
!= NULL
) ? TRUE
: FALSE
;
958 #endif // !_ATL_NO_COM
960 #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
961 int GetLBText(int nIndex
, _CSTRING_NS::CString
& strText
) const
963 ATLASSERT(::IsWindow(m_hWnd
));
964 int cchLen
= GetLBTextLen(nIndex
);
968 LPTSTR lpstr
= strText
.GetBufferSetLength(cchLen
);
971 nRet
= GetLBText(nIndex
, lpstr
);
972 strText
.ReleaseBuffer();
976 #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
978 int GetLBTextLen(int nIndex
) const
980 ATLASSERT(::IsWindow(m_hWnd
));
981 return (int)::SendMessage(m_hWnd
, CB_GETLBTEXTLEN
, nIndex
, 0L);
984 int GetItemHeight(int nIndex
) const
986 ATLASSERT(::IsWindow(m_hWnd
));
987 return (int)::SendMessage(m_hWnd
, CB_GETITEMHEIGHT
, nIndex
, 0L);
990 int SetItemHeight(int nIndex
, UINT cyItemHeight
)
992 ATLASSERT(::IsWindow(m_hWnd
));
993 return (int)::SendMessage(m_hWnd
, CB_SETITEMHEIGHT
, nIndex
, MAKELONG(cyItemHeight
, 0));
996 BOOL
GetExtendedUI() const
998 ATLASSERT(::IsWindow(m_hWnd
));
999 return (BOOL
)::SendMessage(m_hWnd
, CB_GETEXTENDEDUI
, 0, 0L);
1002 int SetExtendedUI(BOOL bExtended
= TRUE
)
1004 ATLASSERT(::IsWindow(m_hWnd
));
1005 return (int)::SendMessage(m_hWnd
, CB_SETEXTENDEDUI
, bExtended
, 0L);
1008 void GetDroppedControlRect(LPRECT lprect
) const
1010 ATLASSERT(::IsWindow(m_hWnd
));
1011 ::SendMessage(m_hWnd
, CB_GETDROPPEDCONTROLRECT
, 0, (LPARAM
)lprect
);
1014 BOOL
GetDroppedState() const
1016 ATLASSERT(::IsWindow(m_hWnd
));
1017 return (BOOL
)::SendMessage(m_hWnd
, CB_GETDROPPEDSTATE
, 0, 0L);
1020 #if (_WIN32_WINNT >= 0x0501)
1021 int GetMinVisible() const
1023 ATLASSERT(::IsWindow(m_hWnd
));
1024 return (int)::SendMessage(m_hWnd
, CB_GETMINVISIBLE
, 0, 0L);
1027 BOOL
SetMinVisible(int nMinVisible
)
1029 ATLASSERT(::IsWindow(m_hWnd
));
1030 return (BOOL
)::SendMessage(m_hWnd
, CB_SETMINVISIBLE
, nMinVisible
, 0L);
1034 BOOL
GetCueBannerText(LPWSTR lpwText
, int cchText
) const
1036 #ifndef CB_GETCUEBANNER
1037 const UINT CB_GETCUEBANNER
= (CBM_FIRST
+ 4);
1039 ATLASSERT(::IsWindow(m_hWnd
));
1040 return (BOOL
)::SendMessage(m_hWnd
, CB_GETCUEBANNER
, (WPARAM
)lpwText
, cchText
);
1044 BOOL
SetCueBannerText(LPCWSTR lpcwText
)
1046 #ifndef CB_SETCUEBANNER
1047 const UINT CB_SETCUEBANNER
= (CBM_FIRST
+ 3);
1049 ATLASSERT(::IsWindow(m_hWnd
));
1050 return (BOOL
)::SendMessage(m_hWnd
, CB_SETCUEBANNER
, 0, (LPARAM
)lpcwText
);
1052 #endif // (_WIN32_WINNT >= 0x0501)
1055 int InitStorage(int nItems
, UINT nBytes
)
1057 ATLASSERT(::IsWindow(m_hWnd
));
1058 return (int)::SendMessage(m_hWnd
, CB_INITSTORAGE
, (WPARAM
)nItems
, nBytes
);
1063 ATLASSERT(::IsWindow(m_hWnd
));
1064 ::SendMessage(m_hWnd
, CB_RESETCONTENT
, 0, 0L);
1068 BOOL
LimitText(int nMaxChars
)
1070 ATLASSERT(::IsWindow(m_hWnd
));
1071 return (BOOL
)::SendMessage(m_hWnd
, CB_LIMITTEXT
, nMaxChars
, 0L);
1074 // for drop-down combo boxes
1075 void ShowDropDown(BOOL bShowIt
= TRUE
)
1077 ATLASSERT(::IsWindow(m_hWnd
));
1078 ::SendMessage(m_hWnd
, CB_SHOWDROPDOWN
, bShowIt
, 0L);
1081 // manipulating listbox items
1082 int AddString(LPCTSTR lpszString
)
1084 ATLASSERT(::IsWindow(m_hWnd
));
1085 return (int)::SendMessage(m_hWnd
, CB_ADDSTRING
, 0, (LPARAM
)lpszString
);
1088 int DeleteString(UINT nIndex
)
1090 ATLASSERT(::IsWindow(m_hWnd
));
1091 return (int)::SendMessage(m_hWnd
, CB_DELETESTRING
, nIndex
, 0L);
1094 int InsertString(int nIndex
, LPCTSTR lpszString
)
1096 ATLASSERT(::IsWindow(m_hWnd
));
1097 return (int)::SendMessage(m_hWnd
, CB_INSERTSTRING
, nIndex
, (LPARAM
)lpszString
);
1101 int Dir(UINT attr
, LPCTSTR lpszWildCard
)
1103 ATLASSERT(::IsWindow(m_hWnd
));
1104 return (int)::SendMessage(m_hWnd
, CB_DIR
, attr
, (LPARAM
)lpszWildCard
);
1106 #endif // !_WIN32_WCE
1108 // selection helpers
1109 int FindString(int nStartAfter
, LPCTSTR lpszString
) const
1111 ATLASSERT(::IsWindow(m_hWnd
));
1112 return (int)::SendMessage(m_hWnd
, CB_FINDSTRING
, nStartAfter
, (LPARAM
)lpszString
);
1115 int FindStringExact(int nIndexStart
, LPCTSTR lpszFind
) const
1117 ATLASSERT(::IsWindow(m_hWnd
));
1118 return (int)::SendMessage(m_hWnd
, CB_FINDSTRINGEXACT
, nIndexStart
, (LPARAM
)lpszFind
);
1121 int SelectString(int nStartAfter
, LPCTSTR lpszString
)
1123 ATLASSERT(::IsWindow(m_hWnd
));
1124 return (int)::SendMessage(m_hWnd
, CB_SELECTSTRING
, nStartAfter
, (LPARAM
)lpszString
);
1127 // Clipboard operations
1130 ATLASSERT(::IsWindow(m_hWnd
));
1131 ::SendMessage(m_hWnd
, WM_CLEAR
, 0, 0L);
1136 ATLASSERT(::IsWindow(m_hWnd
));
1137 ::SendMessage(m_hWnd
, WM_COPY
, 0, 0L);
1142 ATLASSERT(::IsWindow(m_hWnd
));
1143 ::SendMessage(m_hWnd
, WM_CUT
, 0, 0L);
1148 ATLASSERT(::IsWindow(m_hWnd
));
1149 ::SendMessage(m_hWnd
, WM_PASTE
, 0, 0L);
1153 typedef CComboBoxT
<ATL::CWindow
> CComboBox
;
1155 #endif // !WIN32_PLATFORM_WFSP
1157 ///////////////////////////////////////////////////////////////////////////////
1158 // CEdit - client side for a Windows EDIT control
1160 template <class TBase
>
1161 class CEditT
: public TBase
1165 CEditT(HWND hWnd
= NULL
) : TBase(hWnd
)
1168 CEditT
< TBase
>& operator =(HWND hWnd
)
1174 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
1175 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
1176 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
1178 return TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
1182 static LPCTSTR
GetWndClassName()
1187 BOOL
CanUndo() const
1189 ATLASSERT(::IsWindow(m_hWnd
));
1190 return (BOOL
)::SendMessage(m_hWnd
, EM_CANUNDO
, 0, 0L);
1193 int GetLineCount() const
1195 ATLASSERT(::IsWindow(m_hWnd
));
1196 return (int)::SendMessage(m_hWnd
, EM_GETLINECOUNT
, 0, 0L);
1199 BOOL
GetModify() const
1201 ATLASSERT(::IsWindow(m_hWnd
));
1202 return (BOOL
)::SendMessage(m_hWnd
, EM_GETMODIFY
, 0, 0L);
1205 void SetModify(BOOL bModified
= TRUE
)
1207 ATLASSERT(::IsWindow(m_hWnd
));
1208 ::SendMessage(m_hWnd
, EM_SETMODIFY
, bModified
, 0L);
1211 void GetRect(LPRECT lpRect
) const
1213 ATLASSERT(::IsWindow(m_hWnd
));
1214 ::SendMessage(m_hWnd
, EM_GETRECT
, 0, (LPARAM
)lpRect
);
1217 DWORD
GetSel() const
1219 ATLASSERT(::IsWindow(m_hWnd
));
1220 return (DWORD
)::SendMessage(m_hWnd
, EM_GETSEL
, 0, 0L);
1223 void GetSel(int& nStartChar
, int& nEndChar
) const
1225 ATLASSERT(::IsWindow(m_hWnd
));
1226 ::SendMessage(m_hWnd
, EM_GETSEL
, (WPARAM
)&nStartChar
, (LPARAM
)&nEndChar
);
1230 HLOCAL
GetHandle() const
1232 ATLASSERT(::IsWindow(m_hWnd
));
1233 return (HLOCAL
)::SendMessage(m_hWnd
, EM_GETHANDLE
, 0, 0L);
1236 void SetHandle(HLOCAL hBuffer
)
1238 ATLASSERT(::IsWindow(m_hWnd
));
1239 ::SendMessage(m_hWnd
, EM_SETHANDLE
, (WPARAM
)hBuffer
, 0L);
1241 #endif // !_WIN32_WCE
1243 DWORD
GetMargins() const
1245 ATLASSERT(::IsWindow(m_hWnd
));
1246 return (DWORD
)::SendMessage(m_hWnd
, EM_GETMARGINS
, 0, 0L);
1249 void GetMargins(UINT
& nLeft
, UINT
& nRight
) const
1251 ATLASSERT(::IsWindow(m_hWnd
));
1252 DWORD dwRet
= (DWORD
)::SendMessage(m_hWnd
, EM_GETMARGINS
, 0, 0L);
1253 nLeft
= LOWORD(dwRet
);
1254 nRight
= HIWORD(dwRet
);
1257 void SetMargins(UINT nLeft
, UINT nRight
, WORD wFlags
= EC_LEFTMARGIN
| EC_RIGHTMARGIN
)
1259 ATLASSERT(::IsWindow(m_hWnd
));
1260 ::SendMessage(m_hWnd
, EM_SETMARGINS
, wFlags
, MAKELONG(nLeft
, nRight
));
1263 UINT
GetLimitText() const
1265 ATLASSERT(::IsWindow(m_hWnd
));
1266 return (UINT
)::SendMessage(m_hWnd
, EM_GETLIMITTEXT
, 0, 0L);
1269 void SetLimitText(UINT nMax
)
1271 ATLASSERT(::IsWindow(m_hWnd
));
1272 ::SendMessage(m_hWnd
, EM_SETLIMITTEXT
, nMax
, 0L);
1275 POINT
PosFromChar(UINT nChar
) const
1277 ATLASSERT(::IsWindow(m_hWnd
));
1278 DWORD dwRet
= (DWORD
)::SendMessage(m_hWnd
, EM_POSFROMCHAR
, nChar
, 0);
1279 POINT point
= { GET_X_LPARAM(dwRet
), GET_Y_LPARAM(dwRet
) };
1283 int CharFromPos(POINT pt
, int* pLine
= NULL
) const
1285 ATLASSERT(::IsWindow(m_hWnd
));
1286 DWORD dwRet
= (DWORD
)::SendMessage(m_hWnd
, EM_CHARFROMPOS
, 0, MAKELPARAM(pt
.x
, pt
.y
));
1288 *pLine
= (int)(short)HIWORD(dwRet
);
1289 return (int)(short)LOWORD(dwRet
);
1292 // NOTE: first word in lpszBuffer must contain the size of the buffer!
1293 int GetLine(int nIndex
, LPTSTR lpszBuffer
) const
1295 ATLASSERT(::IsWindow(m_hWnd
));
1296 return (int)::SendMessage(m_hWnd
, EM_GETLINE
, nIndex
, (LPARAM
)lpszBuffer
);
1299 int GetLine(int nIndex
, LPTSTR lpszBuffer
, int nMaxLength
) const
1301 ATLASSERT(::IsWindow(m_hWnd
));
1302 *(LPWORD
)lpszBuffer
= (WORD
)nMaxLength
;
1303 return (int)::SendMessage(m_hWnd
, EM_GETLINE
, nIndex
, (LPARAM
)lpszBuffer
);
1306 TCHAR
GetPasswordChar() const
1308 ATLASSERT(::IsWindow(m_hWnd
));
1309 return (TCHAR
)::SendMessage(m_hWnd
, EM_GETPASSWORDCHAR
, 0, 0L);
1312 void SetPasswordChar(TCHAR ch
)
1314 ATLASSERT(::IsWindow(m_hWnd
));
1315 ::SendMessage(m_hWnd
, EM_SETPASSWORDCHAR
, ch
, 0L);
1319 EDITWORDBREAKPROC
GetWordBreakProc() const
1321 ATLASSERT(::IsWindow(m_hWnd
));
1322 return (EDITWORDBREAKPROC
)::SendMessage(m_hWnd
, EM_GETWORDBREAKPROC
, 0, 0L);
1325 void SetWordBreakProc(EDITWORDBREAKPROC ewbprc
)
1327 ATLASSERT(::IsWindow(m_hWnd
));
1328 ::SendMessage(m_hWnd
, EM_SETWORDBREAKPROC
, 0, (LPARAM
)ewbprc
);
1330 #endif // !_WIN32_WCE
1332 int GetFirstVisibleLine() const
1334 ATLASSERT(::IsWindow(m_hWnd
));
1335 return (int)::SendMessage(m_hWnd
, EM_GETFIRSTVISIBLELINE
, 0, 0L);
1339 int GetThumb() const
1341 ATLASSERT(::IsWindow(m_hWnd
));
1342 ATLASSERT((GetStyle() & ES_MULTILINE
) != 0);
1343 return (int)::SendMessage(m_hWnd
, EM_GETTHUMB
, 0, 0L);
1345 #endif // !_WIN32_WCE
1347 BOOL
SetReadOnly(BOOL bReadOnly
= TRUE
)
1349 ATLASSERT(::IsWindow(m_hWnd
));
1350 return (BOOL
)::SendMessage(m_hWnd
, EM_SETREADONLY
, bReadOnly
, 0L);
1353 #if (WINVER >= 0x0500) && !defined(_WIN32_WCE)
1354 UINT
GetImeStatus(UINT uStatus
) const
1356 ATLASSERT(::IsWindow(m_hWnd
));
1357 return (UINT
)::SendMessage(m_hWnd
, EM_GETIMESTATUS
, uStatus
, 0L);
1360 UINT
SetImeStatus(UINT uStatus
, UINT uData
)
1362 ATLASSERT(::IsWindow(m_hWnd
));
1363 return (UINT
)::SendMessage(m_hWnd
, EM_SETIMESTATUS
, uStatus
, uData
);
1365 #endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE)
1367 #if (_WIN32_WINNT >= 0x0501)
1368 BOOL
GetCueBannerText(LPCWSTR lpstrText
, int cchText
) const
1370 ATLASSERT(::IsWindow(m_hWnd
));
1371 return (BOOL
)::SendMessage(m_hWnd
, EM_GETCUEBANNER
, (WPARAM
)lpstrText
, cchText
);
1374 // bKeepWithFocus - Vista only
1375 BOOL
SetCueBannerText(LPCWSTR lpstrText
, BOOL bKeepWithFocus
= FALSE
)
1377 ATLASSERT(::IsWindow(m_hWnd
));
1378 return (BOOL
)::SendMessage(m_hWnd
, EM_SETCUEBANNER
, (WPARAM
)bKeepWithFocus
, (LPARAM
)(lpstrText
));
1380 #endif // (_WIN32_WINNT >= 0x0501)
1383 void EmptyUndoBuffer()
1385 ATLASSERT(::IsWindow(m_hWnd
));
1386 ::SendMessage(m_hWnd
, EM_EMPTYUNDOBUFFER
, 0, 0L);
1389 BOOL
FmtLines(BOOL bAddEOL
)
1391 ATLASSERT(::IsWindow(m_hWnd
));
1392 return (BOOL
)::SendMessage(m_hWnd
, EM_FMTLINES
, bAddEOL
, 0L);
1395 void LimitText(int nChars
= 0)
1397 ATLASSERT(::IsWindow(m_hWnd
));
1398 ::SendMessage(m_hWnd
, EM_LIMITTEXT
, nChars
, 0L);
1401 int LineFromChar(int nIndex
= -1) const
1403 ATLASSERT(::IsWindow(m_hWnd
));
1404 return (int)::SendMessage(m_hWnd
, EM_LINEFROMCHAR
, nIndex
, 0L);
1407 int LineIndex(int nLine
= -1) const
1409 ATLASSERT(::IsWindow(m_hWnd
));
1410 return (int)::SendMessage(m_hWnd
, EM_LINEINDEX
, nLine
, 0L);
1413 int LineLength(int nLine
= -1) const
1415 ATLASSERT(::IsWindow(m_hWnd
));
1416 return (int)::SendMessage(m_hWnd
, EM_LINELENGTH
, nLine
, 0L);
1419 void LineScroll(int nLines
, int nChars
= 0)
1421 ATLASSERT(::IsWindow(m_hWnd
));
1422 ::SendMessage(m_hWnd
, EM_LINESCROLL
, nChars
, nLines
);
1425 void ReplaceSel(LPCTSTR lpszNewText
, BOOL bCanUndo
= FALSE
)
1427 ATLASSERT(::IsWindow(m_hWnd
));
1428 ::SendMessage(m_hWnd
, EM_REPLACESEL
, (WPARAM
) bCanUndo
, (LPARAM
)lpszNewText
);
1431 void SetRect(LPCRECT lpRect
)
1433 ATLASSERT(::IsWindow(m_hWnd
));
1434 ::SendMessage(m_hWnd
, EM_SETRECT
, 0, (LPARAM
)lpRect
);
1437 void SetRectNP(LPCRECT lpRect
)
1439 ATLASSERT(::IsWindow(m_hWnd
));
1440 ::SendMessage(m_hWnd
, EM_SETRECTNP
, 0, (LPARAM
)lpRect
);
1443 void SetSel(DWORD dwSelection
, BOOL bNoScroll
= FALSE
)
1445 ATLASSERT(::IsWindow(m_hWnd
));
1446 ::SendMessage(m_hWnd
, EM_SETSEL
, LOWORD(dwSelection
), HIWORD(dwSelection
));
1448 ::SendMessage(m_hWnd
, EM_SCROLLCARET
, 0, 0L);
1451 void SetSel(int nStartChar
, int nEndChar
, BOOL bNoScroll
= FALSE
)
1453 ATLASSERT(::IsWindow(m_hWnd
));
1454 ::SendMessage(m_hWnd
, EM_SETSEL
, nStartChar
, nEndChar
);
1456 ::SendMessage(m_hWnd
, EM_SCROLLCARET
, 0, 0L);
1459 void SetSelAll(BOOL bNoScroll
= FALSE
)
1461 SetSel(0, -1, bNoScroll
);
1464 void SetSelNone(BOOL bNoScroll
= FALSE
)
1466 SetSel(-1, 0, bNoScroll
);
1469 BOOL
SetTabStops(int nTabStops
, LPINT rgTabStops
)
1471 ATLASSERT(::IsWindow(m_hWnd
));
1472 return (BOOL
)::SendMessage(m_hWnd
, EM_SETTABSTOPS
, nTabStops
, (LPARAM
)rgTabStops
);
1477 ATLASSERT(::IsWindow(m_hWnd
));
1478 return (BOOL
)::SendMessage(m_hWnd
, EM_SETTABSTOPS
, 0, 0L);
1481 BOOL
SetTabStops(const int& cxEachStop
) // takes an 'int'
1483 ATLASSERT(::IsWindow(m_hWnd
));
1484 return (BOOL
)::SendMessage(m_hWnd
, EM_SETTABSTOPS
, 1, (LPARAM
)(LPINT
)&cxEachStop
);
1489 ATLASSERT(::IsWindow(m_hWnd
));
1490 ::SendMessage(m_hWnd
, EM_SCROLLCARET
, 0, 0L);
1493 int Scroll(int nScrollAction
)
1495 ATLASSERT(::IsWindow(m_hWnd
));
1496 ATLASSERT((GetStyle() & ES_MULTILINE
) != 0);
1497 LRESULT lRet
= ::SendMessage(m_hWnd
, EM_SCROLL
, nScrollAction
, 0L);
1498 if(!(BOOL
)HIWORD(lRet
))
1499 return -1; // failed
1500 return (int)(short)LOWORD(lRet
);
1504 void InsertText(int nInsertAfterChar
, LPCTSTR lpstrText
, BOOL bNoScroll
= FALSE
, BOOL bCanUndo
= FALSE
)
1506 SetSel(nInsertAfterChar
, nInsertAfterChar
, bNoScroll
);
1507 ReplaceSel(lpstrText
, bCanUndo
);
1510 void AppendText(LPCTSTR lpstrText
, BOOL bNoScroll
= FALSE
, BOOL bCanUndo
= FALSE
)
1512 InsertText(GetWindowTextLength(), lpstrText
, bNoScroll
, bCanUndo
);
1515 #if (_WIN32_WINNT >= 0x0501)
1516 BOOL
ShowBalloonTip(PEDITBALLOONTIP pEditBaloonTip
)
1518 ATLASSERT(::IsWindow(m_hWnd
));
1519 return (BOOL
)::SendMessage(m_hWnd
, EM_SHOWBALLOONTIP
, 0, (LPARAM
)pEditBaloonTip
);
1522 BOOL
HideBalloonTip()
1524 ATLASSERT(::IsWindow(m_hWnd
));
1525 return (BOOL
)::SendMessage(m_hWnd
, EM_HIDEBALLOONTIP
, 0, 0L);
1527 #endif // (_WIN32_WINNT >= 0x0501)
1529 #if (_WIN32_WINNT >= 0x0600)
1530 DWORD
GetHilite() const
1532 ATLASSERT(::IsWindow(m_hWnd
));
1533 return (DWORD
)::SendMessage(m_hWnd
, EM_GETHILITE
, 0, 0L);
1536 void GetHilite(int& nStartChar
, int& nEndChar
) const
1538 ATLASSERT(::IsWindow(m_hWnd
));
1539 DWORD dwRet
= (DWORD
)::SendMessage(m_hWnd
, EM_GETHILITE
, 0, 0L);
1540 nStartChar
= (int)(short)LOWORD(dwRet
);
1541 nEndChar
= (int)(short)HIWORD(dwRet
);
1544 void SetHilite(int nStartChar
, int nEndChar
)
1546 ATLASSERT(::IsWindow(m_hWnd
));
1547 ::SendMessage(m_hWnd
, EM_SETHILITE
, nStartChar
, nEndChar
);
1549 #endif // (_WIN32_WINNT >= 0x0600)
1551 // Clipboard operations
1554 ATLASSERT(::IsWindow(m_hWnd
));
1555 return (BOOL
)::SendMessage(m_hWnd
, EM_UNDO
, 0, 0L);
1560 ATLASSERT(::IsWindow(m_hWnd
));
1561 ::SendMessage(m_hWnd
, WM_CLEAR
, 0, 0L);
1566 ATLASSERT(::IsWindow(m_hWnd
));
1567 ::SendMessage(m_hWnd
, WM_COPY
, 0, 0L);
1572 ATLASSERT(::IsWindow(m_hWnd
));
1573 ::SendMessage(m_hWnd
, WM_CUT
, 0, 0L);
1578 ATLASSERT(::IsWindow(m_hWnd
));
1579 ::SendMessage(m_hWnd
, WM_PASTE
, 0, 0L);
1582 #ifdef WIN32_PLATFORM_WFSP // SmartPhone only messages
1583 DWORD
GetExtendedStyle()
1585 return SendMessage(EM_GETEXTENDEDSTYLE
);
1588 DWORD
SetExtendedStyle(DWORD dwMask
, DWORD dwExStyle
)
1590 return SendMessage(EM_SETEXTENDEDSTYLE
, (WPARAM
)dwMask
, (LPARAM
)dwExStyle
);
1593 DWORD
GetInputMode(BOOL bCurrentMode
= TRUE
)
1595 return SendMessage(EM_GETINPUTMODE
, 0, (LPARAM
)bCurrentMode
);
1598 BOOL
SetInputMode(DWORD dwMode
)
1600 return SendMessage(EM_SETINPUTMODE
, 0, (LPARAM
)dwMode
);
1603 BOOL
SetSymbols(LPCTSTR szSymbols
)
1605 return SendMessage(EM_SETSYMBOLS
, 0, (LPARAM
)szSymbols
);
1610 return SendMessage(EM_SETSYMBOLS
);
1612 #endif // WIN32_PLATFORM_WFSP
1615 typedef CEditT
<ATL::CWindow
> CEdit
;
1618 ///////////////////////////////////////////////////////////////////////////////
1619 // CEditCommands - message handlers for standard EDIT commands
1621 // Chain to CEditCommands message map. Your class must also derive from CEdit.
1623 // class CMyEdit : public CWindowImpl<CMyEdit, CEdit>,
1624 // public CEditCommands<CMyEdit>
1627 // BEGIN_MSG_MAP(CMyEdit)
1628 // // your handlers...
1629 // CHAIN_MSG_MAP_ALT(CEditCommands<CMyEdit>, 1)
1631 // // other stuff...
1638 BEGIN_MSG_MAP(CEditCommands
< T
>)
1640 COMMAND_ID_HANDLER(ID_EDIT_CLEAR
, OnEditClear
)
1641 COMMAND_ID_HANDLER(ID_EDIT_CLEAR_ALL
, OnEditClearAll
)
1642 COMMAND_ID_HANDLER(ID_EDIT_COPY
, OnEditCopy
)
1643 COMMAND_ID_HANDLER(ID_EDIT_CUT
, OnEditCut
)
1644 COMMAND_ID_HANDLER(ID_EDIT_PASTE
, OnEditPaste
)
1645 COMMAND_ID_HANDLER(ID_EDIT_SELECT_ALL
, OnEditSelectAll
)
1646 COMMAND_ID_HANDLER(ID_EDIT_UNDO
, OnEditUndo
)
1649 LRESULT
OnEditClear(WORD
/*wNotifyCode*/, WORD
/*wID*/, HWND
/*hWndCtl*/, BOOL
& /*bHandled*/)
1651 T
* pT
= static_cast<T
*>(this);
1656 LRESULT
OnEditClearAll(WORD
/*wNotifyCode*/, WORD
/*wID*/, HWND
/*hWndCtl*/, BOOL
& /*bHandled*/)
1658 T
* pT
= static_cast<T
*>(this);
1664 LRESULT
OnEditCopy(WORD
/*wNotifyCode*/, WORD
/*wID*/, HWND
/*hWndCtl*/, BOOL
& /*bHandled*/)
1666 T
* pT
= static_cast<T
*>(this);
1671 LRESULT
OnEditCut(WORD
/*wNotifyCode*/, WORD
/*wID*/, HWND
/*hWndCtl*/, BOOL
& /*bHandled*/)
1673 T
* pT
= static_cast<T
*>(this);
1678 LRESULT
OnEditPaste(WORD
/*wNotifyCode*/, WORD
/*wID*/, HWND
/*hWndCtl*/, BOOL
& /*bHandled*/)
1680 T
* pT
= static_cast<T
*>(this);
1685 LRESULT
OnEditSelectAll(WORD
/*wNotifyCode*/, WORD
/*wID*/, HWND
/*hWndCtl*/, BOOL
& /*bHandled*/)
1687 T
* pT
= static_cast<T
*>(this);
1692 LRESULT
OnEditUndo(WORD
/*wNotifyCode*/, WORD
/*wID*/, HWND
/*hWndCtl*/, BOOL
& /*bHandled*/)
1694 T
* pT
= static_cast<T
*>(this);
1699 // State (update UI) helpers
1701 { return HasSelection(); }
1703 BOOL
CanCopy() const
1704 { return HasSelection(); }
1706 BOOL
CanClear() const
1707 { return HasSelection(); }
1709 BOOL
CanSelectAll() const
1710 { return HasText(); }
1712 BOOL
CanFind() const
1713 { return HasText(); }
1715 BOOL
CanRepeat() const
1716 { return HasText(); }
1718 BOOL
CanReplace() const
1719 { return HasText(); }
1721 BOOL
CanClearAll() const
1722 { return HasText(); }
1725 BOOL
HasSelection() const
1727 const T
* pT
= static_cast<const T
*>(this);
1729 ::SendMessage(pT
->m_hWnd
, EM_GETSEL
, (WPARAM
)&nMin
, (LPARAM
)&nMax
);
1730 return (nMin
!= nMax
);
1733 BOOL
HasText() const
1735 const T
* pT
= static_cast<const T
*>(this);
1736 return (pT
->GetWindowTextLength() > 0);
1741 ///////////////////////////////////////////////////////////////////////////////
1742 // CScrollBar - client side for a Windows SCROLLBAR control
1744 template <class TBase
>
1745 class CScrollBarT
: public TBase
1749 CScrollBarT(HWND hWnd
= NULL
) : TBase(hWnd
)
1752 CScrollBarT
< TBase
>& operator =(HWND hWnd
)
1758 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
1759 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
1760 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
1762 return TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
1766 static LPCTSTR
GetWndClassName()
1768 return _T("SCROLLBAR");
1772 int GetScrollPos() const
1774 ATLASSERT(::IsWindow(m_hWnd
));
1775 return ::GetScrollPos(m_hWnd
, SB_CTL
);
1777 #endif // !_WIN32_WCE
1779 int SetScrollPos(int nPos
, BOOL bRedraw
= TRUE
)
1781 ATLASSERT(::IsWindow(m_hWnd
));
1782 return ::SetScrollPos(m_hWnd
, SB_CTL
, nPos
, bRedraw
);
1786 void GetScrollRange(LPINT lpMinPos
, LPINT lpMaxPos
) const
1788 ATLASSERT(::IsWindow(m_hWnd
));
1789 ::GetScrollRange(m_hWnd
, SB_CTL
, lpMinPos
, lpMaxPos
);
1791 #endif // !_WIN32_WCE
1793 void SetScrollRange(int nMinPos
, int nMaxPos
, BOOL bRedraw
= TRUE
)
1795 ATLASSERT(::IsWindow(m_hWnd
));
1796 ::SetScrollRange(m_hWnd
, SB_CTL
, nMinPos
, nMaxPos
, bRedraw
);
1799 BOOL
GetScrollInfo(LPSCROLLINFO lpScrollInfo
) const
1801 ATLASSERT(::IsWindow(m_hWnd
));
1802 return ::GetScrollInfo(m_hWnd
, SB_CTL
, lpScrollInfo
);
1805 int SetScrollInfo(LPSCROLLINFO lpScrollInfo
, BOOL bRedraw
= TRUE
)
1807 ATLASSERT(::IsWindow(m_hWnd
));
1808 return ::SetScrollInfo(m_hWnd
, SB_CTL
, lpScrollInfo
, bRedraw
);
1812 int GetScrollLimit() const
1814 int nMin
= 0, nMax
= 0;
1815 ::GetScrollRange(m_hWnd
, SB_CTL
, &nMin
, &nMax
);
1816 SCROLLINFO info
= { sizeof(SCROLLINFO
), SIF_PAGE
};
1817 if(::GetScrollInfo(m_hWnd
, SB_CTL
, &info
))
1818 nMax
-= ((info
.nPage
- 1) > 0) ? (info
.nPage
- 1) : 0;
1823 #if (WINVER >= 0x0500)
1824 BOOL
GetScrollBarInfo(PSCROLLBARINFO pScrollBarInfo
) const
1826 ATLASSERT(::IsWindow(m_hWnd
));
1827 #if (_WIN32_WINNT >= 0x0501)
1828 return (BOOL
)::SendMessage(m_hWnd
, SBM_GETSCROLLBARINFO
, 0, (LPARAM
)pScrollBarInfo
);
1829 #else // !(_WIN32_WINNT >= 0x0501)
1830 return ::GetScrollBarInfo(m_hWnd
, OBJID_CLIENT
, pScrollBarInfo
);
1831 #endif // !(_WIN32_WINNT >= 0x0501)
1833 #endif // (WINVER >= 0x0500)
1836 void ShowScrollBar(BOOL bShow
= TRUE
)
1838 ATLASSERT(::IsWindow(m_hWnd
));
1839 ::ShowScrollBar(m_hWnd
, SB_CTL
, bShow
);
1842 BOOL
EnableScrollBar(UINT nArrowFlags
= ESB_ENABLE_BOTH
)
1844 ATLASSERT(::IsWindow(m_hWnd
));
1845 return ::EnableScrollBar(m_hWnd
, SB_CTL
, nArrowFlags
);
1847 #endif // !_WIN32_WCE
1850 typedef CScrollBarT
<ATL::CWindow
> CScrollBar
;
1853 // --- Windows Common Controls ---
1855 ///////////////////////////////////////////////////////////////////////////////
1858 // forward declarations
1859 template <bool t_bManaged
> class CImageListT
;
1860 typedef CImageListT
<false> CImageList
;
1861 typedef CImageListT
<true> CImageListManaged
;
1864 template <bool t_bManaged
>
1869 HIMAGELIST m_hImageList
;
1871 // Constructor/destructor/operators
1872 CImageListT(HIMAGELIST hImageList
= NULL
) : m_hImageList(hImageList
)
1877 if(t_bManaged
&& (m_hImageList
!= NULL
))
1881 CImageListT
<t_bManaged
>& operator =(HIMAGELIST hImageList
)
1887 void Attach(HIMAGELIST hImageList
)
1889 ATLASSERT(m_hImageList
== NULL
);
1890 ATLASSERT(hImageList
!= NULL
);
1891 if(t_bManaged
&& (m_hImageList
!= NULL
) && (m_hImageList
!= hImageList
))
1892 ImageList_Destroy(m_hImageList
);
1893 m_hImageList
= hImageList
;
1898 HIMAGELIST hImageList
= m_hImageList
;
1899 m_hImageList
= NULL
;
1903 operator HIMAGELIST() const { return m_hImageList
; }
1905 bool IsNull() const { return (m_hImageList
== NULL
); }
1908 int GetImageCount() const
1910 ATLASSERT(m_hImageList
!= NULL
);
1911 return ImageList_GetImageCount(m_hImageList
);
1914 COLORREF
GetBkColor() const
1916 ATLASSERT(m_hImageList
!= NULL
);
1917 return ImageList_GetBkColor(m_hImageList
);
1920 COLORREF
SetBkColor(COLORREF cr
)
1922 ATLASSERT(m_hImageList
!= NULL
);
1923 return ImageList_SetBkColor(m_hImageList
, cr
);
1926 BOOL
GetImageInfo(int nImage
, IMAGEINFO
* pImageInfo
) const
1928 ATLASSERT(m_hImageList
!= NULL
);
1929 return ImageList_GetImageInfo(m_hImageList
, nImage
, pImageInfo
);
1932 HICON
GetIcon(int nIndex
, UINT uFlags
= ILD_NORMAL
) const
1934 ATLASSERT(m_hImageList
!= NULL
);
1935 return ImageList_GetIcon(m_hImageList
, nIndex
, uFlags
);
1938 BOOL
GetIconSize(int& cx
, int& cy
) const
1940 ATLASSERT(m_hImageList
!= NULL
);
1941 return ImageList_GetIconSize(m_hImageList
, &cx
, &cy
);
1944 BOOL
GetIconSize(SIZE
& size
) const
1946 ATLASSERT(m_hImageList
!= NULL
);
1947 return ImageList_GetIconSize(m_hImageList
, (int*)&size
.cx
, (int*)&size
.cy
);
1950 BOOL
SetIconSize(int cx
, int cy
)
1952 ATLASSERT(m_hImageList
!= NULL
);
1953 return ImageList_SetIconSize(m_hImageList
, cx
, cy
);
1956 BOOL
SetIconSize(SIZE size
)
1958 ATLASSERT(m_hImageList
!= NULL
);
1959 return ImageList_SetIconSize(m_hImageList
, size
.cx
, size
.cy
);
1962 BOOL
SetImageCount(UINT uNewCount
)
1964 ATLASSERT(m_hImageList
!= NULL
);
1965 return ImageList_SetImageCount(m_hImageList
, uNewCount
);
1968 BOOL
SetOverlayImage(int nImage
, int nOverlay
)
1970 ATLASSERT(m_hImageList
!= NULL
);
1971 return ImageList_SetOverlayImage(m_hImageList
, nImage
, nOverlay
);
1975 BOOL
Create(int cx
, int cy
, UINT nFlags
, int nInitial
, int nGrow
)
1977 ATLASSERT(m_hImageList
== NULL
);
1978 m_hImageList
= ImageList_Create(cx
, cy
, nFlags
, nInitial
, nGrow
);
1979 return (m_hImageList
!= NULL
) ? TRUE
: FALSE
;
1982 BOOL
Create(ATL::_U_STRINGorID bitmap
, int cx
, int nGrow
, COLORREF crMask
)
1984 ATLASSERT(m_hImageList
== NULL
);
1985 m_hImageList
= ImageList_LoadBitmap(ModuleHelper::GetResourceInstance(), bitmap
.m_lpstr
, cx
, nGrow
, crMask
);
1986 return (m_hImageList
!= NULL
) ? TRUE
: FALSE
;
1989 BOOL
CreateFromImage(ATL::_U_STRINGorID image
, int cx
, int nGrow
, COLORREF crMask
, UINT uType
, UINT uFlags
= LR_DEFAULTCOLOR
| LR_DEFAULTSIZE
)
1991 ATLASSERT(m_hImageList
== NULL
);
1992 m_hImageList
= ImageList_LoadImage(ModuleHelper::GetResourceInstance(), image
.m_lpstr
, cx
, nGrow
, crMask
, uType
, uFlags
);
1993 return (m_hImageList
!= NULL
) ? TRUE
: FALSE
;
1996 BOOL
Merge(HIMAGELIST hImageList1
, int nImage1
, HIMAGELIST hImageList2
, int nImage2
, int dx
, int dy
)
1998 ATLASSERT(m_hImageList
== NULL
);
1999 m_hImageList
= ImageList_Merge(hImageList1
, nImage1
, hImageList2
, nImage2
, dx
, dy
);
2000 return (m_hImageList
!= NULL
) ? TRUE
: FALSE
;
2004 #ifdef __IStream_INTERFACE_DEFINED__
2005 BOOL
CreateFromStream(LPSTREAM lpStream
)
2007 ATLASSERT(m_hImageList
== NULL
);
2008 m_hImageList
= ImageList_Read(lpStream
);
2009 return (m_hImageList
!= NULL
) ? TRUE
: FALSE
;
2011 #endif // __IStream_INTERFACE_DEFINED__
2012 #endif // !_WIN32_WCE
2016 if (m_hImageList
== NULL
)
2018 BOOL bRet
= ImageList_Destroy(m_hImageList
);
2020 m_hImageList
= NULL
;
2024 int Add(HBITMAP hBitmap
, HBITMAP hBitmapMask
= NULL
)
2026 ATLASSERT(m_hImageList
!= NULL
);
2027 return ImageList_Add(m_hImageList
, hBitmap
, hBitmapMask
);
2030 int Add(HBITMAP hBitmap
, COLORREF crMask
)
2032 ATLASSERT(m_hImageList
!= NULL
);
2033 return ImageList_AddMasked(m_hImageList
, hBitmap
, crMask
);
2036 BOOL
Remove(int nImage
)
2038 ATLASSERT(m_hImageList
!= NULL
);
2039 return ImageList_Remove(m_hImageList
, nImage
);
2044 ATLASSERT(m_hImageList
!= NULL
);
2045 return ImageList_RemoveAll(m_hImageList
);
2048 BOOL
Replace(int nImage
, HBITMAP hBitmap
, HBITMAP hBitmapMask
)
2050 ATLASSERT(m_hImageList
!= NULL
);
2051 return ImageList_Replace(m_hImageList
, nImage
, hBitmap
, hBitmapMask
);
2054 int AddIcon(HICON hIcon
)
2056 ATLASSERT(m_hImageList
!= NULL
);
2057 return ImageList_AddIcon(m_hImageList
, hIcon
);
2060 int ReplaceIcon(int nImage
, HICON hIcon
)
2062 ATLASSERT(m_hImageList
!= NULL
);
2063 return ImageList_ReplaceIcon(m_hImageList
, nImage
, hIcon
);
2066 HICON
ExtractIcon(int nImage
)
2068 ATLASSERT(m_hImageList
!= NULL
);
2069 return ImageList_ExtractIcon(NULL
, m_hImageList
, nImage
);
2072 BOOL
Draw(HDC hDC
, int nImage
, int x
, int y
, UINT nStyle
)
2074 ATLASSERT(m_hImageList
!= NULL
);
2075 ATLASSERT(hDC
!= NULL
);
2076 return ImageList_Draw(m_hImageList
, nImage
, hDC
, x
, y
, nStyle
);
2079 BOOL
Draw(HDC hDC
, int nImage
, POINT pt
, UINT nStyle
)
2081 ATLASSERT(m_hImageList
!= NULL
);
2082 ATLASSERT(hDC
!= NULL
);
2083 return ImageList_Draw(m_hImageList
, nImage
, hDC
, pt
.x
, pt
.y
, nStyle
);
2086 BOOL
DrawEx(int nImage
, HDC hDC
, int x
, int y
, int dx
, int dy
, COLORREF rgbBk
, COLORREF rgbFg
, UINT fStyle
)
2088 ATLASSERT(m_hImageList
!= NULL
);
2089 ATLASSERT(hDC
!= NULL
);
2090 return ImageList_DrawEx(m_hImageList
, nImage
, hDC
, x
, y
, dx
, dy
, rgbBk
, rgbFg
, fStyle
);
2093 BOOL
DrawEx(int nImage
, HDC hDC
, RECT
& rect
, COLORREF rgbBk
, COLORREF rgbFg
, UINT fStyle
)
2095 ATLASSERT(m_hImageList
!= NULL
);
2096 ATLASSERT(hDC
!= NULL
);
2097 return ImageList_DrawEx(m_hImageList
, nImage
, hDC
, rect
.left
, rect
.top
, rect
.right
- rect
.left
, rect
.bottom
- rect
.top
, rgbBk
, rgbFg
, fStyle
);
2100 static BOOL
DrawIndirect(IMAGELISTDRAWPARAMS
* pimldp
)
2102 return ImageList_DrawIndirect(pimldp
);
2105 BOOL
Copy(int nSrc
, int nDst
, UINT uFlags
= ILCF_MOVE
)
2107 ATLASSERT(m_hImageList
!= NULL
);
2108 return ImageList_Copy(m_hImageList
, nDst
, m_hImageList
, nSrc
, uFlags
);
2111 #ifdef __IStream_INTERFACE_DEFINED__
2113 static HIMAGELIST
Read(LPSTREAM lpStream
)
2115 return ImageList_Read(lpStream
);
2118 BOOL
Write(LPSTREAM lpStream
)
2120 ATLASSERT(m_hImageList
!= NULL
);
2121 return ImageList_Write(m_hImageList
, lpStream
);
2123 #endif // !_WIN32_WCE
2125 #if (_WIN32_WINNT >= 0x0501)
2126 static HRESULT
ReadEx(DWORD dwFlags
, LPSTREAM lpStream
, REFIID riid
, PVOID
* ppv
)
2128 return ImageList_ReadEx(dwFlags
, lpStream
, riid
, ppv
);
2131 HRESULT
WriteEx(DWORD dwFlags
, LPSTREAM lpStream
)
2133 ATLASSERT(m_hImageList
!= NULL
);
2134 return ImageList_WriteEx(m_hImageList
, dwFlags
, lpStream
);
2136 #endif // (_WIN32_WINNT >= 0x0501)
2137 #endif // __IStream_INTERFACE_DEFINED__
2140 BOOL
BeginDrag(int nImage
, POINT ptHotSpot
)
2142 ATLASSERT(m_hImageList
!= NULL
);
2143 return ImageList_BeginDrag(m_hImageList
, nImage
, ptHotSpot
.x
, ptHotSpot
.y
);
2146 BOOL
BeginDrag(int nImage
, int xHotSpot
, int yHotSpot
)
2148 ATLASSERT(m_hImageList
!= NULL
);
2149 return ImageList_BeginDrag(m_hImageList
, nImage
, xHotSpot
, yHotSpot
);
2152 static void EndDrag()
2154 ImageList_EndDrag();
2157 static BOOL
DragMove(POINT pt
)
2159 return ImageList_DragMove(pt
.x
, pt
.y
);
2162 static BOOL
DragMove(int x
, int y
)
2164 return ImageList_DragMove(x
, y
);
2167 BOOL
SetDragCursorImage(int nDrag
, POINT ptHotSpot
)
2169 ATLASSERT(m_hImageList
!= NULL
);
2170 return ImageList_SetDragCursorImage(m_hImageList
, nDrag
, ptHotSpot
.x
, ptHotSpot
.y
);
2173 BOOL
SetDragCursorImage(int nDrag
, int xHotSpot
, int yHotSpot
)
2175 ATLASSERT(m_hImageList
!= NULL
);
2176 return ImageList_SetDragCursorImage(m_hImageList
, nDrag
, xHotSpot
, yHotSpot
);
2179 static BOOL
DragShowNolock(BOOL bShow
= TRUE
)
2181 return ImageList_DragShowNolock(bShow
);
2184 static CImageList
GetDragImage(LPPOINT lpPoint
, LPPOINT lpPointHotSpot
)
2186 return CImageList(ImageList_GetDragImage(lpPoint
, lpPointHotSpot
));
2189 static BOOL
DragEnter(HWND hWnd
, POINT point
)
2191 return ImageList_DragEnter(hWnd
, point
.x
, point
.y
);
2194 static BOOL
DragEnter(HWND hWnd
, int x
, int y
)
2196 return ImageList_DragEnter(hWnd
, x
, y
);
2199 static BOOL
DragLeave(HWND hWnd
)
2201 return ImageList_DragLeave(hWnd
);
2204 #if (_WIN32_IE >= 0x0400)
2205 CImageList
Duplicate() const
2207 ATLASSERT(m_hImageList
!= NULL
);
2208 return CImageList(ImageList_Duplicate(m_hImageList
));
2211 static CImageList
Duplicate(HIMAGELIST hImageList
)
2213 ATLASSERT(hImageList
!= NULL
);
2214 return CImageList(ImageList_Duplicate(hImageList
));
2216 #endif // (_WIN32_IE >= 0x0400)
2220 ///////////////////////////////////////////////////////////////////////////////
2225 class CToolInfo
: public TOOLINFO
2228 CToolInfo(UINT nFlags
, HWND hWnd
, UINT nIDTool
= 0, LPRECT lpRect
= NULL
, LPTSTR lpstrText
= LPSTR_TEXTCALLBACK
, LPARAM lUserParam
= NULL
)
2230 Init(nFlags
, hWnd
, nIDTool
, lpRect
, lpstrText
, lUserParam
);
2233 operator LPTOOLINFO() { return this; }
2235 operator LPARAM() { return (LPARAM
)this; }
2237 void Init(UINT nFlags
, HWND hWnd
, UINT nIDTool
= 0, LPRECT lpRect
= NULL
, LPTSTR lpstrText
= LPSTR_TEXTCALLBACK
, LPARAM lUserParam
= NULL
)
2239 ATLASSERT(::IsWindow(hWnd
));
2240 memset(this, 0, sizeof(TOOLINFO
));
2241 cbSize
= RunTimeHelper::SizeOf_TOOLINFO();
2245 hwnd
= ::GetParent(hWnd
);
2246 uFlags
|= TTF_IDISHWND
;
2247 uId
= (UINT_PTR
)hWnd
;
2256 hinst
= ModuleHelper::GetResourceInstance();
2257 lpszText
= lpstrText
;
2258 lParam
= lUserParam
;
2262 template <class TBase
>
2263 class CToolTipCtrlT
: public TBase
2267 CToolTipCtrlT(HWND hWnd
= NULL
) : TBase(hWnd
)
2270 CToolTipCtrlT
< TBase
>& operator =(HWND hWnd
)
2276 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
2277 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
2278 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
2280 return TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
2284 static LPCTSTR
GetWndClassName()
2286 return TOOLTIPS_CLASS
;
2289 void GetText(LPTOOLINFO lpToolInfo
) const
2291 ATLASSERT(::IsWindow(m_hWnd
));
2292 ::SendMessage(m_hWnd
, TTM_GETTEXT
, 0, (LPARAM
)&lpToolInfo
);
2295 void GetText(LPTSTR lpstrText
, HWND hWnd
, UINT nIDTool
= 0) const
2297 ATLASSERT(::IsWindow(m_hWnd
));
2298 ATLASSERT(hWnd
!= NULL
);
2299 CToolInfo
ti(0, hWnd
, nIDTool
, NULL
, lpstrText
);
2300 ::SendMessage(m_hWnd
, TTM_GETTEXT
, 0, ti
);
2303 BOOL
GetToolInfo(LPTOOLINFO lpToolInfo
) const
2305 ATLASSERT(::IsWindow(m_hWnd
));
2306 return (BOOL
)::SendMessage(m_hWnd
, TTM_GETTOOLINFO
, 0, (LPARAM
)lpToolInfo
);
2309 BOOL
GetToolInfo(HWND hWnd
, UINT nIDTool
, UINT
* puFlags
, LPRECT lpRect
, LPTSTR lpstrText
) const
2311 ATLASSERT(::IsWindow(m_hWnd
));
2312 ATLASSERT(hWnd
!= NULL
);
2313 ATLASSERT(puFlags
!= NULL
);
2314 ATLASSERT(lpRect
!= NULL
);
2315 CToolInfo
ti(0, hWnd
, nIDTool
, NULL
, lpstrText
);
2316 BOOL bRet
= (BOOL
)::SendMessage(m_hWnd
, TTM_GETTOOLINFO
, 0, ti
);
2319 *puFlags
= ti
.uFlags
;
2325 void SetToolInfo(LPTOOLINFO lpToolInfo
)
2327 ATLASSERT(::IsWindow(m_hWnd
));
2328 ::SendMessage(m_hWnd
, TTM_SETTOOLINFO
, 0, (LPARAM
)lpToolInfo
);
2331 void SetToolRect(LPTOOLINFO lpToolInfo
)
2333 ATLASSERT(::IsWindow(m_hWnd
));
2334 ::SendMessage(m_hWnd
, TTM_NEWTOOLRECT
, 0, (LPARAM
)lpToolInfo
);
2337 void SetToolRect(HWND hWnd
, UINT nIDTool
, LPCRECT lpRect
)
2339 ATLASSERT(::IsWindow(m_hWnd
));
2340 ATLASSERT(hWnd
!= NULL
);
2341 ATLASSERT(nIDTool
!= 0);
2343 CToolInfo
ti(0, hWnd
, nIDTool
, (LPRECT
)lpRect
, NULL
);
2344 ::SendMessage(m_hWnd
, TTM_NEWTOOLRECT
, 0, ti
);
2347 int GetToolCount() const
2349 ATLASSERT(::IsWindow(m_hWnd
));
2350 return (int)::SendMessage(m_hWnd
, TTM_GETTOOLCOUNT
, 0, 0L);
2353 int GetDelayTime(DWORD dwType
) const
2355 ATLASSERT(::IsWindow(m_hWnd
));
2356 return (int)::SendMessage(m_hWnd
, TTM_GETDELAYTIME
, dwType
, 0L);
2359 void SetDelayTime(DWORD dwType
, int nTime
)
2361 ATLASSERT(::IsWindow(m_hWnd
));
2362 ::SendMessage(m_hWnd
, TTM_SETDELAYTIME
, dwType
, MAKELPARAM(nTime
, 0));
2365 void GetMargin(LPRECT lpRect
) const
2367 ATLASSERT(::IsWindow(m_hWnd
));
2368 ::SendMessage(m_hWnd
, TTM_GETMARGIN
, 0, (LPARAM
)lpRect
);
2371 void SetMargin(LPRECT lpRect
)
2373 ATLASSERT(::IsWindow(m_hWnd
));
2374 ::SendMessage(m_hWnd
, TTM_SETMARGIN
, 0, (LPARAM
)lpRect
);
2377 int GetMaxTipWidth() const
2379 ATLASSERT(::IsWindow(m_hWnd
));
2380 return (int)::SendMessage(m_hWnd
, TTM_GETMAXTIPWIDTH
, 0, 0L);
2383 int SetMaxTipWidth(int nWidth
)
2385 ATLASSERT(::IsWindow(m_hWnd
));
2386 return (int)::SendMessage(m_hWnd
, TTM_SETMAXTIPWIDTH
, 0, nWidth
);
2389 COLORREF
GetTipBkColor() const
2391 ATLASSERT(::IsWindow(m_hWnd
));
2392 return (COLORREF
)::SendMessage(m_hWnd
, TTM_GETTIPBKCOLOR
, 0, 0L);
2395 void SetTipBkColor(COLORREF clr
)
2397 ATLASSERT(::IsWindow(m_hWnd
));
2398 ::SendMessage(m_hWnd
, TTM_SETTIPBKCOLOR
, (WPARAM
)clr
, 0L);
2401 COLORREF
GetTipTextColor() const
2403 ATLASSERT(::IsWindow(m_hWnd
));
2404 return (COLORREF
)::SendMessage(m_hWnd
, TTM_GETTIPTEXTCOLOR
, 0, 0L);
2407 void SetTipTextColor(COLORREF clr
)
2409 ATLASSERT(::IsWindow(m_hWnd
));
2410 ::SendMessage(m_hWnd
, TTM_SETTIPTEXTCOLOR
, (WPARAM
)clr
, 0L);
2413 BOOL
GetCurrentTool(LPTOOLINFO lpToolInfo
) const
2415 ATLASSERT(::IsWindow(m_hWnd
));
2416 return (BOOL
)::SendMessage(m_hWnd
, TTM_GETCURRENTTOOL
, 0, (LPARAM
)lpToolInfo
);
2419 #if (_WIN32_IE >= 0x0500)
2420 SIZE
GetBubbleSize(LPTOOLINFO lpToolInfo
) const
2422 ATLASSERT(::IsWindow(m_hWnd
));
2423 DWORD dwRet
= (DWORD
)::SendMessage(m_hWnd
, TTM_GETBUBBLESIZE
, 0, (LPARAM
)lpToolInfo
);
2424 SIZE size
= { GET_X_LPARAM(dwRet
), GET_Y_LPARAM(dwRet
) };
2428 BOOL
SetTitle(UINT uIcon
, LPCTSTR lpstrTitle
)
2430 ATLASSERT(::IsWindow(m_hWnd
));
2431 return (BOOL
)::SendMessage(m_hWnd
, TTM_SETTITLE
, uIcon
, (LPARAM
)lpstrTitle
);
2433 #endif // (_WIN32_IE >= 0x0500)
2435 #if (_WIN32_WINNT >= 0x0501)
2436 void GetTitle(PTTGETTITLE pTTGetTitle
) const
2438 ATLASSERT(::IsWindow(m_hWnd
));
2439 ::SendMessage(m_hWnd
, TTM_GETTITLE
, 0, (LPARAM
)pTTGetTitle
);
2442 void SetWindowTheme(LPCWSTR lpstrTheme
)
2444 ATLASSERT(::IsWindow(m_hWnd
));
2445 ::SendMessage(m_hWnd
, TTM_SETWINDOWTHEME
, 0, (LPARAM
)lpstrTheme
);
2447 #endif // (_WIN32_WINNT >= 0x0501)
2450 void Activate(BOOL bActivate
)
2452 ATLASSERT(::IsWindow(m_hWnd
));
2453 ::SendMessage(m_hWnd
, TTM_ACTIVATE
, bActivate
, 0L);
2456 BOOL
AddTool(LPTOOLINFO lpToolInfo
)
2458 ATLASSERT(::IsWindow(m_hWnd
));
2459 return (BOOL
)::SendMessage(m_hWnd
, TTM_ADDTOOL
, 0, (LPARAM
)lpToolInfo
);
2462 BOOL
AddTool(HWND hWnd
, ATL::_U_STRINGorID text
= LPSTR_TEXTCALLBACK
, LPCRECT lpRectTool
= NULL
, UINT nIDTool
= 0)
2464 ATLASSERT(::IsWindow(m_hWnd
));
2465 ATLASSERT(hWnd
!= NULL
);
2466 // the toolrect and toolid must both be zero or both valid
2467 ATLASSERT((lpRectTool
!= NULL
&& nIDTool
!= 0) || (lpRectTool
== NULL
&& nIDTool
== 0));
2469 CToolInfo
ti(0, hWnd
, nIDTool
, (LPRECT
)lpRectTool
, (LPTSTR
)text
.m_lpstr
);
2470 return (BOOL
)::SendMessage(m_hWnd
, TTM_ADDTOOL
, 0, ti
);
2473 void DelTool(LPTOOLINFO lpToolInfo
)
2475 ATLASSERT(::IsWindow(m_hWnd
));
2476 ::SendMessage(m_hWnd
, TTM_DELTOOL
, 0, (LPARAM
)lpToolInfo
);
2479 void DelTool(HWND hWnd
, UINT nIDTool
= 0)
2481 ATLASSERT(::IsWindow(m_hWnd
));
2482 ATLASSERT(hWnd
!= NULL
);
2484 CToolInfo
ti(0, hWnd
, nIDTool
, NULL
, NULL
);
2485 ::SendMessage(m_hWnd
, TTM_DELTOOL
, 0, ti
);
2488 BOOL
HitTest(LPTTHITTESTINFO lpHitTestInfo
) const
2490 ATLASSERT(::IsWindow(m_hWnd
));
2491 return (BOOL
)::SendMessage(m_hWnd
, TTM_HITTEST
, 0, (LPARAM
)lpHitTestInfo
);
2494 BOOL
HitTest(HWND hWnd
, POINT pt
, LPTOOLINFO lpToolInfo
) const
2496 ATLASSERT(::IsWindow(m_hWnd
));
2497 ATLASSERT(hWnd
!= NULL
);
2498 ATLASSERT(lpToolInfo
!= NULL
);
2500 TTHITTESTINFO hti
= { 0 };
2501 hti
.ti
.cbSize
= RunTimeHelper::SizeOf_TOOLINFO();
2505 if((BOOL
)::SendMessage(m_hWnd
, TTM_HITTEST
, 0, (LPARAM
)&hti
) != FALSE
)
2507 *lpToolInfo
= hti
.ti
;
2513 void RelayEvent(LPMSG lpMsg
)
2515 ATLASSERT(::IsWindow(m_hWnd
));
2516 ::SendMessage(m_hWnd
, TTM_RELAYEVENT
, 0, (LPARAM
)lpMsg
);
2519 void UpdateTipText(LPTOOLINFO lpToolInfo
)
2521 ATLASSERT(::IsWindow(m_hWnd
));
2522 ::SendMessage(m_hWnd
, TTM_UPDATETIPTEXT
, 0, (LPARAM
)lpToolInfo
);
2525 void UpdateTipText(ATL::_U_STRINGorID text
, HWND hWnd
, UINT nIDTool
= 0)
2527 ATLASSERT(::IsWindow(m_hWnd
));
2528 ATLASSERT(hWnd
!= NULL
);
2530 CToolInfo
ti(0, hWnd
, nIDTool
, NULL
, (LPTSTR
)text
.m_lpstr
);
2531 ::SendMessage(m_hWnd
, TTM_UPDATETIPTEXT
, 0, ti
);
2534 BOOL
EnumTools(UINT nTool
, LPTOOLINFO lpToolInfo
) const
2536 ATLASSERT(::IsWindow(m_hWnd
));
2537 return (BOOL
)::SendMessage(m_hWnd
, TTM_ENUMTOOLS
, nTool
, (LPARAM
)lpToolInfo
);
2542 ATLASSERT(::IsWindow(m_hWnd
));
2543 ::SendMessage(m_hWnd
, TTM_POP
, 0, 0L);
2546 void TrackActivate(LPTOOLINFO lpToolInfo
, BOOL bActivate
)
2548 ATLASSERT(::IsWindow(m_hWnd
));
2549 ::SendMessage(m_hWnd
, TTM_TRACKACTIVATE
, bActivate
, (LPARAM
)lpToolInfo
);
2552 void TrackActivate(HWND hWnd
, UINT nIDTool
, BOOL bActivate
)
2554 ATLASSERT(::IsWindow(m_hWnd
));
2555 ATLASSERT(hWnd
!= NULL
);
2557 CToolInfo
ti(0, hWnd
, nIDTool
);
2558 ::SendMessage(m_hWnd
, TTM_TRACKACTIVATE
, bActivate
, ti
);
2561 void TrackPosition(int xPos
, int yPos
)
2563 ATLASSERT(::IsWindow(m_hWnd
));
2564 ::SendMessage(m_hWnd
, TTM_TRACKPOSITION
, 0, MAKELPARAM(xPos
, yPos
));
2567 #if (_WIN32_IE >= 0x0400)
2570 ATLASSERT(::IsWindow(m_hWnd
));
2571 ::SendMessage(m_hWnd
, TTM_UPDATE
, 0, 0L);
2573 #endif // (_WIN32_IE >= 0x0400)
2575 #if (_WIN32_IE >= 0x0500)
2576 BOOL
AdjustRect(LPRECT lpRect
, BOOL bLarger
/*= TRUE*/)
2578 ATLASSERT(::IsWindow(m_hWnd
));
2579 return (BOOL
)::SendMessage(m_hWnd
, TTM_ADJUSTRECT
, bLarger
, (LPARAM
)lpRect
);
2581 #endif // (_WIN32_IE >= 0x0500)
2583 #if (_WIN32_WINNT >= 0x0501)
2586 ATLASSERT(::IsWindow(m_hWnd
));
2587 ::SendMessage(m_hWnd
, TTM_POPUP
, 0, 0L);
2589 #endif // (_WIN32_WINNT >= 0x0501)
2592 typedef CToolTipCtrlT
<ATL::CWindow
> CToolTipCtrl
;
2594 #endif // !_WIN32_WCE
2597 ///////////////////////////////////////////////////////////////////////////////
2600 template <class TBase
>
2601 class CHeaderCtrlT
: public TBase
2605 CHeaderCtrlT(HWND hWnd
= NULL
) : TBase(hWnd
)
2608 CHeaderCtrlT
< TBase
>& operator =(HWND hWnd
)
2614 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
2615 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
2616 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
2618 return TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
2622 static LPCTSTR
GetWndClassName()
2627 int GetItemCount() const
2629 ATLASSERT(::IsWindow(m_hWnd
));
2630 return (int)::SendMessage(m_hWnd
, HDM_GETITEMCOUNT
, 0, 0L);
2633 BOOL
GetItem(int nIndex
, LPHDITEM pHeaderItem
) const
2635 ATLASSERT(::IsWindow(m_hWnd
));
2636 return (BOOL
)::SendMessage(m_hWnd
, HDM_GETITEM
, nIndex
, (LPARAM
)pHeaderItem
);
2639 BOOL
SetItem(int nIndex
, LPHDITEM pHeaderItem
)
2641 ATLASSERT(::IsWindow(m_hWnd
));
2642 return (BOOL
)::SendMessage(m_hWnd
, HDM_SETITEM
, nIndex
, (LPARAM
)pHeaderItem
);
2645 CImageList
GetImageList() const
2647 ATLASSERT(::IsWindow(m_hWnd
));
2648 return CImageList((HIMAGELIST
)::SendMessage(m_hWnd
, HDM_GETIMAGELIST
, 0, 0L));
2651 CImageList
SetImageList(HIMAGELIST hImageList
)
2653 ATLASSERT(::IsWindow(m_hWnd
));
2654 return CImageList((HIMAGELIST
)::SendMessage(m_hWnd
, HDM_SETIMAGELIST
, 0, (LPARAM
)hImageList
));
2657 BOOL
GetOrderArray(int nSize
, int* lpnArray
) const
2659 ATLASSERT(::IsWindow(m_hWnd
));
2660 return (BOOL
)::SendMessage(m_hWnd
, HDM_GETORDERARRAY
, nSize
, (LPARAM
)lpnArray
);
2663 BOOL
SetOrderArray(int nSize
, int* lpnArray
)
2665 ATLASSERT(::IsWindow(m_hWnd
));
2666 return (BOOL
)::SendMessage(m_hWnd
, HDM_SETORDERARRAY
, nSize
, (LPARAM
)lpnArray
);
2669 BOOL
GetItemRect(int nIndex
, LPRECT lpItemRect
) const
2671 ATLASSERT(::IsWindow(m_hWnd
));
2672 return (BOOL
)::SendMessage(m_hWnd
, HDM_GETITEMRECT
, nIndex
, (LPARAM
)lpItemRect
);
2675 int SetHotDivider(BOOL bPos
, DWORD dwInputValue
)
2677 ATLASSERT(::IsWindow(m_hWnd
));
2678 return (int)::SendMessage(m_hWnd
, HDM_SETHOTDIVIDER
, bPos
, dwInputValue
);
2681 #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
2682 BOOL
GetUnicodeFormat() const
2684 ATLASSERT(::IsWindow(m_hWnd
));
2685 return (BOOL
)::SendMessage(m_hWnd
, HDM_GETUNICODEFORMAT
, 0, 0L);
2688 BOOL
SetUnicodeFormat(BOOL bUnicode
= TRUE
)
2690 ATLASSERT(::IsWindow(m_hWnd
));
2691 return (BOOL
)::SendMessage(m_hWnd
, HDM_SETUNICODEFORMAT
, bUnicode
, 0L);
2693 #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
2695 #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
2696 int GetBitmapMargin() const
2698 ATLASSERT(::IsWindow(m_hWnd
));
2699 return (int)::SendMessage(m_hWnd
, HDM_GETBITMAPMARGIN
, 0, 0L);
2702 int SetBitmapMargin(int nWidth
)
2704 ATLASSERT(::IsWindow(m_hWnd
));
2705 return (int)::SendMessage(m_hWnd
, HDM_SETBITMAPMARGIN
, nWidth
, 0L);
2708 int SetFilterChangeTimeout(DWORD dwTimeOut
)
2710 ATLASSERT(::IsWindow(m_hWnd
));
2711 return (int)::SendMessage(m_hWnd
, HDM_SETFILTERCHANGETIMEOUT
, 0, dwTimeOut
);
2713 #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
2715 #if (_WIN32_WINNT >= 0x0600)
2716 BOOL
GetItemDropDownRect(int nIndex
, LPRECT lpRect
) const
2718 ATLASSERT(::IsWindow(m_hWnd
));
2719 return (BOOL
)::SendMessage(m_hWnd
, HDM_GETITEMDROPDOWNRECT
, nIndex
, (LPARAM
)lpRect
);
2722 BOOL
GetOverflowRect(LPRECT lpRect
) const
2724 ATLASSERT(::IsWindow(m_hWnd
));
2725 return (BOOL
)::SendMessage(m_hWnd
, HDM_GETOVERFLOWRECT
, 0, (LPARAM
)lpRect
);
2728 int GetFocusedItem() const
2730 ATLASSERT(::IsWindow(m_hWnd
));
2731 return (int)::SendMessage(m_hWnd
, HDM_GETFOCUSEDITEM
, 0, 0L);
2734 BOOL
SetFocusedItem(int nIndex
)
2736 ATLASSERT(::IsWindow(m_hWnd
));
2737 return (BOOL
)::SendMessage(m_hWnd
, HDM_SETFOCUSEDITEM
, 0, nIndex
);
2739 #endif // (_WIN32_WINNT >= 0x0600)
2742 int InsertItem(int nIndex
, LPHDITEM phdi
)
2744 ATLASSERT(::IsWindow(m_hWnd
));
2745 return (int)::SendMessage(m_hWnd
, HDM_INSERTITEM
, nIndex
, (LPARAM
)phdi
);
2748 int AddItem(LPHDITEM phdi
)
2750 return InsertItem(GetItemCount(), phdi
);
2753 BOOL
DeleteItem(int nIndex
)
2755 ATLASSERT(::IsWindow(m_hWnd
));
2756 return (BOOL
)::SendMessage(m_hWnd
, HDM_DELETEITEM
, nIndex
, 0L);
2759 BOOL
Layout(HD_LAYOUT
* pHeaderLayout
)
2761 ATLASSERT(::IsWindow(m_hWnd
));
2762 return (BOOL
)::SendMessage(m_hWnd
, HDM_LAYOUT
, 0, (LPARAM
)pHeaderLayout
);
2765 int HitTest(LPHDHITTESTINFO lpHitTestInfo
) const
2767 ATLASSERT(::IsWindow(m_hWnd
));
2768 return (int)::SendMessage(m_hWnd
, HDM_HITTEST
, 0, (LPARAM
)lpHitTestInfo
);
2771 int OrderToIndex(int nOrder
)
2773 ATLASSERT(::IsWindow(m_hWnd
));
2774 return (int)::SendMessage(m_hWnd
, HDM_ORDERTOINDEX
, nOrder
, 0L);
2777 CImageList
CreateDragImage(int nIndex
)
2779 ATLASSERT(::IsWindow(m_hWnd
));
2780 return CImageList((HIMAGELIST
)::SendMessage(m_hWnd
, HDM_CREATEDRAGIMAGE
, nIndex
, 0L));
2783 #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
2784 int EditFilter(int nColumn
, BOOL bDiscardChanges
)
2786 ATLASSERT(::IsWindow(m_hWnd
));
2787 return (int)::SendMessage(m_hWnd
, HDM_EDITFILTER
, nColumn
, MAKELPARAM(bDiscardChanges
, 0));
2790 int ClearFilter(int nColumn
)
2792 ATLASSERT(::IsWindow(m_hWnd
));
2793 return (int)::SendMessage(m_hWnd
, HDM_CLEARFILTER
, nColumn
, 0L);
2796 int ClearAllFilters()
2798 ATLASSERT(::IsWindow(m_hWnd
));
2799 return (int)::SendMessage(m_hWnd
, HDM_CLEARFILTER
, (WPARAM
)-1, 0L);
2801 #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
2804 typedef CHeaderCtrlT
<ATL::CWindow
> CHeaderCtrl
;
2807 ///////////////////////////////////////////////////////////////////////////////
2810 template <class TBase
>
2811 class CListViewCtrlT
: public TBase
2815 CListViewCtrlT(HWND hWnd
= NULL
) : TBase(hWnd
)
2818 CListViewCtrlT
< TBase
>& operator =(HWND hWnd
)
2824 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
2825 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
2826 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
2828 return TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
2832 static LPCTSTR
GetWndClassName()
2837 COLORREF
GetBkColor() const
2839 ATLASSERT(::IsWindow(m_hWnd
));
2840 return (COLORREF
)::SendMessage(m_hWnd
, LVM_GETBKCOLOR
, 0, 0L);
2843 BOOL
SetBkColor(COLORREF cr
)
2845 ATLASSERT(::IsWindow(m_hWnd
));
2846 return (BOOL
)::SendMessage(m_hWnd
, LVM_SETBKCOLOR
, 0, cr
);
2849 CImageList
GetImageList(int nImageListType
) const
2851 ATLASSERT(::IsWindow(m_hWnd
));
2852 return CImageList((HIMAGELIST
)::SendMessage(m_hWnd
, LVM_GETIMAGELIST
, nImageListType
, 0L));
2855 CImageList
SetImageList(HIMAGELIST hImageList
, int nImageList
)
2857 ATLASSERT(::IsWindow(m_hWnd
));
2858 return CImageList((HIMAGELIST
)::SendMessage(m_hWnd
, LVM_SETIMAGELIST
, nImageList
, (LPARAM
)hImageList
));
2861 int GetItemCount() const
2863 ATLASSERT(::IsWindow(m_hWnd
));
2864 return (int)::SendMessage(m_hWnd
, LVM_GETITEMCOUNT
, 0, 0L);
2867 BOOL
SetItemCount(int nItems
)
2869 ATLASSERT(::IsWindow(m_hWnd
));
2870 return (BOOL
)::SendMessage(m_hWnd
, LVM_SETITEMCOUNT
, nItems
, 0L);
2873 BOOL
GetItem(LPLVITEM pItem
) const
2875 ATLASSERT(::IsWindow(m_hWnd
));
2876 return (BOOL
)::SendMessage(m_hWnd
, LVM_GETITEM
, 0, (LPARAM
)pItem
);
2879 BOOL
SetItem(const LVITEM
* pItem
)
2881 ATLASSERT(::IsWindow(m_hWnd
));
2882 return (BOOL
)::SendMessage(m_hWnd
, LVM_SETITEM
, 0, (LPARAM
)pItem
);
2885 BOOL
SetItem(int nItem
, int nSubItem
, UINT nMask
, LPCTSTR lpszItem
,
2886 int nImage
, UINT nState
, UINT nStateMask
, LPARAM lParam
)
2888 ATLASSERT(::IsWindow(m_hWnd
));
2892 lvi
.iSubItem
= nSubItem
;
2893 lvi
.stateMask
= nStateMask
;
2895 lvi
.pszText
= (LPTSTR
) lpszItem
;
2896 lvi
.iImage
= nImage
;
2897 lvi
.lParam
= lParam
;
2898 return (BOOL
)::SendMessage(m_hWnd
, LVM_SETITEM
, 0, (LPARAM
)&lvi
);
2901 UINT
GetItemState(int nItem
, UINT nMask
) const
2903 ATLASSERT(::IsWindow(m_hWnd
));
2904 return (UINT
)::SendMessage(m_hWnd
, LVM_GETITEMSTATE
, nItem
, nMask
);
2907 BOOL
SetItemState(int nItem
, UINT nState
, UINT nStateMask
)
2909 ATLASSERT(::IsWindow(m_hWnd
));
2912 lvi
.stateMask
= nStateMask
;
2913 return (BOOL
)::SendMessage(m_hWnd
, LVM_SETITEMSTATE
, nItem
, (LPARAM
)&lvi
);
2916 BOOL
SetItemState(int nItem
, LPLVITEM pItem
)
2918 ATLASSERT(::IsWindow(m_hWnd
));
2919 return (BOOL
)::SendMessage(m_hWnd
, LVM_SETITEMSTATE
, nItem
, (LPARAM
)pItem
);
2923 BOOL
GetItemText(int nItem
, int nSubItem
, BSTR
& bstrText
) const
2926 ATLASSERT(::IsWindow(m_hWnd
));
2927 ATLASSERT(bstrText
== NULL
);
2929 lvi
.iSubItem
= nSubItem
;
2931 LPTSTR lpstrText
= NULL
;
2933 for(int nLen
= 256; ; nLen
*= 2)
2935 ATLTRY(lpstrText
= new TCHAR
[nLen
]);
2936 if(lpstrText
== NULL
)
2938 lpstrText
[0] = NULL
;
2939 lvi
.cchTextMax
= nLen
;
2940 lvi
.pszText
= lpstrText
;
2941 nRes
= (int)::SendMessage(m_hWnd
, LVM_GETITEMTEXT
, (WPARAM
)nItem
, (LPARAM
)&lvi
);
2944 delete [] lpstrText
;
2948 if(lpstrText
!= NULL
)
2951 bstrText
= ::SysAllocString(T2OLE(lpstrText
));
2952 delete [] lpstrText
;
2955 return (bstrText
!= NULL
) ? TRUE
: FALSE
;
2957 #endif // !_ATL_NO_COM
2959 #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
2960 int GetItemText(int nItem
, int nSubItem
, _CSTRING_NS::CString
& strText
) const
2962 ATLASSERT(::IsWindow(m_hWnd
));
2964 lvi
.iSubItem
= nSubItem
;
2968 for(int nLen
= 256; ; nLen
*= 2)
2970 lvi
.cchTextMax
= nLen
;
2971 lvi
.pszText
= strText
.GetBufferSetLength(nLen
);
2972 if(lvi
.pszText
== NULL
)
2977 nRes
= (int)::SendMessage(m_hWnd
, LVM_GETITEMTEXT
, (WPARAM
)nItem
, (LPARAM
)&lvi
);
2981 strText
.ReleaseBuffer();
2984 #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
2986 int GetItemText(int nItem
, int nSubItem
, LPTSTR lpszText
, int nLen
) const
2988 ATLASSERT(::IsWindow(m_hWnd
));
2990 lvi
.iSubItem
= nSubItem
;
2991 lvi
.cchTextMax
= nLen
;
2992 lvi
.pszText
= lpszText
;
2993 return (int)::SendMessage(m_hWnd
, LVM_GETITEMTEXT
, (WPARAM
)nItem
, (LPARAM
)&lvi
);
2996 BOOL
SetItemText(int nItem
, int nSubItem
, LPCTSTR lpszText
)
2998 ATLASSERT(::IsWindow(m_hWnd
));
2999 return SetItem(nItem
, nSubItem
, LVIF_TEXT
, lpszText
, 0, 0, 0, 0);
3002 DWORD_PTR
GetItemData(int nItem
) const
3004 ATLASSERT(::IsWindow(m_hWnd
));
3007 lvi
.mask
= LVIF_PARAM
;
3008 BOOL bRet
= (BOOL
)::SendMessage(m_hWnd
, LVM_GETITEM
, 0, (LPARAM
)&lvi
);
3009 return (DWORD_PTR
)(bRet
? lvi
.lParam
: NULL
);
3012 BOOL
SetItemData(int nItem
, DWORD_PTR dwData
)
3014 ATLASSERT(::IsWindow(m_hWnd
));
3015 return SetItem(nItem
, 0, LVIF_PARAM
, NULL
, 0, 0, 0, (LPARAM
)dwData
);
3018 UINT
GetCallbackMask() const
3020 ATLASSERT(::IsWindow(m_hWnd
));
3021 return (UINT
)::SendMessage(m_hWnd
, LVM_GETCALLBACKMASK
, 0, 0L);
3024 BOOL
SetCallbackMask(UINT nMask
)
3026 ATLASSERT(::IsWindow(m_hWnd
));
3027 return (BOOL
)::SendMessage(m_hWnd
, LVM_SETCALLBACKMASK
, nMask
, 0L);
3030 BOOL
GetItemPosition(int nItem
, LPPOINT lpPoint
) const
3032 ATLASSERT(::IsWindow(m_hWnd
));
3033 return (BOOL
)::SendMessage(m_hWnd
, LVM_GETITEMPOSITION
, nItem
, (LPARAM
)lpPoint
);
3036 BOOL
SetItemPosition(int nItem
, POINT pt
)
3038 ATLASSERT(::IsWindow(m_hWnd
));
3039 ATLASSERT(((GetStyle() & LVS_TYPEMASK
) == LVS_ICON
) || ((GetStyle() & LVS_TYPEMASK
) == LVS_SMALLICON
));
3040 return (BOOL
)::SendMessage(m_hWnd
, LVM_SETITEMPOSITION32
, nItem
, (LPARAM
)&pt
);
3043 BOOL
SetItemPosition(int nItem
, int x
, int y
)
3045 ATLASSERT(::IsWindow(m_hWnd
));
3046 ATLASSERT(((GetStyle() & LVS_TYPEMASK
) == LVS_ICON
) || ((GetStyle() & LVS_TYPEMASK
) == LVS_SMALLICON
));
3047 POINT pt
= { x
, y
};
3048 return (BOOL
)::SendMessage(m_hWnd
, LVM_SETITEMPOSITION32
, nItem
, (LPARAM
)&pt
);
3051 int GetStringWidth(LPCTSTR lpsz
) const
3053 ATLASSERT(::IsWindow(m_hWnd
));
3054 return (int)::SendMessage(m_hWnd
, LVM_GETSTRINGWIDTH
, 0, (LPARAM
)lpsz
);
3057 CEdit
GetEditControl() const
3059 ATLASSERT(::IsWindow(m_hWnd
));
3060 return CEdit((HWND
)::SendMessage(m_hWnd
, LVM_GETEDITCONTROL
, 0, 0L));
3063 BOOL
GetColumn(int nCol
, LVCOLUMN
* pColumn
) const
3065 ATLASSERT(::IsWindow(m_hWnd
));
3066 return (BOOL
)::SendMessage(m_hWnd
, LVM_GETCOLUMN
, nCol
, (LPARAM
)pColumn
);
3069 BOOL
SetColumn(int nCol
, const LVCOLUMN
* pColumn
)
3071 ATLASSERT(::IsWindow(m_hWnd
));
3072 return (BOOL
)::SendMessage(m_hWnd
, LVM_SETCOLUMN
, nCol
, (LPARAM
)pColumn
);
3075 int GetColumnWidth(int nCol
) const
3077 ATLASSERT(::IsWindow(m_hWnd
));
3078 return (int)::SendMessage(m_hWnd
, LVM_GETCOLUMNWIDTH
, nCol
, 0L);
3081 BOOL
SetColumnWidth(int nCol
, int cx
)
3083 ATLASSERT(::IsWindow(m_hWnd
));
3084 return (BOOL
)::SendMessage(m_hWnd
, LVM_SETCOLUMNWIDTH
, nCol
, MAKELPARAM(cx
, 0));
3087 BOOL
GetViewRect(LPRECT lpRect
) const
3089 ATLASSERT(::IsWindow(m_hWnd
));
3090 return (BOOL
)::SendMessage(m_hWnd
, LVM_GETVIEWRECT
, 0, (LPARAM
)lpRect
);
3093 COLORREF
GetTextColor() const
3095 ATLASSERT(::IsWindow(m_hWnd
));
3096 return (COLORREF
)::SendMessage(m_hWnd
, LVM_GETTEXTCOLOR
, 0, 0L);
3099 BOOL
SetTextColor(COLORREF cr
)
3101 ATLASSERT(::IsWindow(m_hWnd
));
3102 return (BOOL
)::SendMessage(m_hWnd
, LVM_SETTEXTCOLOR
, 0, cr
);
3105 COLORREF
GetTextBkColor() const
3107 ATLASSERT(::IsWindow(m_hWnd
));
3108 return (COLORREF
)::SendMessage(m_hWnd
, LVM_GETTEXTBKCOLOR
, 0, 0L);
3111 BOOL
SetTextBkColor(COLORREF cr
)
3113 ATLASSERT(::IsWindow(m_hWnd
));
3114 return (BOOL
)::SendMessage(m_hWnd
, LVM_SETTEXTBKCOLOR
, 0, cr
);
3117 int GetTopIndex() const
3119 ATLASSERT(::IsWindow(m_hWnd
));
3120 return (int)::SendMessage(m_hWnd
, LVM_GETTOPINDEX
, 0, 0L);
3123 int GetCountPerPage() const
3125 ATLASSERT(::IsWindow(m_hWnd
));
3126 return (int)::SendMessage(m_hWnd
, LVM_GETCOUNTPERPAGE
, 0, 0L);
3129 BOOL
GetOrigin(LPPOINT lpPoint
) const
3131 ATLASSERT(::IsWindow(m_hWnd
));
3132 return (BOOL
)::SendMessage(m_hWnd
, LVM_GETORIGIN
, 0, (LPARAM
)lpPoint
);
3135 UINT
GetSelectedCount() const
3137 ATLASSERT(::IsWindow(m_hWnd
));
3138 return (UINT
)::SendMessage(m_hWnd
, LVM_GETSELECTEDCOUNT
, 0, 0L);
3141 BOOL
GetItemRect(int nItem
, LPRECT lpRect
, UINT nCode
) const
3143 ATLASSERT(::IsWindow(m_hWnd
));
3144 lpRect
->left
= nCode
;
3145 return (BOOL
)::SendMessage(m_hWnd
, LVM_GETITEMRECT
, (WPARAM
)nItem
, (LPARAM
)lpRect
);
3149 HCURSOR
GetHotCursor() const
3151 ATLASSERT(::IsWindow(m_hWnd
));
3152 return (HCURSOR
)::SendMessage(m_hWnd
, LVM_GETHOTCURSOR
, 0, 0L);
3155 HCURSOR
SetHotCursor(HCURSOR hHotCursor
)
3157 ATLASSERT(::IsWindow(m_hWnd
));
3158 return (HCURSOR
)::SendMessage(m_hWnd
, LVM_SETHOTCURSOR
, 0, (LPARAM
)hHotCursor
);
3161 int GetHotItem() const
3163 ATLASSERT(::IsWindow(m_hWnd
));
3164 return (int)::SendMessage(m_hWnd
, LVM_GETHOTITEM
, 0, 0L);
3167 int SetHotItem(int nIndex
)
3169 ATLASSERT(::IsWindow(m_hWnd
));
3170 return (int)::SendMessage(m_hWnd
, LVM_SETHOTITEM
, nIndex
, 0L);
3172 #endif // !_WIN32_WCE
3174 BOOL
GetColumnOrderArray(int nCount
, int* lpnArray
) const
3176 ATLASSERT(::IsWindow(m_hWnd
));
3177 return (BOOL
)::SendMessage(m_hWnd
, LVM_GETCOLUMNORDERARRAY
, nCount
, (LPARAM
)lpnArray
);
3180 BOOL
SetColumnOrderArray(int nCount
, int* lpnArray
)
3182 ATLASSERT(::IsWindow(m_hWnd
));
3183 return (BOOL
)::SendMessage(m_hWnd
, LVM_SETCOLUMNORDERARRAY
, nCount
, (LPARAM
)lpnArray
);
3186 CHeaderCtrl
GetHeader() const
3188 ATLASSERT(::IsWindow(m_hWnd
));
3189 return CHeaderCtrl((HWND
)::SendMessage(m_hWnd
, LVM_GETHEADER
, 0, 0L));
3192 BOOL
GetSubItemRect(int nItem
, int nSubItem
, int nFlag
, LPRECT lpRect
) const
3194 ATLASSERT(::IsWindow(m_hWnd
));
3195 ATLASSERT((GetStyle() & LVS_TYPEMASK
) == LVS_REPORT
);
3196 ATLASSERT(lpRect
!= NULL
);
3197 lpRect
->top
= nSubItem
;
3198 lpRect
->left
= nFlag
;
3199 return (BOOL
)::SendMessage(m_hWnd
, LVM_GETSUBITEMRECT
, nItem
, (LPARAM
)lpRect
);
3202 DWORD
SetIconSpacing(int cx
, int cy
)
3204 ATLASSERT(::IsWindow(m_hWnd
));
3205 ATLASSERT((GetStyle() & LVS_TYPEMASK
) == LVS_ICON
);
3206 return (DWORD
)::SendMessage(m_hWnd
, LVM_SETICONSPACING
, 0, MAKELPARAM(cx
, cy
));
3209 int GetISearchString(LPTSTR lpstr
) const
3211 ATLASSERT(::IsWindow(m_hWnd
));
3212 return (int)::SendMessage(m_hWnd
, LVM_GETISEARCHSTRING
, 0, (LPARAM
)lpstr
);
3215 void GetItemSpacing(SIZE
& sizeSpacing
, BOOL bSmallIconView
= FALSE
) const
3217 ATLASSERT(::IsWindow(m_hWnd
));
3218 DWORD dwRet
= (DWORD
)::SendMessage(m_hWnd
, LVM_GETITEMSPACING
, bSmallIconView
, 0L);
3219 sizeSpacing
.cx
= GET_X_LPARAM(dwRet
);
3220 sizeSpacing
.cy
= GET_Y_LPARAM(dwRet
);
3223 #if (_WIN32_WCE >= 410)
3224 void SetItemSpacing(INT cySpacing
)
3226 ATLASSERT(::IsWindow(m_hWnd
));
3227 ListView_SetItemSpacing(m_hWnd
, cySpacing
);
3229 #endif // (_WIN32_WCE >= 410)
3231 // single-selection only
3232 int GetSelectedIndex() const
3234 ATLASSERT(::IsWindow(m_hWnd
));
3235 ATLASSERT((GetStyle() & LVS_SINGLESEL
) != 0);
3236 return (int)::SendMessage(m_hWnd
, LVM_GETNEXTITEM
, (WPARAM
)-1, MAKELPARAM(LVNI_ALL
| LVNI_SELECTED
, 0));
3239 BOOL
GetSelectedItem(LPLVITEM pItem
) const
3241 ATLASSERT(::IsWindow(m_hWnd
));
3242 ATLASSERT((GetStyle() & LVS_SINGLESEL
) != 0);
3243 ATLASSERT(pItem
!= NULL
);
3244 pItem
->iItem
= (int)::SendMessage(m_hWnd
, LVM_GETNEXTITEM
, (WPARAM
)-1, MAKELPARAM(LVNI_ALL
| LVNI_SELECTED
, 0));
3245 if(pItem
->iItem
== -1)
3247 return (BOOL
)::SendMessage(m_hWnd
, LVM_GETITEM
, 0, (LPARAM
)pItem
);
3250 // extended list view styles
3251 DWORD
GetExtendedListViewStyle() const
3253 ATLASSERT(::IsWindow(m_hWnd
));
3254 return (DWORD
)::SendMessage(m_hWnd
, LVM_GETEXTENDEDLISTVIEWSTYLE
, 0, 0L);
3257 // dwExMask = 0 means all styles
3258 DWORD
SetExtendedListViewStyle(DWORD dwExStyle
, DWORD dwExMask
= 0)
3260 ATLASSERT(::IsWindow(m_hWnd
));
3261 return (DWORD
)::SendMessage(m_hWnd
, LVM_SETEXTENDEDLISTVIEWSTYLE
, dwExMask
, dwExStyle
);
3265 BOOL
GetCheckState(int nIndex
) const
3267 ATLASSERT(::IsWindow(m_hWnd
));
3268 ATLASSERT((GetExtendedListViewStyle() & LVS_EX_CHECKBOXES
) != 0);
3269 UINT uRet
= GetItemState(nIndex
, LVIS_STATEIMAGEMASK
);
3270 return (uRet
>> 12) - 1;
3273 BOOL
SetCheckState(int nItem
, BOOL bCheck
)
3275 int nCheck
= bCheck
? 2 : 1; // one based index
3276 return SetItemState(nItem
, INDEXTOSTATEIMAGEMASK(nCheck
), LVIS_STATEIMAGEMASK
);
3280 DWORD
GetViewType() const
3282 ATLASSERT(::IsWindow(m_hWnd
));
3283 return (GetStyle() & LVS_TYPEMASK
);
3286 DWORD
SetViewType(DWORD dwType
)
3288 ATLASSERT(::IsWindow(m_hWnd
));
3289 ATLASSERT(dwType
== LVS_ICON
|| dwType
== LVS_SMALLICON
|| dwType
== LVS_LIST
|| dwType
== LVS_REPORT
);
3290 DWORD dwOldType
= GetViewType();
3291 if(dwType
!= dwOldType
)
3292 ModifyStyle(LVS_TYPEMASK
, (dwType
& LVS_TYPEMASK
));
3296 #if (_WIN32_IE >= 0x0400)
3298 BOOL
GetBkImage(LPLVBKIMAGE plvbki
) const
3300 ATLASSERT(::IsWindow(m_hWnd
));
3301 return (BOOL
)::SendMessage(m_hWnd
, LVM_GETBKIMAGE
, 0, (LPARAM
)plvbki
);
3304 BOOL
SetBkImage(LPLVBKIMAGE plvbki
)
3306 ATLASSERT(::IsWindow(m_hWnd
));
3307 return (BOOL
)::SendMessage(m_hWnd
, LVM_SETBKIMAGE
, 0, (LPARAM
)plvbki
);
3309 #endif // !_WIN32_WCE
3311 int GetSelectionMark() const
3313 ATLASSERT(::IsWindow(m_hWnd
));
3314 return (int)::SendMessage(m_hWnd
, LVM_GETSELECTIONMARK
, 0, 0L);
3317 int SetSelectionMark(int nIndex
)
3319 ATLASSERT(::IsWindow(m_hWnd
));
3320 return (int)::SendMessage(m_hWnd
, LVM_SETSELECTIONMARK
, 0, nIndex
);
3324 BOOL
GetWorkAreas(int nWorkAreas
, LPRECT lpRect
) const
3326 ATLASSERT(::IsWindow(m_hWnd
));
3327 return (BOOL
)::SendMessage(m_hWnd
, LVM_GETWORKAREAS
, nWorkAreas
, (LPARAM
)lpRect
);
3330 BOOL
SetWorkAreas(int nWorkAreas
, LPRECT lpRect
)
3332 ATLASSERT(::IsWindow(m_hWnd
));
3333 return (BOOL
)::SendMessage(m_hWnd
, LVM_SETWORKAREAS
, nWorkAreas
, (LPARAM
)lpRect
);
3336 DWORD
GetHoverTime() const
3338 ATLASSERT(::IsWindow(m_hWnd
));
3339 ATLASSERT((GetExtendedListViewStyle() & (LVS_EX_TRACKSELECT
| LVS_EX_ONECLICKACTIVATE
| LVS_EX_TWOCLICKACTIVATE
)) != 0);
3340 return (DWORD
)::SendMessage(m_hWnd
, LVM_GETHOVERTIME
, 0, 0L);
3343 DWORD
SetHoverTime(DWORD dwHoverTime
)
3345 ATLASSERT(::IsWindow(m_hWnd
));
3346 ATLASSERT((GetExtendedListViewStyle() & (LVS_EX_TRACKSELECT
| LVS_EX_ONECLICKACTIVATE
| LVS_EX_TWOCLICKACTIVATE
)) != 0);
3347 return (DWORD
)::SendMessage(m_hWnd
, LVM_SETHOVERTIME
, 0, dwHoverTime
);
3350 BOOL
GetNumberOfWorkAreas(int* pnWorkAreas
) const
3352 ATLASSERT(::IsWindow(m_hWnd
));
3353 return (BOOL
)::SendMessage(m_hWnd
, LVM_GETNUMBEROFWORKAREAS
, 0, (LPARAM
)pnWorkAreas
);
3355 #endif // !_WIN32_WCE
3357 BOOL
SetItemCountEx(int nItems
, DWORD dwFlags
)
3359 ATLASSERT(::IsWindow(m_hWnd
));
3360 ATLASSERT(((GetStyle() & LVS_OWNERDATA
) != 0) && (((GetStyle() & LVS_TYPEMASK
) == LVS_REPORT
) || ((GetStyle() & LVS_TYPEMASK
) == LVS_LIST
)));
3361 return (BOOL
)::SendMessage(m_hWnd
, LVM_SETITEMCOUNT
, nItems
, dwFlags
);
3365 CToolTipCtrl
GetToolTips() const
3367 ATLASSERT(::IsWindow(m_hWnd
));
3368 return CToolTipCtrl((HWND
)::SendMessage(m_hWnd
, LVM_GETTOOLTIPS
, 0, 0L));
3371 CToolTipCtrl
SetToolTips(HWND hWndTT
)
3373 ATLASSERT(::IsWindow(m_hWnd
));
3374 return CToolTipCtrl((HWND
)::SendMessage(m_hWnd
, LVM_SETTOOLTIPS
, (WPARAM
)hWndTT
, 0L));
3377 BOOL
GetUnicodeFormat() const
3379 ATLASSERT(::IsWindow(m_hWnd
));
3380 return (BOOL
)::SendMessage(m_hWnd
, LVM_GETUNICODEFORMAT
, 0, 0L);
3383 BOOL
SetUnicodeFormat(BOOL bUnicode
= TRUE
)
3385 ATLASSERT(::IsWindow(m_hWnd
));
3386 return (BOOL
)::SendMessage(m_hWnd
, LVM_SETUNICODEFORMAT
, bUnicode
, 0L);
3388 #endif // !_WIN32_WCE
3389 #endif // (_WIN32_IE >= 0x0400)
3391 #if (_WIN32_WINNT >= 0x0501)
3392 int GetSelectedColumn() const
3394 ATLASSERT(::IsWindow(m_hWnd
));
3395 return (int)::SendMessage(m_hWnd
, LVM_GETSELECTEDCOLUMN
, 0, 0L);
3398 void SetSelectedColumn(int nColumn
)
3400 ATLASSERT(::IsWindow(m_hWnd
));
3401 ::SendMessage(m_hWnd
, LVM_SETSELECTEDCOLUMN
, nColumn
, 0L);
3404 DWORD
GetView() const
3406 ATLASSERT(::IsWindow(m_hWnd
));
3407 return (DWORD
)::SendMessage(m_hWnd
, LVM_GETVIEW
, 0, 0L);
3410 int SetView(DWORD dwView
)
3412 ATLASSERT(::IsWindow(m_hWnd
));
3413 return (int)::SendMessage(m_hWnd
, LVM_SETVIEW
, dwView
, 0L);
3416 BOOL
IsGroupViewEnabled() const
3418 ATLASSERT(::IsWindow(m_hWnd
));
3419 return (BOOL
)::SendMessage(m_hWnd
, LVM_ISGROUPVIEWENABLED
, 0, 0L);
3422 int GetGroupInfo(int nGroupID
, PLVGROUP pGroup
) const
3424 ATLASSERT(::IsWindow(m_hWnd
));
3425 return (int)::SendMessage(m_hWnd
, LVM_GETGROUPINFO
, nGroupID
, (LPARAM
)pGroup
);
3428 int SetGroupInfo(int nGroupID
, PLVGROUP pGroup
)
3430 ATLASSERT(::IsWindow(m_hWnd
));
3431 return (int)::SendMessage(m_hWnd
, LVM_SETGROUPINFO
, nGroupID
, (LPARAM
)pGroup
);
3434 void GetGroupMetrics(PLVGROUPMETRICS pGroupMetrics
) const
3436 ATLASSERT(::IsWindow(m_hWnd
));
3437 ::SendMessage(m_hWnd
, LVM_GETGROUPMETRICS
, 0, (LPARAM
)pGroupMetrics
);
3440 void SetGroupMetrics(PLVGROUPMETRICS pGroupMetrics
)
3442 ATLASSERT(::IsWindow(m_hWnd
));
3443 ::SendMessage(m_hWnd
, LVM_SETGROUPMETRICS
, 0, (LPARAM
)pGroupMetrics
);
3446 void GetTileViewInfo(PLVTILEVIEWINFO pTileViewInfo
) const
3448 ATLASSERT(::IsWindow(m_hWnd
));
3449 ::SendMessage(m_hWnd
, LVM_GETTILEVIEWINFO
, 0, (LPARAM
)pTileViewInfo
);
3452 BOOL
SetTileViewInfo(PLVTILEVIEWINFO pTileViewInfo
)
3454 ATLASSERT(::IsWindow(m_hWnd
));
3455 return (BOOL
)::SendMessage(m_hWnd
, LVM_SETTILEVIEWINFO
, 0, (LPARAM
)pTileViewInfo
);
3458 void GetTileInfo(PLVTILEINFO pTileInfo
) const
3460 ATLASSERT(::IsWindow(m_hWnd
));
3461 ::SendMessage(m_hWnd
, LVM_GETTILEINFO
, 0, (LPARAM
)pTileInfo
);
3464 BOOL
SetTileInfo(PLVTILEINFO pTileInfo
)
3466 ATLASSERT(::IsWindow(m_hWnd
));
3467 return (BOOL
)::SendMessage(m_hWnd
, LVM_SETTILEINFO
, 0, (LPARAM
)pTileInfo
);
3470 BOOL
GetInsertMark(LPLVINSERTMARK pInsertMark
) const
3472 ATLASSERT(::IsWindow(m_hWnd
));
3473 return (BOOL
)::SendMessage(m_hWnd
, LVM_GETINSERTMARK
, 0, (LPARAM
)pInsertMark
);
3476 BOOL
SetInsertMark(LPLVINSERTMARK pInsertMark
)
3478 ATLASSERT(::IsWindow(m_hWnd
));
3479 return (BOOL
)::SendMessage(m_hWnd
, LVM_SETINSERTMARK
, 0, (LPARAM
)pInsertMark
);
3482 int GetInsertMarkRect(LPRECT lpRect
) const
3484 ATLASSERT(::IsWindow(m_hWnd
));
3485 return (int)::SendMessage(m_hWnd
, LVM_GETINSERTMARKRECT
, 0, (LPARAM
)lpRect
);
3488 COLORREF
GetInsertMarkColor() const
3490 ATLASSERT(::IsWindow(m_hWnd
));
3491 return (COLORREF
)::SendMessage(m_hWnd
, LVM_GETINSERTMARKCOLOR
, 0, 0L);
3494 COLORREF
SetInsertMarkColor(COLORREF clr
)
3496 ATLASSERT(::IsWindow(m_hWnd
));
3497 return (COLORREF
)::SendMessage(m_hWnd
, LVM_SETINSERTMARKCOLOR
, 0, clr
);
3500 COLORREF
GetOutlineColor() const
3502 ATLASSERT(::IsWindow(m_hWnd
));
3503 return (COLORREF
)::SendMessage(m_hWnd
, LVM_GETOUTLINECOLOR
, 0, 0L);
3506 COLORREF
SetOutlineColor(COLORREF clr
)
3508 ATLASSERT(::IsWindow(m_hWnd
));
3509 return (COLORREF
)::SendMessage(m_hWnd
, LVM_SETOUTLINECOLOR
, 0, clr
);
3511 #endif // (_WIN32_WINNT >= 0x0501)
3513 #if (_WIN32_WINNT >= 0x0600)
3514 int GetGroupCount() const
3516 ATLASSERT(::IsWindow(m_hWnd
));
3517 return (int)::SendMessage(m_hWnd
, LVM_GETGROUPCOUNT
, 0, 0L);
3520 BOOL
GetGroupInfoByIndex(int nIndex
, PLVGROUP pGroup
) const
3522 ATLASSERT(::IsWindow(m_hWnd
));
3523 return (BOOL
)::SendMessage(m_hWnd
, LVM_GETGROUPINFOBYINDEX
, nIndex
, (LPARAM
)pGroup
);
3526 BOOL
GetGroupRect(int nGroupID
, int nType
, LPRECT lpRect
) const
3528 ATLASSERT(::IsWindow(m_hWnd
));
3529 ATLASSERT(lpRect
!= NULL
);
3531 lpRect
->top
= nType
;
3532 return (BOOL
)::SendMessage(m_hWnd
, LVM_GETGROUPRECT
, nGroupID
, (LPARAM
)lpRect
);
3535 UINT
GetGroupState(int nGroupID
, UINT uMask
) const
3537 ATLASSERT(::IsWindow(m_hWnd
));
3538 return (UINT
)::SendMessage(m_hWnd
, LVM_GETGROUPSTATE
, nGroupID
, (LPARAM
)uMask
);
3541 int GetFocusedGroup() const
3543 ATLASSERT(::IsWindow(m_hWnd
));
3544 return (int)::SendMessage(m_hWnd
, LVM_GETFOCUSEDGROUP
, 0, 0L);
3547 BOOL
GetEmptyText(LPWSTR lpstrText
, int cchText
) const
3549 ATLASSERT(::IsWindow(m_hWnd
));
3550 return (BOOL
)::SendMessage(m_hWnd
, LVM_GETEMPTYTEXT
, cchText
, (LPARAM
)lpstrText
);
3553 BOOL
GetFooterRect(LPRECT lpRect
) const
3555 ATLASSERT(::IsWindow(m_hWnd
));
3556 return (BOOL
)::SendMessage(m_hWnd
, LVM_GETFOOTERRECT
, 0, (LPARAM
)lpRect
);
3559 BOOL
GetFooterInfo(LPLVFOOTERINFO lpFooterInfo
) const
3561 ATLASSERT(::IsWindow(m_hWnd
));
3562 return (BOOL
)::SendMessage(m_hWnd
, LVM_GETFOOTERINFO
, 0, (LPARAM
)lpFooterInfo
);
3565 BOOL
GetFooterItemRect(int nItem
, LPRECT lpRect
) const
3567 ATLASSERT(::IsWindow(m_hWnd
));
3568 return (BOOL
)::SendMessage(m_hWnd
, LVM_GETFOOTERITEMRECT
, nItem
, (LPARAM
)lpRect
);
3571 BOOL
GetFooterItem(int nItem
, LPLVFOOTERITEM lpFooterItem
) const
3573 ATLASSERT(::IsWindow(m_hWnd
));
3574 return (BOOL
)::SendMessage(m_hWnd
, LVM_GETFOOTERITEM
, nItem
, (LPARAM
)lpFooterItem
);
3577 BOOL
GetItemIndexRect(PLVITEMINDEX pItemIndex
, int nSubItem
, int nType
, LPRECT lpRect
) const
3579 ATLASSERT(::IsWindow(m_hWnd
));
3580 ATLASSERT(pItemIndex
!= NULL
);
3581 ATLASSERT(lpRect
!= NULL
);
3584 lpRect
->top
= nSubItem
;
3585 lpRect
->left
= nType
;
3587 return (BOOL
)::SendMessage(m_hWnd
, LVM_GETITEMINDEXRECT
, (WPARAM
)pItemIndex
, (LPARAM
)lpRect
);
3590 BOOL
SetItemIndexState(PLVITEMINDEX pItemIndex
, UINT uState
, UINT dwMask
)
3592 ATLASSERT(::IsWindow(m_hWnd
));
3595 lvi
.stateMask
= dwMask
;
3596 return (BOOL
)::SendMessage(m_hWnd
, LVM_SETITEMINDEXSTATE
, (WPARAM
)pItemIndex
, (LPARAM
)&lvi
);
3599 BOOL
GetNextItemIndex(PLVITEMINDEX pItemIndex
, WORD wFlags
) const
3601 ATLASSERT(::IsWindow(m_hWnd
));
3602 return (BOOL
)::SendMessage(m_hWnd
, LVM_GETNEXTITEMINDEX
, (WPARAM
)pItemIndex
, MAKELPARAM(wFlags
, 0));
3604 #endif // (_WIN32_WINNT >= 0x0600)
3607 int InsertColumn(int nCol
, const LVCOLUMN
* pColumn
)
3609 ATLASSERT(::IsWindow(m_hWnd
));
3610 return (int)::SendMessage(m_hWnd
, LVM_INSERTCOLUMN
, nCol
, (LPARAM
)pColumn
);
3613 int InsertColumn(int nCol
, LPCTSTR lpszColumnHeading
, int nFormat
= LVCFMT_LEFT
,
3614 int nWidth
= -1, int nSubItem
= -1, int iImage
= -1, int iOrder
= -1)
3616 LVCOLUMN column
= { 0 };
3617 column
.mask
= LVCF_TEXT
|LVCF_FMT
;
3618 column
.pszText
= (LPTSTR
)lpszColumnHeading
;
3619 column
.fmt
= nFormat
;
3622 column
.mask
|= LVCF_WIDTH
;
3627 column
.mask
|= LVCF_SUBITEM
;
3628 column
.iSubItem
= nSubItem
;
3632 column
.mask
|= LVCF_IMAGE
;
3633 column
.iImage
= iImage
;
3637 column
.mask
|= LVCF_ORDER
;
3638 column
.iOrder
= iOrder
;
3640 return InsertColumn(nCol
, &column
);
3643 BOOL
DeleteColumn(int nCol
)
3645 ATLASSERT(::IsWindow(m_hWnd
));
3646 return (BOOL
)::SendMessage(m_hWnd
, LVM_DELETECOLUMN
, nCol
, 0L);
3649 int InsertItem(UINT nMask
, int nItem
, LPCTSTR lpszItem
, UINT nState
, UINT nStateMask
, int nImage
, LPARAM lParam
)
3651 ATLASSERT(::IsWindow(m_hWnd
));
3652 LVITEM item
= { 0 };
3656 item
.pszText
= (LPTSTR
)lpszItem
;
3657 item
.state
= nState
;
3658 item
.stateMask
= nStateMask
;
3659 item
.iImage
= nImage
;
3660 item
.lParam
= lParam
;
3661 return InsertItem(&item
);
3664 int InsertItem(const LVITEM
* pItem
)
3666 ATLASSERT(::IsWindow(m_hWnd
));
3667 return (int)::SendMessage(m_hWnd
, LVM_INSERTITEM
, 0, (LPARAM
)pItem
);
3670 int InsertItem(int nItem
, LPCTSTR lpszItem
)
3672 ATLASSERT(::IsWindow(m_hWnd
));
3673 return InsertItem(LVIF_TEXT
, nItem
, lpszItem
, 0, 0, 0, 0);
3676 int InsertItem(int nItem
, LPCTSTR lpszItem
, int nImage
)
3678 ATLASSERT(::IsWindow(m_hWnd
));
3679 return InsertItem(LVIF_TEXT
|LVIF_IMAGE
, nItem
, lpszItem
, 0, 0, nImage
, 0);
3682 int GetNextItem(int nItem
, int nFlags
) const
3684 ATLASSERT(::IsWindow(m_hWnd
));
3685 return (int)::SendMessage(m_hWnd
, LVM_GETNEXTITEM
, nItem
, MAKELPARAM(nFlags
, 0));
3688 BOOL
DeleteItem(int nItem
)
3690 ATLASSERT(::IsWindow(m_hWnd
));
3691 return (BOOL
)::SendMessage(m_hWnd
, LVM_DELETEITEM
, nItem
, 0L);
3694 BOOL
DeleteAllItems()
3696 ATLASSERT(::IsWindow(m_hWnd
));
3697 return (BOOL
)::SendMessage(m_hWnd
, LVM_DELETEALLITEMS
, 0, 0L);
3700 int FindItem(LVFINDINFO
* pFindInfo
, int nStart
= -1) const
3702 ATLASSERT(::IsWindow(m_hWnd
));
3703 return (int)::SendMessage(m_hWnd
, LVM_FINDITEM
, nStart
, (LPARAM
)pFindInfo
);
3706 int FindItem(LPCTSTR lpstrFind
, bool bPartial
= true, bool bWrap
= false, int nStart
= -1) const
3708 ATLASSERT(::IsWindow(m_hWnd
));
3709 LVFINDINFO lvfi
= { 0 };
3710 lvfi
.flags
= LVFI_STRING
| (bWrap
? LVFI_WRAP
: 0) | (bPartial
? LVFI_PARTIAL
: 0);
3711 lvfi
.psz
= lpstrFind
;
3712 return (int)::SendMessage(m_hWnd
, LVM_FINDITEM
, nStart
, (LPARAM
)&lvfi
);
3715 int HitTest(LVHITTESTINFO
* pHitTestInfo
) const
3717 ATLASSERT(::IsWindow(m_hWnd
));
3718 return (int)::SendMessage(m_hWnd
, LVM_HITTEST
, 0, (LPARAM
)pHitTestInfo
);
3721 int HitTest(POINT pt
, UINT
* pFlags
) const
3723 ATLASSERT(::IsWindow(m_hWnd
));
3724 LVHITTESTINFO hti
= { 0 };
3726 int nRes
= (int)::SendMessage(m_hWnd
, LVM_HITTEST
, 0, (LPARAM
)&hti
);
3728 *pFlags
= hti
.flags
;
3732 BOOL
EnsureVisible(int nItem
, BOOL bPartialOK
)
3734 ATLASSERT(::IsWindow(m_hWnd
));
3735 return (BOOL
)::SendMessage(m_hWnd
, LVM_ENSUREVISIBLE
, nItem
, MAKELPARAM(bPartialOK
, 0));
3738 BOOL
Scroll(SIZE size
)
3740 ATLASSERT(::IsWindow(m_hWnd
));
3741 return (BOOL
)::SendMessage(m_hWnd
, LVM_SCROLL
, size
.cx
, size
.cy
);
3744 BOOL
RedrawItems(int nFirst
, int nLast
)
3746 ATLASSERT(::IsWindow(m_hWnd
));
3747 return (BOOL
)::SendMessage(m_hWnd
, LVM_REDRAWITEMS
, nFirst
, nLast
);
3750 BOOL
Arrange(UINT nCode
)
3752 ATLASSERT(::IsWindow(m_hWnd
));
3753 return (BOOL
)::SendMessage(m_hWnd
, LVM_ARRANGE
, nCode
, 0L);
3756 CEdit
EditLabel(int nItem
)
3758 ATLASSERT(::IsWindow(m_hWnd
));
3759 return CEdit((HWND
)::SendMessage(m_hWnd
, LVM_EDITLABEL
, nItem
, 0L));
3762 BOOL
Update(int nItem
)
3764 ATLASSERT(::IsWindow(m_hWnd
));
3765 return (BOOL
)::SendMessage(m_hWnd
, LVM_UPDATE
, nItem
, 0L);
3768 BOOL
SortItems(PFNLVCOMPARE pfnCompare
, LPARAM lParamSort
)
3770 ATLASSERT(::IsWindow(m_hWnd
));
3771 return (BOOL
)::SendMessage(m_hWnd
, LVM_SORTITEMS
, (WPARAM
)lParamSort
, (LPARAM
)pfnCompare
);
3774 CImageList
RemoveImageList(int nImageList
)
3776 ATLASSERT(::IsWindow(m_hWnd
));
3777 return CImageList((HIMAGELIST
)::SendMessage(m_hWnd
, LVM_SETIMAGELIST
, (WPARAM
)nImageList
, NULL
));
3780 CImageList
CreateDragImage(int nItem
, LPPOINT lpPoint
)
3782 ATLASSERT(::IsWindow(m_hWnd
));
3783 return CImageList((HIMAGELIST
)::SendMessage(m_hWnd
, LVM_CREATEDRAGIMAGE
, nItem
, (LPARAM
)lpPoint
));
3786 DWORD
ApproximateViewRect(int cx
= -1, int cy
= -1, int nCount
= -1)
3788 ATLASSERT(::IsWindow(m_hWnd
));
3789 return (DWORD
)::SendMessage(m_hWnd
, LVM_APPROXIMATEVIEWRECT
, nCount
, MAKELPARAM(cx
, cy
));
3792 int SubItemHitTest(LPLVHITTESTINFO lpInfo
) const
3794 ATLASSERT(::IsWindow(m_hWnd
));
3795 return (int)::SendMessage(m_hWnd
, LVM_SUBITEMHITTEST
, 0, (LPARAM
)lpInfo
);
3798 int AddColumn(LPCTSTR strItem
, int nItem
, int nSubItem
= -1,
3799 int nMask
= LVCF_FMT
| LVCF_WIDTH
| LVCF_TEXT
| LVCF_SUBITEM
,
3800 int nFmt
= LVCFMT_LEFT
)
3802 const int cxOffset
= 15;
3803 ATLASSERT(::IsWindow(m_hWnd
));
3804 LVCOLUMN lvc
= { 0 };
3807 lvc
.pszText
= (LPTSTR
)strItem
;
3808 lvc
.cx
= GetStringWidth(lvc
.pszText
) + cxOffset
;
3809 if(nMask
& LVCF_SUBITEM
)
3810 lvc
.iSubItem
= (nSubItem
!= -1) ? nSubItem
: nItem
;
3811 return InsertColumn(nItem
, &lvc
);
3814 int AddItem(int nItem
, int nSubItem
, LPCTSTR strItem
, int nImageIndex
= -3)
3816 ATLASSERT(::IsWindow(m_hWnd
));
3817 LVITEM lvItem
= { 0 };
3818 lvItem
.mask
= LVIF_TEXT
;
3819 lvItem
.iItem
= nItem
;
3820 lvItem
.iSubItem
= nSubItem
;
3821 lvItem
.pszText
= (LPTSTR
)strItem
;
3822 if(nImageIndex
!= -3)
3824 lvItem
.mask
|= LVIF_IMAGE
;
3825 lvItem
.iImage
= nImageIndex
;
3828 return InsertItem(&lvItem
);
3829 return SetItem(&lvItem
) ? nItem
: -1;
3832 #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
3833 BOOL
SortItemsEx(PFNLVCOMPARE pfnCompare
, LPARAM lParamSort
)
3835 ATLASSERT(::IsWindow(m_hWnd
));
3836 return (BOOL
)::SendMessage(m_hWnd
, LVM_SORTITEMSEX
, (WPARAM
)lParamSort
, (LPARAM
)pfnCompare
);
3838 #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
3840 #if (_WIN32_WINNT >= 0x0501)
3841 int InsertGroup(int nItem
, PLVGROUP pGroup
)
3843 ATLASSERT(::IsWindow(m_hWnd
));
3844 return (int)::SendMessage(m_hWnd
, LVM_INSERTGROUP
, nItem
, (LPARAM
)pGroup
);
3847 int AddGroup(PLVGROUP pGroup
)
3849 return InsertGroup(-1, pGroup
);
3852 int RemoveGroup(int nGroupID
)
3854 ATLASSERT(::IsWindow(m_hWnd
));
3855 return (int)::SendMessage(m_hWnd
, LVM_REMOVEGROUP
, nGroupID
, 0L);
3858 void MoveGroup(int nGroupID
, int nItem
)
3860 ATLASSERT(::IsWindow(m_hWnd
));
3861 ::SendMessage(m_hWnd
, LVM_MOVEGROUP
, nGroupID
, nItem
);
3864 void MoveItemToGroup(int nItem
, int nGroupID
)
3866 ATLASSERT(::IsWindow(m_hWnd
));
3867 ::SendMessage(m_hWnd
, LVM_MOVEITEMTOGROUP
, nItem
, nGroupID
);
3870 int EnableGroupView(BOOL bEnable
)
3872 ATLASSERT(::IsWindow(m_hWnd
));
3873 return (int)::SendMessage(m_hWnd
, LVM_ENABLEGROUPVIEW
, bEnable
, 0L);
3876 int SortGroups(PFNLVGROUPCOMPARE pCompareFunc
, LPVOID lpVoid
= NULL
)
3878 ATLASSERT(::IsWindow(m_hWnd
));
3879 return (int)::SendMessage(m_hWnd
, LVM_SORTGROUPS
, (WPARAM
)pCompareFunc
, (LPARAM
)lpVoid
);
3882 void InsertGroupSorted(PLVINSERTGROUPSORTED pInsertGroupSorted
)
3884 ATLASSERT(::IsWindow(m_hWnd
));
3885 ::SendMessage(m_hWnd
, LVM_INSERTGROUPSORTED
, (WPARAM
)pInsertGroupSorted
, 0L);
3888 void RemoveAllGroups()
3890 ATLASSERT(::IsWindow(m_hWnd
));
3891 ::SendMessage(m_hWnd
, LVM_REMOVEALLGROUPS
, 0, 0L);
3894 BOOL
HasGroup(int nGroupID
)
3896 ATLASSERT(::IsWindow(m_hWnd
));
3897 return (BOOL
)::SendMessage(m_hWnd
, LVM_HASGROUP
, nGroupID
, 0L);
3900 BOOL
InsertMarkHitTest(LPPOINT lpPoint
, LPLVINSERTMARK pInsertMark
) const
3902 ATLASSERT(::IsWindow(m_hWnd
));
3903 return (BOOL
)::SendMessage(m_hWnd
, LVM_INSERTMARKHITTEST
, (WPARAM
)lpPoint
, (LPARAM
)pInsertMark
);
3906 BOOL
SetInfoTip(PLVSETINFOTIP pSetInfoTip
)
3908 ATLASSERT(::IsWindow(m_hWnd
));
3909 return (BOOL
)::SendMessage(m_hWnd
, LVM_SETINFOTIP
, 0, (LPARAM
)pSetInfoTip
);
3912 void CancelEditLabel()
3914 ATLASSERT(::IsWindow(m_hWnd
));
3915 ::SendMessage(m_hWnd
, LVM_CANCELEDITLABEL
, 0, 0L);
3918 UINT
MapIndexToID(int nIndex
) const
3920 ATLASSERT(::IsWindow(m_hWnd
));
3921 return (UINT
)::SendMessage(m_hWnd
, LVM_MAPINDEXTOID
, nIndex
, 0L);
3924 int MapIDToIndex(UINT uID
) const
3926 ATLASSERT(::IsWindow(m_hWnd
));
3927 return (int)::SendMessage(m_hWnd
, LVM_MAPIDTOINDEX
, uID
, 0L);
3929 #endif // (_WIN32_WINNT >= 0x0501)
3931 #if (_WIN32_WINNT >= 0x0600)
3932 int HitTestEx(LPLVHITTESTINFO lpHitTestInfo
) const
3934 ATLASSERT(::IsWindow(m_hWnd
));
3935 return (int)::SendMessage(m_hWnd
, LVM_HITTEST
, (WPARAM
)-1, (LPARAM
)lpHitTestInfo
);
3938 int HitTestEx(POINT pt
, UINT
* pFlags
) const
3940 ATLASSERT(::IsWindow(m_hWnd
));
3941 LVHITTESTINFO hti
= { 0 };
3943 int nRes
= (int)::SendMessage(m_hWnd
, LVM_HITTEST
, (WPARAM
)-1, (LPARAM
)&hti
);
3945 *pFlags
= hti
.flags
;
3949 int SubItemHitTestEx(LPLVHITTESTINFO lpHitTestInfo
) const
3951 ATLASSERT(::IsWindow(m_hWnd
));
3952 return (int)::SendMessage(m_hWnd
, LVM_SUBITEMHITTEST
, (WPARAM
)-1, (LPARAM
)lpHitTestInfo
);
3954 #endif // (_WIN32_WINNT >= 0x0600)
3956 // Note: selects only one item
3957 BOOL
SelectItem(int nIndex
)
3959 ATLASSERT(::IsWindow(m_hWnd
));
3961 // multi-selection only: de-select all items
3962 if((GetStyle() & LVS_SINGLESEL
) == 0)
3963 SetItemState(-1, 0, LVIS_SELECTED
);
3965 BOOL bRet
= SetItemState(nIndex
, LVIS_SELECTED
| LVIS_FOCUSED
, LVIS_SELECTED
| LVIS_FOCUSED
);
3967 bRet
= EnsureVisible(nIndex
, FALSE
);
3973 typedef CListViewCtrlT
<ATL::CWindow
> CListViewCtrl
;
3976 ///////////////////////////////////////////////////////////////////////////////
3979 template <class TBase
>
3980 class CTreeViewCtrlT
: public TBase
3984 CTreeViewCtrlT(HWND hWnd
= NULL
) : TBase(hWnd
)
3987 CTreeViewCtrlT
< TBase
>& operator =(HWND hWnd
)
3993 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
3994 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
3995 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
3997 return TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
4001 static LPCTSTR
GetWndClassName()
4006 UINT
GetCount() const
4008 ATLASSERT(::IsWindow(m_hWnd
));
4009 return (UINT
)::SendMessage(m_hWnd
, TVM_GETCOUNT
, 0, 0L);
4012 UINT
GetIndent() const
4014 ATLASSERT(::IsWindow(m_hWnd
));
4015 return (UINT
)::SendMessage(m_hWnd
, TVM_GETINDENT
, 0, 0L);
4018 void SetIndent(UINT nIndent
)
4020 ATLASSERT(::IsWindow(m_hWnd
));
4021 ::SendMessage(m_hWnd
, TVM_SETINDENT
, nIndent
, 0L);
4024 CImageList
GetImageList(int nImageListType
= TVSIL_NORMAL
) const
4026 ATLASSERT(::IsWindow(m_hWnd
));
4027 return CImageList((HIMAGELIST
)::SendMessage(m_hWnd
, TVM_GETIMAGELIST
, (WPARAM
)nImageListType
, 0L));
4030 CImageList
SetImageList(HIMAGELIST hImageList
, int nImageListType
= TVSIL_NORMAL
)
4032 ATLASSERT(::IsWindow(m_hWnd
));
4033 return CImageList((HIMAGELIST
)::SendMessage(m_hWnd
, TVM_SETIMAGELIST
, (WPARAM
)nImageListType
, (LPARAM
)hImageList
));
4036 BOOL
GetItem(LPTVITEM pItem
) const
4038 ATLASSERT(::IsWindow(m_hWnd
));
4039 return (BOOL
)::SendMessage(m_hWnd
, TVM_GETITEM
, 0, (LPARAM
)pItem
);
4042 BOOL
SetItem(LPTVITEM pItem
)
4044 ATLASSERT(::IsWindow(m_hWnd
));
4045 return (BOOL
)::SendMessage(m_hWnd
, TVM_SETITEM
, 0, (LPARAM
)pItem
);
4048 BOOL
SetItem(HTREEITEM hItem
, UINT nMask
, LPCTSTR lpszItem
, int nImage
,
4049 int nSelectedImage
, UINT nState
, UINT nStateMask
, LPARAM lParam
)
4051 ATLASSERT(::IsWindow(m_hWnd
));
4052 TVITEM item
= { 0 };
4055 item
.pszText
= (LPTSTR
) lpszItem
;
4056 item
.iImage
= nImage
;
4057 item
.iSelectedImage
= nSelectedImage
;
4058 item
.state
= nState
;
4059 item
.stateMask
= nStateMask
;
4060 item
.lParam
= lParam
;
4061 return (BOOL
)::SendMessage(m_hWnd
, TVM_SETITEM
, 0, (LPARAM
)&item
);
4064 BOOL
GetItemText(HTREEITEM hItem
, LPTSTR lpstrText
, int nLen
) const
4066 ATLASSERT(::IsWindow(m_hWnd
));
4067 ATLASSERT(lpstrText
!= NULL
);
4069 TVITEM item
= { 0 };
4071 item
.mask
= TVIF_TEXT
;
4072 item
.pszText
= lpstrText
;
4073 item
.cchTextMax
= nLen
;
4075 return (BOOL
)::SendMessage(m_hWnd
, TVM_GETITEM
, 0, (LPARAM
)&item
);
4079 BOOL
GetItemText(HTREEITEM hItem
, BSTR
& bstrText
) const
4082 ATLASSERT(::IsWindow(m_hWnd
));
4083 ATLASSERT(bstrText
== NULL
);
4084 TVITEM item
= { 0 };
4086 item
.mask
= TVIF_TEXT
;
4088 LPTSTR lpstrText
= NULL
;
4090 for(int nLen
= 256; ; nLen
*= 2)
4092 ATLTRY(lpstrText
= new TCHAR
[nLen
]);
4093 if(lpstrText
== NULL
)
4095 lpstrText
[0] = NULL
;
4096 item
.pszText
= lpstrText
;
4097 item
.cchTextMax
= nLen
;
4098 bRet
= (BOOL
)::SendMessage(m_hWnd
, TVM_GETITEM
, 0, (LPARAM
)&item
);
4099 if(!bRet
|| (lstrlen(item
.pszText
) < nLen
- 1))
4101 delete [] lpstrText
;
4105 if(lpstrText
!= NULL
)
4108 bstrText
= ::SysAllocString(T2OLE(lpstrText
));
4109 delete [] lpstrText
;
4112 return (bstrText
!= NULL
) ? TRUE
: FALSE
;
4114 #endif // !_ATL_NO_COM
4116 #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
4117 BOOL
GetItemText(HTREEITEM hItem
, _CSTRING_NS::CString
& strText
) const
4119 ATLASSERT(::IsWindow(m_hWnd
));
4120 TVITEM item
= { 0 };
4122 item
.mask
= TVIF_TEXT
;
4126 for(int nLen
= 256; ; nLen
*= 2)
4128 item
.pszText
= strText
.GetBufferSetLength(nLen
);
4129 if(item
.pszText
== NULL
)
4134 item
.cchTextMax
= nLen
;
4135 bRet
= (BOOL
)::SendMessage(m_hWnd
, TVM_GETITEM
, 0, (LPARAM
)&item
);
4136 if(!bRet
|| (lstrlen(item
.pszText
) < nLen
- 1))
4139 strText
.ReleaseBuffer();
4142 #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
4144 BOOL
SetItemText(HTREEITEM hItem
, LPCTSTR lpszItem
)
4146 ATLASSERT(::IsWindow(m_hWnd
));
4147 return SetItem(hItem
, TVIF_TEXT
, lpszItem
, 0, 0, 0, 0, NULL
);
4150 BOOL
GetItemImage(HTREEITEM hItem
, int& nImage
, int& nSelectedImage
) const
4152 ATLASSERT(::IsWindow(m_hWnd
));
4153 TVITEM item
= { 0 };
4155 item
.mask
= TVIF_IMAGE
|TVIF_SELECTEDIMAGE
;
4156 BOOL bRes
= (BOOL
)::SendMessage(m_hWnd
, TVM_GETITEM
, 0, (LPARAM
)&item
);
4159 nImage
= item
.iImage
;
4160 nSelectedImage
= item
.iSelectedImage
;
4165 BOOL
SetItemImage(HTREEITEM hItem
, int nImage
, int nSelectedImage
)
4167 ATLASSERT(::IsWindow(m_hWnd
));
4168 return SetItem(hItem
, TVIF_IMAGE
|TVIF_SELECTEDIMAGE
, NULL
, nImage
, nSelectedImage
, 0, 0, NULL
);
4171 UINT
GetItemState(HTREEITEM hItem
, UINT nStateMask
) const
4173 ATLASSERT(::IsWindow(m_hWnd
));
4174 #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
4175 return (((UINT
)::SendMessage(m_hWnd
, TVM_GETITEMSTATE
, (WPARAM
)hItem
, (LPARAM
)nStateMask
)) & nStateMask
);
4176 #else // !((_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE))
4177 TVITEM item
= { 0 };
4179 item
.mask
= TVIF_STATE
;
4181 item
.stateMask
= nStateMask
;
4182 ::SendMessage(m_hWnd
, TVM_GETITEM
, 0, (LPARAM
)&item
);
4183 return (item
.state
& nStateMask
);
4184 #endif // !((_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE))
4187 BOOL
SetItemState(HTREEITEM hItem
, UINT nState
, UINT nStateMask
)
4189 ATLASSERT(::IsWindow(m_hWnd
));
4190 return SetItem(hItem
, TVIF_STATE
, NULL
, 0, 0, nState
, nStateMask
, NULL
);
4193 DWORD_PTR
GetItemData(HTREEITEM hItem
) const
4195 ATLASSERT(::IsWindow(m_hWnd
));
4196 TVITEM item
= { 0 };
4198 item
.mask
= TVIF_PARAM
;
4199 BOOL bRet
= (BOOL
)::SendMessage(m_hWnd
, TVM_GETITEM
, 0, (LPARAM
)&item
);
4200 return (DWORD_PTR
)(bRet
? item
.lParam
: NULL
);
4203 BOOL
SetItemData(HTREEITEM hItem
, DWORD_PTR dwData
)
4205 ATLASSERT(::IsWindow(m_hWnd
));
4206 return SetItem(hItem
, TVIF_PARAM
, NULL
, 0, 0, 0, 0, (LPARAM
)dwData
);
4209 CEdit
GetEditControl() const
4211 ATLASSERT(::IsWindow(m_hWnd
));
4212 return CEdit((HWND
)::SendMessage(m_hWnd
, TVM_GETEDITCONTROL
, 0, 0L));
4215 UINT
GetVisibleCount() const
4217 ATLASSERT(::IsWindow(m_hWnd
));
4218 return (UINT
)::SendMessage(m_hWnd
, TVM_GETVISIBLECOUNT
, 0, 0L);
4221 BOOL
GetItemRect(HTREEITEM hItem
, LPRECT lpRect
, BOOL bTextOnly
) const
4223 ATLASSERT(::IsWindow(m_hWnd
));
4224 *(HTREEITEM
*)lpRect
= hItem
;
4225 return (BOOL
)::SendMessage(m_hWnd
, TVM_GETITEMRECT
, (WPARAM
)bTextOnly
, (LPARAM
)lpRect
);
4228 BOOL
ItemHasChildren(HTREEITEM hItem
) const
4230 ATLASSERT(::IsWindow(m_hWnd
));
4231 TVITEM item
= { 0 };
4233 item
.mask
= TVIF_CHILDREN
;
4234 ::SendMessage(m_hWnd
, TVM_GETITEM
, 0, (LPARAM
)&item
);
4235 return item
.cChildren
;
4239 CToolTipCtrl
GetToolTips() const
4241 ATLASSERT(::IsWindow(m_hWnd
));
4242 return CToolTipCtrl((HWND
)::SendMessage(m_hWnd
, TVM_GETTOOLTIPS
, 0, 0L));
4245 CToolTipCtrl
SetToolTips(HWND hWndTT
)
4247 ATLASSERT(::IsWindow(m_hWnd
));
4248 return CToolTipCtrl((HWND
)::SendMessage(m_hWnd
, TVM_SETTOOLTIPS
, (WPARAM
)hWndTT
, 0L));
4250 #endif // !_WIN32_WCE
4252 int GetISearchString(LPTSTR lpstr
) const
4254 ATLASSERT(::IsWindow(m_hWnd
));
4255 return (int)::SendMessage(m_hWnd
, TVM_GETISEARCHSTRING
, 0, (LPARAM
)lpstr
);
4259 BOOL
GetCheckState(HTREEITEM hItem
) const
4261 ATLASSERT(::IsWindow(m_hWnd
));
4262 ATLASSERT((GetStyle() & TVS_CHECKBOXES
) != 0);
4263 UINT uRet
= GetItemState(hItem
, TVIS_STATEIMAGEMASK
);
4264 return (uRet
>> 12) - 1;
4267 BOOL
SetCheckState(HTREEITEM hItem
, BOOL bCheck
)
4269 int nCheck
= bCheck
? 2 : 1; // one based index
4270 return SetItemState(hItem
, INDEXTOSTATEIMAGEMASK(nCheck
), TVIS_STATEIMAGEMASK
);
4273 #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
4274 COLORREF
GetBkColor() const
4276 ATLASSERT(::IsWindow(m_hWnd
));
4277 return (COLORREF
)::SendMessage(m_hWnd
, TVM_GETBKCOLOR
, 0, 0L);
4280 COLORREF
SetBkColor(COLORREF clr
)
4282 ATLASSERT(::IsWindow(m_hWnd
));
4283 return (COLORREF
)::SendMessage(m_hWnd
, TVM_SETBKCOLOR
, 0, (LPARAM
)clr
);
4286 COLORREF
GetInsertMarkColor() const
4288 ATLASSERT(::IsWindow(m_hWnd
));
4289 return (COLORREF
)::SendMessage(m_hWnd
, TVM_GETINSERTMARKCOLOR
, 0, 0L);
4292 COLORREF
SetInsertMarkColor(COLORREF clr
)
4294 ATLASSERT(::IsWindow(m_hWnd
));
4295 return (COLORREF
)::SendMessage(m_hWnd
, TVM_SETINSERTMARKCOLOR
, 0, (LPARAM
)clr
);
4298 int GetItemHeight() const
4300 ATLASSERT(::IsWindow(m_hWnd
));
4301 return (int)::SendMessage(m_hWnd
, TVM_GETITEMHEIGHT
, 0, 0L);
4304 int SetItemHeight(int cyHeight
)
4306 ATLASSERT(::IsWindow(m_hWnd
));
4307 return (int)::SendMessage(m_hWnd
, TVM_SETITEMHEIGHT
, cyHeight
, 0L);
4310 int GetScrollTime() const
4312 ATLASSERT(::IsWindow(m_hWnd
));
4313 return (int)::SendMessage(m_hWnd
, TVM_GETSCROLLTIME
, 0, 0L);
4316 int SetScrollTime(int nScrollTime
)
4318 ATLASSERT(::IsWindow(m_hWnd
));
4319 return (int)::SendMessage(m_hWnd
, TVM_SETSCROLLTIME
, nScrollTime
, 0L);
4322 COLORREF
GetTextColor() const
4324 ATLASSERT(::IsWindow(m_hWnd
));
4325 return (COLORREF
)::SendMessage(m_hWnd
, TVM_GETTEXTCOLOR
, 0, 0L);
4328 COLORREF
SetTextColor(COLORREF clr
)
4330 ATLASSERT(::IsWindow(m_hWnd
));
4331 return (COLORREF
)::SendMessage(m_hWnd
, TVM_SETTEXTCOLOR
, 0, (LPARAM
)clr
);
4334 BOOL
GetUnicodeFormat() const
4336 ATLASSERT(::IsWindow(m_hWnd
));
4337 return (BOOL
)::SendMessage(m_hWnd
, TVM_GETUNICODEFORMAT
, 0, 0L);
4340 BOOL
SetUnicodeFormat(BOOL bUnicode
= TRUE
)
4342 ATLASSERT(::IsWindow(m_hWnd
));
4343 return (BOOL
)::SendMessage(m_hWnd
, TVM_SETUNICODEFORMAT
, bUnicode
, 0L);
4345 #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
4347 #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
4348 COLORREF
GetLineColor() const
4350 ATLASSERT(::IsWindow(m_hWnd
));
4351 return (COLORREF
)::SendMessage(m_hWnd
, TVM_GETLINECOLOR
, 0, 0L);
4354 COLORREF
SetLineColor(COLORREF clrNew
/*= CLR_DEFAULT*/)
4356 ATLASSERT(::IsWindow(m_hWnd
));
4357 return (COLORREF
)::SendMessage(m_hWnd
, TVM_SETLINECOLOR
, 0, (LPARAM
)clrNew
);
4359 #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
4361 #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
4362 BOOL
GetItem(LPTVITEMEX pItem
) const
4364 ATLASSERT(::IsWindow(m_hWnd
));
4365 return (BOOL
)::SendMessage(m_hWnd
, TVM_GETITEM
, 0, (LPARAM
)pItem
);
4368 BOOL
SetItem(LPTVITEMEX pItem
)
4370 ATLASSERT(::IsWindow(m_hWnd
));
4371 return (BOOL
)::SendMessage(m_hWnd
, TVM_SETITEM
, 0, (LPARAM
)pItem
);
4373 #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
4375 DWORD
GetExtendedStyle() const
4377 #ifndef TVM_GETEXTENDEDSTYLE
4378 const UINT TVM_GETEXTENDEDSTYLE
= (TV_FIRST
+ 45);
4380 ATLASSERT(::IsWindow(m_hWnd
));
4381 return (DWORD
)::SendMessage(m_hWnd
, TVM_GETEXTENDEDSTYLE
, 0, 0L);
4384 DWORD
SetExtendedStyle(DWORD dwStyle
, DWORD dwMask
)
4386 #ifndef TVM_SETEXTENDEDSTYLE
4387 const UINT TVM_SETEXTENDEDSTYLE
= (TV_FIRST
+ 44);
4389 ATLASSERT(::IsWindow(m_hWnd
));
4390 return (DWORD
)::SendMessage(m_hWnd
, TVM_SETEXTENDEDSTYLE
, dwMask
, dwStyle
);
4393 #if (_WIN32_WINNT >= 0x0600)
4394 BOOL
SetAutoScrollInfo(UINT uPixPerSec
, UINT uUpdateTime
)
4396 ATLASSERT(::IsWindow(m_hWnd
));
4397 return (BOOL
)::SendMessage(m_hWnd
, TVM_SETAUTOSCROLLINFO
, (WPARAM
)uPixPerSec
, (LPARAM
)uUpdateTime
);
4400 DWORD
GetSelectedCount() const
4402 ATLASSERT(::IsWindow(m_hWnd
));
4403 return (DWORD
)::SendMessage(m_hWnd
, TVM_GETSELECTEDCOUNT
, 0, 0L);
4406 BOOL
GetItemPartRect(HTREEITEM hItem
, TVITEMPART partID
, LPRECT lpRect
) const
4408 ATLASSERT(::IsWindow(m_hWnd
));
4409 TVGETITEMPARTRECTINFO gipri
= { hItem
, lpRect
, partID
};
4410 return (BOOL
)::SendMessage(m_hWnd
, TVM_GETITEMPARTRECT
, 0, (LPARAM
)&gipri
);
4412 #endif // (_WIN32_WINNT >= 0x0600)
4415 HTREEITEM
InsertItem(LPTVINSERTSTRUCT lpInsertStruct
)
4417 ATLASSERT(::IsWindow(m_hWnd
));
4418 return (HTREEITEM
)::SendMessage(m_hWnd
, TVM_INSERTITEM
, 0, (LPARAM
)lpInsertStruct
);
4421 HTREEITEM
InsertItem(LPCTSTR lpszItem
, int nImage
,
4422 int nSelectedImage
, HTREEITEM hParent
, HTREEITEM hInsertAfter
)
4424 ATLASSERT(::IsWindow(m_hWnd
));
4425 return InsertItem(TVIF_TEXT
| TVIF_IMAGE
| TVIF_SELECTEDIMAGE
, lpszItem
, nImage
, nSelectedImage
, 0, 0, 0, hParent
, hInsertAfter
);
4428 HTREEITEM
InsertItem(LPCTSTR lpszItem
, HTREEITEM hParent
, HTREEITEM hInsertAfter
)
4430 ATLASSERT(::IsWindow(m_hWnd
));
4431 return InsertItem(TVIF_TEXT
, lpszItem
, 0, 0, 0, 0, 0, hParent
, hInsertAfter
);
4434 HTREEITEM
InsertItem(UINT nMask
, LPCTSTR lpszItem
, int nImage
,
4435 int nSelectedImage
, UINT nState
, UINT nStateMask
, LPARAM lParam
,
4436 HTREEITEM hParent
, HTREEITEM hInsertAfter
)
4438 ATLASSERT(::IsWindow(m_hWnd
));
4439 TVINSERTSTRUCT tvis
= { 0 };
4440 tvis
.hParent
= hParent
;
4441 tvis
.hInsertAfter
= hInsertAfter
;
4442 tvis
.item
.mask
= nMask
;
4443 tvis
.item
.pszText
= (LPTSTR
) lpszItem
;
4444 tvis
.item
.iImage
= nImage
;
4445 tvis
.item
.iSelectedImage
= nSelectedImage
;
4446 tvis
.item
.state
= nState
;
4447 tvis
.item
.stateMask
= nStateMask
;
4448 tvis
.item
.lParam
= lParam
;
4449 return (HTREEITEM
)::SendMessage(m_hWnd
, TVM_INSERTITEM
, 0, (LPARAM
)&tvis
);
4452 BOOL
DeleteItem(HTREEITEM hItem
)
4454 ATLASSERT(::IsWindow(m_hWnd
));
4455 return (BOOL
)::SendMessage(m_hWnd
, TVM_DELETEITEM
, 0, (LPARAM
)hItem
);
4458 BOOL
DeleteAllItems()
4460 ATLASSERT(::IsWindow(m_hWnd
));
4461 return (BOOL
)::SendMessage(m_hWnd
, TVM_DELETEITEM
, 0, (LPARAM
)TVI_ROOT
);
4464 BOOL
Expand(HTREEITEM hItem
, UINT nCode
= TVE_EXPAND
)
4466 ATLASSERT(::IsWindow(m_hWnd
));
4467 return (BOOL
)::SendMessage(m_hWnd
, TVM_EXPAND
, nCode
, (LPARAM
)hItem
);
4470 HTREEITEM
GetNextItem(HTREEITEM hItem
, UINT nCode
) const
4472 ATLASSERT(::IsWindow(m_hWnd
));
4473 return (HTREEITEM
)::SendMessage(m_hWnd
, TVM_GETNEXTITEM
, nCode
, (LPARAM
)hItem
);
4476 HTREEITEM
GetChildItem(HTREEITEM hItem
) const
4478 ATLASSERT(::IsWindow(m_hWnd
));
4479 return (HTREEITEM
)::SendMessage(m_hWnd
, TVM_GETNEXTITEM
, TVGN_CHILD
, (LPARAM
)hItem
);
4482 HTREEITEM
GetNextSiblingItem(HTREEITEM hItem
) const
4484 ATLASSERT(::IsWindow(m_hWnd
));
4485 return (HTREEITEM
)::SendMessage(m_hWnd
, TVM_GETNEXTITEM
, TVGN_NEXT
, (LPARAM
)hItem
);
4488 HTREEITEM
GetPrevSiblingItem(HTREEITEM hItem
) const
4490 ATLASSERT(::IsWindow(m_hWnd
));
4491 return (HTREEITEM
)::SendMessage(m_hWnd
, TVM_GETNEXTITEM
, TVGN_PREVIOUS
, (LPARAM
)hItem
);
4494 HTREEITEM
GetParentItem(HTREEITEM hItem
) const
4496 ATLASSERT(::IsWindow(m_hWnd
));
4497 return (HTREEITEM
)::SendMessage(m_hWnd
, TVM_GETNEXTITEM
, TVGN_PARENT
, (LPARAM
)hItem
);
4500 HTREEITEM
GetFirstVisibleItem() const
4502 ATLASSERT(::IsWindow(m_hWnd
));
4503 return (HTREEITEM
)::SendMessage(m_hWnd
, TVM_GETNEXTITEM
, TVGN_FIRSTVISIBLE
, 0L);
4506 HTREEITEM
GetNextVisibleItem(HTREEITEM hItem
) const
4508 ATLASSERT(::IsWindow(m_hWnd
));
4509 return (HTREEITEM
)::SendMessage(m_hWnd
, TVM_GETNEXTITEM
, TVGN_NEXTVISIBLE
, (LPARAM
)hItem
);
4512 HTREEITEM
GetPrevVisibleItem(HTREEITEM hItem
) const
4514 ATLASSERT(::IsWindow(m_hWnd
));
4515 return (HTREEITEM
)::SendMessage(m_hWnd
, TVM_GETNEXTITEM
, TVGN_PREVIOUSVISIBLE
, (LPARAM
)hItem
);
4518 HTREEITEM
GetSelectedItem() const
4520 ATLASSERT(::IsWindow(m_hWnd
));
4521 return (HTREEITEM
)::SendMessage(m_hWnd
, TVM_GETNEXTITEM
, TVGN_CARET
, 0L);
4524 HTREEITEM
GetDropHilightItem() const
4526 ATLASSERT(::IsWindow(m_hWnd
));
4527 return (HTREEITEM
)::SendMessage(m_hWnd
, TVM_GETNEXTITEM
, TVGN_DROPHILITE
, 0L);
4530 HTREEITEM
GetRootItem() const
4532 ATLASSERT(::IsWindow(m_hWnd
));
4533 return (HTREEITEM
)::SendMessage(m_hWnd
, TVM_GETNEXTITEM
, TVGN_ROOT
, 0L);
4536 #if !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400)
4537 HTREEITEM
GetLastVisibleItem() const
4539 ATLASSERT(::IsWindow(m_hWnd
));
4540 return (HTREEITEM
)::SendMessage(m_hWnd
, TVM_GETNEXTITEM
, TVGN_LASTVISIBLE
, 0L);
4542 #endif // !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400)
4544 #if (_WIN32_IE >= 0x0600)
4545 HTREEITEM
GetNextSelectedItem() const
4547 ATLASSERT(::IsWindow(m_hWnd
));
4548 return (HTREEITEM
)::SendMessage(m_hWnd
, TVM_GETNEXTITEM
, TVGN_NEXTSELECTED
, 0L);
4550 #endif // (_WIN32_IE >= 0x0600)
4552 BOOL
Select(HTREEITEM hItem
, UINT nCode
)
4554 ATLASSERT(::IsWindow(m_hWnd
));
4555 return (BOOL
)::SendMessage(m_hWnd
, TVM_SELECTITEM
, nCode
, (LPARAM
)hItem
);
4558 BOOL
SelectItem(HTREEITEM hItem
)
4560 ATLASSERT(::IsWindow(m_hWnd
));
4561 return (BOOL
)::SendMessage(m_hWnd
, TVM_SELECTITEM
, TVGN_CARET
, (LPARAM
)hItem
);
4564 BOOL
SelectDropTarget(HTREEITEM hItem
)
4566 ATLASSERT(::IsWindow(m_hWnd
));
4567 return (BOOL
)::SendMessage(m_hWnd
, TVM_SELECTITEM
, TVGN_DROPHILITE
, (LPARAM
)hItem
);
4570 BOOL
SelectSetFirstVisible(HTREEITEM hItem
)
4572 ATLASSERT(::IsWindow(m_hWnd
));
4573 return (BOOL
)::SendMessage(m_hWnd
, TVM_SELECTITEM
, TVGN_FIRSTVISIBLE
, (LPARAM
)hItem
);
4576 CEdit
EditLabel(HTREEITEM hItem
)
4578 ATLASSERT(::IsWindow(m_hWnd
));
4579 return CEdit((HWND
)::SendMessage(m_hWnd
, TVM_EDITLABEL
, 0, (LPARAM
)hItem
));
4582 BOOL
EndEditLabelNow(BOOL bCancel
)
4584 ATLASSERT(::IsWindow(m_hWnd
));
4585 return (BOOL
)::SendMessage(m_hWnd
, TVM_ENDEDITLABELNOW
, bCancel
, 0L);
4588 HTREEITEM
HitTest(TVHITTESTINFO
* pHitTestInfo
) const
4590 ATLASSERT(::IsWindow(m_hWnd
));
4591 return (HTREEITEM
)::SendMessage(m_hWnd
, TVM_HITTEST
, 0, (LPARAM
)pHitTestInfo
);
4594 HTREEITEM
HitTest(POINT pt
, UINT
* pFlags
) const
4596 ATLASSERT(::IsWindow(m_hWnd
));
4597 TVHITTESTINFO hti
= { 0 };
4599 HTREEITEM hTreeItem
= (HTREEITEM
)::SendMessage(m_hWnd
, TVM_HITTEST
, 0, (LPARAM
)&hti
);
4601 *pFlags
= hti
.flags
;
4605 BOOL
SortChildren(HTREEITEM hItem
, BOOL bRecurse
= FALSE
)
4607 ATLASSERT(::IsWindow(m_hWnd
));
4608 return (BOOL
)::SendMessage(m_hWnd
, TVM_SORTCHILDREN
, (WPARAM
)bRecurse
, (LPARAM
)hItem
);
4611 BOOL
EnsureVisible(HTREEITEM hItem
)
4613 ATLASSERT(::IsWindow(m_hWnd
));
4614 return (BOOL
)::SendMessage(m_hWnd
, TVM_ENSUREVISIBLE
, 0, (LPARAM
)hItem
);
4617 BOOL
SortChildrenCB(LPTVSORTCB pSort
, BOOL bRecurse
= FALSE
)
4619 ATLASSERT(::IsWindow(m_hWnd
));
4620 return (BOOL
)::SendMessage(m_hWnd
, TVM_SORTCHILDRENCB
, (WPARAM
)bRecurse
, (LPARAM
)pSort
);
4623 CImageList
RemoveImageList(int nImageList
)
4625 ATLASSERT(::IsWindow(m_hWnd
));
4626 return CImageList((HIMAGELIST
)::SendMessage(m_hWnd
, TVM_SETIMAGELIST
, (WPARAM
)nImageList
, NULL
));
4629 CImageList
CreateDragImage(HTREEITEM hItem
)
4631 ATLASSERT(::IsWindow(m_hWnd
));
4632 return CImageList((HIMAGELIST
)::SendMessage(m_hWnd
, TVM_CREATEDRAGIMAGE
, 0, (LPARAM
)hItem
));
4635 #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
4636 BOOL
SetInsertMark(HTREEITEM hTreeItem
, BOOL bAfter
)
4638 ATLASSERT(::IsWindow(m_hWnd
));
4639 return (BOOL
)::SendMessage(m_hWnd
, TVM_SETINSERTMARK
, bAfter
, (LPARAM
)hTreeItem
);
4642 BOOL
RemoveInsertMark()
4644 ATLASSERT(::IsWindow(m_hWnd
));
4645 return (BOOL
)::SendMessage(m_hWnd
, TVM_SETINSERTMARK
, 0, 0L);
4647 #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
4649 #if (_WIN32_WINNT >= 0x0501)
4650 HTREEITEM
MapAccIDToHTREEITEM(UINT uID
) const
4652 ATLASSERT(::IsWindow(m_hWnd
));
4653 return (HTREEITEM
)::SendMessage(m_hWnd
, TVM_MAPACCIDTOHTREEITEM
, uID
, 0L);
4656 UINT
MapHTREEITEMToAccID(HTREEITEM hTreeItem
) const
4658 ATLASSERT(::IsWindow(m_hWnd
));
4659 return (UINT
)::SendMessage(m_hWnd
, TVM_MAPHTREEITEMTOACCID
, (WPARAM
)hTreeItem
, 0L);
4661 #endif // (_WIN32_WINNT >= 0x0501)
4663 #if (_WIN32_WINNT >= 0x0600)
4664 void ShowInfoTip(HTREEITEM hItem
)
4666 ATLASSERT(::IsWindow(m_hWnd
));
4667 ::SendMessage(m_hWnd
, TVM_SHOWINFOTIP
, 0, (LPARAM
)hItem
);
4669 #endif // (_WIN32_WINNT >= 0x0600)
4672 typedef CTreeViewCtrlT
<ATL::CWindow
> CTreeViewCtrl
;
4675 ///////////////////////////////////////////////////////////////////////////////
4678 // forward declaration
4679 template <class TBase
> class CTreeViewCtrlExT
;
4681 // Note: TBase here is for CTreeViewCtrlExT, and not for CTreeItemT itself
4682 template <class TBase
>
4686 HTREEITEM m_hTreeItem
;
4687 CTreeViewCtrlExT
<TBase
>* m_pTreeView
;
4690 CTreeItemT(HTREEITEM hTreeItem
= NULL
, CTreeViewCtrlExT
<TBase
>* pTreeView
= NULL
) : m_hTreeItem(hTreeItem
), m_pTreeView(pTreeView
)
4693 CTreeItemT(const CTreeItemT
<TBase
>& posSrc
)
4698 operator HTREEITEM() { return m_hTreeItem
; }
4700 CTreeItemT
<TBase
>& operator =(const CTreeItemT
<TBase
>& itemSrc
)
4702 m_hTreeItem
= itemSrc
.m_hTreeItem
;
4703 m_pTreeView
= itemSrc
.m_pTreeView
;
4708 CTreeViewCtrlExT
<TBase
>* GetTreeView() const { return m_pTreeView
; }
4710 BOOL
operator !() const { return m_hTreeItem
== NULL
; }
4712 BOOL
IsNull() const { return m_hTreeItem
== NULL
; }
4714 BOOL
GetRect(LPRECT lpRect
, BOOL bTextOnly
) const;
4715 BOOL
GetText(LPTSTR lpstrText
, int nLen
) const;
4717 BOOL
GetText(BSTR
& bstrText
) const;
4718 #endif // !_ATL_NO_COM
4719 #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
4720 BOOL
GetText(_CSTRING_NS::CString
& strText
) const;
4721 #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
4722 BOOL
SetText(LPCTSTR lpszItem
);
4723 BOOL
GetImage(int& nImage
, int& nSelectedImage
) const;
4724 BOOL
SetImage(int nImage
, int nSelectedImage
);
4725 UINT
GetState(UINT nStateMask
) const;
4726 BOOL
SetState(UINT nState
, UINT nStateMask
);
4727 DWORD_PTR
GetData() const;
4728 BOOL
SetData(DWORD_PTR dwData
);
4729 BOOL
SetItem(UINT nMask
, LPCTSTR lpszItem
, int nImage
, int nSelectedImage
, UINT nState
, UINT nStateMask
, LPARAM lParam
);
4732 CTreeItemT
<TBase
> InsertAfter(LPCTSTR lpstrItem
, HTREEITEM hItemAfter
, int nImageIndex
)
4734 return _Insert(lpstrItem
, nImageIndex
, hItemAfter
);
4737 CTreeItemT
<TBase
> AddHead(LPCTSTR lpstrItem
, int nImageIndex
)
4739 return _Insert(lpstrItem
, nImageIndex
, TVI_FIRST
);
4742 CTreeItemT
<TBase
> AddTail(LPCTSTR lpstrItem
, int nImageIndex
)
4744 return _Insert(lpstrItem
, nImageIndex
, TVI_LAST
);
4747 CTreeItemT
<TBase
> GetChild() const;
4748 CTreeItemT
<TBase
> GetNext(UINT nCode
) const;
4749 CTreeItemT
<TBase
> GetNextSibling() const;
4750 CTreeItemT
<TBase
> GetPrevSibling() const;
4751 CTreeItemT
<TBase
> GetParent() const;
4752 CTreeItemT
<TBase
> GetFirstVisible() const;
4753 CTreeItemT
<TBase
> GetNextVisible() const;
4754 CTreeItemT
<TBase
> GetPrevVisible() const;
4755 CTreeItemT
<TBase
> GetSelected() const;
4756 CTreeItemT
<TBase
> GetDropHilight() const;
4757 CTreeItemT
<TBase
> GetRoot() const;
4758 #if !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400)
4759 CTreeItemT
<TBase
> GetLastVisible() const;
4760 #endif // !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400)
4761 #if (_WIN32_IE >= 0x0600)
4762 CTreeItemT
<TBase
> GetNextSelected() const;
4763 #endif // (_WIN32_IE >= 0x0600)
4764 BOOL
HasChildren() const;
4766 BOOL
Expand(UINT nCode
= TVE_EXPAND
);
4767 BOOL
Select(UINT nCode
);
4769 BOOL
SelectDropTarget();
4770 BOOL
SelectSetFirstVisible();
4772 HIMAGELIST
CreateDragImage();
4773 BOOL
SortChildren(BOOL bRecurse
= FALSE
);
4774 BOOL
EnsureVisible();
4775 CTreeItemT
<TBase
> _Insert(LPCTSTR lpstrItem
, int nImageIndex
, HTREEITEM hItemAfter
);
4776 int GetImageIndex() const;
4777 #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
4778 BOOL
SetInsertMark(BOOL bAfter
);
4779 #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
4780 #if (_WIN32_WINNT >= 0x0501)
4781 UINT
MapHTREEITEMToAccID() const;
4782 #endif // (_WIN32_WINNT >= 0x0501)
4783 #if (_WIN32_WINNT >= 0x0600)
4785 BOOL
GetPartRect(TVITEMPART partID
, LPRECT lpRect
) const;
4786 #endif // (_WIN32_WINNT >= 0x0600)
4789 typedef CTreeItemT
<ATL::CWindow
> CTreeItem
;
4792 template <class TBase
>
4793 class CTreeViewCtrlExT
: public CTreeViewCtrlT
< TBase
>
4797 CTreeViewCtrlExT(HWND hWnd
= NULL
) : CTreeViewCtrlT
< TBase
>(hWnd
)
4800 CTreeViewCtrlExT
< TBase
>& operator =(HWND hWnd
)
4806 // Operations (overides that return CTreeItem)
4807 CTreeItemT
<TBase
> InsertItem(LPTVINSERTSTRUCT lpInsertStruct
)
4809 ATLASSERT(::IsWindow(m_hWnd
));
4810 HTREEITEM hTreeItem
= (HTREEITEM
)::SendMessage(m_hWnd
, TVM_INSERTITEM
, 0, (LPARAM
)lpInsertStruct
);
4811 return CTreeItemT
<TBase
>(hTreeItem
, this);
4814 CTreeItemT
<TBase
> InsertItem(LPCTSTR lpszItem
, int nImage
,
4815 int nSelectedImage
, HTREEITEM hParent
, HTREEITEM hInsertAfter
)
4817 ATLASSERT(::IsWindow(m_hWnd
));
4818 return InsertItem(TVIF_TEXT
| TVIF_IMAGE
| TVIF_SELECTEDIMAGE
, lpszItem
, nImage
, nSelectedImage
, 0, 0, 0, hParent
, hInsertAfter
);
4821 CTreeItemT
<TBase
> InsertItem(LPCTSTR lpszItem
, HTREEITEM hParent
, HTREEITEM hInsertAfter
)
4823 ATLASSERT(::IsWindow(m_hWnd
));
4824 return InsertItem(TVIF_TEXT
, lpszItem
, 0, 0, 0, 0, 0, hParent
, hInsertAfter
);
4827 CTreeItemT
<TBase
> GetNextItem(HTREEITEM hItem
, UINT nCode
) const
4829 ATLASSERT(::IsWindow(m_hWnd
));
4830 HTREEITEM hTreeItem
= (HTREEITEM
)::SendMessage(m_hWnd
, TVM_GETNEXTITEM
, nCode
, (LPARAM
)hItem
);
4831 return CTreeItemT
<TBase
>(hTreeItem
, (CTreeViewCtrlExT
<TBase
>*)this);
4834 CTreeItemT
<TBase
> GetChildItem(HTREEITEM hItem
) const
4836 ATLASSERT(::IsWindow(m_hWnd
));
4837 HTREEITEM hTreeItem
= (HTREEITEM
)::SendMessage(m_hWnd
, TVM_GETNEXTITEM
, TVGN_CHILD
, (LPARAM
)hItem
);
4838 return CTreeItemT
<TBase
>(hTreeItem
, (CTreeViewCtrlExT
<TBase
>*)this);
4841 CTreeItemT
<TBase
> GetNextSiblingItem(HTREEITEM hItem
) const
4843 ATLASSERT(::IsWindow(m_hWnd
));
4844 HTREEITEM hTreeItem
= (HTREEITEM
)::SendMessage(m_hWnd
, TVM_GETNEXTITEM
, TVGN_NEXT
, (LPARAM
)hItem
);
4845 return CTreeItemT
<TBase
>(hTreeItem
, (CTreeViewCtrlExT
<TBase
>*)this);
4848 CTreeItemT
<TBase
> GetPrevSiblingItem(HTREEITEM hItem
) const
4850 ATLASSERT(::IsWindow(m_hWnd
));
4851 HTREEITEM hTreeItem
= (HTREEITEM
)::SendMessage(m_hWnd
, TVM_GETNEXTITEM
, TVGN_PREVIOUS
, (LPARAM
)hItem
);
4852 return CTreeItemT
<TBase
>(hTreeItem
, (CTreeViewCtrlExT
<TBase
>*)this);
4855 CTreeItemT
<TBase
> GetParentItem(HTREEITEM hItem
) const
4857 ATLASSERT(::IsWindow(m_hWnd
));
4858 HTREEITEM hTreeItem
= (HTREEITEM
)::SendMessage(m_hWnd
, TVM_GETNEXTITEM
, TVGN_PARENT
, (LPARAM
)hItem
);
4859 return CTreeItemT
<TBase
>(hTreeItem
, (CTreeViewCtrlExT
<TBase
>*)this);
4862 CTreeItemT
<TBase
> GetFirstVisibleItem() const
4864 ATLASSERT(::IsWindow(m_hWnd
));
4865 HTREEITEM hTreeItem
= (HTREEITEM
)::SendMessage(m_hWnd
, TVM_GETNEXTITEM
, TVGN_FIRSTVISIBLE
, 0L);
4866 return CTreeItemT
<TBase
>(hTreeItem
, (CTreeViewCtrlExT
<TBase
>*)this);
4869 CTreeItemT
<TBase
> GetNextVisibleItem(HTREEITEM hItem
) const
4871 ATLASSERT(::IsWindow(m_hWnd
));
4872 HTREEITEM hTreeItem
= (HTREEITEM
)::SendMessage(m_hWnd
, TVM_GETNEXTITEM
, TVGN_NEXTVISIBLE
, (LPARAM
)hItem
);
4873 return CTreeItemT
<TBase
>(hTreeItem
, (CTreeViewCtrlExT
<TBase
>*)this);
4876 CTreeItemT
<TBase
> GetPrevVisibleItem(HTREEITEM hItem
) const
4878 ATLASSERT(::IsWindow(m_hWnd
));
4879 HTREEITEM hTreeItem
= (HTREEITEM
)::SendMessage(m_hWnd
, TVM_GETNEXTITEM
, TVGN_PREVIOUSVISIBLE
, (LPARAM
)hItem
);
4880 return CTreeItemT
<TBase
>(hTreeItem
, (CTreeViewCtrlExT
<TBase
>*)this);
4883 CTreeItemT
<TBase
> GetSelectedItem() const
4885 ATLASSERT(::IsWindow(m_hWnd
));
4886 HTREEITEM hTreeItem
= (HTREEITEM
)::SendMessage(m_hWnd
, TVM_GETNEXTITEM
, TVGN_CARET
, 0L);
4887 return CTreeItemT
<TBase
>(hTreeItem
, (CTreeViewCtrlExT
<TBase
>*)this);
4890 CTreeItemT
<TBase
> GetDropHilightItem() const
4892 ATLASSERT(::IsWindow(m_hWnd
));
4893 HTREEITEM hTreeItem
= (HTREEITEM
)::SendMessage(m_hWnd
, TVM_GETNEXTITEM
, TVGN_DROPHILITE
, 0L);
4894 return CTreeItemT
<TBase
>(hTreeItem
, (CTreeViewCtrlExT
<TBase
>*)this);
4897 CTreeItemT
<TBase
> GetRootItem() const
4899 ATLASSERT(::IsWindow(m_hWnd
));
4900 HTREEITEM hTreeItem
= (HTREEITEM
)::SendMessage(m_hWnd
, TVM_GETNEXTITEM
, TVGN_ROOT
, 0L);
4901 return CTreeItemT
<TBase
>(hTreeItem
, (CTreeViewCtrlExT
<TBase
>*)this);
4904 #if !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400)
4905 CTreeItemT
<TBase
> GetLastVisibleItem() const
4907 ATLASSERT(::IsWindow(m_hWnd
));
4908 HTREEITEM hTreeItem
= (HTREEITEM
)::SendMessage(m_hWnd
, TVM_GETNEXTITEM
, TVGN_LASTVISIBLE
, 0L);
4909 return CTreeItemT
<TBase
>(hTreeItem
, (CTreeViewCtrlExT
<TBase
>*)this);
4911 #endif // !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400)
4913 #if (_WIN32_IE >= 0x0600)
4914 CTreeItemT
<TBase
> GetNextSelectedItem() const
4916 ATLASSERT(::IsWindow(m_hWnd
));
4917 HTREEITEM hTreeItem
= (HTREEITEM
)::SendMessage(m_hWnd
, TVM_GETNEXTITEM
, TVGN_NEXTSELECTED
, 0L);
4918 return CTreeItemT
<TBase
>(hTreeItem
, (CTreeViewCtrlExT
<TBase
>*)this);
4920 #endif // (_WIN32_IE >= 0x0600)
4922 CTreeItemT
<TBase
> HitTest(TVHITTESTINFO
* pHitTestInfo
) const
4924 ATLASSERT(::IsWindow(m_hWnd
));
4925 HTREEITEM hTreeItem
= (HTREEITEM
)::SendMessage(m_hWnd
, TVM_HITTEST
, 0, (LPARAM
)pHitTestInfo
);
4926 return CTreeItemT
<TBase
>(hTreeItem
, (CTreeViewCtrlExT
<TBase
>*)this);
4929 CTreeItemT
<TBase
> InsertItem(UINT nMask
, LPCTSTR lpszItem
, int nImage
,
4930 int nSelectedImage
, UINT nState
, UINT nStateMask
, LPARAM lParam
,
4931 HTREEITEM hParent
, HTREEITEM hInsertAfter
)
4933 ATLASSERT(::IsWindow(m_hWnd
));
4934 TVINSERTSTRUCT tvis
= { 0 };
4935 tvis
.hParent
= hParent
;
4936 tvis
.hInsertAfter
= hInsertAfter
;
4937 tvis
.item
.mask
= nMask
;
4938 tvis
.item
.pszText
= (LPTSTR
) lpszItem
;
4939 tvis
.item
.iImage
= nImage
;
4940 tvis
.item
.iSelectedImage
= nSelectedImage
;
4941 tvis
.item
.state
= nState
;
4942 tvis
.item
.stateMask
= nStateMask
;
4943 tvis
.item
.lParam
= lParam
;
4944 HTREEITEM hTreeItem
= (HTREEITEM
)::SendMessage(m_hWnd
, TVM_INSERTITEM
, 0, (LPARAM
)&tvis
);
4945 return CTreeItemT
<TBase
>(hTreeItem
, this);
4948 CTreeItemT
<TBase
> HitTest(POINT pt
, UINT
* pFlags
) const
4950 ATLASSERT(::IsWindow(m_hWnd
));
4951 TVHITTESTINFO hti
= { 0 };
4953 HTREEITEM hTreeItem
= (HTREEITEM
)::SendMessage(m_hWnd
, TVM_HITTEST
, 0, (LPARAM
)&hti
);
4955 *pFlags
= hti
.flags
;
4956 return CTreeItemT
<TBase
>(hTreeItem
, (CTreeViewCtrlExT
<TBase
>*)this);
4959 #if (_WIN32_WINNT >= 0x0501)
4960 CTreeItemT
<TBase
> MapAccIDToHTREEITEM(UINT uID
) const
4962 ATLASSERT(::IsWindow(m_hWnd
));
4963 HTREEITEM hTreeItem
= (HTREEITEM
)::SendMessage(m_hWnd
, TVM_MAPACCIDTOHTREEITEM
, uID
, 0L);
4964 return CTreeItemT
<TBase
>(hTreeItem
, (CTreeViewCtrlExT
<TBase
>*)this);
4966 #endif // (_WIN32_WINNT >= 0x0501)
4969 typedef CTreeViewCtrlExT
<ATL::CWindow
> CTreeViewCtrlEx
;
4972 // CTreeItem inline methods
4973 template <class TBase
>
4974 inline BOOL CTreeItemT
<TBase
>::GetRect(LPRECT lpRect
, BOOL bTextOnly
) const
4976 ATLASSERT(m_pTreeView
!= NULL
);
4977 return m_pTreeView
->GetItemRect(m_hTreeItem
,lpRect
,bTextOnly
);
4980 template <class TBase
>
4981 inline CTreeItemT
<TBase
> CTreeItemT
<TBase
>::GetNext(UINT nCode
) const
4983 ATLASSERT(m_pTreeView
!= NULL
);
4984 return m_pTreeView
->GetNextItem(m_hTreeItem
,nCode
);
4987 template <class TBase
>
4988 inline CTreeItemT
<TBase
> CTreeItemT
<TBase
>::GetChild() const
4990 ATLASSERT(m_pTreeView
!= NULL
);
4991 return m_pTreeView
->GetChildItem(m_hTreeItem
);
4994 template <class TBase
>
4995 inline CTreeItemT
<TBase
> CTreeItemT
<TBase
>::GetNextSibling() const
4997 ATLASSERT(m_pTreeView
!= NULL
);
4998 return m_pTreeView
->GetNextSiblingItem(m_hTreeItem
);
5001 template <class TBase
>
5002 inline CTreeItemT
<TBase
> CTreeItemT
<TBase
>::GetPrevSibling() const
5004 ATLASSERT(m_pTreeView
!= NULL
);
5005 return m_pTreeView
->GetPrevSiblingItem(m_hTreeItem
);
5008 template <class TBase
>
5009 inline CTreeItemT
<TBase
> CTreeItemT
<TBase
>::GetParent() const
5011 ATLASSERT(m_pTreeView
!= NULL
);
5012 return m_pTreeView
->GetParentItem(m_hTreeItem
);
5015 template <class TBase
>
5016 inline CTreeItemT
<TBase
> CTreeItemT
<TBase
>::GetFirstVisible() const
5018 ATLASSERT(m_pTreeView
!= NULL
);
5019 return m_pTreeView
->GetFirstVisibleItem();
5022 template <class TBase
>
5023 inline CTreeItemT
<TBase
> CTreeItemT
<TBase
>::GetNextVisible() const
5025 ATLASSERT(m_pTreeView
!= NULL
);
5026 return m_pTreeView
->GetNextVisibleItem(m_hTreeItem
);
5029 template <class TBase
>
5030 inline CTreeItemT
<TBase
> CTreeItemT
<TBase
>::GetPrevVisible() const
5032 ATLASSERT(m_pTreeView
!= NULL
);
5033 return m_pTreeView
->GetPrevVisibleItem(m_hTreeItem
);
5036 template <class TBase
>
5037 inline CTreeItemT
<TBase
> CTreeItemT
<TBase
>::GetSelected() const
5039 ATLASSERT(m_pTreeView
!= NULL
);
5040 return m_pTreeView
->GetSelectedItem();
5043 template <class TBase
>
5044 inline CTreeItemT
<TBase
> CTreeItemT
<TBase
>::GetDropHilight() const
5046 ATLASSERT(m_pTreeView
!= NULL
);
5047 return m_pTreeView
->GetDropHilightItem();
5050 template <class TBase
>
5051 inline CTreeItemT
<TBase
> CTreeItemT
<TBase
>::GetRoot() const
5053 ATLASSERT(m_pTreeView
!= NULL
);
5054 return m_pTreeView
->GetRootItem();
5057 #if !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400)
5058 template <class TBase
>
5059 inline CTreeItemT
<TBase
> CTreeItemT
<TBase
>::GetLastVisible() const
5061 ATLASSERT(m_pTreeView
!= NULL
);
5062 return m_pTreeView
->GetLastVisibleItem();
5064 #endif // !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400)
5066 #if (_WIN32_IE >= 0x0600)
5067 template <class TBase
>
5068 inline CTreeItemT
<TBase
> CTreeItemT
<TBase
>::GetNextSelected() const
5070 ATLASSERT(m_pTreeView
!= NULL
);
5071 return m_pTreeView
->GetNextSelectedItem();
5073 #endif // (_WIN32_IE >= 0x0600)
5075 template <class TBase
>
5076 inline BOOL CTreeItemT
<TBase
>::GetText(LPTSTR lpstrText
, int nLen
) const
5078 ATLASSERT(m_pTreeView
!= NULL
);
5079 return m_pTreeView
->GetItemText(m_hTreeItem
, lpstrText
, nLen
);
5084 template <class TBase
>
5085 inline BOOL CTreeItemT
<TBase
>::GetText(BSTR
& bstrText
) const
5087 ATLASSERT(m_pTreeView
!= NULL
);
5088 return m_pTreeView
->GetItemText(m_hTreeItem
, bstrText
);
5090 #endif // _OLEAUTO_H_
5091 #endif // !_ATL_NO_COM
5093 #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
5094 template <class TBase
>
5095 inline BOOL CTreeItemT
<TBase
>::GetText(_CSTRING_NS::CString
& strText
) const
5097 ATLASSERT(m_pTreeView
!= NULL
);
5098 return m_pTreeView
->GetItemText(m_hTreeItem
, strText
);
5100 #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
5102 template <class TBase
>
5103 inline BOOL CTreeItemT
<TBase
>::GetImage(int& nImage
, int& nSelectedImage
) const
5105 ATLASSERT(m_pTreeView
!= NULL
);
5106 return m_pTreeView
->GetItemImage(m_hTreeItem
,nImage
,nSelectedImage
);
5109 template <class TBase
>
5110 inline UINT CTreeItemT
<TBase
>::GetState(UINT nStateMask
) const
5112 ATLASSERT(m_pTreeView
!= NULL
);
5113 return m_pTreeView
->GetItemState(m_hTreeItem
,nStateMask
);
5116 template <class TBase
>
5117 inline DWORD_PTR CTreeItemT
<TBase
>::GetData() const
5119 ATLASSERT(m_pTreeView
!= NULL
);
5120 return m_pTreeView
->GetItemData(m_hTreeItem
);
5123 template <class TBase
>
5124 inline BOOL CTreeItemT
<TBase
>::SetItem(UINT nMask
, LPCTSTR lpszItem
, int nImage
,
5125 int nSelectedImage
, UINT nState
, UINT nStateMask
, LPARAM lParam
)
5127 ATLASSERT(m_pTreeView
!= NULL
);
5128 return m_pTreeView
->SetItem(m_hTreeItem
, nMask
, lpszItem
, nImage
, nSelectedImage
, nState
, nStateMask
, lParam
);
5131 template <class TBase
>
5132 inline BOOL CTreeItemT
<TBase
>::SetText(LPCTSTR lpszItem
)
5134 ATLASSERT(m_pTreeView
!= NULL
);
5135 return m_pTreeView
->SetItemText(m_hTreeItem
,lpszItem
);
5138 template <class TBase
>
5139 inline BOOL CTreeItemT
<TBase
>::SetImage(int nImage
, int nSelectedImage
)
5141 ATLASSERT(m_pTreeView
!= NULL
);
5142 return m_pTreeView
->SetItemImage(m_hTreeItem
,nImage
,nSelectedImage
);
5145 template <class TBase
>
5146 inline BOOL CTreeItemT
<TBase
>::SetState(UINT nState
, UINT nStateMask
)
5148 ATLASSERT(m_pTreeView
!= NULL
);
5149 return m_pTreeView
->SetItemState(m_hTreeItem
,nState
,nStateMask
);
5152 template <class TBase
>
5153 inline BOOL CTreeItemT
<TBase
>::SetData(DWORD_PTR dwData
)
5155 ATLASSERT(m_pTreeView
!= NULL
);
5156 return m_pTreeView
->SetItemData(m_hTreeItem
,dwData
);
5159 template <class TBase
>
5160 inline BOOL CTreeItemT
<TBase
>::HasChildren() const
5162 ATLASSERT(m_pTreeView
!= NULL
);
5163 return m_pTreeView
->ItemHasChildren(m_hTreeItem
);
5166 template <class TBase
>
5167 inline BOOL CTreeItemT
<TBase
>::Delete()
5169 ATLASSERT(m_pTreeView
!= NULL
);
5170 return m_pTreeView
->DeleteItem(m_hTreeItem
);
5173 template <class TBase
>
5174 inline BOOL CTreeItemT
<TBase
>::Expand(UINT nCode
/*= TVE_EXPAND*/)
5176 ATLASSERT(m_pTreeView
!= NULL
);
5177 return m_pTreeView
->Expand(m_hTreeItem
,nCode
);
5180 template <class TBase
>
5181 inline BOOL CTreeItemT
<TBase
>::Select(UINT nCode
)
5183 ATLASSERT(m_pTreeView
!= NULL
);
5184 return m_pTreeView
->Select(m_hTreeItem
,nCode
);
5187 template <class TBase
>
5188 inline BOOL CTreeItemT
<TBase
>::Select()
5190 ATLASSERT(m_pTreeView
!= NULL
);
5191 return m_pTreeView
->SelectItem(m_hTreeItem
);
5194 template <class TBase
>
5195 inline BOOL CTreeItemT
<TBase
>::SelectDropTarget()
5197 ATLASSERT(m_pTreeView
!= NULL
);
5198 return m_pTreeView
->SelectDropTarget(m_hTreeItem
);
5201 template <class TBase
>
5202 inline BOOL CTreeItemT
<TBase
>::SelectSetFirstVisible()
5204 ATLASSERT(m_pTreeView
!= NULL
);
5205 return m_pTreeView
->SelectSetFirstVisible(m_hTreeItem
);
5208 template <class TBase
>
5209 inline HWND CTreeItemT
<TBase
>::EditLabel()
5211 ATLASSERT(m_pTreeView
!= NULL
);
5212 return m_pTreeView
->EditLabel(m_hTreeItem
);
5215 template <class TBase
>
5216 inline HIMAGELIST CTreeItemT
<TBase
>::CreateDragImage()
5218 ATLASSERT(m_pTreeView
!= NULL
);
5219 return m_pTreeView
->CreateDragImage(m_hTreeItem
);
5222 template <class TBase
>
5223 inline BOOL CTreeItemT
<TBase
>::SortChildren(BOOL bRecurse
/*= FALSE*/)
5225 ATLASSERT(m_pTreeView
!= NULL
);
5226 return m_pTreeView
->SortChildren(m_hTreeItem
, bRecurse
);
5229 template <class TBase
>
5230 inline BOOL CTreeItemT
<TBase
>::EnsureVisible()
5232 ATLASSERT(m_pTreeView
!= NULL
);
5233 return m_pTreeView
->EnsureVisible(m_hTreeItem
);
5236 template <class TBase
>
5237 inline CTreeItemT
<TBase
> CTreeItemT
<TBase
>::_Insert(LPCTSTR lpstrItem
, int nImageIndex
, HTREEITEM hItemAfter
)
5239 ATLASSERT(m_pTreeView
!= NULL
);
5240 TVINSERTSTRUCT ins
= { 0 };
5241 ins
.hParent
= m_hTreeItem
;
5242 ins
.hInsertAfter
= hItemAfter
;
5243 ins
.item
.mask
= TVIF_TEXT
;
5244 ins
.item
.pszText
= (LPTSTR
)lpstrItem
;
5245 if(nImageIndex
!= -1)
5247 ins
.item
.mask
|= TVIF_IMAGE
| TVIF_SELECTEDIMAGE
;
5248 ins
.item
.iImage
= nImageIndex
;
5249 ins
.item
.iSelectedImage
= nImageIndex
;
5251 return CTreeItemT
<TBase
>(m_pTreeView
->InsertItem(&ins
), m_pTreeView
);
5254 template <class TBase
>
5255 inline int CTreeItemT
<TBase
>::GetImageIndex() const
5257 ATLASSERT(m_pTreeView
!= NULL
);
5258 TVITEM item
= { 0 };
5259 item
.mask
= TVIF_HANDLE
| TVIF_IMAGE
;
5260 item
.hItem
= m_hTreeItem
;
5261 m_pTreeView
->GetItem(&item
);
5265 #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
5266 template <class TBase
>
5267 inline BOOL CTreeItemT
<TBase
>::SetInsertMark(BOOL bAfter
)
5269 ATLASSERT(m_pTreeView
!= NULL
);
5270 return m_pTreeView
->SetInsertMark(m_hTreeItem
, bAfter
);
5272 #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
5274 #if (_WIN32_WINNT >= 0x0501)
5275 template <class TBase
>
5276 inline UINT CTreeItemT
<TBase
>::MapHTREEITEMToAccID() const
5278 ATLASSERT(m_pTreeView
!= NULL
);
5279 return m_pTreeView
->MapHTREEITEMToAccID(m_hTreeItem
);
5281 #endif // (_WIN32_WINNT >= 0x0501)
5283 #if (_WIN32_WINNT >= 0x0600)
5284 template <class TBase
>
5285 inline void CTreeItemT
<TBase
>::ShowInfoTip()
5287 ATLASSERT(m_pTreeView
!= NULL
);
5288 m_pTreeView
->ShowInfoTip(m_hTreeItem
);
5291 template <class TBase
>
5292 inline BOOL CTreeItemT
<TBase
>::GetPartRect(TVITEMPART partID
, LPRECT lpRect
) const
5294 ATLASSERT(m_pTreeView
!= NULL
);
5295 return m_pTreeView
->GetItemPartRect(m_hTreeItem
, partID
, lpRect
);
5297 #endif // (_WIN32_WINNT >= 0x0600)
5300 ///////////////////////////////////////////////////////////////////////////////
5303 template <class TBase
>
5304 class CToolBarCtrlT
: public TBase
5308 CToolBarCtrlT(HWND hWnd
= NULL
) : TBase(hWnd
)
5311 CToolBarCtrlT
< TBase
>& operator =(HWND hWnd
)
5317 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
5318 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
5319 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
5321 return TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
5325 static LPCTSTR
GetWndClassName()
5327 return TOOLBARCLASSNAME
;
5330 BOOL
IsButtonEnabled(int nID
) const
5332 ATLASSERT(::IsWindow(m_hWnd
));
5333 return (BOOL
)::SendMessage(m_hWnd
, TB_ISBUTTONENABLED
, nID
, 0L);
5336 BOOL
IsButtonChecked(int nID
) const
5338 ATLASSERT(::IsWindow(m_hWnd
));
5339 return (BOOL
)::SendMessage(m_hWnd
, TB_ISBUTTONCHECKED
, nID
, 0L);
5342 BOOL
IsButtonPressed(int nID
) const
5344 ATLASSERT(::IsWindow(m_hWnd
));
5345 return (BOOL
)::SendMessage(m_hWnd
, TB_ISBUTTONPRESSED
, nID
, 0L);
5348 BOOL
IsButtonHidden(int nID
) const
5350 ATLASSERT(::IsWindow(m_hWnd
));
5351 return(BOOL
) ::SendMessage(m_hWnd
, TB_ISBUTTONHIDDEN
, nID
, 0L);
5354 BOOL
IsButtonIndeterminate(int nID
) const
5356 ATLASSERT(::IsWindow(m_hWnd
));
5357 return (BOOL
)::SendMessage(m_hWnd
, TB_ISBUTTONINDETERMINATE
, nID
, 0L);
5360 int GetState(int nID
) const
5362 ATLASSERT(::IsWindow(m_hWnd
));
5363 return (int)::SendMessage(m_hWnd
, TB_GETSTATE
, nID
, 0L);
5366 BOOL
SetState(int nID
, UINT nState
)
5368 ATLASSERT(::IsWindow(m_hWnd
));
5369 return (BOOL
)::SendMessage(m_hWnd
, TB_SETSTATE
, nID
, MAKELPARAM(nState
, 0));
5372 BOOL
GetButton(int nIndex
, LPTBBUTTON lpButton
) const
5374 ATLASSERT(::IsWindow(m_hWnd
));
5375 return (BOOL
)::SendMessage(m_hWnd
, TB_GETBUTTON
, nIndex
, (LPARAM
)lpButton
);
5378 int GetButtonCount() const
5380 ATLASSERT(::IsWindow(m_hWnd
));
5381 return (int)::SendMessage(m_hWnd
, TB_BUTTONCOUNT
, 0, 0L);
5384 BOOL
GetItemRect(int nIndex
, LPRECT lpRect
) const
5386 ATLASSERT(::IsWindow(m_hWnd
));
5387 return (BOOL
)::SendMessage(m_hWnd
, TB_GETITEMRECT
, nIndex
, (LPARAM
)lpRect
);
5390 void SetButtonStructSize(int nSize
= sizeof(TBBUTTON
))
5392 ATLASSERT(::IsWindow(m_hWnd
));
5393 ::SendMessage(m_hWnd
, TB_BUTTONSTRUCTSIZE
, nSize
, 0L);
5396 BOOL
SetButtonSize(SIZE size
)
5398 ATLASSERT(::IsWindow(m_hWnd
));
5399 return (BOOL
)::SendMessage(m_hWnd
, TB_SETBUTTONSIZE
, 0, MAKELPARAM(size
.cx
, size
.cy
));
5402 BOOL
SetButtonSize(int cx
, int cy
)
5404 ATLASSERT(::IsWindow(m_hWnd
));
5405 return (BOOL
)::SendMessage(m_hWnd
, TB_SETBUTTONSIZE
, 0, MAKELPARAM(cx
, cy
));
5408 BOOL
SetBitmapSize(SIZE size
)
5410 ATLASSERT(::IsWindow(m_hWnd
));
5411 return (BOOL
)::SendMessage(m_hWnd
, TB_SETBITMAPSIZE
, 0, MAKELPARAM(size
.cx
, size
.cy
));
5414 BOOL
SetBitmapSize(int cx
, int cy
)
5416 ATLASSERT(::IsWindow(m_hWnd
));
5417 return (BOOL
)::SendMessage(m_hWnd
, TB_SETBITMAPSIZE
, 0, MAKELPARAM(cx
, cy
));
5421 CToolTipCtrl
GetToolTips() const
5423 ATLASSERT(::IsWindow(m_hWnd
));
5424 return CToolTipCtrl((HWND
)::SendMessage(m_hWnd
, TB_GETTOOLTIPS
, 0, 0L));
5427 void SetToolTips(HWND hWndToolTip
)
5429 ATLASSERT(::IsWindow(m_hWnd
));
5430 ::SendMessage(m_hWnd
, TB_SETTOOLTIPS
, (WPARAM
)hWndToolTip
, 0L);
5432 #endif // !_WIN32_WCE
5434 void SetNotifyWnd(HWND hWnd
)
5436 ATLASSERT(::IsWindow(m_hWnd
));
5437 ::SendMessage(m_hWnd
, TB_SETPARENT
, (WPARAM
)hWnd
, 0L);
5442 ATLASSERT(::IsWindow(m_hWnd
));
5443 return (int)::SendMessage(m_hWnd
, TB_GETROWS
, 0, 0L);
5446 void SetRows(int nRows
, BOOL bLarger
, LPRECT lpRect
)
5448 ATLASSERT(::IsWindow(m_hWnd
));
5449 ::SendMessage(m_hWnd
, TB_SETROWS
, MAKELPARAM(nRows
, bLarger
), (LPARAM
)lpRect
);
5452 BOOL
SetCmdID(int nIndex
, UINT nID
)
5454 ATLASSERT(::IsWindow(m_hWnd
));
5455 return (BOOL
)::SendMessage(m_hWnd
, TB_SETCMDID
, nIndex
, nID
);
5458 DWORD
GetBitmapFlags() const
5460 ATLASSERT(::IsWindow(m_hWnd
));
5461 return (DWORD
)::SendMessage(m_hWnd
, TB_GETBITMAPFLAGS
, 0, 0L);
5464 int GetBitmap(int nID
) const
5466 ATLASSERT(::IsWindow(m_hWnd
));
5467 return (int)::SendMessage(m_hWnd
, TB_GETBITMAP
, nID
, 0L);
5470 int GetButtonText(int nID
, LPTSTR lpstrText
) const
5472 ATLASSERT(::IsWindow(m_hWnd
));
5473 return (int)::SendMessage(m_hWnd
, TB_GETBUTTONTEXT
, nID
, (LPARAM
)lpstrText
);
5476 // nIndex - IE5 or higher only
5477 CImageList
GetImageList(int nIndex
= 0) const
5479 ATLASSERT(::IsWindow(m_hWnd
));
5480 return CImageList((HIMAGELIST
)::SendMessage(m_hWnd
, TB_GETIMAGELIST
, nIndex
, 0L));
5483 // nIndex - IE5 or higher only
5484 CImageList
SetImageList(HIMAGELIST hImageList
, int nIndex
= 0)
5486 ATLASSERT(::IsWindow(m_hWnd
));
5487 return CImageList((HIMAGELIST
)::SendMessage(m_hWnd
, TB_SETIMAGELIST
, nIndex
, (LPARAM
)hImageList
));
5490 // nIndex - IE5 or higher only
5491 CImageList
GetDisabledImageList(int nIndex
= 0) const
5493 ATLASSERT(::IsWindow(m_hWnd
));
5494 return CImageList((HIMAGELIST
)::SendMessage(m_hWnd
, TB_GETDISABLEDIMAGELIST
, nIndex
, 0L));
5497 // nIndex - IE5 or higher only
5498 CImageList
SetDisabledImageList(HIMAGELIST hImageList
, int nIndex
= 0)
5500 ATLASSERT(::IsWindow(m_hWnd
));
5501 return CImageList((HIMAGELIST
)::SendMessage(m_hWnd
, TB_SETDISABLEDIMAGELIST
, nIndex
, (LPARAM
)hImageList
));
5505 // nIndex - IE5 or higher only
5506 CImageList
GetHotImageList(int nIndex
= 0) const
5508 ATLASSERT(::IsWindow(m_hWnd
));
5509 return CImageList((HIMAGELIST
)::SendMessage(m_hWnd
, TB_GETHOTIMAGELIST
, nIndex
, 0L));
5512 // nIndex - IE5 or higher only
5513 CImageList
SetHotImageList(HIMAGELIST hImageList
, int nIndex
= 0)
5515 ATLASSERT(::IsWindow(m_hWnd
));
5516 return CImageList((HIMAGELIST
)::SendMessage(m_hWnd
, TB_SETHOTIMAGELIST
, nIndex
, (LPARAM
)hImageList
));
5518 #endif // !_WIN32_WCE
5520 DWORD
GetStyle() const
5522 ATLASSERT(::IsWindow(m_hWnd
));
5523 return (DWORD
)::SendMessage(m_hWnd
, TB_GETSTYLE
, 0, 0L);
5526 void SetStyle(DWORD dwStyle
)
5528 ATLASSERT(::IsWindow(m_hWnd
));
5529 ::SendMessage(m_hWnd
, TB_SETSTYLE
, 0, dwStyle
);
5532 DWORD
GetButtonSize() const
5534 ATLASSERT(::IsWindow(m_hWnd
));
5535 return (DWORD
)::SendMessage(m_hWnd
, TB_GETBUTTONSIZE
, 0, 0L);
5538 void GetButtonSize(SIZE
& size
) const
5540 ATLASSERT(::IsWindow(m_hWnd
));
5541 DWORD dwRet
= (DWORD
)::SendMessage(m_hWnd
, TB_GETBUTTONSIZE
, 0, 0L);
5542 size
.cx
= LOWORD(dwRet
);
5543 size
.cy
= HIWORD(dwRet
);
5546 BOOL
GetRect(int nID
, LPRECT lpRect
) const
5548 ATLASSERT(::IsWindow(m_hWnd
));
5549 return (BOOL
)::SendMessage(m_hWnd
, TB_GETRECT
, nID
, (LPARAM
)lpRect
);
5552 int GetTextRows() const
5554 ATLASSERT(::IsWindow(m_hWnd
));
5555 return (int)::SendMessage(m_hWnd
, TB_GETTEXTROWS
, 0, 0L);
5558 BOOL
SetButtonWidth(int cxMin
, int cxMax
)
5560 ATLASSERT(::IsWindow(m_hWnd
));
5561 return (BOOL
)::SendMessage(m_hWnd
, TB_SETBUTTONWIDTH
, 0, MAKELPARAM(cxMin
, cxMax
));
5564 BOOL
SetIndent(int nIndent
)
5566 ATLASSERT(::IsWindow(m_hWnd
));
5567 return (BOOL
)::SendMessage(m_hWnd
, TB_SETINDENT
, nIndent
, 0L);
5570 BOOL
SetMaxTextRows(int nMaxTextRows
)
5572 ATLASSERT(::IsWindow(m_hWnd
));
5573 return (BOOL
)::SendMessage(m_hWnd
, TB_SETMAXTEXTROWS
, nMaxTextRows
, 0L);
5576 #if (_WIN32_IE >= 0x0400)
5578 BOOL
GetAnchorHighlight() const
5580 ATLASSERT(::IsWindow(m_hWnd
));
5581 return (BOOL
)::SendMessage(m_hWnd
, TB_GETANCHORHIGHLIGHT
, 0, 0L);
5584 BOOL
SetAnchorHighlight(BOOL bEnable
= TRUE
)
5586 ATLASSERT(::IsWindow(m_hWnd
));
5587 return (BOOL
)::SendMessage(m_hWnd
, TB_SETANCHORHIGHLIGHT
, bEnable
, 0L);
5589 #endif // !_WIN32_WCE
5591 int GetButtonInfo(int nID
, LPTBBUTTONINFO lptbbi
) const
5593 ATLASSERT(::IsWindow(m_hWnd
));
5594 return (int)::SendMessage(m_hWnd
, TB_GETBUTTONINFO
, nID
, (LPARAM
)lptbbi
);
5597 BOOL
SetButtonInfo(int nID
, LPTBBUTTONINFO lptbbi
)
5599 ATLASSERT(::IsWindow(m_hWnd
));
5600 return (BOOL
)::SendMessage(m_hWnd
, TB_SETBUTTONINFO
, nID
, (LPARAM
)lptbbi
);
5603 BOOL
SetButtonInfo(int nID
, DWORD dwMask
, BYTE Style
, BYTE State
, LPCTSTR lpszItem
,
5604 int iImage
, WORD cx
, int iCommand
, DWORD_PTR lParam
)
5606 ATLASSERT(::IsWindow(m_hWnd
));
5607 TBBUTTONINFO tbbi
= { 0 };
5608 tbbi
.cbSize
= sizeof(TBBUTTONINFO
);
5609 tbbi
.dwMask
= dwMask
;
5610 tbbi
.idCommand
= iCommand
;
5611 tbbi
.iImage
= iImage
;
5612 tbbi
.fsState
= State
;
5613 tbbi
.fsStyle
= Style
;
5615 tbbi
.pszText
= (LPTSTR
) lpszItem
;
5616 tbbi
.lParam
= lParam
;
5617 return (BOOL
)::SendMessage(m_hWnd
, TB_SETBUTTONINFO
, nID
, (LPARAM
)&tbbi
);
5621 int GetHotItem() const
5623 ATLASSERT(::IsWindow(m_hWnd
));
5624 return (int)::SendMessage(m_hWnd
, TB_GETHOTITEM
, 0, 0L);
5627 int SetHotItem(int nItem
)
5629 ATLASSERT(::IsWindow(m_hWnd
));
5630 return (int)::SendMessage(m_hWnd
, TB_SETHOTITEM
, nItem
, 0L);
5632 #endif // !_WIN32_WCE
5634 BOOL
IsButtonHighlighted(int nButtonID
) const
5636 ATLASSERT(::IsWindow(m_hWnd
));
5637 return (BOOL
)::SendMessage(m_hWnd
, TB_ISBUTTONHIGHLIGHTED
, nButtonID
, 0L);
5640 DWORD
SetDrawTextFlags(DWORD dwMask
, DWORD dwFlags
)
5642 ATLASSERT(::IsWindow(m_hWnd
));
5643 return (DWORD
)::SendMessage(m_hWnd
, TB_SETDRAWTEXTFLAGS
, dwMask
, dwFlags
);
5647 BOOL
GetColorScheme(LPCOLORSCHEME lpcs
) const
5649 ATLASSERT(::IsWindow(m_hWnd
));
5650 return (BOOL
)::SendMessage(m_hWnd
, TB_GETCOLORSCHEME
, 0, (LPARAM
)lpcs
);
5653 void SetColorScheme(LPCOLORSCHEME lpcs
)
5655 ATLASSERT(::IsWindow(m_hWnd
));
5656 ::SendMessage(m_hWnd
, TB_SETCOLORSCHEME
, 0, (LPARAM
)lpcs
);
5659 DWORD
GetExtendedStyle() const
5661 ATLASSERT(::IsWindow(m_hWnd
));
5662 return (DWORD
)::SendMessage(m_hWnd
, TB_GETEXTENDEDSTYLE
, 0, 0L);
5665 DWORD
SetExtendedStyle(DWORD dwStyle
)
5667 ATLASSERT(::IsWindow(m_hWnd
));
5668 return (DWORD
)::SendMessage(m_hWnd
, TB_SETEXTENDEDSTYLE
, 0, dwStyle
);
5671 void GetInsertMark(LPTBINSERTMARK lptbim
) const
5673 ATLASSERT(::IsWindow(m_hWnd
));
5674 ::SendMessage(m_hWnd
, TB_GETINSERTMARK
, 0, (LPARAM
)lptbim
);
5677 void SetInsertMark(LPTBINSERTMARK lptbim
)
5679 ATLASSERT(::IsWindow(m_hWnd
));
5680 ::SendMessage(m_hWnd
, TB_SETINSERTMARK
, 0, (LPARAM
)lptbim
);
5683 COLORREF
GetInsertMarkColor() const
5685 ATLASSERT(::IsWindow(m_hWnd
));
5686 return (COLORREF
)::SendMessage(m_hWnd
, TB_GETINSERTMARKCOLOR
, 0, 0L);
5689 COLORREF
SetInsertMarkColor(COLORREF clr
)
5691 ATLASSERT(::IsWindow(m_hWnd
));
5692 return (COLORREF
)::SendMessage(m_hWnd
, TB_SETINSERTMARKCOLOR
, 0, (LPARAM
)clr
);
5695 BOOL
GetMaxSize(LPSIZE lpSize
) const
5697 ATLASSERT(::IsWindow(m_hWnd
));
5698 return (BOOL
)::SendMessage(m_hWnd
, TB_GETMAXSIZE
, 0, (LPARAM
)lpSize
);
5701 void GetPadding(LPSIZE lpSizePadding
) const
5703 ATLASSERT(::IsWindow(m_hWnd
));
5704 ATLASSERT(lpSizePadding
!= NULL
);
5705 DWORD dwRet
= (DWORD
)::SendMessage(m_hWnd
, TB_GETPADDING
, 0, 0L);
5706 lpSizePadding
->cx
= GET_X_LPARAM(dwRet
);
5707 lpSizePadding
->cy
= GET_Y_LPARAM(dwRet
);
5710 void SetPadding(int cx
, int cy
, LPSIZE lpSizePadding
= NULL
)
5712 ATLASSERT(::IsWindow(m_hWnd
));
5713 DWORD dwRet
= (DWORD
)::SendMessage(m_hWnd
, TB_SETPADDING
, 0, MAKELPARAM(cx
, cy
));
5714 if(lpSizePadding
!= NULL
)
5716 lpSizePadding
->cx
= GET_X_LPARAM(dwRet
);
5717 lpSizePadding
->cy
= GET_Y_LPARAM(dwRet
);
5721 BOOL
GetUnicodeFormat() const
5723 ATLASSERT(::IsWindow(m_hWnd
));
5724 return (BOOL
)::SendMessage(m_hWnd
, TB_GETUNICODEFORMAT
, 0, 0L);
5727 BOOL
SetUnicodeFormat(BOOL bUnicode
= TRUE
)
5729 ATLASSERT(::IsWindow(m_hWnd
));
5730 return (BOOL
)::SendMessage(m_hWnd
, TB_SETUNICODEFORMAT
, bUnicode
, 0L);
5732 #endif // !_WIN32_WCE
5733 #endif // (_WIN32_IE >= 0x0400)
5735 #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
5736 int GetString(int nString
, LPTSTR lpstrString
, int cchMaxLen
) const
5738 ATLASSERT(::IsWindow(m_hWnd
));
5739 return (int)::SendMessage(m_hWnd
, TB_GETSTRING
, MAKEWPARAM(cchMaxLen
, nString
), (LPARAM
)lpstrString
);
5742 int GetStringBSTR(int nString
, BSTR
& bstrString
) const
5745 ATLASSERT(::IsWindow(m_hWnd
));
5746 ATLASSERT(bstrString
== NULL
);
5747 int nLength
= (int)(short)LOWORD(::SendMessage(m_hWnd
, TB_GETSTRING
, MAKEWPARAM(0, nString
), NULL
));
5750 CTempBuffer
<TCHAR
, _WTL_STACK_ALLOC_THRESHOLD
> buff
;
5751 LPTSTR lpstrText
= buff
.Allocate(nLength
+ 1);
5752 if(lpstrText
!= NULL
)
5754 nLength
= (int)::SendMessage(m_hWnd
, TB_GETSTRING
, MAKEWPARAM(nLength
+ 1, nString
), (LPARAM
)lpstrText
);
5756 bstrString
= ::SysAllocString(T2OLE(lpstrText
));
5767 #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
5768 int GetString(int nString
, _CSTRING_NS::CString
& str
) const
5770 ATLASSERT(::IsWindow(m_hWnd
));
5771 int nLength
= (int)(short)LOWORD(::SendMessage(m_hWnd
, TB_GETSTRING
, MAKEWPARAM(0, nString
), NULL
));
5774 LPTSTR lpstr
= str
.GetBufferSetLength(nLength
+ 1);
5776 nLength
= (int)::SendMessage(m_hWnd
, TB_GETSTRING
, MAKEWPARAM(nLength
+ 1, nString
), (LPARAM
)lpstr
);
5779 str
.ReleaseBuffer();
5783 #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
5784 #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
5786 #if (_WIN32_WINNT >= 0x0501)
5787 void GetMetrics(LPTBMETRICS lptbm
) const
5789 ATLASSERT(::IsWindow(m_hWnd
));
5790 ::SendMessage(m_hWnd
, TB_GETMETRICS
, 0, (LPARAM
)lptbm
);
5793 void SetMetrics(LPTBMETRICS lptbm
)
5795 ATLASSERT(::IsWindow(m_hWnd
));
5796 ::SendMessage(m_hWnd
, TB_SETMETRICS
, 0, (LPARAM
)lptbm
);
5799 void SetWindowTheme(LPCWSTR lpstrTheme
)
5801 ATLASSERT(::IsWindow(m_hWnd
));
5802 ::SendMessage(m_hWnd
, TB_SETWINDOWTHEME
, 0, (LPARAM
)lpstrTheme
);
5804 #endif // (_WIN32_WINNT >= 0x0501)
5806 #if (_WIN32_WINNT >= 0x0600)
5807 CImageList
GetPressedImageList(int nIndex
= 0) const
5809 ATLASSERT(::IsWindow(m_hWnd
));
5810 return CImageList((HIMAGELIST
)::SendMessage(m_hWnd
, TB_GETPRESSEDIMAGELIST
, nIndex
, 0L));
5813 CImageList
SetPressedImageList(HIMAGELIST hImageList
, int nIndex
= 0)
5815 ATLASSERT(::IsWindow(m_hWnd
));
5816 return CImageList((HIMAGELIST
)::SendMessage(m_hWnd
, TB_SETPRESSEDIMAGELIST
, nIndex
, (LPARAM
)hImageList
));
5819 void GetItemDropDownRect(int nIndex
, LPRECT lpRect
) const
5821 #ifndef TB_GETITEMDROPDOWNRECT
5822 const int TB_GETITEMDROPDOWNRECT
= WM_USER
+ 103;
5824 ATLASSERT(::IsWindow(m_hWnd
));
5825 BOOL bRet
= (BOOL
)::SendMessage(m_hWnd
, TB_GETITEMDROPDOWNRECT
, nIndex
, (LPARAM
)lpRect
);
5826 bRet
; // avoid level 4 warning
5827 ATLASSERT(bRet
!= FALSE
);
5829 #endif // (_WIN32_WINNT >= 0x0600)
5832 BOOL
EnableButton(int nID
, BOOL bEnable
= TRUE
)
5834 ATLASSERT(::IsWindow(m_hWnd
));
5835 return (BOOL
)::SendMessage(m_hWnd
, TB_ENABLEBUTTON
, nID
, MAKELPARAM(bEnable
, 0));
5838 BOOL
CheckButton(int nID
, BOOL bCheck
= TRUE
)
5840 ATLASSERT(::IsWindow(m_hWnd
));
5841 return (BOOL
)::SendMessage(m_hWnd
, TB_CHECKBUTTON
, nID
, MAKELPARAM(bCheck
, 0));
5844 BOOL
PressButton(int nID
, BOOL bPress
= TRUE
)
5846 ATLASSERT(::IsWindow(m_hWnd
));
5847 return (BOOL
)::SendMessage(m_hWnd
, TB_PRESSBUTTON
, nID
, MAKELPARAM(bPress
, 0));
5850 BOOL
HideButton(int nID
, BOOL bHide
= TRUE
)
5852 ATLASSERT(::IsWindow(m_hWnd
));
5853 return (BOOL
)::SendMessage(m_hWnd
, TB_HIDEBUTTON
, nID
, MAKELPARAM(bHide
, 0));
5856 BOOL
Indeterminate(int nID
, BOOL bIndeterminate
= TRUE
)
5858 ATLASSERT(::IsWindow(m_hWnd
));
5859 return (BOOL
)::SendMessage(m_hWnd
, TB_INDETERMINATE
, nID
, MAKELPARAM(bIndeterminate
, 0));
5862 int AddBitmap(int nNumButtons
, UINT nBitmapID
)
5864 ATLASSERT(::IsWindow(m_hWnd
));
5865 TBADDBITMAP tbab
= { 0 };
5866 tbab
.hInst
= ModuleHelper::GetResourceInstance();
5867 ATLASSERT(tbab
.hInst
!= NULL
);
5868 tbab
.nID
= nBitmapID
;
5869 return (int)::SendMessage(m_hWnd
, TB_ADDBITMAP
, (WPARAM
)nNumButtons
, (LPARAM
)&tbab
);
5872 int AddBitmap(int nNumButtons
, HBITMAP hBitmap
)
5874 ATLASSERT(::IsWindow(m_hWnd
));
5875 TBADDBITMAP tbab
= { 0 };
5877 tbab
.nID
= (UINT_PTR
)hBitmap
;
5878 return (int)::SendMessage(m_hWnd
, TB_ADDBITMAP
, (WPARAM
)nNumButtons
, (LPARAM
)&tbab
);
5881 BOOL
AddButtons(int nNumButtons
, LPTBBUTTON lpButtons
)
5883 ATLASSERT(::IsWindow(m_hWnd
));
5884 return (BOOL
)::SendMessage(m_hWnd
, TB_ADDBUTTONS
, nNumButtons
, (LPARAM
)lpButtons
);
5887 BOOL
InsertButton(int nIndex
, LPTBBUTTON lpButton
)
5889 ATLASSERT(::IsWindow(m_hWnd
));
5890 return (BOOL
)::SendMessage(m_hWnd
, TB_INSERTBUTTON
, nIndex
, (LPARAM
)lpButton
);
5893 BOOL
InsertButton(int nIndex
, int iCommand
, BYTE Style
, BYTE State
, int iBitmap
,
5894 INT_PTR iString
, DWORD_PTR lParam
)
5896 ATLASSERT(::IsWindow(m_hWnd
));
5897 TBBUTTON tbb
= { 0 };
5898 tbb
.fsStyle
= Style
;
5899 tbb
.fsState
= State
;
5900 tbb
.idCommand
= iCommand
;
5901 tbb
.iBitmap
= iBitmap
;
5902 tbb
.iString
= iString
;
5903 tbb
.dwData
= lParam
;
5904 return (BOOL
)::SendMessage(m_hWnd
, TB_INSERTBUTTON
, nIndex
, (LPARAM
)&tbb
);
5907 BOOL
InsertButton(int nIndex
, int iCommand
, BYTE Style
, BYTE State
, int iBitmap
,
5908 LPCTSTR lpszItem
, DWORD_PTR lParam
)
5910 return InsertButton(nIndex
, iCommand
, Style
, State
, iBitmap
, (INT_PTR
)lpszItem
, lParam
);
5913 BOOL
AddButton(LPTBBUTTON lpButton
)
5915 return InsertButton(-1, lpButton
);
5918 BOOL
AddButton(int iCommand
, BYTE Style
, BYTE State
, int iBitmap
, INT_PTR iString
, DWORD_PTR lParam
)
5920 return InsertButton(-1, iCommand
, Style
, State
, iBitmap
, iString
, lParam
);
5923 BOOL
AddButton(int iCommand
, BYTE Style
, BYTE State
, int iBitmap
, LPCTSTR lpszItem
, DWORD_PTR lParam
)
5925 return InsertButton(-1, iCommand
, Style
, State
, iBitmap
, lpszItem
, lParam
);
5928 BOOL
DeleteButton(int nIndex
)
5930 ATLASSERT(::IsWindow(m_hWnd
));
5931 return (BOOL
)::SendMessage(m_hWnd
, TB_DELETEBUTTON
, nIndex
, 0L);
5934 BOOL
InsertSeparator(int nIndex
, int cxWidth
= 8)
5936 return InsertButton(nIndex
, 0, BTNS_SEP
, 0, cxWidth
, (INT_PTR
)0, 0);
5939 BOOL
AddSeparator(int cxWidth
= 8)
5941 return AddButton(0, BTNS_SEP
, 0, cxWidth
, (INT_PTR
)0, 0);
5944 int CommandToIndex(UINT nID
) const
5946 ATLASSERT(::IsWindow(m_hWnd
));
5947 return (int)::SendMessage(m_hWnd
, TB_COMMANDTOINDEX
, nID
, 0L);
5951 void SaveState(HKEY hKeyRoot
, LPCTSTR lpszSubKey
, LPCTSTR lpszValueName
)
5953 ATLASSERT(::IsWindow(m_hWnd
));
5954 TBSAVEPARAMS tbs
= { 0 };
5956 tbs
.pszSubKey
= lpszSubKey
;
5957 tbs
.pszValueName
= lpszValueName
;
5958 ::SendMessage(m_hWnd
, TB_SAVERESTORE
, (WPARAM
)TRUE
, (LPARAM
)&tbs
);
5961 void RestoreState(HKEY hKeyRoot
, LPCTSTR lpszSubKey
, LPCTSTR lpszValueName
)
5963 ATLASSERT(::IsWindow(m_hWnd
));
5964 TBSAVEPARAMS tbs
= { 0 };
5966 tbs
.pszSubKey
= lpszSubKey
;
5967 tbs
.pszValueName
= lpszValueName
;
5968 ::SendMessage(m_hWnd
, TB_SAVERESTORE
, (WPARAM
)FALSE
, (LPARAM
)&tbs
);
5973 ATLASSERT(::IsWindow(m_hWnd
));
5974 ::SendMessage(m_hWnd
, TB_CUSTOMIZE
, 0, 0L);
5976 #endif // !_WIN32_WCE
5978 int AddString(UINT nStringID
)
5980 ATLASSERT(::IsWindow(m_hWnd
));
5981 return (int)::SendMessage(m_hWnd
, TB_ADDSTRING
, (WPARAM
)ModuleHelper::GetResourceInstance(), (LPARAM
)nStringID
);
5984 int AddStrings(LPCTSTR lpszStrings
)
5986 ATLASSERT(::IsWindow(m_hWnd
));
5987 return (int)::SendMessage(m_hWnd
, TB_ADDSTRING
, 0, (LPARAM
)lpszStrings
);
5992 ATLASSERT(::IsWindow(m_hWnd
));
5993 ::SendMessage(m_hWnd
, TB_AUTOSIZE
, 0, 0L);
5996 BOOL
ChangeBitmap(int nID
, int nBitmap
)
5998 ATLASSERT(::IsWindow(m_hWnd
));
5999 return (BOOL
)::SendMessage(m_hWnd
, TB_CHANGEBITMAP
, nID
, MAKELPARAM(nBitmap
, 0));
6002 int LoadImages(int nBitmapID
)
6004 ATLASSERT(::IsWindow(m_hWnd
));
6005 return (int)::SendMessage(m_hWnd
, TB_LOADIMAGES
, nBitmapID
, (LPARAM
)ModuleHelper::GetResourceInstance());
6008 int LoadStdImages(int nBitmapID
)
6010 ATLASSERT(::IsWindow(m_hWnd
));
6011 return (int)::SendMessage(m_hWnd
, TB_LOADIMAGES
, nBitmapID
, (LPARAM
)HINST_COMMCTRL
);
6014 BOOL
ReplaceBitmap(LPTBREPLACEBITMAP ptbrb
)
6016 ATLASSERT(::IsWindow(m_hWnd
));
6017 return (BOOL
)::SendMessage(m_hWnd
, TB_REPLACEBITMAP
, 0, (LPARAM
)ptbrb
);
6020 #if (_WIN32_IE >= 0x0400)
6021 int HitTest(LPPOINT lpPoint
) const
6023 ATLASSERT(::IsWindow(m_hWnd
));
6024 return (int)::SendMessage(m_hWnd
, TB_HITTEST
, 0, (LPARAM
)lpPoint
);
6028 BOOL
InsertMarkHitTest(LPPOINT lpPoint
, LPTBINSERTMARK lptbim
) const
6030 ATLASSERT(::IsWindow(m_hWnd
));
6031 return (BOOL
)::SendMessage(m_hWnd
, TB_INSERTMARKHITTEST
, (WPARAM
)lpPoint
, (LPARAM
)lptbim
);
6034 BOOL
InsertMarkHitTest(int x
, int y
, LPTBINSERTMARK lptbim
) const
6036 ATLASSERT(::IsWindow(m_hWnd
));
6037 POINT pt
= { x
, y
};
6038 return (BOOL
)::SendMessage(m_hWnd
, TB_INSERTMARKHITTEST
, (WPARAM
)&pt
, (LPARAM
)lptbim
);
6041 BOOL
MapAccelerator(TCHAR chAccel
, int& nID
) const
6043 ATLASSERT(::IsWindow(m_hWnd
));
6044 return (BOOL
)::SendMessage(m_hWnd
, TB_MAPACCELERATOR
, (WPARAM
)chAccel
, (LPARAM
)&nID
);
6047 BOOL
MarkButton(int nID
, BOOL bHighlight
= TRUE
)
6049 ATLASSERT(::IsWindow(m_hWnd
));
6050 return (BOOL
)::SendMessage(m_hWnd
, TB_MARKBUTTON
, nID
, MAKELPARAM(bHighlight
, 0));
6053 BOOL
MoveButton(int nOldPos
, int nNewPos
)
6055 ATLASSERT(::IsWindow(m_hWnd
));
6056 return (BOOL
)::SendMessage(m_hWnd
, TB_MOVEBUTTON
, nOldPos
, nNewPos
);
6059 HRESULT
GetObject(REFIID iid
, LPVOID
* ppvObject
)
6061 ATLASSERT(::IsWindow(m_hWnd
));
6062 return (HRESULT
)::SendMessage(m_hWnd
, TB_GETOBJECT
, (WPARAM
)&iid
, (LPARAM
)ppvObject
);
6064 #endif // !_WIN32_WCE
6065 #endif // (_WIN32_IE >= 0x0400)
6068 typedef CToolBarCtrlT
<ATL::CWindow
> CToolBarCtrl
;
6071 ///////////////////////////////////////////////////////////////////////////////
6074 template <class TBase
>
6075 class CStatusBarCtrlT
: public TBase
6079 CStatusBarCtrlT(HWND hWnd
= NULL
) : TBase(hWnd
)
6082 CStatusBarCtrlT
< TBase
>& operator =(HWND hWnd
)
6088 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
6089 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
6090 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
6092 return TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
6096 static LPCTSTR
GetWndClassName()
6098 return STATUSCLASSNAME
;
6101 int GetParts(int nParts
, int* pParts
) const
6103 ATLASSERT(::IsWindow(m_hWnd
));
6104 return (int)::SendMessage(m_hWnd
, SB_GETPARTS
, nParts
, (LPARAM
)pParts
);
6107 BOOL
SetParts(int nParts
, int* pWidths
)
6109 ATLASSERT(::IsWindow(m_hWnd
));
6110 return (BOOL
)::SendMessage(m_hWnd
, SB_SETPARTS
, nParts
, (LPARAM
)pWidths
);
6113 int GetTextLength(int nPane
, int* pType
= NULL
) const
6115 ATLASSERT(::IsWindow(m_hWnd
));
6116 ATLASSERT(nPane
< 256);
6117 DWORD dwRet
= (DWORD
)::SendMessage(m_hWnd
, SB_GETTEXTLENGTH
, (WPARAM
)nPane
, 0L);
6119 *pType
= (int)(short)HIWORD(dwRet
);
6120 return (int)(short)LOWORD(dwRet
);
6123 int GetText(int nPane
, LPTSTR lpszText
, int* pType
= NULL
) const
6125 ATLASSERT(::IsWindow(m_hWnd
));
6126 ATLASSERT(nPane
< 256);
6127 DWORD dwRet
= (DWORD
)::SendMessage(m_hWnd
, SB_GETTEXT
, (WPARAM
)nPane
, (LPARAM
)lpszText
);
6129 *pType
= (int)(short)HIWORD(dwRet
);
6130 return (int)(short)LOWORD(dwRet
);
6134 BOOL
GetTextBSTR(int nPane
, BSTR
& bstrText
, int* pType
= NULL
) const
6137 ATLASSERT(::IsWindow(m_hWnd
));
6138 ATLASSERT(nPane
< 256);
6139 ATLASSERT(bstrText
== NULL
);
6140 int nLength
= (int)(short)LOWORD(::SendMessage(m_hWnd
, SB_GETTEXTLENGTH
, (WPARAM
)nPane
, 0L));
6144 CTempBuffer
<TCHAR
, _WTL_STACK_ALLOC_THRESHOLD
> buff
;
6145 LPTSTR lpstrText
= buff
.Allocate(nLength
+ 1);
6146 if(lpstrText
== NULL
)
6149 if(!GetText(nPane
, lpstrText
, pType
))
6152 bstrText
= ::SysAllocString(T2OLE(lpstrText
));
6153 return (bstrText
!= NULL
) ? TRUE
: FALSE
;
6155 #endif // !_ATL_NO_COM
6157 #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
6158 int GetText(int nPane
, _CSTRING_NS::CString
& strText
, int* pType
= NULL
) const
6160 ATLASSERT(::IsWindow(m_hWnd
));
6161 ATLASSERT(nPane
< 256);
6162 int nLength
= (int)(short)LOWORD(::SendMessage(m_hWnd
, SB_GETTEXTLENGTH
, (WPARAM
)nPane
, 0L));
6166 LPTSTR lpstr
= strText
.GetBufferSetLength(nLength
);
6169 return GetText(nPane
, lpstr
, pType
);
6171 #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
6173 BOOL
SetText(int nPane
, LPCTSTR lpszText
, int nType
= 0)
6175 ATLASSERT(::IsWindow(m_hWnd
));
6176 ATLASSERT(nPane
< 256);
6177 return (BOOL
)::SendMessage(m_hWnd
, SB_SETTEXT
, (nPane
| nType
), (LPARAM
)lpszText
);
6180 BOOL
GetRect(int nPane
, LPRECT lpRect
) const
6182 ATLASSERT(::IsWindow(m_hWnd
));
6183 ATLASSERT(nPane
< 256);
6184 return (BOOL
)::SendMessage(m_hWnd
, SB_GETRECT
, nPane
, (LPARAM
)lpRect
);
6187 BOOL
GetBorders(int* pBorders
) const
6189 ATLASSERT(::IsWindow(m_hWnd
));
6190 return (BOOL
)::SendMessage(m_hWnd
, SB_GETBORDERS
, 0, (LPARAM
)pBorders
);
6193 BOOL
GetBorders(int& nHorz
, int& nVert
, int& nSpacing
) const
6195 ATLASSERT(::IsWindow(m_hWnd
));
6196 int borders
[3] = { 0, 0, 0 };
6197 BOOL bResult
= (BOOL
)::SendMessage(m_hWnd
, SB_GETBORDERS
, 0, (LPARAM
)&borders
);
6202 nSpacing
= borders
[2];
6207 void SetMinHeight(int nMin
)
6209 ATLASSERT(::IsWindow(m_hWnd
));
6210 ::SendMessage(m_hWnd
, SB_SETMINHEIGHT
, nMin
, 0L);
6213 BOOL
SetSimple(BOOL bSimple
= TRUE
)
6215 ATLASSERT(::IsWindow(m_hWnd
));
6216 return (BOOL
)::SendMessage(m_hWnd
, SB_SIMPLE
, bSimple
, 0L);
6219 BOOL
IsSimple() const
6221 ATLASSERT(::IsWindow(m_hWnd
));
6222 return (BOOL
)::SendMessage(m_hWnd
, SB_ISSIMPLE
, 0, 0L);
6225 #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
6226 BOOL
GetUnicodeFormat() const
6228 ATLASSERT(::IsWindow(m_hWnd
));
6229 return (BOOL
)::SendMessage(m_hWnd
, SB_GETUNICODEFORMAT
, 0, 0L);
6232 BOOL
SetUnicodeFormat(BOOL bUnicode
= TRUE
)
6234 ATLASSERT(::IsWindow(m_hWnd
));
6235 return (BOOL
)::SendMessage(m_hWnd
, SB_SETUNICODEFORMAT
, bUnicode
, 0L);
6238 void GetTipText(int nPane
, LPTSTR lpstrText
, int nSize
) const
6240 ATLASSERT(::IsWindow(m_hWnd
));
6241 ATLASSERT(nPane
< 256);
6242 ::SendMessage(m_hWnd
, SB_GETTIPTEXT
, MAKEWPARAM(nPane
, nSize
), (LPARAM
)lpstrText
);
6245 void SetTipText(int nPane
, LPCTSTR lpstrText
)
6247 ATLASSERT(::IsWindow(m_hWnd
));
6248 ATLASSERT(nPane
< 256);
6249 ::SendMessage(m_hWnd
, SB_SETTIPTEXT
, nPane
, (LPARAM
)lpstrText
);
6251 #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
6253 #if ((_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 0x0500))
6254 COLORREF
SetBkColor(COLORREF clrBk
)
6256 ATLASSERT(::IsWindow(m_hWnd
));
6257 return (COLORREF
)::SendMessage(m_hWnd
, SB_SETBKCOLOR
, 0, (LPARAM
)clrBk
);
6260 HICON
GetIcon(int nPane
) const
6262 ATLASSERT(::IsWindow(m_hWnd
));
6263 ATLASSERT(nPane
< 256);
6264 return (HICON
)::SendMessage(m_hWnd
, SB_GETICON
, nPane
, 0L);
6267 BOOL
SetIcon(int nPane
, HICON hIcon
)
6269 ATLASSERT(::IsWindow(m_hWnd
));
6270 ATLASSERT(nPane
< 256);
6271 return (BOOL
)::SendMessage(m_hWnd
, SB_SETICON
, nPane
, (LPARAM
)hIcon
);
6273 #endif // ((_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 0x0500))
6276 typedef CStatusBarCtrlT
<ATL::CWindow
> CStatusBarCtrl
;
6279 ///////////////////////////////////////////////////////////////////////////////
6282 template <class TBase
>
6283 class CTabCtrlT
: public TBase
6287 CTabCtrlT(HWND hWnd
= NULL
) : TBase(hWnd
)
6290 CTabCtrlT
< TBase
>& operator =(HWND hWnd
)
6296 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
6297 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
6298 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
6300 return TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
6304 static LPCTSTR
GetWndClassName()
6306 return WC_TABCONTROL
;
6309 CImageList
GetImageList() const
6311 ATLASSERT(::IsWindow(m_hWnd
));
6312 return CImageList((HIMAGELIST
)::SendMessage(m_hWnd
, TCM_GETIMAGELIST
, 0, 0L));
6315 CImageList
SetImageList(HIMAGELIST hImageList
)
6317 ATLASSERT(::IsWindow(m_hWnd
));
6318 return CImageList((HIMAGELIST
)::SendMessage(m_hWnd
, TCM_SETIMAGELIST
, 0, (LPARAM
)hImageList
));
6321 int GetItemCount() const
6323 ATLASSERT(::IsWindow(m_hWnd
));
6324 return (int)::SendMessage(m_hWnd
, TCM_GETITEMCOUNT
, 0, 0L);
6327 BOOL
GetItem(int nItem
, LPTCITEM pTabCtrlItem
) const
6329 ATLASSERT(::IsWindow(m_hWnd
));
6330 return (BOOL
)::SendMessage(m_hWnd
, TCM_GETITEM
, nItem
, (LPARAM
)pTabCtrlItem
);
6333 BOOL
SetItem(int nItem
, LPTCITEM pTabCtrlItem
)
6335 ATLASSERT(::IsWindow(m_hWnd
));
6336 return (BOOL
)::SendMessage(m_hWnd
, TCM_SETITEM
, nItem
, (LPARAM
)pTabCtrlItem
);
6339 int SetItem(int nItem
, UINT mask
, LPCTSTR lpszItem
, DWORD dwState
, DWORD dwStateMask
, int iImage
, LPARAM lParam
)
6341 ATLASSERT(::IsWindow(m_hWnd
));
6344 tci
.pszText
= (LPTSTR
) lpszItem
;
6345 tci
.dwState
= dwState
;
6346 tci
.dwStateMask
= dwStateMask
;
6347 tci
.iImage
= iImage
;
6348 tci
.lParam
= lParam
;
6349 return (int)::SendMessage(m_hWnd
, TCM_SETITEM
, nItem
, (LPARAM
)&tci
);
6352 BOOL
GetItemRect(int nItem
, LPRECT lpRect
) const
6354 ATLASSERT(::IsWindow(m_hWnd
));
6355 return (BOOL
)::SendMessage(m_hWnd
, TCM_GETITEMRECT
, nItem
, (LPARAM
)lpRect
);
6358 int GetCurSel() const
6360 ATLASSERT(::IsWindow(m_hWnd
));
6361 return (int)::SendMessage(m_hWnd
, TCM_GETCURSEL
, 0, 0L);
6364 int SetCurSel(int nItem
)
6366 ATLASSERT(::IsWindow(m_hWnd
));
6367 return (int)::SendMessage(m_hWnd
, TCM_SETCURSEL
, nItem
, 0L);
6370 SIZE
SetItemSize(SIZE size
)
6372 ATLASSERT(::IsWindow(m_hWnd
));
6373 DWORD dwSize
= (DWORD
)::SendMessage(m_hWnd
, TCM_SETITEMSIZE
, 0, MAKELPARAM(size
.cx
, size
.cy
));
6374 SIZE sizeRet
= { GET_X_LPARAM(dwSize
), GET_Y_LPARAM(dwSize
) };
6378 void SetItemSize(int cx
, int cy
)
6380 ATLASSERT(::IsWindow(m_hWnd
));
6381 ::SendMessage(m_hWnd
, TCM_SETITEMSIZE
, 0, MAKELPARAM(cx
, cy
));
6384 void SetPadding(SIZE size
)
6386 ATLASSERT(::IsWindow(m_hWnd
));
6387 ::SendMessage(m_hWnd
, TCM_SETPADDING
, 0, MAKELPARAM(size
.cx
, size
.cy
));
6390 int GetRowCount() const
6392 ATLASSERT(::IsWindow(m_hWnd
));
6393 return (int)::SendMessage(m_hWnd
, TCM_GETROWCOUNT
, 0, 0L);
6397 CToolTipCtrl
GetToolTips() const
6399 ATLASSERT(::IsWindow(m_hWnd
));
6400 return CToolTipCtrl((HWND
)::SendMessage(m_hWnd
, TCM_GETTOOLTIPS
, 0, 0L));
6403 // this method is deprecated, please use GetToolTips
6404 CToolTipCtrl
GetTooltips() const { return GetToolTips(); }
6406 void SetToolTips(HWND hWndToolTip
)
6408 ATLASSERT(::IsWindow(m_hWnd
));
6409 ::SendMessage(m_hWnd
, TCM_SETTOOLTIPS
, (WPARAM
)hWndToolTip
, 0L);
6412 // this method is deprecated, please use SetToolTips
6413 void SetTooltips(HWND hWndToolTip
) { SetToolTips(hWndToolTip
); }
6415 #endif // !_WIN32_WCE
6417 int GetCurFocus() const
6419 ATLASSERT(::IsWindow(m_hWnd
));
6420 return (int)::SendMessage(m_hWnd
, TCM_GETCURFOCUS
, 0, 0L);
6423 void SetCurFocus(int nItem
)
6425 ATLASSERT(::IsWindow(m_hWnd
));
6426 ::SendMessage(m_hWnd
, TCM_SETCURFOCUS
, nItem
, 0L);
6429 BOOL
SetItemExtra(int cbExtra
)
6431 ATLASSERT(::IsWindow(m_hWnd
));
6432 ATLASSERT(GetItemCount() == 0); // must be empty
6433 return (BOOL
)::SendMessage(m_hWnd
, TCM_SETITEMEXTRA
, cbExtra
, 0L);
6436 int SetMinTabWidth(int nWidth
= -1)
6438 ATLASSERT(::IsWindow(m_hWnd
));
6439 return (int)::SendMessage(m_hWnd
, TCM_SETMINTABWIDTH
, 0, nWidth
);
6442 #if (_WIN32_IE >= 0x0400)
6443 DWORD
GetExtendedStyle() const
6445 ATLASSERT(::IsWindow(m_hWnd
));
6446 return (DWORD
)::SendMessage(m_hWnd
, TCM_GETEXTENDEDSTYLE
, 0, 0L);
6449 DWORD
SetExtendedStyle(DWORD dwExMask
, DWORD dwExStyle
)
6451 ATLASSERT(::IsWindow(m_hWnd
));
6452 return (DWORD
)::SendMessage(m_hWnd
, TCM_SETEXTENDEDSTYLE
, dwExMask
, dwExStyle
);
6456 BOOL
GetUnicodeFormat() const
6458 ATLASSERT(::IsWindow(m_hWnd
));
6459 return (BOOL
)::SendMessage(m_hWnd
, TCM_GETUNICODEFORMAT
, 0, 0L);
6462 BOOL
SetUnicodeFormat(BOOL bUnicode
= TRUE
)
6464 ATLASSERT(::IsWindow(m_hWnd
));
6465 return (BOOL
)::SendMessage(m_hWnd
, TCM_SETUNICODEFORMAT
, bUnicode
, 0L);
6467 #endif // !_WIN32_WCE
6468 #endif // (_WIN32_IE >= 0x0400)
6471 int InsertItem(int nItem
, LPTCITEM pTabCtrlItem
)
6473 ATLASSERT(::IsWindow(m_hWnd
));
6474 return (int)::SendMessage(m_hWnd
, TCM_INSERTITEM
, nItem
, (LPARAM
)pTabCtrlItem
);
6477 int InsertItem(int nItem
, UINT mask
, LPCTSTR lpszItem
, int iImage
, LPARAM lParam
)
6479 ATLASSERT(::IsWindow(m_hWnd
));
6482 tci
.pszText
= (LPTSTR
) lpszItem
;
6483 tci
.iImage
= iImage
;
6484 tci
.lParam
= lParam
;
6485 return (int)::SendMessage(m_hWnd
, TCM_INSERTITEM
, nItem
, (LPARAM
)&tci
);
6488 int InsertItem(int nItem
, LPCTSTR lpszItem
)
6490 ATLASSERT(::IsWindow(m_hWnd
));
6492 tci
.mask
= TCIF_TEXT
;
6493 tci
.pszText
= (LPTSTR
) lpszItem
;
6494 return (int)::SendMessage(m_hWnd
, TCM_INSERTITEM
, nItem
, (LPARAM
)&tci
);
6497 int AddItem(LPTCITEM pTabCtrlItem
)
6499 return InsertItem(GetItemCount(), pTabCtrlItem
);
6502 int AddItem(UINT mask
, LPCTSTR lpszItem
, int iImage
, LPARAM lParam
)
6504 return InsertItem(GetItemCount(), mask
, lpszItem
, iImage
, lParam
);
6507 int AddItem(LPCTSTR lpszItem
)
6509 return InsertItem(GetItemCount(), lpszItem
);
6512 BOOL
DeleteItem(int nItem
)
6514 ATLASSERT(::IsWindow(m_hWnd
));
6515 return (BOOL
)::SendMessage(m_hWnd
, TCM_DELETEITEM
, nItem
, 0L);
6518 BOOL
DeleteAllItems()
6520 ATLASSERT(::IsWindow(m_hWnd
));
6521 return (BOOL
)::SendMessage(m_hWnd
, TCM_DELETEALLITEMS
, 0, 0L);
6524 void AdjustRect(BOOL bLarger
, LPRECT lpRect
)
6526 ATLASSERT(::IsWindow(m_hWnd
));
6527 ::SendMessage(m_hWnd
, TCM_ADJUSTRECT
, bLarger
, (LPARAM
)lpRect
);
6530 void RemoveImage(int nImage
)
6532 ATLASSERT(::IsWindow(m_hWnd
));
6533 ::SendMessage(m_hWnd
, TCM_REMOVEIMAGE
, nImage
, 0L);
6536 int HitTest(TC_HITTESTINFO
* pHitTestInfo
) const
6538 ATLASSERT(::IsWindow(m_hWnd
));
6539 return (int)::SendMessage(m_hWnd
, TCM_HITTEST
, 0, (LPARAM
)pHitTestInfo
);
6542 void DeselectAll(BOOL bExcludeFocus
= TRUE
)
6544 ATLASSERT(::IsWindow(m_hWnd
));
6545 ::SendMessage(m_hWnd
, TCM_DESELECTALL
, bExcludeFocus
, 0L);
6548 #if (_WIN32_IE >= 0x0400)
6549 BOOL
HighlightItem(int nIndex
, BOOL bHighlight
= TRUE
)
6551 ATLASSERT(::IsWindow(m_hWnd
));
6552 return (BOOL
)::SendMessage(m_hWnd
, TCM_HIGHLIGHTITEM
, nIndex
, MAKELPARAM(bHighlight
, 0));
6554 #endif // (_WIN32_IE >= 0x0400)
6557 typedef CTabCtrlT
<ATL::CWindow
> CTabCtrl
;
6560 ///////////////////////////////////////////////////////////////////////////////
6563 template <class TBase
>
6564 class CTrackBarCtrlT
: public TBase
6568 CTrackBarCtrlT(HWND hWnd
= NULL
) : TBase(hWnd
)
6571 CTrackBarCtrlT
< TBase
>& operator =(HWND hWnd
)
6577 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
6578 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
6579 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
6581 return TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
6585 static LPCTSTR
GetWndClassName()
6587 return TRACKBAR_CLASS
;
6590 int GetLineSize() const
6592 ATLASSERT(::IsWindow(m_hWnd
));
6593 return (int)::SendMessage(m_hWnd
, TBM_GETLINESIZE
, 0, 0L);
6596 int SetLineSize(int nSize
)
6598 ATLASSERT(::IsWindow(m_hWnd
));
6599 return (int)::SendMessage(m_hWnd
, TBM_SETLINESIZE
, 0, nSize
);
6602 int GetPageSize() const
6604 ATLASSERT(::IsWindow(m_hWnd
));
6605 return (int)::SendMessage(m_hWnd
, TBM_GETPAGESIZE
, 0, 0L);
6608 int SetPageSize(int nSize
)
6610 ATLASSERT(::IsWindow(m_hWnd
));
6611 return (int)::SendMessage(m_hWnd
, TBM_SETPAGESIZE
, 0, nSize
);
6614 int GetRangeMin() const
6616 ATLASSERT(::IsWindow(m_hWnd
));
6617 return (int)::SendMessage(m_hWnd
, TBM_GETRANGEMIN
, 0, 0L);
6620 void SetRangeMin(int nMin
, BOOL bRedraw
= FALSE
)
6622 ATLASSERT(::IsWindow(m_hWnd
));
6623 ::SendMessage(m_hWnd
, TBM_SETRANGEMIN
, bRedraw
, nMin
);
6626 int GetRangeMax() const
6628 ATLASSERT(::IsWindow(m_hWnd
));
6629 return (int)::SendMessage(m_hWnd
, TBM_GETRANGEMAX
, 0, 0L);
6632 void SetRangeMax(int nMax
, BOOL bRedraw
= FALSE
)
6634 ATLASSERT(::IsWindow(m_hWnd
));
6635 ::SendMessage(m_hWnd
, TBM_SETRANGEMAX
, bRedraw
, nMax
);
6638 void GetRange(int& nMin
, int& nMax
) const
6640 nMin
= GetRangeMin();
6641 nMax
= GetRangeMax();
6644 void SetRange(int nMin
, int nMax
, BOOL bRedraw
= TRUE
)
6646 ATLASSERT(::IsWindow(m_hWnd
));
6647 ::SendMessage(m_hWnd
, TBM_SETRANGE
, bRedraw
, MAKELPARAM(nMin
, nMax
));
6650 int GetSelStart() const
6652 ATLASSERT(::IsWindow(m_hWnd
));
6653 return (int)::SendMessage(m_hWnd
, TBM_GETSELSTART
, 0, 0L);
6656 void SetSelStart(int nMin
, BOOL bRedraw
= FALSE
)
6658 ATLASSERT(::IsWindow(m_hWnd
));
6659 ::SendMessage(m_hWnd
, TBM_SETSELSTART
, bRedraw
, (LPARAM
)nMin
);
6662 int GetSelEnd() const
6664 ATLASSERT(::IsWindow(m_hWnd
));
6665 return (int)::SendMessage(m_hWnd
, TBM_GETSELEND
, 0, 0L);
6668 void SetSelEnd(int nMax
, BOOL bRedraw
= FALSE
)
6670 ATLASSERT(::IsWindow(m_hWnd
));
6671 ::SendMessage(m_hWnd
, TBM_SETSELEND
, bRedraw
, (LPARAM
)nMax
);
6674 void GetSelection(int& nMin
, int& nMax
) const
6676 nMin
= GetSelStart();
6680 void SetSelection(int nMin
, int nMax
, BOOL bRedraw
= TRUE
)
6682 SetSelStart(nMin
, FALSE
);
6683 SetSelEnd(nMax
, bRedraw
);
6686 void GetChannelRect(LPRECT lprc
) const
6688 ATLASSERT(::IsWindow(m_hWnd
));
6689 ::SendMessage(m_hWnd
, TBM_GETCHANNELRECT
, 0, (LPARAM
)lprc
);
6692 void GetThumbRect(LPRECT lprc
) const
6694 ATLASSERT(::IsWindow(m_hWnd
));
6695 ::SendMessage(m_hWnd
, TBM_GETTHUMBRECT
, 0, (LPARAM
)lprc
);
6700 ATLASSERT(::IsWindow(m_hWnd
));
6701 return (int)::SendMessage(m_hWnd
, TBM_GETPOS
, 0, 0L);
6704 void SetPos(int nPos
)
6706 ATLASSERT(::IsWindow(m_hWnd
));
6707 ::SendMessage(m_hWnd
, TBM_SETPOS
, TRUE
, nPos
);
6710 UINT
GetNumTics() const
6712 ATLASSERT(::IsWindow(m_hWnd
));
6713 return (UINT
)::SendMessage(m_hWnd
, TBM_GETNUMTICS
, 0, 0L);
6716 DWORD
* GetTicArray() const
6718 ATLASSERT(::IsWindow(m_hWnd
));
6719 return (DWORD
*)::SendMessage(m_hWnd
, TBM_GETPTICS
, 0, 0L);
6722 int GetTic(int nTic
) const
6724 ATLASSERT(::IsWindow(m_hWnd
));
6725 return (int)::SendMessage(m_hWnd
, TBM_GETTIC
, nTic
, 0L);
6728 BOOL
SetTic(int nTic
)
6730 ATLASSERT(::IsWindow(m_hWnd
));
6731 return (BOOL
)::SendMessage(m_hWnd
, TBM_SETTIC
, 0, nTic
);
6734 int GetTicPos(int nTic
) const
6736 ATLASSERT(::IsWindow(m_hWnd
));
6737 return (int)::SendMessage(m_hWnd
, TBM_GETTICPOS
, nTic
, 0L);
6740 void SetTicFreq(int nFreq
)
6742 ATLASSERT(::IsWindow(m_hWnd
));
6743 ::SendMessage(m_hWnd
, TBM_SETTICFREQ
, nFreq
, 0L);
6746 int GetThumbLength() const
6748 ATLASSERT(::IsWindow(m_hWnd
));
6749 return (int)::SendMessage(m_hWnd
, TBM_GETTHUMBLENGTH
, 0, 0L);
6752 void SetThumbLength(int nLength
)
6754 ATLASSERT(::IsWindow(m_hWnd
));
6755 ::SendMessage(m_hWnd
, TBM_SETTHUMBLENGTH
, nLength
, 0L);
6758 void SetSel(int nStart
, int nEnd
, BOOL bRedraw
= TRUE
)
6760 ATLASSERT(::IsWindow(m_hWnd
));
6761 ATLASSERT((GetStyle() & TBS_ENABLESELRANGE
) != 0);
6762 ::SendMessage(m_hWnd
, TBM_SETSEL
, bRedraw
, MAKELPARAM(nStart
, nEnd
));
6765 ATL::CWindow
GetBuddy(BOOL bLeft
= TRUE
) const
6767 ATLASSERT(::IsWindow(m_hWnd
));
6768 return ATL::CWindow((HWND
)::SendMessage(m_hWnd
, TBM_GETBUDDY
, bLeft
, 0L));
6771 ATL::CWindow
SetBuddy(HWND hWndBuddy
, BOOL bLeft
= TRUE
)
6773 ATLASSERT(::IsWindow(m_hWnd
));
6774 return ATL::CWindow((HWND
)::SendMessage(m_hWnd
, TBM_SETBUDDY
, bLeft
, (LPARAM
)hWndBuddy
));
6778 CToolTipCtrl
GetToolTips() const
6780 ATLASSERT(::IsWindow(m_hWnd
));
6781 return CToolTipCtrl((HWND
)::SendMessage(m_hWnd
, TBM_GETTOOLTIPS
, 0, 0L));
6784 void SetToolTips(HWND hWndTT
)
6786 ATLASSERT(::IsWindow(m_hWnd
));
6787 ::SendMessage(m_hWnd
, TBM_SETTOOLTIPS
, (WPARAM
)hWndTT
, 0L);
6790 int SetTipSide(int nSide
)
6792 ATLASSERT(::IsWindow(m_hWnd
));
6793 return (int)::SendMessage(m_hWnd
, TBM_SETTIPSIDE
, nSide
, 0L);
6795 #endif // !_WIN32_WCE
6797 #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
6798 BOOL
GetUnicodeFormat() const
6800 ATLASSERT(::IsWindow(m_hWnd
));
6801 return (BOOL
)::SendMessage(m_hWnd
, TBM_GETUNICODEFORMAT
, 0, 0L);
6804 BOOL
SetUnicodeFormat(BOOL bUnicode
= TRUE
)
6806 ATLASSERT(::IsWindow(m_hWnd
));
6807 return (BOOL
)::SendMessage(m_hWnd
, TBM_SETUNICODEFORMAT
, bUnicode
, 0L);
6809 #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
6812 void ClearSel(BOOL bRedraw
= FALSE
)
6814 ATLASSERT(::IsWindow(m_hWnd
));
6815 ::SendMessage(m_hWnd
, TBM_CLEARSEL
, bRedraw
, 0L);
6820 ATLASSERT(::IsWindow(m_hWnd
));
6821 ::SendMessage(m_hWnd
, TBM_SETPOS
, FALSE
, 0L);
6824 void ClearTics(BOOL bRedraw
= FALSE
)
6826 ATLASSERT(::IsWindow(m_hWnd
));
6827 ::SendMessage(m_hWnd
, TBM_CLEARTICS
, bRedraw
, 0L);
6831 typedef CTrackBarCtrlT
<ATL::CWindow
> CTrackBarCtrl
;
6834 ///////////////////////////////////////////////////////////////////////////////
6837 template <class TBase
>
6838 class CUpDownCtrlT
: public TBase
6842 CUpDownCtrlT(HWND hWnd
= NULL
) : TBase(hWnd
)
6845 CUpDownCtrlT
< TBase
>& operator =(HWND hWnd
)
6851 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
6852 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
6853 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
6855 return TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
6859 static LPCTSTR
GetWndClassName()
6861 return UPDOWN_CLASS
;
6864 UINT
GetAccel(int nAccel
, UDACCEL
* pAccel
) const
6866 ATLASSERT(::IsWindow(m_hWnd
));
6867 return (UINT
)LOWORD(::SendMessage(m_hWnd
, UDM_GETACCEL
, nAccel
, (LPARAM
)pAccel
));
6870 BOOL
SetAccel(int nAccel
, UDACCEL
* pAccel
)
6872 ATLASSERT(::IsWindow(m_hWnd
));
6873 return (BOOL
)LOWORD(::SendMessage(m_hWnd
, UDM_SETACCEL
, nAccel
, (LPARAM
)pAccel
));
6876 UINT
GetBase() const
6878 ATLASSERT(::IsWindow(m_hWnd
));
6879 return (UINT
)LOWORD(::SendMessage(m_hWnd
, UDM_GETBASE
, 0, 0L));
6882 int SetBase(int nBase
)
6884 ATLASSERT(::IsWindow(m_hWnd
));
6885 return (int)::SendMessage(m_hWnd
, UDM_SETBASE
, nBase
, 0L);
6888 ATL::CWindow
GetBuddy() const
6890 ATLASSERT(::IsWindow(m_hWnd
));
6891 return ATL::CWindow((HWND
)::SendMessage(m_hWnd
, UDM_GETBUDDY
, 0, 0L));
6894 ATL::CWindow
SetBuddy(HWND hWndBuddy
)
6896 ATLASSERT(::IsWindow(m_hWnd
));
6897 return ATL::CWindow((HWND
)::SendMessage(m_hWnd
, UDM_SETBUDDY
, (WPARAM
)hWndBuddy
, 0L));
6900 int GetPos(LPBOOL lpbError
= NULL
) const
6902 ATLASSERT(::IsWindow(m_hWnd
));
6903 DWORD dwRet
= (DWORD
)::SendMessage(m_hWnd
, UDM_GETPOS
, 0, 0L);
6904 // Note: Seems that Windows always sets error to TRUE if
6905 // UDS_SETBUDDYINT style is not used
6906 if(lpbError
!= NULL
)
6907 *lpbError
= (HIWORD(dwRet
) != 0) ? TRUE
: FALSE
;
6908 return (int)(short)LOWORD(dwRet
);
6911 int SetPos(int nPos
)
6913 ATLASSERT(::IsWindow(m_hWnd
));
6914 return (int)(short)LOWORD(::SendMessage(m_hWnd
, UDM_SETPOS
, 0, MAKELPARAM(nPos
, 0)));
6917 DWORD
GetRange() const
6919 ATLASSERT(::IsWindow(m_hWnd
));
6920 return (DWORD
)::SendMessage(m_hWnd
, UDM_GETRANGE
, 0, 0L);
6923 void GetRange(int& nLower
, int& nUpper
) const
6925 ATLASSERT(::IsWindow(m_hWnd
));
6926 DWORD dwRet
= (DWORD
)::SendMessage(m_hWnd
, UDM_GETRANGE
, 0, 0L);
6927 nLower
= (int)(short)HIWORD(dwRet
);
6928 nUpper
= (int)(short)LOWORD(dwRet
);
6931 void SetRange(int nLower
, int nUpper
)
6933 ATLASSERT(::IsWindow(m_hWnd
));
6934 ::SendMessage(m_hWnd
, UDM_SETRANGE
, 0, MAKELPARAM(nUpper
, nLower
));
6937 #if (_WIN32_IE >= 0x0400)
6938 void SetRange32(int nLower
, int nUpper
)
6940 ATLASSERT(::IsWindow(m_hWnd
));
6941 ::SendMessage(m_hWnd
, UDM_SETRANGE32
, nLower
, nUpper
);
6944 void GetRange32(int& nLower
, int& nUpper
) const
6946 ATLASSERT(::IsWindow(m_hWnd
));
6947 ::SendMessage(m_hWnd
, UDM_GETRANGE32
, (WPARAM
)&nLower
, (LPARAM
)&nUpper
);
6951 BOOL
GetUnicodeFormat() const
6953 ATLASSERT(::IsWindow(m_hWnd
));
6954 return (BOOL
)::SendMessage(m_hWnd
, UDM_GETUNICODEFORMAT
, 0, 0L);
6957 BOOL
SetUnicodeFormat(BOOL bUnicode
= TRUE
)
6959 ATLASSERT(::IsWindow(m_hWnd
));
6960 return (BOOL
)::SendMessage(m_hWnd
, UDM_SETUNICODEFORMAT
, bUnicode
, 0L);
6962 #endif // !_WIN32_WCE
6963 #endif // (_WIN32_IE >= 0x0400)
6965 #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
6966 int GetPos32(LPBOOL lpbError
= NULL
) const
6968 ATLASSERT(::IsWindow(m_hWnd
));
6969 // Note: Seems that Windows always sets error to TRUE if
6970 // UDS_SETBUDDYINT style is not used
6971 return (int)::SendMessage(m_hWnd
, UDM_GETPOS32
, 0, (LPARAM
)lpbError
);
6974 int SetPos32(int nPos
)
6976 ATLASSERT(::IsWindow(m_hWnd
));
6977 return (int)::SendMessage(m_hWnd
, UDM_SETPOS32
, 0, (LPARAM
)nPos
);
6979 #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
6982 typedef CUpDownCtrlT
<ATL::CWindow
> CUpDownCtrl
;
6985 ///////////////////////////////////////////////////////////////////////////////
6988 template <class TBase
>
6989 class CProgressBarCtrlT
: public TBase
6993 CProgressBarCtrlT(HWND hWnd
= NULL
) : TBase(hWnd
)
6996 CProgressBarCtrlT
< TBase
>& operator =(HWND hWnd
)
7002 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
7003 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
7004 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
7006 return TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
7010 static LPCTSTR
GetWndClassName()
7012 return PROGRESS_CLASS
;
7015 DWORD
SetRange(int nLower
, int nUpper
)
7017 ATLASSERT(::IsWindow(m_hWnd
));
7018 return (DWORD
)::SendMessage(m_hWnd
, PBM_SETRANGE
, 0, MAKELPARAM(nLower
, nUpper
));
7021 int SetPos(int nPos
)
7023 ATLASSERT(::IsWindow(m_hWnd
));
7024 return (int)(short)LOWORD(::SendMessage(m_hWnd
, PBM_SETPOS
, nPos
, 0L));
7027 int OffsetPos(int nPos
)
7029 ATLASSERT(::IsWindow(m_hWnd
));
7030 return (int)(short)LOWORD(::SendMessage(m_hWnd
, PBM_DELTAPOS
, nPos
, 0L));
7033 int SetStep(int nStep
)
7035 ATLASSERT(::IsWindow(m_hWnd
));
7036 return (int)(short)LOWORD(::SendMessage(m_hWnd
, PBM_SETSTEP
, nStep
, 0L));
7041 ATLASSERT(::IsWindow(m_hWnd
));
7042 return (UINT
)::SendMessage(m_hWnd
, PBM_GETPOS
, 0, 0L);
7045 void GetRange(PPBRANGE pPBRange
) const
7047 ATLASSERT(::IsWindow(m_hWnd
));
7048 ATLASSERT(pPBRange
!= NULL
);
7049 ::SendMessage(m_hWnd
, PBM_GETRANGE
, TRUE
, (LPARAM
)pPBRange
);
7052 void GetRange(int& nLower
, int& nUpper
) const
7054 ATLASSERT(::IsWindow(m_hWnd
));
7055 PBRANGE range
= { 0 };
7056 ::SendMessage(m_hWnd
, PBM_GETRANGE
, TRUE
, (LPARAM
)&range
);
7057 nLower
= range
.iLow
;
7058 nUpper
= range
.iHigh
;
7061 int GetRangeLimit(BOOL bLowLimit
) const
7063 ATLASSERT(::IsWindow(m_hWnd
));
7064 return (int)::SendMessage(m_hWnd
, PBM_GETRANGE
, bLowLimit
, (LPARAM
)NULL
);
7067 DWORD
SetRange32(int nMin
, int nMax
)
7069 ATLASSERT(::IsWindow(m_hWnd
));
7070 return (DWORD
)::SendMessage(m_hWnd
, PBM_SETRANGE32
, nMin
, nMax
);
7073 #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
7074 COLORREF
SetBarColor(COLORREF clr
)
7076 ATLASSERT(::IsWindow(m_hWnd
));
7077 return (COLORREF
)::SendMessage(m_hWnd
, PBM_SETBARCOLOR
, 0, (LPARAM
)clr
);
7080 COLORREF
SetBkColor(COLORREF clr
)
7082 ATLASSERT(::IsWindow(m_hWnd
));
7083 return (COLORREF
)::SendMessage(m_hWnd
, PBM_SETBKCOLOR
, 0, (LPARAM
)clr
);
7085 #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
7087 #if (_WIN32_WINNT >= 0x0501) && defined(PBM_SETMARQUEE)
7088 BOOL
SetMarquee(BOOL bMarquee
, UINT uUpdateTime
= 0U)
7090 ATLASSERT(::IsWindow(m_hWnd
));
7091 return (BOOL
)::SendMessage(m_hWnd
, PBM_SETMARQUEE
, (WPARAM
)bMarquee
, (LPARAM
)uUpdateTime
);
7093 #endif // (_WIN32_WINNT >= 0x0501) && defined(PBM_SETMARQUEE)
7095 #if (_WIN32_WINNT >= 0x0600)
7098 ATLASSERT(::IsWindow(m_hWnd
));
7099 return (int)::SendMessage(m_hWnd
, PBM_GETSTEP
, 0, 0L);
7102 COLORREF
GetBkColor() const
7104 ATLASSERT(::IsWindow(m_hWnd
));
7105 return (COLORREF
)::SendMessage(m_hWnd
, PBM_GETBKCOLOR
, 0, 0L);
7108 COLORREF
GetBarColor() const
7110 ATLASSERT(::IsWindow(m_hWnd
));
7111 return (COLORREF
)::SendMessage(m_hWnd
, PBM_GETBARCOLOR
, 0, 0L);
7114 int GetState() const
7116 ATLASSERT(::IsWindow(m_hWnd
));
7117 return (int)::SendMessage(m_hWnd
, PBM_GETSTATE
, 0, 0L);
7120 int SetState(int nState
)
7122 ATLASSERT(::IsWindow(m_hWnd
));
7123 return (int)::SendMessage(m_hWnd
, PBM_SETSTATE
, nState
, 0L);
7125 #endif // (_WIN32_WINNT >= 0x0600)
7130 ATLASSERT(::IsWindow(m_hWnd
));
7131 return (int)(short)LOWORD(::SendMessage(m_hWnd
, PBM_STEPIT
, 0, 0L));
7135 typedef CProgressBarCtrlT
<ATL::CWindow
> CProgressBarCtrl
;
7138 ///////////////////////////////////////////////////////////////////////////////
7143 template <class TBase
>
7144 class CHotKeyCtrlT
: public TBase
7148 CHotKeyCtrlT(HWND hWnd
= NULL
) : TBase(hWnd
)
7151 CHotKeyCtrlT
< TBase
>& operator =(HWND hWnd
)
7157 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
7158 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
7159 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
7161 return TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
7165 static LPCTSTR
GetWndClassName()
7167 return HOTKEY_CLASS
;
7170 DWORD
GetHotKey() const
7172 ATLASSERT(::IsWindow(m_hWnd
));
7173 return (DWORD
)::SendMessage(m_hWnd
, HKM_GETHOTKEY
, 0, 0L);
7176 void GetHotKey(WORD
&wVirtualKeyCode
, WORD
&wModifiers
) const
7178 ATLASSERT(::IsWindow(m_hWnd
));
7179 DWORD dw
= (DWORD
)::SendMessage(m_hWnd
, HKM_GETHOTKEY
, 0, 0L);
7180 wVirtualKeyCode
= LOBYTE(LOWORD(dw
));
7181 wModifiers
= HIBYTE(LOWORD(dw
));
7184 void SetHotKey(WORD wVirtualKeyCode
, WORD wModifiers
)
7186 ATLASSERT(::IsWindow(m_hWnd
));
7187 ::SendMessage(m_hWnd
, HKM_SETHOTKEY
, MAKEWORD(wVirtualKeyCode
, wModifiers
), 0L);
7190 void SetRules(WORD wInvalidComb
, WORD wModifiers
)
7192 ATLASSERT(::IsWindow(m_hWnd
));
7193 ::SendMessage(m_hWnd
, HKM_SETRULES
, wInvalidComb
, MAKELPARAM(wModifiers
, 0));
7197 typedef CHotKeyCtrlT
<ATL::CWindow
> CHotKeyCtrl
;
7199 #endif // !_WIN32_WCE
7202 ///////////////////////////////////////////////////////////////////////////////
7207 template <class TBase
>
7208 class CAnimateCtrlT
: public TBase
7212 CAnimateCtrlT(HWND hWnd
= NULL
) : TBase(hWnd
)
7215 CAnimateCtrlT
< TBase
>& operator =(HWND hWnd
)
7221 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
7222 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
7223 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
7225 return TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
7229 static LPCTSTR
GetWndClassName()
7231 return ANIMATE_CLASS
;
7235 BOOL
Open(ATL::_U_STRINGorID FileName
)
7237 ATLASSERT(::IsWindow(m_hWnd
));
7238 return (BOOL
)::SendMessage(m_hWnd
, ACM_OPEN
, 0, (LPARAM
)FileName
.m_lpstr
);
7241 BOOL
Play(UINT nFrom
, UINT nTo
, UINT nRep
)
7243 ATLASSERT(::IsWindow(m_hWnd
));
7244 return (BOOL
)::SendMessage(m_hWnd
, ACM_PLAY
, nRep
, MAKELPARAM(nFrom
, nTo
));
7249 ATLASSERT(::IsWindow(m_hWnd
));
7250 return (BOOL
)::SendMessage(m_hWnd
, ACM_STOP
, 0, 0L);
7255 ATLASSERT(::IsWindow(m_hWnd
));
7256 return (BOOL
)::SendMessage(m_hWnd
, ACM_OPEN
, 0, 0L);
7261 ATLASSERT(::IsWindow(m_hWnd
));
7262 return (BOOL
)::SendMessage(m_hWnd
, ACM_PLAY
, 0, MAKELPARAM(nTo
, nTo
));
7266 BOOL
IsPlaying() const
7268 #ifndef ACM_ISPLAYING
7269 const UINT ACM_ISPLAYING
= (WM_USER
+104);
7271 ATLASSERT(::IsWindow(m_hWnd
));
7272 return (BOOL
)::SendMessage(m_hWnd
, ACM_ISPLAYING
, 0, 0L);
7276 typedef CAnimateCtrlT
<ATL::CWindow
> CAnimateCtrl
;
7278 #endif // !_WIN32_WCE
7281 ///////////////////////////////////////////////////////////////////////////////
7286 #if defined(_UNICODE) && (_RICHEDIT_VER == 0x0100)
7287 #undef RICHEDIT_CLASS
7288 #define RICHEDIT_CLASS L"RICHEDIT"
7291 #if !defined(_UNICODE) && (_RICHEDIT_VER >= 0x0500)
7292 #undef MSFTEDIT_CLASS
7293 #define MSFTEDIT_CLASS "RICHEDIT50W"
7296 template <class TBase
>
7297 class CRichEditCtrlT
: public TBase
7301 CRichEditCtrlT(HWND hWnd
= NULL
) : TBase(hWnd
)
7304 CRichEditCtrlT
< TBase
>& operator =(HWND hWnd
)
7310 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
7311 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
7312 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
7314 return TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
7318 static LPCTSTR
GetWndClassName()
7320 #if (_RICHEDIT_VER >= 0x0500)
7321 return MSFTEDIT_CLASS
;
7323 return RICHEDIT_CLASS
;
7327 static LPCTSTR
GetLibraryName()
7329 #if (_RICHEDIT_VER >= 0x0500)
7330 return _T("MSFTEDIT.DLL");
7331 #elif (_RICHEDIT_VER >= 0x0200)
7332 return _T("RICHED20.DLL");
7334 return _T("RICHED32.DLL");
7338 int GetLineCount() const
7340 ATLASSERT(::IsWindow(m_hWnd
));
7341 return (int)::SendMessage(m_hWnd
, EM_GETLINECOUNT
, 0, 0L);
7344 BOOL
GetModify() const
7346 ATLASSERT(::IsWindow(m_hWnd
));
7347 return (BOOL
)::SendMessage(m_hWnd
, EM_GETMODIFY
, 0, 0L);
7350 void SetModify(BOOL bModified
= TRUE
)
7352 ATLASSERT(::IsWindow(m_hWnd
));
7353 ::SendMessage(m_hWnd
, EM_SETMODIFY
, bModified
, 0L);
7356 void GetRect(LPRECT lpRect
) const
7358 ATLASSERT(::IsWindow(m_hWnd
));
7359 ::SendMessage(m_hWnd
, EM_GETRECT
, 0, (LPARAM
)lpRect
);
7362 DWORD
GetOptions() const
7364 ATLASSERT(::IsWindow(m_hWnd
));
7365 return (DWORD
)::SendMessage(m_hWnd
, EM_GETOPTIONS
, 0, 0L);
7368 DWORD
SetOptions(WORD wOperation
, DWORD dwOptions
)
7370 ATLASSERT(::IsWindow(m_hWnd
));
7371 return (DWORD
)::SendMessage(m_hWnd
, EM_SETOPTIONS
, wOperation
, dwOptions
);
7374 // NOTE: first word in lpszBuffer must contain the size of the buffer!
7375 int GetLine(int nIndex
, LPTSTR lpszBuffer
) const
7377 ATLASSERT(::IsWindow(m_hWnd
));
7378 return (int)::SendMessage(m_hWnd
, EM_GETLINE
, nIndex
, (LPARAM
)lpszBuffer
);
7381 int GetLine(int nIndex
, LPTSTR lpszBuffer
, int nMaxLength
) const
7383 ATLASSERT(::IsWindow(m_hWnd
));
7384 *(LPWORD
)lpszBuffer
= (WORD
)nMaxLength
;
7385 return (int)::SendMessage(m_hWnd
, EM_GETLINE
, nIndex
, (LPARAM
)lpszBuffer
);
7388 BOOL
CanUndo() const
7390 ATLASSERT(::IsWindow(m_hWnd
));
7391 return (BOOL
)::SendMessage(m_hWnd
, EM_CANUNDO
, 0, 0L);
7394 BOOL
CanPaste(UINT nFormat
= 0) const
7396 ATLASSERT(::IsWindow(m_hWnd
));
7397 return (BOOL
)::SendMessage(m_hWnd
, EM_CANPASTE
, nFormat
, 0L);
7400 void GetSel(LONG
& nStartChar
, LONG
& nEndChar
) const
7402 ATLASSERT(::IsWindow(m_hWnd
));
7403 CHARRANGE cr
= { 0, 0 };
7404 ::SendMessage(m_hWnd
, EM_EXGETSEL
, 0, (LPARAM
)&cr
);
7405 nStartChar
= cr
.cpMin
;
7406 nEndChar
= cr
.cpMax
;
7409 void GetSel(CHARRANGE
&cr
) const
7411 ATLASSERT(::IsWindow(m_hWnd
));
7412 ::SendMessage(m_hWnd
, EM_EXGETSEL
, 0, (LPARAM
)&cr
);
7415 int SetSel(LONG nStartChar
, LONG nEndChar
)
7417 ATLASSERT(::IsWindow(m_hWnd
));
7418 CHARRANGE cr
= { nStartChar
, nEndChar
};
7419 return (int)::SendMessage(m_hWnd
, EM_EXSETSEL
, 0, (LPARAM
)&cr
);
7422 int SetSel(CHARRANGE
&cr
)
7424 ATLASSERT(::IsWindow(m_hWnd
));
7425 return (int)::SendMessage(m_hWnd
, EM_EXSETSEL
, 0, (LPARAM
)&cr
);
7430 return SetSel(0, -1);
7435 return SetSel(-1, 0);
7438 DWORD
GetDefaultCharFormat(CHARFORMAT
& cf
) const
7440 ATLASSERT(::IsWindow(m_hWnd
));
7441 cf
.cbSize
= sizeof(CHARFORMAT
);
7442 return (DWORD
)::SendMessage(m_hWnd
, EM_GETCHARFORMAT
, 0, (LPARAM
)&cf
);
7445 DWORD
GetSelectionCharFormat(CHARFORMAT
& cf
) const
7447 ATLASSERT(::IsWindow(m_hWnd
));
7448 cf
.cbSize
= sizeof(CHARFORMAT
);
7449 return (DWORD
)::SendMessage(m_hWnd
, EM_GETCHARFORMAT
, 1, (LPARAM
)&cf
);
7452 DWORD
GetEventMask() const
7454 ATLASSERT(::IsWindow(m_hWnd
));
7455 return (DWORD
)::SendMessage(m_hWnd
, EM_GETEVENTMASK
, 0, 0L);
7458 LONG
GetLimitText() const
7460 ATLASSERT(::IsWindow(m_hWnd
));
7461 return (LONG
)::SendMessage(m_hWnd
, EM_GETLIMITTEXT
, 0, 0L);
7464 DWORD
GetParaFormat(PARAFORMAT
& pf
) const
7466 ATLASSERT(::IsWindow(m_hWnd
));
7467 pf
.cbSize
= sizeof(PARAFORMAT
);
7468 return (DWORD
)::SendMessage(m_hWnd
, EM_GETPARAFORMAT
, 0, (LPARAM
)&pf
);
7471 #if (_RICHEDIT_VER >= 0x0200)
7472 LONG
GetSelText(LPTSTR lpstrBuff
) const
7474 ATLASSERT(::IsWindow(m_hWnd
));
7475 return (LONG
)::SendMessage(m_hWnd
, EM_GETSELTEXT
, 0, (LPARAM
)lpstrBuff
);
7477 #else // !(_RICHEDIT_VER >= 0x0200)
7478 // RichEdit 1.0 EM_GETSELTEXT is ANSI only
7479 LONG
GetSelText(LPSTR lpstrBuff
) const
7481 ATLASSERT(::IsWindow(m_hWnd
));
7482 return (LONG
)::SendMessage(m_hWnd
, EM_GETSELTEXT
, 0, (LPARAM
)lpstrBuff
);
7484 #endif // !(_RICHEDIT_VER >= 0x0200)
7487 BOOL
GetSelTextBSTR(BSTR
& bstrText
) const
7490 ATLASSERT(::IsWindow(m_hWnd
));
7491 ATLASSERT(bstrText
== NULL
);
7493 CHARRANGE cr
= { 0, 0 };
7494 ::SendMessage(m_hWnd
, EM_EXGETSEL
, 0, (LPARAM
)&cr
);
7496 #if (_RICHEDIT_VER >= 0x0200)
7497 CTempBuffer
<TCHAR
, _WTL_STACK_ALLOC_THRESHOLD
> buff
;
7498 LPTSTR lpstrText
= buff
.Allocate(cr
.cpMax
- cr
.cpMin
+ 1);
7499 if(lpstrText
== NULL
)
7501 if(::SendMessage(m_hWnd
, EM_GETSELTEXT
, 0, (LPARAM
)lpstrText
) == 0)
7504 bstrText
= ::SysAllocString(T2W(lpstrText
));
7505 #else // !(_RICHEDIT_VER >= 0x0200)
7506 CTempBuffer
<char, _WTL_STACK_ALLOC_THRESHOLD
> buff
;
7507 LPSTR lpstrText
= buff
.Allocate(cr
.cpMax
- cr
.cpMin
+ 1);
7508 if(lpstrText
== NULL
)
7510 if(::SendMessage(m_hWnd
, EM_GETSELTEXT
, 0, (LPARAM
)lpstrText
) == 0)
7513 bstrText
= ::SysAllocString(A2W(lpstrText
));
7514 #endif // !(_RICHEDIT_VER >= 0x0200)
7516 return (bstrText
!= NULL
) ? TRUE
: FALSE
;
7518 #endif // !_ATL_NO_COM
7520 #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
7521 LONG
GetSelText(_CSTRING_NS::CString
& strText
) const
7523 ATLASSERT(::IsWindow(m_hWnd
));
7525 CHARRANGE cr
= { 0, 0 };
7526 ::SendMessage(m_hWnd
, EM_EXGETSEL
, 0, (LPARAM
)&cr
);
7528 #if (_RICHEDIT_VER >= 0x0200)
7530 LPTSTR lpstrText
= strText
.GetBufferSetLength(cr
.cpMax
- cr
.cpMin
);
7531 if(lpstrText
!= NULL
)
7533 lLen
= (LONG
)::SendMessage(m_hWnd
, EM_GETSELTEXT
, 0, (LPARAM
)lpstrText
);
7534 strText
.ReleaseBuffer();
7536 #else // !(_RICHEDIT_VER >= 0x0200)
7537 CTempBuffer
<char, _WTL_STACK_ALLOC_THRESHOLD
> buff
;
7538 LPSTR lpstrText
= buff
.Allocate(cr
.cpMax
- cr
.cpMin
+ 1);
7539 if(lpstrText
== NULL
)
7541 LONG lLen
= (LONG
)::SendMessage(m_hWnd
, EM_GETSELTEXT
, 0, (LPARAM
)lpstrText
);
7546 strText
= A2T(lpstrText
);
7547 #endif // !(_RICHEDIT_VER >= 0x0200)
7551 #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
7553 WORD
GetSelectionType() const
7555 ATLASSERT(::IsWindow(m_hWnd
));
7556 return (WORD
)::SendMessage(m_hWnd
, EM_SELECTIONTYPE
, 0, 0L);
7559 COLORREF
SetBackgroundColor(COLORREF cr
)
7561 ATLASSERT(::IsWindow(m_hWnd
));
7562 return (COLORREF
)::SendMessage(m_hWnd
, EM_SETBKGNDCOLOR
, 0, cr
);
7565 COLORREF
SetBackgroundColor() // sets to system background
7567 ATLASSERT(::IsWindow(m_hWnd
));
7568 return (COLORREF
)::SendMessage(m_hWnd
, EM_SETBKGNDCOLOR
, 1, 0);
7571 BOOL
SetCharFormat(CHARFORMAT
& cf
, WORD wFlags
)
7573 ATLASSERT(::IsWindow(m_hWnd
));
7574 cf
.cbSize
= sizeof(CHARFORMAT
);
7575 return (BOOL
)::SendMessage(m_hWnd
, EM_SETCHARFORMAT
, (WPARAM
)wFlags
, (LPARAM
)&cf
);
7578 BOOL
SetDefaultCharFormat(CHARFORMAT
& cf
)
7580 ATLASSERT(::IsWindow(m_hWnd
));
7581 cf
.cbSize
= sizeof(CHARFORMAT
);
7582 return (BOOL
)::SendMessage(m_hWnd
, EM_SETCHARFORMAT
, 0, (LPARAM
)&cf
);
7585 BOOL
SetSelectionCharFormat(CHARFORMAT
& cf
)
7587 ATLASSERT(::IsWindow(m_hWnd
));
7588 cf
.cbSize
= sizeof(CHARFORMAT
);
7589 return (BOOL
)::SendMessage(m_hWnd
, EM_SETCHARFORMAT
, SCF_SELECTION
, (LPARAM
)&cf
);
7592 BOOL
SetWordCharFormat(CHARFORMAT
& cf
)
7594 ATLASSERT(::IsWindow(m_hWnd
));
7595 cf
.cbSize
= sizeof(CHARFORMAT
);
7596 return (BOOL
)::SendMessage(m_hWnd
, EM_SETCHARFORMAT
, SCF_SELECTION
| SCF_WORD
, (LPARAM
)&cf
);
7599 DWORD
SetEventMask(DWORD dwEventMask
)
7601 ATLASSERT(::IsWindow(m_hWnd
));
7602 return (DWORD
)::SendMessage(m_hWnd
, EM_SETEVENTMASK
, 0, dwEventMask
);
7605 BOOL
SetParaFormat(PARAFORMAT
& pf
)
7607 ATLASSERT(::IsWindow(m_hWnd
));
7608 pf
.cbSize
= sizeof(PARAFORMAT
);
7609 return (BOOL
)::SendMessage(m_hWnd
, EM_SETPARAFORMAT
, 0, (LPARAM
)&pf
);
7612 BOOL
SetTargetDevice(HDC hDC
, int cxLineWidth
)
7614 ATLASSERT(::IsWindow(m_hWnd
));
7615 return (BOOL
)::SendMessage(m_hWnd
, EM_SETTARGETDEVICE
, (WPARAM
)hDC
, cxLineWidth
);
7618 int GetTextLength() const
7620 ATLASSERT(::IsWindow(m_hWnd
));
7621 return (int)::SendMessage(m_hWnd
, WM_GETTEXTLENGTH
, 0, 0L);
7624 BOOL
SetReadOnly(BOOL bReadOnly
= TRUE
)
7626 ATLASSERT(::IsWindow(m_hWnd
));
7627 return (BOOL
)::SendMessage(m_hWnd
, EM_SETREADONLY
, bReadOnly
, 0L);
7630 int GetFirstVisibleLine() const
7632 ATLASSERT(::IsWindow(m_hWnd
));
7633 return (int)::SendMessage(m_hWnd
, EM_GETFIRSTVISIBLELINE
, 0, 0L);
7636 int GetTextRange(TEXTRANGE
* pTextRange
) const
7638 ATLASSERT(::IsWindow(m_hWnd
));
7639 return (int)::SendMessage(m_hWnd
, EM_GETTEXTRANGE
, 0, (LPARAM
)pTextRange
);
7642 #if (_RICHEDIT_VER < 0x0200)
7643 EDITWORDBREAKPROCEX
GetWordBreakProcEx() const
7645 ATLASSERT(::IsWindow(m_hWnd
));
7646 return (EDITWORDBREAKPROCEX
)::SendMessage(m_hWnd
, EM_GETWORDBREAKPROCEX
, 0, 0L);
7649 EDITWORDBREAKPROCEX
SetWordBreakProcEx(EDITWORDBREAKPROCEX pfnEditWordBreakProcEx
)
7651 ATLASSERT(::IsWindow(m_hWnd
));
7652 return (EDITWORDBREAKPROCEX
)::SendMessage(m_hWnd
, EM_SETWORDBREAKPROCEX
, 0, (LPARAM
)pfnEditWordBreakProcEx
);
7654 #endif // (_RICHEDIT_VER < 0x0200)
7656 #if (_RICHEDIT_VER >= 0x0200)
7657 int GetTextRange(LONG nStartChar
, LONG nEndChar
, LPTSTR lpstrText
) const
7659 ATLASSERT(::IsWindow(m_hWnd
));
7660 TEXTRANGE tr
= { 0 };
7661 tr
.chrg
.cpMin
= nStartChar
;
7662 tr
.chrg
.cpMax
= nEndChar
;
7663 tr
.lpstrText
= lpstrText
;
7664 return (int)::SendMessage(m_hWnd
, EM_GETTEXTRANGE
, 0, (LPARAM
)&tr
);
7666 #else // !(_RICHEDIT_VER >= 0x0200)
7667 int GetTextRange(LONG nStartChar
, LONG nEndChar
, LPSTR lpstrText
) const
7669 ATLASSERT(::IsWindow(m_hWnd
));
7670 TEXTRANGE tr
= { 0 };
7671 tr
.chrg
.cpMin
= nStartChar
;
7672 tr
.chrg
.cpMax
= nEndChar
;
7673 tr
.lpstrText
= lpstrText
;
7674 return (int)::SendMessage(m_hWnd
, EM_GETTEXTRANGE
, 0, (LPARAM
)&tr
);
7676 #endif // !(_RICHEDIT_VER >= 0x0200)
7678 #if (_RICHEDIT_VER >= 0x0200)
7679 DWORD
GetDefaultCharFormat(CHARFORMAT2
& cf
) const
7681 ATLASSERT(::IsWindow(m_hWnd
));
7682 cf
.cbSize
= sizeof(CHARFORMAT2
);
7683 return (DWORD
)::SendMessage(m_hWnd
, EM_GETCHARFORMAT
, 0, (LPARAM
)&cf
);
7686 BOOL
SetCharFormat(CHARFORMAT2
& cf
, WORD wFlags
)
7688 ATLASSERT(::IsWindow(m_hWnd
));
7689 cf
.cbSize
= sizeof(CHARFORMAT2
);
7690 return (BOOL
)::SendMessage(m_hWnd
, EM_SETCHARFORMAT
, (WPARAM
)wFlags
, (LPARAM
)&cf
);
7693 BOOL
SetDefaultCharFormat(CHARFORMAT2
& cf
)
7695 ATLASSERT(::IsWindow(m_hWnd
));
7696 cf
.cbSize
= sizeof(CHARFORMAT2
);
7697 return (BOOL
)::SendMessage(m_hWnd
, EM_SETCHARFORMAT
, 0, (LPARAM
)&cf
);
7700 DWORD
GetSelectionCharFormat(CHARFORMAT2
& cf
) const
7702 ATLASSERT(::IsWindow(m_hWnd
));
7703 cf
.cbSize
= sizeof(CHARFORMAT2
);
7704 return (DWORD
)::SendMessage(m_hWnd
, EM_GETCHARFORMAT
, 1, (LPARAM
)&cf
);
7707 BOOL
SetSelectionCharFormat(CHARFORMAT2
& cf
)
7709 ATLASSERT(::IsWindow(m_hWnd
));
7710 cf
.cbSize
= sizeof(CHARFORMAT2
);
7711 return (BOOL
)::SendMessage(m_hWnd
, EM_SETCHARFORMAT
, SCF_SELECTION
, (LPARAM
)&cf
);
7714 BOOL
SetWordCharFormat(CHARFORMAT2
& cf
)
7716 ATLASSERT(::IsWindow(m_hWnd
));
7717 cf
.cbSize
= sizeof(CHARFORMAT2
);
7718 return (BOOL
)::SendMessage(m_hWnd
, EM_SETCHARFORMAT
, SCF_SELECTION
| SCF_WORD
, (LPARAM
)&cf
);
7721 DWORD
GetParaFormat(PARAFORMAT2
& pf
) const
7723 ATLASSERT(::IsWindow(m_hWnd
));
7724 pf
.cbSize
= sizeof(PARAFORMAT2
);
7725 return (DWORD
)::SendMessage(m_hWnd
, EM_GETPARAFORMAT
, 0, (LPARAM
)&pf
);
7728 BOOL
SetParaFormat(PARAFORMAT2
& pf
)
7730 ATLASSERT(::IsWindow(m_hWnd
));
7731 pf
.cbSize
= sizeof(PARAFORMAT2
);
7732 return (BOOL
)::SendMessage(m_hWnd
, EM_SETPARAFORMAT
, 0, (LPARAM
)&pf
);
7735 TEXTMODE
GetTextMode() const
7737 ATLASSERT(::IsWindow(m_hWnd
));
7738 return (TEXTMODE
)::SendMessage(m_hWnd
, EM_GETTEXTMODE
, 0, 0L);
7741 BOOL
SetTextMode(TEXTMODE enumTextMode
)
7743 ATLASSERT(::IsWindow(m_hWnd
));
7744 return !(BOOL
)::SendMessage(m_hWnd
, EM_SETTEXTMODE
, enumTextMode
, 0L);
7747 UNDONAMEID
GetUndoName() const
7749 ATLASSERT(::IsWindow(m_hWnd
));
7750 return (UNDONAMEID
)::SendMessage(m_hWnd
, EM_GETUNDONAME
, 0, 0L);
7753 UNDONAMEID
GetRedoName() const
7755 ATLASSERT(::IsWindow(m_hWnd
));
7756 return (UNDONAMEID
)::SendMessage(m_hWnd
, EM_GETREDONAME
, 0, 0L);
7759 BOOL
CanRedo() const
7761 ATLASSERT(::IsWindow(m_hWnd
));
7762 return (BOOL
)::SendMessage(m_hWnd
, EM_CANREDO
, 0, 0L);
7765 BOOL
GetAutoURLDetect() const
7767 ATLASSERT(::IsWindow(m_hWnd
));
7768 return (BOOL
)::SendMessage(m_hWnd
, EM_GETAUTOURLDETECT
, 0, 0L);
7771 BOOL
SetAutoURLDetect(BOOL bAutoDetect
= TRUE
)
7773 ATLASSERT(::IsWindow(m_hWnd
));
7774 return !(BOOL
)::SendMessage(m_hWnd
, EM_AUTOURLDETECT
, bAutoDetect
, 0L);
7777 // this method is deprecated, please use SetAutoURLDetect
7778 BOOL
EnableAutoURLDetect(BOOL bEnable
= TRUE
) { return SetAutoURLDetect(bEnable
); }
7780 UINT
SetUndoLimit(UINT uUndoLimit
)
7782 ATLASSERT(::IsWindow(m_hWnd
));
7783 return (UINT
)::SendMessage(m_hWnd
, EM_SETUNDOLIMIT
, uUndoLimit
, 0L);
7786 void SetPalette(HPALETTE hPalette
)
7788 ATLASSERT(::IsWindow(m_hWnd
));
7789 ::SendMessage(m_hWnd
, EM_SETPALETTE
, (WPARAM
)hPalette
, 0L);
7792 int GetTextEx(GETTEXTEX
* pGetTextEx
, LPTSTR lpstrText
) const
7794 ATLASSERT(::IsWindow(m_hWnd
));
7795 return (int)::SendMessage(m_hWnd
, EM_GETTEXTEX
, (WPARAM
)pGetTextEx
, (LPARAM
)lpstrText
);
7798 int GetTextEx(LPTSTR lpstrText
, int nTextLen
, DWORD dwFlags
= GT_DEFAULT
, UINT uCodePage
= CP_ACP
, LPCSTR lpDefaultChar
= NULL
, LPBOOL lpUsedDefChar
= NULL
) const
7800 ATLASSERT(::IsWindow(m_hWnd
));
7801 GETTEXTEX gte
= { 0 };
7802 gte
.cb
= nTextLen
* sizeof(TCHAR
);
7803 gte
.codepage
= uCodePage
;
7804 gte
.flags
= dwFlags
;
7805 gte
.lpDefaultChar
= lpDefaultChar
;
7806 gte
.lpUsedDefChar
= lpUsedDefChar
;
7807 return (int)::SendMessage(m_hWnd
, EM_GETTEXTEX
, (WPARAM
)>e
, (LPARAM
)lpstrText
);
7810 int GetTextLengthEx(GETTEXTLENGTHEX
* pGetTextLengthEx
) const
7812 ATLASSERT(::IsWindow(m_hWnd
));
7813 return (int)::SendMessage(m_hWnd
, EM_GETTEXTLENGTHEX
, (WPARAM
)pGetTextLengthEx
, 0L);
7816 int GetTextLengthEx(DWORD dwFlags
= GTL_DEFAULT
, UINT uCodePage
= CP_ACP
) const
7818 ATLASSERT(::IsWindow(m_hWnd
));
7819 GETTEXTLENGTHEX gtle
= { 0 };
7820 gtle
.codepage
= uCodePage
;
7821 gtle
.flags
= dwFlags
;
7822 return (int)::SendMessage(m_hWnd
, EM_GETTEXTLENGTHEX
, (WPARAM
)>le
, 0L);
7825 EDITWORDBREAKPROC
GetWordBreakProc() const
7827 ATLASSERT(::IsWindow(m_hWnd
));
7828 return (EDITWORDBREAKPROC
)::SendMessage(m_hWnd
, EM_GETWORDBREAKPROC
, 0, 0L);
7831 void SetWordBreakProc(EDITWORDBREAKPROC ewbprc
)
7833 ATLASSERT(::IsWindow(m_hWnd
));
7834 ::SendMessage(m_hWnd
, EM_SETWORDBREAKPROC
, 0, (LPARAM
)ewbprc
);
7836 #endif // (_RICHEDIT_VER >= 0x0200)
7838 #if (_RICHEDIT_VER >= 0x0300)
7839 int SetTextEx(SETTEXTEX
* pSetTextEx
, LPCTSTR lpstrText
)
7841 ATLASSERT(::IsWindow(m_hWnd
));
7842 return (int)::SendMessage(m_hWnd
, EM_SETTEXTEX
, (WPARAM
)pSetTextEx
, (LPARAM
)lpstrText
);
7845 int SetTextEx(LPCTSTR lpstrText
, DWORD dwFlags
= ST_DEFAULT
, UINT uCodePage
= CP_ACP
)
7847 ATLASSERT(::IsWindow(m_hWnd
));
7848 SETTEXTEX ste
= { 0 };
7849 ste
.flags
= dwFlags
;
7850 ste
.codepage
= uCodePage
;
7851 return (int)::SendMessage(m_hWnd
, EM_SETTEXTEX
, (WPARAM
)&ste
, (LPARAM
)lpstrText
);
7854 int GetEditStyle() const
7856 ATLASSERT(::IsWindow(m_hWnd
));
7857 return (int)::SendMessage(m_hWnd
, EM_GETEDITSTYLE
, 0, 0L);
7860 int SetEditStyle(int nStyle
, int nMask
= -1)
7862 ATLASSERT(::IsWindow(m_hWnd
));
7864 nMask
= nStyle
; // set everything specified
7865 return (int)::SendMessage(m_hWnd
, EM_SETEDITSTYLE
, nStyle
, nMask
);
7868 BOOL
SetFontSize(int nFontSizeDelta
)
7870 ATLASSERT(::IsWindow(m_hWnd
));
7871 ATLASSERT(nFontSizeDelta
>= -1637 && nFontSizeDelta
<= 1638);
7872 return (BOOL
)::SendMessage(m_hWnd
, EM_SETFONTSIZE
, nFontSizeDelta
, 0L);
7875 void GetScrollPos(LPPOINT lpPoint
) const
7877 ATLASSERT(::IsWindow(m_hWnd
));
7878 ATLASSERT(lpPoint
!= NULL
);
7879 ::SendMessage(m_hWnd
, EM_GETSCROLLPOS
, 0, (LPARAM
)lpPoint
);
7882 void SetScrollPos(LPPOINT lpPoint
)
7884 ATLASSERT(::IsWindow(m_hWnd
));
7885 ATLASSERT(lpPoint
!= NULL
);
7886 ::SendMessage(m_hWnd
, EM_SETSCROLLPOS
, 0, (LPARAM
)lpPoint
);
7889 BOOL
GetZoom(int& nNum
, int& nDen
) const
7891 ATLASSERT(::IsWindow(m_hWnd
));
7892 return (BOOL
)::SendMessage(m_hWnd
, EM_GETZOOM
, (WPARAM
)&nNum
, (LPARAM
)&nDen
);
7895 BOOL
SetZoom(int nNum
, int nDen
)
7897 ATLASSERT(::IsWindow(m_hWnd
));
7898 ATLASSERT(nNum
>= 0 && nNum
<= 64);
7899 ATLASSERT(nDen
>= 0 && nDen
<= 64);
7900 return (BOOL
)::SendMessage(m_hWnd
, EM_SETZOOM
, nNum
, nDen
);
7905 ATLASSERT(::IsWindow(m_hWnd
));
7906 return (BOOL
)::SendMessage(m_hWnd
, EM_SETZOOM
, 0, 0L);
7909 void SetMargins(UINT nLeft
, UINT nRight
, WORD wFlags
= EC_LEFTMARGIN
| EC_RIGHTMARGIN
)
7911 ATLASSERT(::IsWindow(m_hWnd
));
7912 ::SendMessage(m_hWnd
, EM_SETMARGINS
, wFlags
, MAKELONG(nLeft
, nRight
));
7914 #endif // (_RICHEDIT_VER >= 0x0300)
7917 void LimitText(LONG nChars
= 0)
7919 ATLASSERT(::IsWindow(m_hWnd
));
7920 ::SendMessage(m_hWnd
, EM_EXLIMITTEXT
, 0, nChars
);
7923 int LineFromChar(LONG nIndex
) const
7925 ATLASSERT(::IsWindow(m_hWnd
));
7926 return (int)::SendMessage(m_hWnd
, EM_EXLINEFROMCHAR
, 0, nIndex
);
7929 POINT
PosFromChar(LONG nChar
) const
7931 ATLASSERT(::IsWindow(m_hWnd
));
7932 POINT point
= { 0, 0 };
7933 ::SendMessage(m_hWnd
, EM_POSFROMCHAR
, (WPARAM
)&point
, nChar
);
7937 int CharFromPos(POINT pt
) const
7939 ATLASSERT(::IsWindow(m_hWnd
));
7940 POINTL ptl
= { pt
.x
, pt
.y
};
7941 return (int)::SendMessage(m_hWnd
, EM_CHARFROMPOS
, 0, (LPARAM
)&ptl
);
7944 void EmptyUndoBuffer()
7946 ATLASSERT(::IsWindow(m_hWnd
));
7947 ::SendMessage(m_hWnd
, EM_EMPTYUNDOBUFFER
, 0, 0L);
7950 int LineIndex(int nLine
= -1) const
7952 ATLASSERT(::IsWindow(m_hWnd
));
7953 return (int)::SendMessage(m_hWnd
, EM_LINEINDEX
, nLine
, 0L);
7956 int LineLength(int nLine
= -1) const
7958 ATLASSERT(::IsWindow(m_hWnd
));
7959 return (int)::SendMessage(m_hWnd
, EM_LINELENGTH
, nLine
, 0L);
7962 BOOL
LineScroll(int nLines
)
7964 ATLASSERT(::IsWindow(m_hWnd
));
7965 return (BOOL
)::SendMessage(m_hWnd
, EM_LINESCROLL
, 0, nLines
);
7968 void ReplaceSel(LPCTSTR lpszNewText
, BOOL bCanUndo
= FALSE
)
7970 ATLASSERT(::IsWindow(m_hWnd
));
7971 ::SendMessage(m_hWnd
, EM_REPLACESEL
, (WPARAM
) bCanUndo
, (LPARAM
)lpszNewText
);
7974 void SetRect(LPCRECT lpRect
)
7976 ATLASSERT(::IsWindow(m_hWnd
));
7977 ::SendMessage(m_hWnd
, EM_SETRECT
, 0, (LPARAM
)lpRect
);
7980 BOOL
DisplayBand(LPRECT pDisplayRect
)
7982 ATLASSERT(::IsWindow(m_hWnd
));
7983 return (BOOL
)::SendMessage(m_hWnd
, EM_DISPLAYBAND
, 0, (LPARAM
)pDisplayRect
);
7986 LONG
FindText(DWORD dwFlags
, FINDTEXT
& ft
) const
7988 ATLASSERT(::IsWindow(m_hWnd
));
7989 #if (_RICHEDIT_VER >= 0x0200) && defined(_UNICODE)
7990 return (LONG
)::SendMessage(m_hWnd
, EM_FINDTEXTW
, dwFlags
, (LPARAM
)&ft
);
7992 return (LONG
)::SendMessage(m_hWnd
, EM_FINDTEXT
, dwFlags
, (LPARAM
)&ft
);
7996 LONG
FindText(DWORD dwFlags
, FINDTEXTEX
& ft
) const
7998 ATLASSERT(::IsWindow(m_hWnd
));
7999 #if (_RICHEDIT_VER >= 0x0200) && defined(_UNICODE)
8000 return (LONG
)::SendMessage(m_hWnd
, EM_FINDTEXTEXW
, dwFlags
, (LPARAM
)&ft
);
8002 return (LONG
)::SendMessage(m_hWnd
, EM_FINDTEXTEX
, dwFlags
, (LPARAM
)&ft
);
8006 LONG
FormatRange(FORMATRANGE
& fr
, BOOL bDisplay
= TRUE
)
8008 ATLASSERT(::IsWindow(m_hWnd
));
8009 return (LONG
)::SendMessage(m_hWnd
, EM_FORMATRANGE
, bDisplay
, (LPARAM
)&fr
);
8012 LONG
FormatRange(FORMATRANGE
* pFormatRange
, BOOL bDisplay
= TRUE
)
8014 ATLASSERT(::IsWindow(m_hWnd
));
8015 return (LONG
)::SendMessage(m_hWnd
, EM_FORMATRANGE
, bDisplay
, (LPARAM
)pFormatRange
);
8018 void HideSelection(BOOL bHide
= TRUE
, BOOL bChangeStyle
= FALSE
)
8020 ATLASSERT(::IsWindow(m_hWnd
));
8021 ::SendMessage(m_hWnd
, EM_HIDESELECTION
, bHide
, bChangeStyle
);
8024 void PasteSpecial(UINT uClipFormat
, DWORD dwAspect
= 0, HMETAFILE hMF
= 0)
8026 ATLASSERT(::IsWindow(m_hWnd
));
8027 REPASTESPECIAL reps
= { dwAspect
, (DWORD_PTR
)hMF
};
8028 ::SendMessage(m_hWnd
, EM_PASTESPECIAL
, uClipFormat
, (LPARAM
)&reps
);
8031 void RequestResize()
8033 ATLASSERT(::IsWindow(m_hWnd
));
8034 ::SendMessage(m_hWnd
, EM_REQUESTRESIZE
, 0, 0L);
8037 LONG
StreamIn(UINT uFormat
, EDITSTREAM
& es
)
8039 ATLASSERT(::IsWindow(m_hWnd
));
8040 return (LONG
)::SendMessage(m_hWnd
, EM_STREAMIN
, uFormat
, (LPARAM
)&es
);
8043 LONG
StreamOut(UINT uFormat
, EDITSTREAM
& es
)
8045 ATLASSERT(::IsWindow(m_hWnd
));
8046 return (LONG
)::SendMessage(m_hWnd
, EM_STREAMOUT
, uFormat
, (LPARAM
)&es
);
8049 DWORD
FindWordBreak(int nCode
, LONG nStartChar
)
8051 ATLASSERT(::IsWindow(m_hWnd
));
8052 return (DWORD
)::SendMessage(m_hWnd
, EM_FINDWORDBREAK
, nCode
, nStartChar
);
8055 // Additional operations
8058 ATLASSERT(::IsWindow(m_hWnd
));
8059 ::SendMessage(m_hWnd
, EM_SCROLLCARET
, 0, 0L);
8062 int InsertText(long nInsertAfterChar
, LPCTSTR lpstrText
, BOOL bCanUndo
= FALSE
)
8064 int nRet
= SetSel(nInsertAfterChar
, nInsertAfterChar
);
8065 ReplaceSel(lpstrText
, bCanUndo
);
8069 int AppendText(LPCTSTR lpstrText
, BOOL bCanUndo
= FALSE
)
8071 return InsertText(GetWindowTextLength(), lpstrText
, bCanUndo
);
8074 // Clipboard operations
8077 ATLASSERT(::IsWindow(m_hWnd
));
8078 return (BOOL
)::SendMessage(m_hWnd
, EM_UNDO
, 0, 0L);
8083 ATLASSERT(::IsWindow(m_hWnd
));
8084 ::SendMessage(m_hWnd
, WM_CLEAR
, 0, 0L);
8089 ATLASSERT(::IsWindow(m_hWnd
));
8090 ::SendMessage(m_hWnd
, WM_COPY
, 0, 0L);
8095 ATLASSERT(::IsWindow(m_hWnd
));
8096 ::SendMessage(m_hWnd
, WM_CUT
, 0, 0L);
8101 ATLASSERT(::IsWindow(m_hWnd
));
8102 ::SendMessage(m_hWnd
, WM_PASTE
, 0, 0L);
8106 IRichEditOle
* GetOleInterface() const
8108 ATLASSERT(::IsWindow(m_hWnd
));
8109 IRichEditOle
*pRichEditOle
= NULL
;
8110 ::SendMessage(m_hWnd
, EM_GETOLEINTERFACE
, 0, (LPARAM
)&pRichEditOle
);
8111 return pRichEditOle
;
8114 BOOL
SetOleCallback(IRichEditOleCallback
* pCallback
)
8116 ATLASSERT(::IsWindow(m_hWnd
));
8117 return (BOOL
)::SendMessage(m_hWnd
, EM_SETOLECALLBACK
, 0, (LPARAM
)pCallback
);
8120 #if (_RICHEDIT_VER >= 0x0200)
8123 ATLASSERT(::IsWindow(m_hWnd
));
8124 return (BOOL
)::SendMessage(m_hWnd
, EM_REDO
, 0, 0L);
8127 void StopGroupTyping()
8129 ATLASSERT(::IsWindow(m_hWnd
));
8130 ::SendMessage(m_hWnd
, EM_STOPGROUPTYPING
, 0, 0L);
8133 void ShowScrollBar(int nBarType
, BOOL bVisible
= TRUE
)
8135 ATLASSERT(::IsWindow(m_hWnd
));
8136 ::SendMessage(m_hWnd
, EM_SHOWSCROLLBAR
, nBarType
, bVisible
);
8138 #endif // (_RICHEDIT_VER >= 0x0200)
8140 #if (_RICHEDIT_VER >= 0x0300)
8141 BOOL
SetTabStops(int nTabStops
, LPINT rgTabStops
)
8143 ATLASSERT(::IsWindow(m_hWnd
));
8144 return (BOOL
)::SendMessage(m_hWnd
, EM_SETTABSTOPS
, nTabStops
, (LPARAM
)rgTabStops
);
8149 ATLASSERT(::IsWindow(m_hWnd
));
8150 return (BOOL
)::SendMessage(m_hWnd
, EM_SETTABSTOPS
, 0, 0L);
8153 BOOL
SetTabStops(const int& cxEachStop
) // takes an 'int'
8155 ATLASSERT(::IsWindow(m_hWnd
));
8156 return (BOOL
)::SendMessage(m_hWnd
, EM_SETTABSTOPS
, 1, (LPARAM
)(LPINT
)&cxEachStop
);
8158 #endif // (_RICHEDIT_VER >= 0x0300)
8160 #if (_RICHEDIT_VER >= 0x0800)
8161 AutoCorrectProc
GetAutoCorrectProc() const
8163 ATLASSERT(::IsWindow(m_hWnd
));
8164 return (AutoCorrectProc
)::SendMessage(m_hWnd
, EM_GETAUTOCORRECTPROC
, 0, 0L);
8167 BOOL
SetAutoCorrectProc(AutoCorrectProc pfn
)
8169 ATLASSERT(::IsWindow(m_hWnd
));
8170 return (BOOL
)::SendMessage(m_hWnd
, EM_SETAUTOCORRECTPROC
, (WPARAM
)pfn
, 0L);
8173 BOOL
CallAutoCorrectProc(WCHAR ch
)
8175 ATLASSERT(::IsWindow(m_hWnd
));
8176 return (BOOL
)::SendMessage(m_hWnd
, EM_CALLAUTOCORRECTPROC
, (WPARAM
)ch
, 0L);
8179 DWORD
GetEditStyleEx() const
8181 ATLASSERT(::IsWindow(m_hWnd
));
8182 return (DWORD
)::SendMessage(m_hWnd
, EM_GETEDITSTYLEEX
, 0, 0L);
8185 DWORD
SetEditStyleEx(DWORD dwStyleEx
, DWORD dwMask
)
8187 ATLASSERT(::IsWindow(m_hWnd
));
8188 return (DWORD
)::SendMessage(m_hWnd
, EM_SETEDITSTYLEEX
, dwStyleEx
, dwMask
);
8191 DWORD
GetStoryType(int nStoryIndex
) const
8193 ATLASSERT(::IsWindow(m_hWnd
));
8194 return (DWORD
)::SendMessage(m_hWnd
, EM_GETSTORYTYPE
, nStoryIndex
, 0L);
8197 DWORD
SetStoryType(int nStoryIndex
, DWORD dwStoryType
)
8199 ATLASSERT(::IsWindow(m_hWnd
));
8200 return (DWORD
)::SendMessage(m_hWnd
, EM_SETSTORYTYPE
, nStoryIndex
, dwStoryType
);
8203 DWORD
GetEllipsisMode() const
8205 ATLASSERT(::IsWindow(m_hWnd
));
8208 BOOL bRet
= (BOOL
)::SendMessage(m_hWnd
, EM_GETELLIPSISMODE
, 0, (LPARAM
)&dwMode
);
8209 bRet
; // avoid level 4 warning
8210 ATLASSERT(bRet
!= FALSE
);
8215 BOOL
SetEllipsisMode(DWORD dwEllipsisMode
)
8217 ATLASSERT(::IsWindow(m_hWnd
));
8218 return (BOOL
)::SendMessage(m_hWnd
, EM_SETELLIPSISMODE
, 0, dwEllipsisMode
);
8221 BOOL
GetEllipsisState() const
8223 ATLASSERT(::IsWindow(m_hWnd
));
8224 return (BOOL
)::SendMessage(m_hWnd
, EM_GETELLIPSISSTATE
, 0, 0L);
8227 BOOL
GetTouchOptions(int nTouchOptions
) const
8229 ATLASSERT(::IsWindow(m_hWnd
));
8230 return (BOOL
)::SendMessage(m_hWnd
, EM_GETTOUCHOPTIONS
, nTouchOptions
, 0L);
8233 void SetTouchOptions(int nTouchOptions
, BOOL bEnable
)
8235 ATLASSERT(::IsWindow(m_hWnd
));
8236 ::SendMessage(m_hWnd
, EM_SETTOUCHOPTIONS
, nTouchOptions
, bEnable
);
8239 HRESULT
InsertTable(TABLEROWPARMS
* pRowParams
, TABLECELLPARMS
* pCellParams
)
8241 ATLASSERT(::IsWindow(m_hWnd
));
8242 return (HRESULT
)::SendMessage(m_hWnd
, EM_INSERTTABLE
, (WPARAM
)pRowParams
, (LPARAM
)pCellParams
);
8245 HRESULT
GetTableParams(TABLEROWPARMS
* pRowParams
, TABLECELLPARMS
* pCellParams
) const
8247 ATLASSERT(::IsWindow(m_hWnd
));
8248 return (HRESULT
)::SendMessage(m_hWnd
, EM_GETTABLEPARMS
, (WPARAM
)pRowParams
, (LPARAM
)pCellParams
);
8251 HRESULT
SetTableParams(TABLEROWPARMS
* pRowParams
, TABLECELLPARMS
* pCellParams
)
8253 ATLASSERT(::IsWindow(m_hWnd
));
8254 return (HRESULT
)::SendMessage(m_hWnd
, EM_SETTABLEPARMS
, (WPARAM
)pRowParams
, (LPARAM
)pCellParams
);
8257 HRESULT
InsertImage(RICHEDIT_IMAGE_PARAMETERS
* pParams
)
8259 ATLASSERT(::IsWindow(m_hWnd
));
8260 return (HRESULT
)::SendMessage(m_hWnd
, EM_INSERTIMAGE
, 0, (LPARAM
)pParams
);
8263 BOOL
SetUiaName(LPCTSTR lpstrName
)
8265 ATLASSERT(::IsWindow(m_hWnd
));
8266 return (BOOL
)::SendMessage(m_hWnd
, EM_SETUIANAME
, 0, (LPARAM
)lpstrName
);
8268 #endif // (_RICHEDIT_VER >= 0x0800)
8271 typedef CRichEditCtrlT
<ATL::CWindow
> CRichEditCtrl
;
8273 #endif // !_WIN32_WCE
8276 ///////////////////////////////////////////////////////////////////////////////
8277 // CRichEditCommands - message handlers for standard EDIT commands
8281 // Chain to CRichEditCommands message map. Your class must also derive from CRichEditCtrl.
8283 // class CMyRichEdit : public CWindowImpl<CMyRichEdit, CRichEditCtrl>,
8284 // public CRichEditCommands<CMyRichEdit>
8287 // BEGIN_MSG_MAP(CMyRichEdit)
8288 // // your handlers...
8289 // CHAIN_MSG_MAP_ALT(CRichEditCommands<CMyRichEdit>, 1)
8291 // // other stuff...
8295 class CRichEditCommands
: public CEditCommands
< T
>
8298 BEGIN_MSG_MAP(CRichEditCommands
< T
>)
8300 COMMAND_ID_HANDLER(ID_EDIT_CLEAR
, CEditCommands
< T
>::OnEditClear
)
8301 COMMAND_ID_HANDLER(ID_EDIT_CLEAR_ALL
, CEditCommands
< T
>::OnEditClearAll
)
8302 COMMAND_ID_HANDLER(ID_EDIT_COPY
, CEditCommands
< T
>::OnEditCopy
)
8303 COMMAND_ID_HANDLER(ID_EDIT_CUT
, CEditCommands
< T
>::OnEditCut
)
8304 COMMAND_ID_HANDLER(ID_EDIT_PASTE
, CEditCommands
< T
>::OnEditPaste
)
8305 COMMAND_ID_HANDLER(ID_EDIT_SELECT_ALL
, CEditCommands
< T
>::OnEditSelectAll
)
8306 COMMAND_ID_HANDLER(ID_EDIT_UNDO
, CEditCommands
< T
>::OnEditUndo
)
8307 #if (_RICHEDIT_VER >= 0x0200)
8308 COMMAND_ID_HANDLER(ID_EDIT_REDO
, OnEditRedo
)
8309 #endif // (_RICHEDIT_VER >= 0x0200)
8312 #if (_RICHEDIT_VER >= 0x0200)
8313 LRESULT
OnEditRedo(WORD
/*wNotifyCode*/, WORD
/*wID*/, HWND
/*hWndCtl*/, BOOL
& /*bHandled*/)
8315 T
* pT
= static_cast<T
*>(this);
8319 #endif // (_RICHEDIT_VER >= 0x0200)
8321 // State (update UI) helpers
8323 { return HasSelection(); }
8325 BOOL
CanCopy() const
8326 { return HasSelection(); }
8328 BOOL
CanClear() const
8329 { return HasSelection(); }
8332 BOOL
HasSelection() const
8334 const T
* pT
= static_cast<const T
*>(this);
8335 return (pT
->GetSelectionType() != SEL_EMPTY
);
8339 #endif // _WIN32_WCE
8342 ///////////////////////////////////////////////////////////////////////////////
8347 template <class TBase
>
8348 class CDragListBoxT
: public CListBoxT
< TBase
>
8352 CDragListBoxT(HWND hWnd
= NULL
) : CListBoxT
< TBase
>(hWnd
)
8355 CDragListBoxT
< TBase
>& operator =(HWND hWnd
)
8361 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
8362 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
8363 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
8365 HWND hWnd
= TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
8374 ATLASSERT(::IsWindow(m_hWnd
));
8375 ATLASSERT((GetStyle() & (LBS_MULTIPLESEL
| LBS_EXTENDEDSEL
)) == 0);
8376 return ::MakeDragList(m_hWnd
);
8379 int LBItemFromPt(POINT pt
, BOOL bAutoScroll
= TRUE
)
8381 ATLASSERT(::IsWindow(m_hWnd
));
8382 return ::LBItemFromPt(m_hWnd
, pt
, bAutoScroll
);
8385 void DrawInsert(int nItem
)
8387 ATLASSERT(::IsWindow(m_hWnd
));
8388 ::DrawInsert(GetParent(), m_hWnd
, nItem
);
8391 static UINT
GetDragListMessage()
8393 static UINT uDragListMessage
= 0;
8394 if(uDragListMessage
== 0)
8396 CStaticDataInitCriticalSectionLock lock
;
8397 if(FAILED(lock
.Lock()))
8399 ATLTRACE2(atlTraceUI
, 0, _T("ERROR : Unable to lock critical section in CDragListBox::GetDragListMessage.\n"));
8404 if(uDragListMessage
== 0)
8405 uDragListMessage
= ::RegisterWindowMessage(DRAGLISTMSGSTRING
);
8409 ATLASSERT(uDragListMessage
!= 0);
8410 return uDragListMessage
;
8414 typedef CDragListBoxT
<ATL::CWindow
> CDragListBox
;
8417 class CDragListNotifyImpl
8420 BEGIN_MSG_MAP(CDragListNotifyImpl
< T
>)
8421 MESSAGE_HANDLER(CDragListBox::GetDragListMessage(), OnDragListNotify
)
8424 LRESULT
OnDragListNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
8426 uMsg
; // avoid level 4 warning
8427 ATLASSERT(uMsg
== CDragListBox::GetDragListMessage());
8428 T
* pT
= static_cast<T
*>(this);
8429 LPDRAGLISTINFO lpDragListInfo
= (LPDRAGLISTINFO
)lParam
;
8431 switch(lpDragListInfo
->uNotification
)
8434 lRet
= (LPARAM
)pT
->OnBeginDrag((int)wParam
, lpDragListInfo
->hWnd
, lpDragListInfo
->ptCursor
);
8437 pT
->OnCancelDrag((int)wParam
, lpDragListInfo
->hWnd
, lpDragListInfo
->ptCursor
);
8440 lRet
= (LPARAM
)pT
->OnDragging((int)wParam
, lpDragListInfo
->hWnd
, lpDragListInfo
->ptCursor
);
8443 pT
->OnDropped((int)wParam
, lpDragListInfo
->hWnd
, lpDragListInfo
->ptCursor
);
8446 ATLTRACE2(atlTraceUI
, 0, _T("Unknown DragListBox notification\n"));
8447 bHandled
= FALSE
; // don't handle it
8454 BOOL
OnBeginDrag(int /*nCtlID*/, HWND
/*hWndDragList*/, POINT
/*ptCursor*/)
8456 return TRUE
; // allow dragging
8459 void OnCancelDrag(int /*nCtlID*/, HWND
/*hWndDragList*/, POINT
/*ptCursor*/)
8464 int OnDragging(int /*nCtlID*/, HWND
/*hWndDragList*/, POINT
/*ptCursor*/)
8466 return 0; // don't change cursor
8469 void OnDropped(int /*nCtlID*/, HWND
/*hWndDragList*/, POINT
/*ptCursor*/)
8475 #endif // _WIN32_WCE
8478 ///////////////////////////////////////////////////////////////////////////////
8481 template <class TBase
>
8482 class CReBarCtrlT
: public TBase
8486 CReBarCtrlT(HWND hWnd
= NULL
) : TBase(hWnd
)
8489 CReBarCtrlT
< TBase
>& operator =(HWND hWnd
)
8495 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
8496 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
8497 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
8499 return TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
8503 static LPCTSTR
GetWndClassName()
8505 return REBARCLASSNAME
;
8508 UINT
GetBandCount() const
8510 ATLASSERT(::IsWindow(m_hWnd
));
8511 return (UINT
)::SendMessage(m_hWnd
, RB_GETBANDCOUNT
, 0, 0L);
8514 BOOL
GetBandInfo(int nBand
, LPREBARBANDINFO lprbbi
) const
8516 ATLASSERT(::IsWindow(m_hWnd
));
8517 return (BOOL
)::SendMessage(m_hWnd
, RB_GETBANDINFO
, nBand
, (LPARAM
)lprbbi
);
8520 BOOL
SetBandInfo(int nBand
, LPREBARBANDINFO lprbbi
)
8522 ATLASSERT(::IsWindow(m_hWnd
));
8523 return (BOOL
)::SendMessage(m_hWnd
, RB_SETBANDINFO
, nBand
, (LPARAM
)lprbbi
);
8526 BOOL
GetBarInfo(LPREBARINFO lprbi
) const
8528 ATLASSERT(::IsWindow(m_hWnd
));
8529 return (BOOL
)::SendMessage(m_hWnd
, RB_GETBARINFO
, 0, (LPARAM
)lprbi
);
8532 BOOL
SetBarInfo(LPREBARINFO lprbi
)
8534 ATLASSERT(::IsWindow(m_hWnd
));
8535 return (BOOL
)::SendMessage(m_hWnd
, RB_SETBARINFO
, 0, (LPARAM
)lprbi
);
8538 CImageList
GetImageList() const
8540 ATLASSERT(::IsWindow(m_hWnd
));
8541 REBARINFO rbi
= { 0 };
8542 rbi
.cbSize
= sizeof(REBARINFO
);
8543 rbi
.fMask
= RBIM_IMAGELIST
;
8544 BOOL bRet
= (BOOL
)::SendMessage(m_hWnd
, RB_GETBARINFO
, 0, (LPARAM
)&rbi
);
8545 return CImageList((bRet
!= FALSE
) ? rbi
.himl
: NULL
);
8548 BOOL
SetImageList(HIMAGELIST hImageList
)
8550 ATLASSERT(::IsWindow(m_hWnd
));
8551 REBARINFO rbi
= { 0 };
8552 rbi
.cbSize
= sizeof(REBARINFO
);
8553 rbi
.fMask
= RBIM_IMAGELIST
;
8554 rbi
.himl
= hImageList
;
8555 return (BOOL
)::SendMessage(m_hWnd
, RB_SETBARINFO
, 0, (LPARAM
)&rbi
);
8558 UINT
GetRowCount() const
8560 ATLASSERT(::IsWindow(m_hWnd
));
8561 return (UINT
)::SendMessage(m_hWnd
, RB_GETROWCOUNT
, 0, 0L);
8564 UINT
GetRowHeight(int nBand
) const
8566 ATLASSERT(::IsWindow(m_hWnd
));
8567 return (UINT
)::SendMessage(m_hWnd
, RB_GETROWHEIGHT
, nBand
, 0L);
8570 #if (_WIN32_IE >= 0x0400)
8571 COLORREF
GetTextColor() const
8573 ATLASSERT(::IsWindow(m_hWnd
));
8574 return (COLORREF
)::SendMessage(m_hWnd
, RB_GETTEXTCOLOR
, 0, 0L);
8577 COLORREF
SetTextColor(COLORREF clr
)
8579 ATLASSERT(::IsWindow(m_hWnd
));
8580 return (COLORREF
)::SendMessage(m_hWnd
, RB_SETTEXTCOLOR
, 0, (LPARAM
)clr
);
8583 COLORREF
GetBkColor() const
8585 ATLASSERT(::IsWindow(m_hWnd
));
8586 return (COLORREF
)::SendMessage(m_hWnd
, RB_GETBKCOLOR
, 0, 0L);
8589 COLORREF
SetBkColor(COLORREF clr
)
8591 ATLASSERT(::IsWindow(m_hWnd
));
8592 return (COLORREF
)::SendMessage(m_hWnd
, RB_SETBKCOLOR
, 0, (LPARAM
)clr
);
8595 UINT
GetBarHeight() const
8597 ATLASSERT(::IsWindow(m_hWnd
));
8598 return (UINT
)::SendMessage(m_hWnd
, RB_GETBARHEIGHT
, 0, 0L);
8601 BOOL
GetRect(int nBand
, LPRECT lpRect
) const
8603 ATLASSERT(::IsWindow(m_hWnd
));
8604 return (BOOL
)::SendMessage(m_hWnd
, RB_GETRECT
, nBand
, (LPARAM
)lpRect
);
8608 CToolTipCtrl
GetToolTips() const
8610 ATLASSERT(::IsWindow(m_hWnd
));
8611 return CToolTipCtrl((HWND
)::SendMessage(m_hWnd
, RB_GETTOOLTIPS
, 0, 0L));
8614 void SetToolTips(HWND hwndToolTip
)
8616 ATLASSERT(::IsWindow(m_hWnd
));
8617 ::SendMessage(m_hWnd
, RB_SETTOOLTIPS
, (WPARAM
)hwndToolTip
, 0L);
8619 #endif // !_WIN32_WCE
8621 void GetBandBorders(int nBand
, LPRECT lpRect
) const
8623 ATLASSERT(::IsWindow(m_hWnd
));
8624 ATLASSERT(lpRect
!= NULL
);
8625 ::SendMessage(m_hWnd
, RB_GETBANDBORDERS
, nBand
, (LPARAM
)lpRect
);
8629 BOOL
GetColorScheme(LPCOLORSCHEME lpColorScheme
) const
8631 ATLASSERT(::IsWindow(m_hWnd
));
8632 ATLASSERT(lpColorScheme
!= NULL
);
8633 return (BOOL
)::SendMessage(m_hWnd
, RB_GETCOLORSCHEME
, 0, (LPARAM
)lpColorScheme
);
8636 void SetColorScheme(LPCOLORSCHEME lpColorScheme
)
8638 ATLASSERT(::IsWindow(m_hWnd
));
8639 ATLASSERT(lpColorScheme
!= NULL
);
8640 ::SendMessage(m_hWnd
, RB_SETCOLORSCHEME
, 0, (LPARAM
)lpColorScheme
);
8643 HPALETTE
GetPalette() const
8645 ATLASSERT(::IsWindow(m_hWnd
));
8646 return (HPALETTE
)::SendMessage(m_hWnd
, RB_GETPALETTE
, 0, 0L);
8649 HPALETTE
SetPalette(HPALETTE hPalette
)
8651 ATLASSERT(::IsWindow(m_hWnd
));
8652 return (HPALETTE
)::SendMessage(m_hWnd
, RB_SETPALETTE
, 0, (LPARAM
)hPalette
);
8655 BOOL
GetUnicodeFormat() const
8657 ATLASSERT(::IsWindow(m_hWnd
));
8658 return (BOOL
)::SendMessage(m_hWnd
, RB_GETUNICODEFORMAT
, 0, 0L);
8661 BOOL
SetUnicodeFormat(BOOL bUnicode
= TRUE
)
8663 ATLASSERT(::IsWindow(m_hWnd
));
8664 return (BOOL
)::SendMessage(m_hWnd
, RB_SETUNICODEFORMAT
, bUnicode
, 0L);
8666 #endif // !_WIN32_WCE
8667 #endif // (_WIN32_IE >= 0x0400)
8669 #if (_WIN32_WINNT >= 0x0501)
8670 // requires uxtheme.h to be included to use MARGINS struct
8672 typedef struct _MARGINS
* PMARGINS
;
8673 #endif // !_UXTHEME_H_
8674 void GetBandMargins(PMARGINS pMargins
) const
8676 ATLASSERT(::IsWindow(m_hWnd
));
8677 ::SendMessage(m_hWnd
, RB_GETBANDMARGINS
, 0, (LPARAM
)pMargins
);
8680 void SetWindowTheme(LPCWSTR lpstrTheme
)
8682 ATLASSERT(::IsWindow(m_hWnd
));
8683 ::SendMessage(m_hWnd
, RB_SETWINDOWTHEME
, 0, (LPARAM
)lpstrTheme
);
8685 #endif // (_WIN32_WINNT >= 0x0501)
8687 #if (_WIN32_IE >= 0x0600)
8688 DWORD
GetExtendedStyle() const
8690 ATLASSERT(::IsWindow(m_hWnd
));
8691 return (DWORD
)::SendMessage(m_hWnd
, RB_GETEXTENDEDSTYLE
, 0, 0L);
8694 DWORD
SetExtendedStyle(DWORD dwStyle
, DWORD dwMask
)
8696 ATLASSERT(::IsWindow(m_hWnd
));
8697 return (DWORD
)::SendMessage(m_hWnd
, RB_SETEXTENDEDSTYLE
, dwMask
, dwStyle
);
8699 #endif // (_WIN32_IE >= 0x0600)
8702 BOOL
InsertBand(int nBand
, LPREBARBANDINFO lprbbi
)
8704 ATLASSERT(::IsWindow(m_hWnd
));
8705 return (BOOL
)::SendMessage(m_hWnd
, RB_INSERTBAND
, nBand
, (LPARAM
)lprbbi
);
8708 BOOL
AddBand(LPREBARBANDINFO lprbbi
)
8710 return InsertBand(-1, lprbbi
);
8713 BOOL
DeleteBand(int nBand
)
8715 ATLASSERT(::IsWindow(m_hWnd
));
8716 return (BOOL
)::SendMessage(m_hWnd
, RB_DELETEBAND
, nBand
, 0L);
8719 ATL::CWindow
SetNotifyWnd(HWND hWnd
)
8721 ATLASSERT(::IsWindow(m_hWnd
));
8722 return ATL::CWindow((HWND
)::SendMessage(m_hWnd
, RB_SETPARENT
, (WPARAM
)hWnd
, 0L));
8725 #if (_WIN32_IE >= 0x0400)
8726 void BeginDrag(int nBand
, DWORD dwPos
)
8728 ATLASSERT(::IsWindow(m_hWnd
));
8729 ::SendMessage(m_hWnd
, RB_BEGINDRAG
, nBand
, dwPos
);
8732 void BeginDrag(int nBand
, int xPos
, int yPos
)
8734 ATLASSERT(::IsWindow(m_hWnd
));
8735 ::SendMessage(m_hWnd
, RB_BEGINDRAG
, nBand
, MAKELPARAM(xPos
, yPos
));
8740 ATLASSERT(::IsWindow(m_hWnd
));
8741 ::SendMessage(m_hWnd
, RB_ENDDRAG
, 0, 0L);
8744 void DragMove(DWORD dwPos
)
8746 ATLASSERT(::IsWindow(m_hWnd
));
8747 ::SendMessage(m_hWnd
, RB_DRAGMOVE
, 0, dwPos
);
8750 void DragMove(int xPos
, int yPos
)
8752 ATLASSERT(::IsWindow(m_hWnd
));
8753 ::SendMessage(m_hWnd
, RB_DRAGMOVE
, 0, MAKELPARAM(xPos
, yPos
));
8757 void GetDropTarget(IDropTarget
** ppDropTarget
) const
8759 ATLASSERT(::IsWindow(m_hWnd
));
8760 ::SendMessage(m_hWnd
, RB_GETDROPTARGET
, 0, (LPARAM
)ppDropTarget
);
8762 #endif // !_WIN32_WCE
8764 void MaximizeBand(int nBand
, BOOL bIdeal
= FALSE
)
8766 ATLASSERT(::IsWindow(m_hWnd
));
8767 ::SendMessage(m_hWnd
, RB_MAXIMIZEBAND
, nBand
, bIdeal
);
8770 void MinimizeBand(int nBand
)
8772 ATLASSERT(::IsWindow(m_hWnd
));
8773 ::SendMessage(m_hWnd
, RB_MINIMIZEBAND
, nBand
, 0L);
8776 BOOL
SizeToRect(LPRECT lpRect
)
8778 ATLASSERT(::IsWindow(m_hWnd
));
8779 return (BOOL
)::SendMessage(m_hWnd
, RB_SIZETORECT
, 0, (LPARAM
)lpRect
);
8782 int IdToIndex(UINT uBandID
) const
8784 ATLASSERT(::IsWindow(m_hWnd
));
8785 return (int)::SendMessage(m_hWnd
, RB_IDTOINDEX
, uBandID
, 0L);
8788 int HitTest(LPRBHITTESTINFO lprbht
) const
8790 ATLASSERT(::IsWindow(m_hWnd
));
8791 return (int)::SendMessage(m_hWnd
, RB_HITTEST
, 0, (LPARAM
)lprbht
);
8794 BOOL
ShowBand(int nBand
, BOOL bShow
)
8796 ATLASSERT(::IsWindow(m_hWnd
));
8797 return (BOOL
)::SendMessage(m_hWnd
, RB_SHOWBAND
, nBand
, bShow
);
8801 BOOL
MoveBand(int nBand
, int nNewPos
)
8803 ATLASSERT(::IsWindow(m_hWnd
));
8804 ATLASSERT(nNewPos
>= 0 && nNewPos
<= ((int)GetBandCount() - 1));
8805 return (BOOL
)::SendMessage(m_hWnd
, RB_MOVEBAND
, nBand
, nNewPos
);
8807 #endif // !_WIN32_WCE
8808 #endif // (_WIN32_IE >= 0x0400)
8810 #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
8811 void PushChevron(int nBand
, LPARAM lAppValue
)
8813 ATLASSERT(::IsWindow(m_hWnd
));
8814 ::SendMessage(m_hWnd
, RB_PUSHCHEVRON
, nBand
, lAppValue
);
8816 #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
8819 #if (_WIN32_IE >= 0x0400)
8820 void LockBands(bool bLock
)
8822 int nBandCount
= GetBandCount();
8823 for(int i
=0; i
< nBandCount
; i
++)
8825 REBARBANDINFO rbbi
= { RunTimeHelper::SizeOf_REBARBANDINFO() };
8826 rbbi
.fMask
= RBBIM_STYLE
;
8827 BOOL bRet
= GetBandInfo(i
, &rbbi
);
8830 if((rbbi
.fStyle
& RBBS_GRIPPERALWAYS
) == 0)
8832 rbbi
.fStyle
|= RBBS_GRIPPERALWAYS
;
8833 bRet
= SetBandInfo(i
, &rbbi
);
8835 rbbi
.fStyle
&= ~RBBS_GRIPPERALWAYS
;
8839 rbbi
.fStyle
|= RBBS_NOGRIPPER
;
8841 rbbi
.fStyle
&= ~RBBS_NOGRIPPER
;
8843 bRet
= SetBandInfo(i
, &rbbi
);
8847 #endif // (_WIN32_IE >= 0x0400)
8849 #if (_WIN32_WINNT >= 0x0600)
8850 BOOL
SetBandWidth(int nBand
, int cxWidth
)
8852 ATLASSERT(::IsWindow(m_hWnd
));
8853 return (BOOL
)::SendMessage(m_hWnd
, RB_SETBANDWIDTH
, nBand
, cxWidth
);
8855 #endif // (_WIN32_WINNT >= 0x0600)
8858 typedef CReBarCtrlT
<ATL::CWindow
> CReBarCtrl
;
8861 ///////////////////////////////////////////////////////////////////////////////
8866 template <class TBase
>
8867 class CComboBoxExT
: public CComboBoxT
< TBase
>
8871 CComboBoxExT(HWND hWnd
= NULL
) : CComboBoxT
< TBase
>(hWnd
)
8874 CComboBoxExT
< TBase
>& operator =(HWND hWnd
)
8880 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
8881 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
8882 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
8884 return TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
8888 static LPCTSTR
GetWndClassName()
8890 return WC_COMBOBOXEX
;
8893 CImageList
GetImageList() const
8895 ATLASSERT(::IsWindow(m_hWnd
));
8896 return CImageList((HIMAGELIST
)::SendMessage(m_hWnd
, CBEM_GETIMAGELIST
, 0, 0L));
8899 CImageList
SetImageList(HIMAGELIST hImageList
)
8901 ATLASSERT(::IsWindow(m_hWnd
));
8902 return CImageList((HIMAGELIST
)::SendMessage(m_hWnd
, CBEM_SETIMAGELIST
, 0, (LPARAM
)hImageList
));
8905 #if (_WIN32_IE >= 0x0400)
8906 DWORD
GetExtendedStyle() const
8908 ATLASSERT(::IsWindow(m_hWnd
));
8909 return (DWORD
)::SendMessage(m_hWnd
, CBEM_GETEXTENDEDSTYLE
, 0, 0L);
8912 DWORD
SetExtendedStyle(DWORD dwExMask
, DWORD dwExStyle
)
8914 ATLASSERT(::IsWindow(m_hWnd
));
8915 return (DWORD
)::SendMessage(m_hWnd
, CBEM_SETEXTENDEDSTYLE
, dwExMask
, dwExStyle
);
8918 BOOL
GetUnicodeFormat() const
8920 ATLASSERT(::IsWindow(m_hWnd
));
8921 return (BOOL
)::SendMessage(m_hWnd
, CBEM_GETUNICODEFORMAT
, 0, 0L);
8924 BOOL
SetUnicodeFormat(BOOL bUnicode
= TRUE
)
8926 ATLASSERT(::IsWindow(m_hWnd
));
8927 return (BOOL
)::SendMessage(m_hWnd
, CBEM_SETUNICODEFORMAT
, bUnicode
, 0L);
8929 #endif // (_WIN32_IE >= 0x0400)
8931 #if (_WIN32_WINNT >= 0x0501)
8932 void SetWindowTheme(LPCWSTR lpstrTheme
)
8934 ATLASSERT(::IsWindow(m_hWnd
));
8935 ::SendMessage(m_hWnd
, CBEM_SETWINDOWTHEME
, 0, (LPARAM
)lpstrTheme
);
8937 #endif // (_WIN32_WINNT >= 0x0501)
8940 int InsertItem(const COMBOBOXEXITEM
* lpcCBItem
)
8942 ATLASSERT(::IsWindow(m_hWnd
));
8943 return (int)::SendMessage(m_hWnd
, CBEM_INSERTITEM
, 0, (LPARAM
)lpcCBItem
);
8946 int InsertItem(UINT nMask
, int nIndex
, LPCTSTR lpszItem
, int nImage
, int nSelImage
,
8947 int iIndent
, int iOverlay
, LPARAM lParam
)
8949 ATLASSERT(::IsWindow(m_hWnd
));
8950 COMBOBOXEXITEM cbex
= { 0 };
8952 cbex
.iItem
= nIndex
;
8953 cbex
.pszText
= (LPTSTR
) lpszItem
;
8954 cbex
.iImage
= nImage
;
8955 cbex
.iSelectedImage
= nSelImage
;
8956 cbex
.iIndent
= iIndent
;
8957 cbex
.iOverlay
= iOverlay
;
8958 cbex
.lParam
= lParam
;
8959 return (int)::SendMessage(m_hWnd
, CBEM_INSERTITEM
, 0, (LPARAM
)&cbex
);
8962 int InsertItem(int nIndex
, LPCTSTR lpszItem
, int nImage
, int nSelImage
, int iIndent
, LPARAM lParam
= 0)
8964 ATLASSERT(::IsWindow(m_hWnd
));
8965 COMBOBOXEXITEM cbex
= { 0 };
8966 cbex
.mask
= CBEIF_TEXT
| CBEIF_IMAGE
| CBEIF_SELECTEDIMAGE
| CBEIF_INDENT
| CBEIF_LPARAM
;
8967 cbex
.iItem
= nIndex
;
8968 cbex
.pszText
= (LPTSTR
) lpszItem
;
8969 cbex
.iImage
= nImage
;
8970 cbex
.iSelectedImage
= nSelImage
;
8971 cbex
.iIndent
= iIndent
;
8972 cbex
.lParam
= lParam
;
8973 return (int)::SendMessage(m_hWnd
, CBEM_INSERTITEM
, 0, (LPARAM
)&cbex
);
8976 int AddItem(UINT nMask
, LPCTSTR lpszItem
, int nImage
, int nSelImage
, int iIndent
, int iOverlay
, LPARAM lParam
)
8978 return InsertItem(nMask
, -1, lpszItem
, nImage
, nSelImage
, iIndent
, iOverlay
, lParam
);
8981 int AddItem(LPCTSTR lpszItem
, int nImage
, int nSelImage
, int iIndent
, LPARAM lParam
= 0)
8983 return InsertItem(-1, lpszItem
, nImage
, nSelImage
, iIndent
, lParam
);
8986 int DeleteItem(int nIndex
)
8988 ATLASSERT(::IsWindow(m_hWnd
));
8989 return (int)::SendMessage(m_hWnd
, CBEM_DELETEITEM
, nIndex
, 0L);
8992 BOOL
GetItem(PCOMBOBOXEXITEM pCBItem
) const
8994 ATLASSERT(::IsWindow(m_hWnd
));
8995 return (BOOL
)::SendMessage(m_hWnd
, CBEM_GETITEM
, 0, (LPARAM
)pCBItem
);
8998 BOOL
SetItem(const COMBOBOXEXITEM
* lpcCBItem
)
9000 ATLASSERT(::IsWindow(m_hWnd
));
9001 return (BOOL
)::SendMessage(m_hWnd
, CBEM_SETITEM
, 0, (LPARAM
)lpcCBItem
);
9004 int SetItem(int nIndex
, UINT nMask
, LPCTSTR lpszItem
, int nImage
, int nSelImage
,
9005 int iIndent
, int iOverlay
, LPARAM lParam
)
9007 ATLASSERT(::IsWindow(m_hWnd
));
9008 COMBOBOXEXITEM cbex
= { 0 };
9010 cbex
.iItem
= nIndex
;
9011 cbex
.pszText
= (LPTSTR
) lpszItem
;
9012 cbex
.iImage
= nImage
;
9013 cbex
.iSelectedImage
= nSelImage
;
9014 cbex
.iIndent
= iIndent
;
9015 cbex
.iOverlay
= iOverlay
;
9016 cbex
.lParam
= lParam
;
9017 return (int)::SendMessage(m_hWnd
, CBEM_SETITEM
, 0, (LPARAM
)&cbex
);
9020 BOOL
GetItemText(int nIndex
, LPTSTR lpszItem
, int nLen
) const
9022 ATLASSERT(::IsWindow(m_hWnd
));
9023 ATLASSERT(lpszItem
!= NULL
);
9025 COMBOBOXEXITEM cbex
= { 0 };
9026 cbex
.mask
= CBEIF_TEXT
;
9027 cbex
.iItem
= nIndex
;
9028 cbex
.pszText
= lpszItem
;
9029 cbex
.cchTextMax
= nLen
;
9031 return (BOOL
)::SendMessage(m_hWnd
, CBEM_GETITEM
, 0, (LPARAM
)&cbex
);
9035 BOOL
GetItemText(int nIndex
, BSTR
& bstrText
) const
9038 ATLASSERT(::IsWindow(m_hWnd
));
9039 ATLASSERT(bstrText
== NULL
);
9041 COMBOBOXEXITEM cbex
= { 0 };
9042 cbex
.mask
= CBEIF_TEXT
;
9043 cbex
.iItem
= nIndex
;
9045 LPTSTR lpstrText
= NULL
;
9047 for(int nLen
= 256; ; nLen
*= 2)
9049 ATLTRY(lpstrText
= new TCHAR
[nLen
]);
9050 if(lpstrText
== NULL
)
9052 lpstrText
[0] = NULL
;
9053 cbex
.pszText
= lpstrText
;
9054 cbex
.cchTextMax
= nLen
;
9055 bRet
= (BOOL
)::SendMessage(m_hWnd
, CBEM_GETITEM
, 0, (LPARAM
)&cbex
);
9056 if(!bRet
|| (lstrlen(cbex
.pszText
) < nLen
- 1))
9058 delete [] lpstrText
;
9062 if(lpstrText
!= NULL
)
9065 bstrText
= ::SysAllocString(T2OLE(lpstrText
));
9066 delete [] lpstrText
;
9069 return (bstrText
!= NULL
) ? TRUE
: FALSE
;
9071 #endif // !_ATL_NO_COM
9073 #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
9074 BOOL
GetItemText(int nIndex
, _CSTRING_NS::CString
& strText
) const
9076 ATLASSERT(::IsWindow(m_hWnd
));
9078 COMBOBOXEXITEM cbex
= { 0 };
9079 cbex
.mask
= CBEIF_TEXT
;
9080 cbex
.iItem
= nIndex
;
9084 for(int nLen
= 256; ; nLen
*= 2)
9086 cbex
.pszText
= strText
.GetBufferSetLength(nLen
);
9087 if(cbex
.pszText
== NULL
)
9092 cbex
.cchTextMax
= nLen
;
9093 bRet
= (BOOL
)::SendMessage(m_hWnd
, CBEM_GETITEM
, 0, (LPARAM
)&cbex
);
9094 if(!bRet
|| (lstrlen(cbex
.pszText
) < nLen
- 1))
9097 strText
.ReleaseBuffer();
9100 #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
9102 BOOL
SetItemText(int nIndex
, LPCTSTR lpszItem
)
9104 ATLASSERT(::IsWindow(m_hWnd
));
9105 return SetItem(nIndex
, CBEIF_TEXT
, lpszItem
, 0, 0, 0, 0, 0);
9108 CComboBox
GetComboCtrl() const
9110 ATLASSERT(::IsWindow(m_hWnd
));
9111 return CComboBox((HWND
)::SendMessage(m_hWnd
, CBEM_GETCOMBOCONTROL
, 0, 0L));
9114 CEdit
GetEditCtrl() const
9116 ATLASSERT(::IsWindow(m_hWnd
));
9117 return CEdit((HWND
)::SendMessage(m_hWnd
, CBEM_GETEDITCONTROL
, 0, 0L));
9120 BOOL
HasEditChanged() const
9122 ATLASSERT(::IsWindow(m_hWnd
));
9123 return (BOOL
)::SendMessage(m_hWnd
, CBEM_HASEDITCHANGED
, 0, 0L);
9127 int AddString(LPCTSTR
/*lpszItem*/)
9129 ATLASSERT(FALSE
); // Not available in CComboBoxEx; use InsertItem
9133 int InsertString(int /*nIndex*/, LPCTSTR
/*lpszString*/)
9135 ATLASSERT(FALSE
); // Not available in CComboBoxEx; use InsertItem
9139 int Dir(UINT
/*attr*/, LPCTSTR
/*lpszWildCard*/)
9141 ATLASSERT(FALSE
); // Not available in CComboBoxEx
9145 int FindString(int /*nStartAfter*/, LPCTSTR
/*lpszString*/) const
9147 ATLASSERT(FALSE
); // Not available in CComboBoxEx; try FindStringExact
9152 typedef CComboBoxExT
<ATL::CWindow
> CComboBoxEx
;
9154 #endif // !_WIN32_WCE
9157 ///////////////////////////////////////////////////////////////////////////////
9158 // CMonthCalendarCtrl
9160 template <class TBase
>
9161 class CMonthCalendarCtrlT
: public TBase
9165 CMonthCalendarCtrlT(HWND hWnd
= NULL
) : TBase(hWnd
)
9168 CMonthCalendarCtrlT
< TBase
>& operator =(HWND hWnd
)
9174 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
9175 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
9176 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
9178 return TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
9182 static LPCTSTR
GetWndClassName()
9184 return MONTHCAL_CLASS
;
9187 COLORREF
GetColor(int nColorType
) const
9189 ATLASSERT(::IsWindow(m_hWnd
));
9190 return (COLORREF
)::SendMessage(m_hWnd
, MCM_GETCOLOR
, nColorType
, 0L);
9193 COLORREF
SetColor(int nColorType
, COLORREF clr
)
9195 ATLASSERT(::IsWindow(m_hWnd
));
9196 return (COLORREF
)::SendMessage(m_hWnd
, MCM_SETCOLOR
, nColorType
, clr
);
9199 BOOL
GetCurSel(LPSYSTEMTIME lpSysTime
) const
9201 ATLASSERT(::IsWindow(m_hWnd
));
9202 return (BOOL
)::SendMessage(m_hWnd
, MCM_GETCURSEL
, 0, (LPARAM
)lpSysTime
);
9205 BOOL
SetCurSel(LPSYSTEMTIME lpSysTime
)
9207 ATLASSERT(::IsWindow(m_hWnd
));
9208 return (BOOL
)::SendMessage(m_hWnd
, MCM_SETCURSEL
, 0, (LPARAM
)lpSysTime
);
9211 int GetFirstDayOfWeek(BOOL
* pbLocaleVal
= NULL
) const
9213 ATLASSERT(::IsWindow(m_hWnd
));
9214 DWORD dwRet
= (DWORD
)::SendMessage(m_hWnd
, MCM_GETFIRSTDAYOFWEEK
, 0, 0L);
9215 if(pbLocaleVal
!= NULL
)
9216 *pbLocaleVal
= (BOOL
)HIWORD(dwRet
);
9217 return (int)(short)LOWORD(dwRet
);
9220 int SetFirstDayOfWeek(int nDay
, BOOL
* pbLocaleVal
= NULL
)
9222 ATLASSERT(::IsWindow(m_hWnd
));
9223 DWORD dwRet
= (DWORD
)::SendMessage(m_hWnd
, MCM_SETFIRSTDAYOFWEEK
, 0, nDay
);
9224 if(pbLocaleVal
!= NULL
)
9225 *pbLocaleVal
= (BOOL
)HIWORD(dwRet
);
9226 return (int)(short)LOWORD(dwRet
);
9229 int GetMaxSelCount() const
9231 ATLASSERT(::IsWindow(m_hWnd
));
9232 return (int)::SendMessage(m_hWnd
, MCM_GETMAXSELCOUNT
, 0, 0L);
9235 BOOL
SetMaxSelCount(int nMax
)
9237 ATLASSERT(::IsWindow(m_hWnd
));
9238 return (BOOL
)::SendMessage(m_hWnd
, MCM_SETMAXSELCOUNT
, nMax
, 0L);
9241 int GetMonthDelta() const
9243 ATLASSERT(::IsWindow(m_hWnd
));
9244 return (int)::SendMessage(m_hWnd
, MCM_GETMONTHDELTA
, 0, 0L);
9247 int SetMonthDelta(int nDelta
)
9249 ATLASSERT(::IsWindow(m_hWnd
));
9250 return (int)::SendMessage(m_hWnd
, MCM_SETMONTHDELTA
, nDelta
, 0L);
9253 DWORD
GetRange(LPSYSTEMTIME lprgSysTimeArray
) const
9255 ATLASSERT(::IsWindow(m_hWnd
));
9256 return (DWORD
)::SendMessage(m_hWnd
, MCM_GETRANGE
, 0, (LPARAM
)lprgSysTimeArray
);
9259 BOOL
SetRange(DWORD dwFlags
, LPSYSTEMTIME lprgSysTimeArray
)
9261 ATLASSERT(::IsWindow(m_hWnd
));
9262 return (BOOL
)::SendMessage(m_hWnd
, MCM_SETRANGE
, dwFlags
, (LPARAM
)lprgSysTimeArray
);
9265 BOOL
GetSelRange(LPSYSTEMTIME lprgSysTimeArray
) const
9267 ATLASSERT(::IsWindow(m_hWnd
));
9268 return (BOOL
)::SendMessage(m_hWnd
, MCM_GETSELRANGE
, 0, (LPARAM
)lprgSysTimeArray
);
9271 BOOL
SetSelRange(LPSYSTEMTIME lprgSysTimeArray
)
9273 ATLASSERT(::IsWindow(m_hWnd
));
9274 return (BOOL
)::SendMessage(m_hWnd
, MCM_SETSELRANGE
, 0, (LPARAM
)lprgSysTimeArray
);
9277 BOOL
GetToday(LPSYSTEMTIME lpSysTime
) const
9279 ATLASSERT(::IsWindow(m_hWnd
));
9280 return (BOOL
)::SendMessage(m_hWnd
, MCM_GETTODAY
, 0, (LPARAM
)lpSysTime
);
9283 void SetToday(LPSYSTEMTIME lpSysTime
)
9285 ATLASSERT(::IsWindow(m_hWnd
));
9286 ::SendMessage(m_hWnd
, MCM_SETTODAY
, 0, (LPARAM
)lpSysTime
);
9289 BOOL
GetMinReqRect(LPRECT lpRectInfo
) const
9291 ATLASSERT(::IsWindow(m_hWnd
));
9292 return (BOOL
)::SendMessage(m_hWnd
, MCM_GETMINREQRECT
, 0, (LPARAM
)lpRectInfo
);
9295 int GetMaxTodayWidth() const
9297 ATLASSERT(::IsWindow(m_hWnd
));
9298 return (int)::SendMessage(m_hWnd
, MCM_GETMAXTODAYWIDTH
, 0, 0L);
9301 #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
9302 BOOL
GetUnicodeFormat() const
9304 ATLASSERT(::IsWindow(m_hWnd
));
9305 return (BOOL
)::SendMessage(m_hWnd
, MCM_GETUNICODEFORMAT
, 0, 0L);
9308 BOOL
SetUnicodeFormat(BOOL bUnicode
= TRUE
)
9310 ATLASSERT(::IsWindow(m_hWnd
));
9311 return (BOOL
)::SendMessage(m_hWnd
, MCM_SETUNICODEFORMAT
, bUnicode
, 0L);
9313 #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
9315 #if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)
9316 DWORD
GetCurrentView() const
9318 ATLASSERT(::IsWindow(m_hWnd
));
9319 return (DWORD
)::SendMessage(m_hWnd
, MCM_GETCURRENTVIEW
, 0, 0L);
9322 BOOL
SetCurrentView(DWORD dwView
)
9324 ATLASSERT(::IsWindow(m_hWnd
));
9325 return (BOOL
)::SendMessage(m_hWnd
, MCM_SETCURRENTVIEW
, 0, dwView
);
9328 DWORD
GetCalendarCount() const
9330 ATLASSERT(::IsWindow(m_hWnd
));
9331 return (DWORD
)::SendMessage(m_hWnd
, MCM_GETCALENDARCOUNT
, 0, 0L);
9334 BOOL
GetCalendarGridInfo(PMCGRIDINFO pGridInfo
) const
9336 ATLASSERT(::IsWindow(m_hWnd
));
9337 return (BOOL
)::SendMessage(m_hWnd
, MCM_GETCALENDARGRIDINFO
, 0, (LPARAM
)pGridInfo
);
9340 CALID
GetCALID() const
9342 ATLASSERT(::IsWindow(m_hWnd
));
9343 return (CALID
)::SendMessage(m_hWnd
, MCM_GETCALID
, 0, 0L);
9346 void SetCALID(CALID calid
)
9348 ATLASSERT(::IsWindow(m_hWnd
));
9349 ::SendMessage(m_hWnd
, MCM_SETCALID
, (LPARAM
)calid
, 0L);
9352 int GetCalendarBorder() const
9354 ATLASSERT(::IsWindow(m_hWnd
));
9355 return (int)::SendMessage(m_hWnd
, MCM_GETCALENDARBORDER
, 0, 0L);
9358 void SetCalendarBorder(int cxyBorder
, BOOL bSet
= TRUE
)
9360 ATLASSERT(::IsWindow(m_hWnd
));
9361 ::SendMessage(m_hWnd
, MCM_SETCALENDARBORDER
, (WPARAM
)bSet
, (LPARAM
)cxyBorder
);
9363 #endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)
9366 int GetMonthRange(DWORD dwFlags
, LPSYSTEMTIME lprgSysTimeArray
) const
9368 ATLASSERT(::IsWindow(m_hWnd
));
9369 return (int)::SendMessage(m_hWnd
, MCM_GETMONTHRANGE
, dwFlags
, (LPARAM
)lprgSysTimeArray
);
9372 BOOL
SetDayState(int nMonths
, LPMONTHDAYSTATE lpDayStateArray
)
9374 ATLASSERT(::IsWindow(m_hWnd
));
9375 return (BOOL
)::SendMessage(m_hWnd
, MCM_SETDAYSTATE
, nMonths
, (LPARAM
)lpDayStateArray
);
9378 DWORD
HitTest(PMCHITTESTINFO pMCHitTest
) const
9380 ATLASSERT(::IsWindow(m_hWnd
));
9381 return (DWORD
)::SendMessage(m_hWnd
, MCM_HITTEST
, 0, (LPARAM
)pMCHitTest
);
9384 #if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)
9385 void SizeRectToMin(LPRECT lpRect
)
9387 ATLASSERT(::IsWindow(m_hWnd
));
9388 ::SendMessage(m_hWnd
, MCM_SIZERECTTOMIN
, 0, (LPARAM
)lpRect
);
9390 #endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)
9393 typedef CMonthCalendarCtrlT
<ATL::CWindow
> CMonthCalendarCtrl
;
9396 ///////////////////////////////////////////////////////////////////////////////
9397 // CDateTimePickerCtrl
9399 template <class TBase
>
9400 class CDateTimePickerCtrlT
: public TBase
9404 CDateTimePickerCtrlT(HWND hWnd
= NULL
) : TBase(hWnd
)
9407 CDateTimePickerCtrlT
< TBase
>& operator =(HWND hWnd
)
9413 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
9414 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
9415 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
9417 return TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
9421 static LPCTSTR
GetWndClassName()
9423 return DATETIMEPICK_CLASS
;
9426 BOOL
SetFormat(LPCTSTR lpszFormat
)
9428 ATLASSERT(::IsWindow(m_hWnd
));
9429 return (BOOL
)::SendMessage(m_hWnd
, DTM_SETFORMAT
, 0, (LPARAM
)lpszFormat
);
9432 COLORREF
GetMonthCalColor(int nColorType
) const
9434 ATLASSERT(::IsWindow(m_hWnd
));
9435 return (COLORREF
)::SendMessage(m_hWnd
, DTM_GETMCCOLOR
, nColorType
, 0L);
9438 COLORREF
SetMonthCalColor(int nColorType
, COLORREF clr
)
9440 ATLASSERT(::IsWindow(m_hWnd
));
9441 return (COLORREF
)::SendMessage(m_hWnd
, DTM_SETMCCOLOR
, nColorType
, clr
);
9444 DWORD
GetRange(LPSYSTEMTIME lpSysTimeArray
) const
9446 ATLASSERT(::IsWindow(m_hWnd
));
9447 return (DWORD
)::SendMessage(m_hWnd
, DTM_GETRANGE
, 0, (LPARAM
)lpSysTimeArray
);
9450 BOOL
SetRange(DWORD dwFlags
, LPSYSTEMTIME lpSysTimeArray
)
9452 ATLASSERT(::IsWindow(m_hWnd
));
9453 return (BOOL
)::SendMessage(m_hWnd
, DTM_SETRANGE
, dwFlags
, (LPARAM
)lpSysTimeArray
);
9456 DWORD
GetSystemTime(LPSYSTEMTIME lpSysTime
) const
9458 ATLASSERT(::IsWindow(m_hWnd
));
9459 return (DWORD
)::SendMessage(m_hWnd
, DTM_GETSYSTEMTIME
, 0, (LPARAM
)lpSysTime
);
9462 BOOL
SetSystemTime(DWORD dwFlags
, LPSYSTEMTIME lpSysTime
)
9464 ATLASSERT(::IsWindow(m_hWnd
));
9465 return (BOOL
)::SendMessage(m_hWnd
, DTM_SETSYSTEMTIME
, dwFlags
, (LPARAM
)lpSysTime
);
9468 CMonthCalendarCtrl
GetMonthCal() const
9470 ATLASSERT(::IsWindow(m_hWnd
));
9471 return CMonthCalendarCtrl((HWND
)::SendMessage(m_hWnd
, DTM_GETMONTHCAL
, 0, 0L));
9474 #if (_WIN32_IE >= 0x0400)
9475 CFontHandle
GetMonthCalFont() const
9477 ATLASSERT(::IsWindow(m_hWnd
));
9478 return CFontHandle((HFONT
)::SendMessage(m_hWnd
, DTM_GETMCFONT
, 0, 0L));
9481 void SetMonthCalFont(HFONT hFont
, BOOL bRedraw
= TRUE
)
9483 ATLASSERT(::IsWindow(m_hWnd
));
9484 ::SendMessage(m_hWnd
, DTM_SETMCFONT
, (WPARAM
)hFont
, MAKELPARAM(bRedraw
, 0));
9486 #endif // (_WIN32_IE >= 0x0400)
9488 #if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)
9489 DWORD
GetMonthCalStyle() const
9491 ATLASSERT(::IsWindow(m_hWnd
));
9492 return (DWORD
)::SendMessage(m_hWnd
, DTM_GETMCSTYLE
, 0, 0L);
9495 DWORD
SetMonthCalStyle(DWORD dwStyle
)
9497 ATLASSERT(::IsWindow(m_hWnd
));
9498 return (DWORD
)::SendMessage(m_hWnd
, DTM_SETMCSTYLE
, 0, (LPARAM
)dwStyle
);
9501 void GetDateTimePickerInfo(LPDATETIMEPICKERINFO lpPickerInfo
) const
9503 ATLASSERT(::IsWindow(m_hWnd
));
9504 ::SendMessage(m_hWnd
, DTM_GETDATETIMEPICKERINFO
, 0, (LPARAM
)lpPickerInfo
);
9507 BOOL
GetIdealSize(LPSIZE lpSize
) const
9509 ATLASSERT(::IsWindow(m_hWnd
));
9510 return (BOOL
)::SendMessage(m_hWnd
, DTM_GETIDEALSIZE
, 0, (LPARAM
)lpSize
);
9513 void CloseMonthCal()
9515 ATLASSERT(::IsWindow(m_hWnd
));
9516 ::SendMessage(m_hWnd
, DTM_CLOSEMONTHCAL
, 0, 0L);
9518 #endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)
9521 typedef CDateTimePickerCtrlT
<ATL::CWindow
> CDateTimePickerCtrl
;
9524 ///////////////////////////////////////////////////////////////////////////////
9525 // CFlatScrollBarImpl - support for flat scroll bars
9527 #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
9530 class CFlatScrollBarImpl
9534 BOOL
FlatSB_Initialize()
9536 T
* pT
= static_cast<T
*>(this);
9537 ATLASSERT(::IsWindow(pT
->m_hWnd
));
9538 return ::InitializeFlatSB(pT
->m_hWnd
);
9541 HRESULT
FlatSB_Uninitialize()
9543 T
* pT
= static_cast<T
*>(this);
9544 ATLASSERT(::IsWindow(pT
->m_hWnd
));
9545 return ::UninitializeFlatSB(pT
->m_hWnd
);
9548 // Flat scroll bar properties
9549 BOOL
FlatSB_GetScrollProp(UINT uIndex
, LPINT lpnValue
) const
9551 const T
* pT
= static_cast<const T
*>(this);
9552 ATLASSERT(::IsWindow(pT
->m_hWnd
));
9553 return ::FlatSB_GetScrollProp(pT
->m_hWnd
, uIndex
, lpnValue
);
9556 BOOL
FlatSB_SetScrollProp(UINT uIndex
, int nValue
, BOOL bRedraw
= TRUE
)
9558 T
* pT
= static_cast<T
*>(this);
9559 ATLASSERT(::IsWindow(pT
->m_hWnd
));
9560 return ::FlatSB_SetScrollProp(pT
->m_hWnd
, uIndex
, nValue
, bRedraw
);
9564 int FlatSB_GetScrollPos(int nBar
) const
9566 const T
* pT
= static_cast<const T
*>(this);
9567 ATLASSERT(::IsWindow(pT
->m_hWnd
));
9568 return ::FlatSB_GetScrollPos(pT
->m_hWnd
, nBar
);
9571 int FlatSB_SetScrollPos(int nBar
, int nPos
, BOOL bRedraw
= TRUE
)
9573 T
* pT
= static_cast<T
*>(this);
9574 ATLASSERT(::IsWindow(pT
->m_hWnd
));
9575 return ::FlatSB_SetScrollPos(pT
->m_hWnd
, nBar
, nPos
, bRedraw
);
9578 BOOL
FlatSB_GetScrollRange(int nBar
, LPINT lpMinPos
, LPINT lpMaxPos
) const
9580 const T
* pT
= static_cast<const T
*>(this);
9581 ATLASSERT(::IsWindow(pT
->m_hWnd
));
9582 return ::FlatSB_GetScrollRange(pT
->m_hWnd
, nBar
, lpMinPos
, lpMaxPos
);
9585 BOOL
FlatSB_SetScrollRange(int nBar
, int nMinPos
, int nMaxPos
, BOOL bRedraw
= TRUE
)
9587 T
* pT
= static_cast<T
*>(this);
9588 ATLASSERT(::IsWindow(pT
->m_hWnd
));
9589 return ::FlatSB_SetScrollRange(pT
->m_hWnd
, nBar
, nMinPos
, nMaxPos
, bRedraw
);
9592 BOOL
FlatSB_GetScrollInfo(int nBar
, LPSCROLLINFO lpScrollInfo
) const
9594 const T
* pT
= static_cast<const T
*>(this);
9595 ATLASSERT(::IsWindow(pT
->m_hWnd
));
9596 return ::FlatSB_GetScrollInfo(pT
->m_hWnd
, nBar
, lpScrollInfo
);
9599 int FlatSB_SetScrollInfo(int nBar
, LPSCROLLINFO lpScrollInfo
, BOOL bRedraw
= TRUE
)
9601 T
* pT
= static_cast<T
*>(this);
9602 ATLASSERT(::IsWindow(pT
->m_hWnd
));
9603 return ::FlatSB_SetScrollInfo(pT
->m_hWnd
, nBar
, lpScrollInfo
, bRedraw
);
9607 BOOL
FlatSB_ShowScrollBar(UINT nBar
, BOOL bShow
= TRUE
)
9609 T
* pT
= static_cast<T
*>(this);
9610 ATLASSERT(::IsWindow(pT
->m_hWnd
));
9611 return ::FlatSB_ShowScrollBar(pT
->m_hWnd
, nBar
, bShow
);
9614 BOOL
FlatSB_EnableScrollBar(UINT uSBFlags
, UINT uArrowFlags
= ESB_ENABLE_BOTH
)
9616 T
* pT
= static_cast<T
*>(this);
9617 ATLASSERT(::IsWindow(pT
->m_hWnd
));
9618 return ::FlatSB_EnableScrollBar(pT
->m_hWnd
, uSBFlags
, uArrowFlags
);
9622 template <class TBase
>
9623 class CFlatScrollBarT
: public TBase
, public CFlatScrollBarImpl
<CFlatScrollBarT
< TBase
> >
9626 CFlatScrollBarT(HWND hWnd
= NULL
) : TBase(hWnd
)
9629 CFlatScrollBarT
< TBase
>& operator =(HWND hWnd
)
9636 typedef CFlatScrollBarT
<ATL::CWindow
> CFlatScrollBar
;
9638 #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
9641 ///////////////////////////////////////////////////////////////////////////////
9644 #if (_WIN32_IE >= 0x0400)
9646 template <class TBase
>
9647 class CIPAddressCtrlT
: public TBase
9651 CIPAddressCtrlT(HWND hWnd
= NULL
) : TBase(hWnd
)
9654 CIPAddressCtrlT
< TBase
>& operator =(HWND hWnd
)
9660 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
9661 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
9662 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
9664 return TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
9668 static LPCTSTR
GetWndClassName()
9670 return WC_IPADDRESS
;
9673 BOOL
IsBlank() const
9675 ATLASSERT(::IsWindow(m_hWnd
));
9676 return (BOOL
)::SendMessage(m_hWnd
, IPM_ISBLANK
, 0, 0L);
9679 int GetAddress(LPDWORD lpdwAddress
) const
9681 ATLASSERT(::IsWindow(m_hWnd
));
9682 return (int)::SendMessage(m_hWnd
, IPM_GETADDRESS
, 0, (LPARAM
)lpdwAddress
);
9685 void SetAddress(DWORD dwAddress
)
9687 ATLASSERT(::IsWindow(m_hWnd
));
9688 ::SendMessage(m_hWnd
, IPM_SETADDRESS
, 0, dwAddress
);
9693 ATLASSERT(::IsWindow(m_hWnd
));
9694 ::SendMessage(m_hWnd
, IPM_CLEARADDRESS
, 0, 0L);
9697 void SetRange(int nField
, WORD wRange
)
9699 ATLASSERT(::IsWindow(m_hWnd
));
9700 ::SendMessage(m_hWnd
, IPM_SETRANGE
, nField
, wRange
);
9703 void SetRange(int nField
, BYTE nMin
, BYTE nMax
)
9705 ATLASSERT(::IsWindow(m_hWnd
));
9706 ::SendMessage(m_hWnd
, IPM_SETRANGE
, nField
, MAKEIPRANGE(nMin
, nMax
));
9709 void SetFocus(int nField
)
9711 ATLASSERT(::IsWindow(m_hWnd
));
9712 ::SendMessage(m_hWnd
, IPM_SETFOCUS
, nField
, 0L);
9716 typedef CIPAddressCtrlT
<ATL::CWindow
> CIPAddressCtrl
;
9718 #endif // (_WIN32_IE >= 0x0400)
9721 ///////////////////////////////////////////////////////////////////////////////
9724 #if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
9726 template <class TBase
>
9727 class CPagerCtrlT
: public TBase
9731 CPagerCtrlT(HWND hWnd
= NULL
) : TBase(hWnd
)
9734 CPagerCtrlT
< TBase
>& operator =(HWND hWnd
)
9740 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
9741 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
9742 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
9744 return TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
9748 static LPCTSTR
GetWndClassName()
9750 return WC_PAGESCROLLER
;
9753 int GetButtonSize() const
9755 ATLASSERT(::IsWindow(m_hWnd
));
9756 return (int)::SendMessage(m_hWnd
, PGM_GETBUTTONSIZE
, 0, 0L);
9759 int SetButtonSize(int nButtonSize
)
9761 ATLASSERT(::IsWindow(m_hWnd
));
9762 return (int)::SendMessage(m_hWnd
, PGM_SETBUTTONSIZE
, 0, nButtonSize
);
9765 DWORD
GetButtonState(int nButton
) const
9767 ATLASSERT(::IsWindow(m_hWnd
));
9768 ATLASSERT(nButton
== PGB_TOPORLEFT
|| nButton
== PGB_BOTTOMORRIGHT
);
9769 return (DWORD
)::SendMessage(m_hWnd
, PGM_GETBUTTONSTATE
, 0, nButton
);
9772 COLORREF
GetBkColor() const
9774 ATLASSERT(::IsWindow(m_hWnd
));
9775 return (COLORREF
)::SendMessage(m_hWnd
, PGM_GETBKCOLOR
, 0, 0L);
9778 COLORREF
SetBkColor(COLORREF clrBk
)
9780 ATLASSERT(::IsWindow(m_hWnd
));
9781 return (COLORREF
)::SendMessage(m_hWnd
, PGM_SETBKCOLOR
, 0, (LPARAM
)clrBk
);
9784 int GetBorder() const
9786 ATLASSERT(::IsWindow(m_hWnd
));
9787 return (int)::SendMessage(m_hWnd
, PGM_GETBORDER
, 0, 0L);
9790 int SetBorder(int nBorderSize
)
9792 ATLASSERT(::IsWindow(m_hWnd
));
9793 return (int)::SendMessage(m_hWnd
, PGM_SETBORDER
, 0, nBorderSize
);
9798 ATLASSERT(::IsWindow(m_hWnd
));
9799 return (int)::SendMessage(m_hWnd
, PGM_GETPOS
, 0, 0L);
9802 int SetPos(int nPos
)
9804 ATLASSERT(::IsWindow(m_hWnd
));
9805 return (int)::SendMessage(m_hWnd
, PGM_SETPOS
, 0, nPos
);
9809 void SetChild(HWND hWndChild
)
9811 ATLASSERT(::IsWindow(m_hWnd
));
9812 ::SendMessage(m_hWnd
, PGM_SETCHILD
, 0, (LPARAM
)hWndChild
);
9815 void ForwardMouse(BOOL bForward
= TRUE
)
9817 ATLASSERT(::IsWindow(m_hWnd
));
9818 ::SendMessage(m_hWnd
, PGM_FORWARDMOUSE
, bForward
, 0L);
9823 ATLASSERT(::IsWindow(m_hWnd
));
9824 ::SendMessage(m_hWnd
, PGM_RECALCSIZE
, 0, 0L);
9827 void GetDropTarget(IDropTarget
** ppDropTarget
)
9829 ATLASSERT(::IsWindow(m_hWnd
));
9830 ATLASSERT(ppDropTarget
!= NULL
);
9831 ::SendMessage(m_hWnd
, PGM_GETDROPTARGET
, 0, (LPARAM
)ppDropTarget
);
9835 typedef CPagerCtrlT
<ATL::CWindow
> CPagerCtrl
;
9837 #endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
9840 ///////////////////////////////////////////////////////////////////////////////
9841 // CLinkCtrl - Windows SYSLINK control
9843 #if (_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE)
9845 template <class TBase
>
9846 class CLinkCtrlT
: public TBase
9850 CLinkCtrlT(HWND hWnd
= NULL
) : TBase(hWnd
)
9853 CLinkCtrlT
< TBase
>& operator =(HWND hWnd
)
9859 HWND
Create(HWND hWndParent
, ATL::_U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
,
9860 DWORD dwStyle
= 0, DWORD dwExStyle
= 0,
9861 ATL::_U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
9863 return TBase::Create(GetWndClassName(), hWndParent
, rect
.m_lpRect
, szWindowName
, dwStyle
, dwExStyle
, MenuOrID
.m_hMenu
, lpCreateParam
);
9867 static LPCTSTR
GetWndClassName()
9876 int GetIdealHeight(int cxMaxWidth
= 0) const
9878 ATLASSERT(::IsWindow(m_hWnd
));
9879 return (int)::SendMessage(m_hWnd
, LM_GETIDEALHEIGHT
, cxMaxWidth
, 0L);
9882 BOOL
GetItem(PLITEM pLItem
) const
9884 ATLASSERT(::IsWindow(m_hWnd
));
9885 return (BOOL
)::SendMessage(m_hWnd
, LM_GETITEM
, 0, (LPARAM
)pLItem
);
9888 BOOL
SetItem(PLITEM pLItem
)
9890 ATLASSERT(::IsWindow(m_hWnd
));
9891 return (BOOL
)::SendMessage(m_hWnd
, LM_SETITEM
, 0, (LPARAM
)pLItem
);
9895 int GetIdealSize(SIZE
& size
, int cxMaxWidth
= 0) const
9897 #ifndef LM_GETIDEALSIZE
9898 const UINT LM_GETIDEALSIZE
= LM_GETIDEALHEIGHT
;
9900 ATLASSERT(::IsWindow(m_hWnd
));
9901 return (int)::SendMessage(m_hWnd
, LM_GETIDEALSIZE
, cxMaxWidth
, (LPARAM
)&size
);
9905 BOOL
HitTest(PLHITTESTINFO pLHitTestInfo
) const
9907 ATLASSERT(::IsWindow(m_hWnd
));
9908 return (BOOL
)::SendMessage(m_hWnd
, LM_HITTEST
, 0, (LPARAM
)pLHitTestInfo
);
9912 typedef CLinkCtrlT
<ATL::CWindow
> CLinkCtrl
;
9914 #endif // (_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE)
9917 ///////////////////////////////////////////////////////////////////////////////
9918 // CCustomDraw - MI class for custom-draw support
9924 #if (_ATL_VER < 0x0700)
9927 BOOL
IsMsgHandled() const
9929 return m_bHandledCD
;
9932 void SetMsgHandled(BOOL bHandled
)
9934 m_bHandledCD
= bHandled
;
9936 #endif // !(_ATL_VER < 0x0700)
9938 // Message map and handlers
9939 BEGIN_MSG_MAP(CCustomDraw
< T
>)
9940 NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW
, OnCustomDraw
)
9942 REFLECTED_NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW
, OnCustomDraw
)
9946 LRESULT
OnCustomDraw(int idCtrl
, LPNMHDR pnmh
, BOOL
& bHandled
)
9948 T
* pT
= static_cast<T
*>(this);
9949 pT
->SetMsgHandled(TRUE
);
9950 LPNMCUSTOMDRAW lpNMCustomDraw
= (LPNMCUSTOMDRAW
)pnmh
;
9952 switch(lpNMCustomDraw
->dwDrawStage
)
9955 dwRet
= pT
->OnPrePaint(idCtrl
, lpNMCustomDraw
);
9957 case CDDS_POSTPAINT
:
9958 dwRet
= pT
->OnPostPaint(idCtrl
, lpNMCustomDraw
);
9961 dwRet
= pT
->OnPreErase(idCtrl
, lpNMCustomDraw
);
9963 case CDDS_POSTERASE
:
9964 dwRet
= pT
->OnPostErase(idCtrl
, lpNMCustomDraw
);
9966 case CDDS_ITEMPREPAINT
:
9967 dwRet
= pT
->OnItemPrePaint(idCtrl
, lpNMCustomDraw
);
9969 case CDDS_ITEMPOSTPAINT
:
9970 dwRet
= pT
->OnItemPostPaint(idCtrl
, lpNMCustomDraw
);
9972 case CDDS_ITEMPREERASE
:
9973 dwRet
= pT
->OnItemPreErase(idCtrl
, lpNMCustomDraw
);
9975 case CDDS_ITEMPOSTERASE
:
9976 dwRet
= pT
->OnItemPostErase(idCtrl
, lpNMCustomDraw
);
9978 #if (_WIN32_IE >= 0x0400)
9979 case (CDDS_ITEMPREPAINT
| CDDS_SUBITEM
):
9980 dwRet
= pT
->OnSubItemPrePaint(idCtrl
, lpNMCustomDraw
);
9982 #endif // (_WIN32_IE >= 0x0400)
9984 pT
->SetMsgHandled(FALSE
);
9987 bHandled
= pT
->IsMsgHandled();
9992 DWORD
OnPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW
/*lpNMCustomDraw*/)
9994 return CDRF_DODEFAULT
;
9997 DWORD
OnPostPaint(int /*idCtrl*/, LPNMCUSTOMDRAW
/*lpNMCustomDraw*/)
9999 return CDRF_DODEFAULT
;
10002 DWORD
OnPreErase(int /*idCtrl*/, LPNMCUSTOMDRAW
/*lpNMCustomDraw*/)
10004 return CDRF_DODEFAULT
;
10007 DWORD
OnPostErase(int /*idCtrl*/, LPNMCUSTOMDRAW
/*lpNMCustomDraw*/)
10009 return CDRF_DODEFAULT
;
10012 DWORD
OnItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW
/*lpNMCustomDraw*/)
10014 return CDRF_DODEFAULT
;
10017 DWORD
OnItemPostPaint(int /*idCtrl*/, LPNMCUSTOMDRAW
/*lpNMCustomDraw*/)
10019 return CDRF_DODEFAULT
;
10022 DWORD
OnItemPreErase(int /*idCtrl*/, LPNMCUSTOMDRAW
/*lpNMCustomDraw*/)
10024 return CDRF_DODEFAULT
;
10027 DWORD
OnItemPostErase(int /*idCtrl*/, LPNMCUSTOMDRAW
/*lpNMCustomDraw*/)
10029 return CDRF_DODEFAULT
;
10032 #if (_WIN32_IE >= 0x0400)
10033 DWORD
OnSubItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW
/*lpNMCustomDraw*/)
10035 return CDRF_DODEFAULT
;
10037 #endif // (_WIN32_IE >= 0x0400)
10041 // --- Windows CE common controls ---
10045 ///////////////////////////////////////////////////////////////////////////////
10046 // CCECommandBarCtrl
10048 template <class TBase
>
10049 class CCECommandBarCtrlT
: public TBase
10053 CCECommandBarCtrlT(HWND hWnd
= NULL
) : TBase(hWnd
) { }
10055 CCECommandBarCtrlT
< TBase
>& operator=(HWND hWnd
)
10062 BOOL
IsVisible() const
10064 return IsWindowVisible();
10067 int GetHeight() const
10069 ATLASSERT(::IsWindow(m_hWnd
));
10070 return ::CommandBar_Height(m_hWnd
);
10073 HMENU
GetMenu(WORD wButton
) const
10075 ATLASSERT(::IsWindow(m_hWnd
));
10076 return ::CommandBar_GetMenu(m_hWnd
, wButton
);
10080 HWND
Create(HWND hWndParent
, int nCmdBarID
)
10082 m_hWnd
= ::CommandBar_Create(ModuleHelper::GetModuleInstance(), hWndParent
, nCmdBarID
);
10083 ATLASSERT(::IsWindow(m_hWnd
));
10092 BOOL
Show(BOOL bShow
= TRUE
)
10094 ATLASSERT(::IsWindow(m_hWnd
));
10095 return ::CommandBar_Show(m_hWnd
, bShow
);
10098 BOOL
DrawMenuBar(WORD wButton
)
10100 ATLASSERT(::IsWindow(m_hWnd
));
10101 return ::CommandBar_DrawMenuBar(m_hWnd
, wButton
);
10104 BOOL
AddAdornments(DWORD dwFlags
= 0)
10106 ATLASSERT(::IsWindow(m_hWnd
));
10107 return ::CommandBar_AddAdornments(m_hWnd
, dwFlags
, 0);
10110 int AddBitmap(int nBitmapID
, int nNumImages
)
10112 ATLASSERT(::IsWindow(m_hWnd
));
10113 return ::CommandBar_AddBitmap(m_hWnd
, ModuleHelper::GetResourceInstance(), nBitmapID
, nNumImages
, 16, 16);
10116 BOOL
AddButtons(UINT uNumButtons
, LPTBBUTTON lpButtons
)
10118 ATLASSERT(::IsWindow(m_hWnd
));
10119 return CommandBar_AddButtons(m_hWnd
, uNumButtons
, lpButtons
);
10122 BOOL
AddToolTips(UINT uNumToolTips
, LPTSTR lpToolTips
)
10124 ATLASSERT(::IsWindow(m_hWnd
));
10125 return CommandBar_AddToolTips(m_hWnd
, uNumToolTips
, lpToolTips
);
10128 BOOL
InsertButton(int nButton
, LPTBBUTTON lpButton
)
10130 ATLASSERT(::IsWindow(m_hWnd
));
10131 return CommandBar_InsertButton(m_hWnd
, nButton
, lpButton
);
10134 HWND
InsertComboBox(int nWidth
, UINT dwStyle
, WORD wComboBoxID
, WORD wButton
)
10136 ATLASSERT(::IsWindow(m_hWnd
));
10137 return ::CommandBar_InsertComboBox(m_hWnd
, ModuleHelper::GetModuleInstance(), nWidth
, dwStyle
, wComboBoxID
, wButton
);
10140 BOOL
InsertMenubar(WORD wMenuID
, WORD wButton
)
10142 ATLASSERT(::IsWindow(m_hWnd
));
10143 return ::CommandBar_InsertMenubar(m_hWnd
, ModuleHelper::GetResourceInstance(), wMenuID
, wButton
);
10146 BOOL
InsertMenubarEx(ATL::_U_STRINGorID menu
, WORD wButton
)
10148 ATLASSERT(::IsWindow(m_hWnd
));
10149 return ::CommandBar_InsertMenubarEx(m_hWnd
, ModuleHelper::GetResourceInstance(), (LPTSTR
)menu
.m_lpstr
, wButton
);
10152 BOOL
IsCommandBarMessage(LPMSG lpMsg
)
10154 ATLASSERT(::IsWindow(m_hWnd
));
10155 return ::IsCommandBarMessage(m_hWnd
, lpMsg
);
10159 #if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC MenuBar
10160 typedef CCECommandBarCtrlT
<CToolBarCtrl
> CMenuBarCtrl
;
10162 typedef CCECommandBarCtrlT
<CToolBarCtrl
> CCECommandBarCtrl
;
10163 #endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__)
10165 ///////////////////////////////////////////////////////////////////////////////
10166 // CCECommandBandsCtrl
10168 template <class TBase
>
10169 class CCECommandBandsCtrlT
: public TBase
10173 CCECommandBandsCtrlT(HWND hWnd
= NULL
) : TBase(hWnd
) { }
10175 CCECommandBandsCtrlT
< TBase
>& operator=(HWND hWnd
)
10182 BOOL
IsVisible() const
10184 return IsWindowVisible();
10187 #if (_WIN32_IE >= 0x0400)
10188 UINT
GetHeight() const
10190 ATLASSERT(::IsWindow(m_hWnd
));
10191 return CommandBands_Height(m_hWnd
);
10193 #endif // (_WIN32_IE >= 0x0400)
10195 HWND
GetCommandBar(UINT uBand
) const
10197 ATLASSERT(::IsWindow(m_hWnd
));
10198 return ::CommandBands_GetCommandBar(m_hWnd
, uBand
);
10201 BOOL
GetRestoreInformation(UINT uBand
, LPCOMMANDBANDSRESTOREINFO pcbr
) const
10203 ATLASSERT(::IsWindow(m_hWnd
));
10204 return ::CommandBands_GetRestoreInformation(m_hWnd
, uBand
, pcbr
);
10208 HWND
Create(HWND hWndParent
, UINT wID
, DWORD dwStyles
, HIMAGELIST hImageList
= NULL
)
10210 m_hWnd
= ::CommandBands_Create(ModuleHelper::GetModuleInstance(), hWndParent
, wID
, dwStyles
, hImageList
);
10211 ATLASSERT(::IsWindow(m_hWnd
));
10215 BOOL
AddAdornments(DWORD dwFlags
= 0, LPREBARBANDINFO prbbi
= NULL
)
10217 ATLASSERT(::IsWindow(m_hWnd
));
10218 return ::CommandBands_AddAdornments(m_hWnd
, ModuleHelper::GetModuleInstance(), dwFlags
, prbbi
);
10221 BOOL
AddBands(UINT uBandCount
, LPREBARBANDINFO prbbi
)
10223 ATLASSERT(::IsWindow(m_hWnd
));
10224 return ::CommandBands_AddBands(m_hWnd
, ModuleHelper::GetModuleInstance(), uBandCount
, prbbi
);
10227 BOOL
Show(BOOL bShow
= TRUE
)
10229 ATLASSERT(::IsWindow(m_hWnd
));
10230 return ::CommandBands_Show(m_hWnd
, bShow
);
10234 typedef CCECommandBandsCtrlT
<ATL::CWindow
> CCECommandBandsCtrl
;
10236 #endif // _WIN32_WCE
10238 }; // namespace WTL
10240 #endif // __ATLCTRLS_H__