annotate foosdk/wtl/Include/atlctrlx.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 // Windows Template Library - WTL version 10.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 // Copyright (C) Microsoft Corporation, WTL Team. All rights reserved.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 //
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 // This file is a part of the Windows Template Library.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 // The use and distribution terms for this software are covered by the
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 // Microsoft Public License (http://opensource.org/licenses/MS-PL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 // which can be found in the file MS-PL.txt at the root folder.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 #ifndef __ATLCTRLX_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 #define __ATLCTRLX_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 #ifndef __ATLAPP_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 #error atlctrlx.h requires atlapp.h to be included first
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 #ifndef __ATLCTRLS_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 #error atlctrlx.h requires atlctrls.h to be included first
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 // Classes in this file:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 //
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 // CBitmapButtonImpl<T, TBase, TWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 // CBitmapButton
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 // CCheckListViewCtrlImpl<T, TBase, TWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 // CCheckListViewCtrl
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 // CHyperLinkImpl<T, TBase, TWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 // CHyperLink
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 // CWaitCursor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 // CCustomWaitCursor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 // CMultiPaneStatusBarCtrlImpl<T, TBase>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 // CMultiPaneStatusBarCtrl
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 // CPaneContainerImpl<T, TBase, TWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 // CPaneContainer
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 // CSortListViewImpl<T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 // CSortListViewCtrlImpl<T, TBase, TWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 // CSortListViewCtrl
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 // CTabViewImpl<T, TBase, TWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 // CTabView
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 namespace WTL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 // CBitmapButton - bitmap button implementation
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 // bitmap button extended styles
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 #define BMPBTN_HOVER 0x00000001
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 #define BMPBTN_AUTO3D_SINGLE 0x00000002
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 #define BMPBTN_AUTO3D_DOUBLE 0x00000004
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 #define BMPBTN_AUTOSIZE 0x00000008
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 #define BMPBTN_SHAREIMAGELISTS 0x00000010
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 #define BMPBTN_AUTOFIRE 0x00000020
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 #define BMPBTN_CHECK 0x00000040
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 #define BMPBTN_AUTOCHECK 0x00000080
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 // Note: BMPBTN_CHECK/BMPBTN_AUTOCHECK disables BN_DOUBLECLICKED,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 // BMPBTN_AUTOFIRE doesn't work with BMPBTN_CHECK/BMPBTN_AUTOCHECK
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 template <class T, class TBase = CButton, class TWinTraits = ATL::CControlWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 class ATL_NO_VTABLE CBitmapButtonImpl : public ATL::CWindowImpl< T, TBase, TWinTraits >
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 DECLARE_WND_SUPERCLASS2(NULL, T, TBase::GetWndClassName())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 enum
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 _nImageNormal = 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 _nImagePushed,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 _nImageFocusOrHover,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 _nImageDisabled,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 _nImageCount = 4,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 enum
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 ID_TIMER_FIRST = 1000,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 ID_TIMER_REPEAT = 1001
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 // Bitmap button specific extended styles
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 DWORD m_dwExtendedStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 CImageList m_ImageList;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 int m_nImage[_nImageCount];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 CToolTipCtrl m_tip;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 LPTSTR m_lpstrToolTipText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 // Internal states
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 unsigned m_fMouseOver:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 unsigned m_fFocus:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 unsigned m_fPressed:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 unsigned m_fChecked:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 // Constructor/Destructor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 CBitmapButtonImpl(DWORD dwExtendedStyle = BMPBTN_AUTOSIZE, HIMAGELIST hImageList = NULL) :
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 m_dwExtendedStyle(dwExtendedStyle), m_ImageList(hImageList),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 m_lpstrToolTipText(NULL),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 m_fMouseOver(0), m_fFocus(0), m_fPressed(0), m_fChecked(0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 m_nImage[_nImageNormal] = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 m_nImage[_nImagePushed] = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 m_nImage[_nImageFocusOrHover] = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 m_nImage[_nImageDisabled] = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 #ifdef _DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 if(((m_dwExtendedStyle & BMPBTN_AUTOFIRE) != 0) && IsCheckMode())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 ATLTRACE2(atlTraceUI, 0, _T("CBitmapButtonImpl - Check mode and BMPBTN_AUTOFIRE cannot be used together, BMPBTN_AUTOFIRE will be ignored.\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 #endif // _DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 ~CBitmapButtonImpl()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 if((m_dwExtendedStyle & BMPBTN_SHAREIMAGELISTS) == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 m_ImageList.Destroy();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 delete [] m_lpstrToolTipText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 // overridden to provide proper initialization
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 BOOL SubclassWindow(HWND hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 BOOL bRet = ATL::CWindowImpl< T, TBase, TWinTraits >::SubclassWindow(hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 if(bRet != FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 pT->Init();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 // Attributes
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 DWORD GetBitmapButtonExtendedStyle() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 return m_dwExtendedStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 DWORD SetBitmapButtonExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 DWORD dwPrevStyle = m_dwExtendedStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 if(dwMask == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 m_dwExtendedStyle = dwExtendedStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 #ifdef _DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 if(((m_dwExtendedStyle & BMPBTN_AUTOFIRE) != 0) && IsCheckMode())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 ATLTRACE2(atlTraceUI, 0, _T("CBitmapButtonImpl - Check mode and BMPBTN_AUTOFIRE cannot be used together, BMPBTN_AUTOFIRE will be ignored.\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 #endif // _DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 return dwPrevStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 HIMAGELIST GetImageList() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 return m_ImageList;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 HIMAGELIST SetImageList(HIMAGELIST hImageList)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 HIMAGELIST hImageListPrev = m_ImageList;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 m_ImageList = hImageList;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 if(((m_dwExtendedStyle & BMPBTN_AUTOSIZE) != 0) && ::IsWindow(this->m_hWnd))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 SizeToImage();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 return hImageListPrev;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 int GetToolTipTextLength() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 return (m_lpstrToolTipText == NULL) ? -1 : lstrlen(m_lpstrToolTipText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 bool GetToolTipText(LPTSTR lpstrText, int nLength) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 ATLASSERT(lpstrText != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 if(m_lpstrToolTipText == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 errno_t nRet = ATL::Checked::tcsncpy_s(lpstrText, nLength, m_lpstrToolTipText, _TRUNCATE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 return ((nRet == 0) || (nRet == STRUNCATE));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 bool SetToolTipText(LPCTSTR lpstrText)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 if(m_lpstrToolTipText != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 delete [] m_lpstrToolTipText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 m_lpstrToolTipText = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 if(lpstrText == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 if(m_tip.IsWindow())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 m_tip.Activate(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 int cchLen = lstrlen(lpstrText) + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 ATLTRY(m_lpstrToolTipText = new TCHAR[cchLen]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 if(m_lpstrToolTipText == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 ATL::Checked::tcscpy_s(m_lpstrToolTipText, cchLen, lpstrText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 if(m_tip.IsWindow())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 m_tip.Activate(TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 m_tip.AddTool(this->m_hWnd, m_lpstrToolTipText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 bool GetCheck() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 return (m_fChecked == 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 void SetCheck(bool bCheck, bool bUpdate = true)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 m_fChecked = bCheck ? 1 : 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 if(bUpdate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 this->Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 this->UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 // Operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 void SetImages(int nNormal, int nPushed = -1, int nFocusOrHover = -1, int nDisabled = -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 if(nNormal != -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 m_nImage[_nImageNormal] = nNormal;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 if(nPushed != -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 m_nImage[_nImagePushed] = nPushed;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 if(nFocusOrHover != -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 m_nImage[_nImageFocusOrHover] = nFocusOrHover;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 if(nDisabled != -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 m_nImage[_nImageDisabled] = nDisabled;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 BOOL SizeToImage()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 ATLASSERT(::IsWindow(this->m_hWnd) && (m_ImageList.m_hImageList != NULL));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 int cx = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 int cy = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 if(!m_ImageList.GetIconSize(cx, cy))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 return this->ResizeClient(cx, cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 // Overrideables
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 void DoPaint(CDCHandle dc)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 ATLASSERT(m_ImageList.m_hImageList != NULL); // image list must be set
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 ATLASSERT(m_nImage[0] != -1); // main bitmap must be set
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 // set bitmap according to the current button state
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 bool bHover = IsHoverMode();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 bool bPressed = (m_fPressed == 1) || (IsCheckMode() && (m_fChecked == 1));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 int nImage = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 if(!this->IsWindowEnabled())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 nImage = m_nImage[_nImageDisabled];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 else if(bPressed)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 nImage = m_nImage[_nImagePushed];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 else if((!bHover && (m_fFocus == 1)) || (bHover && (m_fMouseOver == 1)))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 nImage = m_nImage[_nImageFocusOrHover];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 // if none is set, use default one
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 if(nImage == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 nImage = m_nImage[_nImageNormal];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 // draw the button image
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 bool bAuto3D = (m_dwExtendedStyle & (BMPBTN_AUTO3D_SINGLE | BMPBTN_AUTO3D_DOUBLE)) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 int xyPos = (bPressed && bAuto3D && (m_nImage[_nImagePushed] == -1)) ? 1 : 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 m_ImageList.Draw(dc, nImage, xyPos, xyPos, ILD_NORMAL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 // draw 3D border if required
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 if(bAuto3D)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 this->GetClientRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 if(bPressed)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 dc.DrawEdge(&rect, ((m_dwExtendedStyle & BMPBTN_AUTO3D_SINGLE) != 0) ? BDR_SUNKENOUTER : EDGE_SUNKEN, BF_RECT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 else if(!bHover || (m_fMouseOver == 1))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 dc.DrawEdge(&rect, ((m_dwExtendedStyle & BMPBTN_AUTO3D_SINGLE) != 0) ? BDR_RAISEDINNER : EDGE_RAISED, BF_RECT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 if(!bHover && (m_fFocus == 1))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 ::InflateRect(&rect, -2 * ::GetSystemMetrics(SM_CXEDGE), -2 * ::GetSystemMetrics(SM_CYEDGE));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 dc.DrawFocusRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 // Message map and handlers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 BEGIN_MSG_MAP(CBitmapButtonImpl)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 MESSAGE_HANDLER(WM_CREATE, OnCreate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 MESSAGE_RANGE_HANDLER(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseMessage)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 MESSAGE_HANDLER(WM_PAINT, OnPaint)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 MESSAGE_HANDLER(WM_SETFOCUS, OnFocus)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 MESSAGE_HANDLER(WM_KILLFOCUS, OnFocus)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 MESSAGE_HANDLER(WM_LBUTTONDBLCLK, OnLButtonDblClk)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 MESSAGE_HANDLER(WM_CAPTURECHANGED, OnCaptureChanged)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 MESSAGE_HANDLER(WM_ENABLE, OnEnable)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 MESSAGE_HANDLER(WM_MOUSELEAVE, OnMouseLeave)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 MESSAGE_HANDLER(WM_KEYUP, OnKeyUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 MESSAGE_HANDLER(WM_TIMER, OnTimer)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 MESSAGE_HANDLER(WM_UPDATEUISTATE, OnUpdateUiState)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 pT->Init();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 if(m_tip.IsWindow())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 m_tip.DestroyWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 m_tip.m_hWnd = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 LRESULT OnMouseMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 MSG msg = { this->m_hWnd, uMsg, wParam, lParam };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 if(m_tip.IsWindow())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 m_tip.RelayEvent(&msg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 return 1; // no background needed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 if(wParam != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 pT->DoPaint((HDC)wParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 CPaintDC dc(this->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 pT->DoPaint(dc.m_hDC);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 LRESULT OnFocus(UINT uMsg, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 m_fFocus = (uMsg == WM_SETFOCUS) ? 1 : 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 this->Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 this->UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388 LRESULT lRet = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 if(IsHoverMode())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 this->SetCapture();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 lRet = this->DefWindowProc(uMsg, wParam, lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 if(::GetCapture() == this->m_hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 m_fPressed = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 this->Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 this->UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 if(((m_dwExtendedStyle & BMPBTN_AUTOFIRE) != 0) && !IsCheckMode())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 int nElapse = 250;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 int nDelay = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 if(::SystemParametersInfo(SPI_GETKEYBOARDDELAY, 0, &nDelay, 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 nElapse += nDelay * 250; // all milli-seconds
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 this->SetTimer(ID_TIMER_FIRST, nElapse);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 LRESULT OnLButtonDblClk(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 LRESULT lRet = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 if(!IsHoverMode() && !IsCheckMode())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 lRet = this->DefWindowProc(uMsg, wParam, lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 if(::GetCapture() != this->m_hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 this->SetCapture();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 if(m_fPressed == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 m_fPressed = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 this->Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 this->UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426 LRESULT OnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 if(((m_dwExtendedStyle & BMPBTN_AUTOCHECK) != 0) && (m_fPressed == 1))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 SetCheck(!GetCheck(), false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431 LRESULT lRet = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432 if(!IsHoverMode() && !IsCheckMode())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 lRet = this->DefWindowProc(uMsg, wParam, lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 if(::GetCapture() == this->m_hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436 if((IsHoverMode() || IsCheckMode()) && (m_fPressed == 1))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 this->GetParent().SendMessage(WM_COMMAND, MAKEWPARAM(this->GetDlgCtrlID(), BN_CLICKED), (LPARAM)this->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 ::ReleaseCapture();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443 LRESULT OnCaptureChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445 if(m_fPressed == 1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447 m_fPressed = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448 this->Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
449 this->UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
450 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 LRESULT OnEnable(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 this->Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458 this->UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463 LRESULT OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 if(::GetCapture() == this->m_hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 POINT ptCursor = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468 this->ClientToScreen(&ptCursor);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470 this->GetWindowRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471 unsigned int uPressed = ::PtInRect(&rect, ptCursor) ? 1 : 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472 if(m_fPressed != uPressed)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 m_fPressed = uPressed;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475 this->Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 this->UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479 else if(IsHoverMode() && m_fMouseOver == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 m_fMouseOver = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
482 this->Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
483 this->UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484 StartTrackMouseLeave();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490 LRESULT OnMouseLeave(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 if(m_fMouseOver == 1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494 m_fMouseOver = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495 this->Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496 this->UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
497 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501 LRESULT OnKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503 if((wParam == VK_SPACE) && IsHoverMode())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504 return 0; // ignore if in hover mode
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505 if((wParam == VK_SPACE) && (m_fPressed == 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507 m_fPressed = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508 this->Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509 this->UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
511 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
512 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
513 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
514
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
515 LRESULT OnKeyUp(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
516 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
517 if((wParam == VK_SPACE) && IsHoverMode())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
518 return 0; // ignore if in hover mode
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
519 if((wParam == VK_SPACE) && (m_fPressed == 1))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
520 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
521 m_fPressed = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
522 if((m_dwExtendedStyle & BMPBTN_AUTOCHECK) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
523 SetCheck(!GetCheck(), false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
524 this->Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
525 this->UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
526 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
527 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
528 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
529 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
530
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
531 LRESULT OnTimer(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
532 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
533 ATLASSERT((m_dwExtendedStyle & BMPBTN_AUTOFIRE) != 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
534 switch(wParam) // timer ID
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
535 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
536 case ID_TIMER_FIRST:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
537 this->KillTimer(ID_TIMER_FIRST);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
538 if(m_fPressed == 1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
539 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
540 this->GetParent().SendMessage(WM_COMMAND, MAKEWPARAM(this->GetDlgCtrlID(), BN_CLICKED), (LPARAM)this->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
541 int nElapse = 250;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
542 int nRepeat = 40;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
543 if(::SystemParametersInfo(SPI_GETKEYBOARDSPEED, 0, &nRepeat, 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
544 nElapse = 10000 / (10 * nRepeat + 25); // milli-seconds, approximated
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
545 this->SetTimer(ID_TIMER_REPEAT, nElapse);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
546 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
547 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
548 case ID_TIMER_REPEAT:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
549 if(m_fPressed == 1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
550 this->GetParent().SendMessage(WM_COMMAND, MAKEWPARAM(this->GetDlgCtrlID(), BN_CLICKED), (LPARAM)this->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
551 else if(::GetCapture() != this->m_hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
552 this->KillTimer(ID_TIMER_REPEAT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
553 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
554 default: // not our timer
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
555 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
556 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
557 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
558 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
559
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
560 LRESULT OnUpdateUiState(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
561 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
562 // If the control is subclassed or superclassed, this message can cause
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
563 // repainting without WM_PAINT. We don't use this state, so just do nothing.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
564 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
565 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
566
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
567 // Implementation
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
568 void Init()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
569 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
570 // We need this style to prevent Windows from painting the button
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
571 this->ModifyStyle(0, BS_OWNERDRAW);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
572
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
573 // create a tool tip
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
574 m_tip.Create(this->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
575 ATLASSERT(m_tip.IsWindow());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
576 if(m_tip.IsWindow() && (m_lpstrToolTipText != NULL))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
577 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
578 m_tip.Activate(TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
579 m_tip.AddTool(this->m_hWnd, m_lpstrToolTipText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
580 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
581
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
582 if((m_ImageList.m_hImageList != NULL) && ((m_dwExtendedStyle & BMPBTN_AUTOSIZE) != 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
583 SizeToImage();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
584 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
585
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
586 BOOL StartTrackMouseLeave()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
587 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
588 TRACKMOUSEEVENT tme = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
589 tme.cbSize = sizeof(tme);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
590 tme.dwFlags = TME_LEAVE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
591 tme.hwndTrack = this->m_hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
592 return ::TrackMouseEvent(&tme);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
593 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
594
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
595 bool IsHoverMode() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
596 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
597 return ((m_dwExtendedStyle & BMPBTN_HOVER) != 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
598 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
599
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
600 bool IsCheckMode() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
601 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
602 return ((m_dwExtendedStyle & (BMPBTN_CHECK | BMPBTN_AUTOCHECK)) != 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
603 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
604 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
605
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
606 class CBitmapButton : public CBitmapButtonImpl<CBitmapButton>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
607 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
608 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
609 DECLARE_WND_SUPERCLASS(_T("WTL_BitmapButton"), GetWndClassName())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
610
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
611 CBitmapButton(DWORD dwExtendedStyle = BMPBTN_AUTOSIZE, HIMAGELIST hImageList = NULL) :
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
612 CBitmapButtonImpl<CBitmapButton>(dwExtendedStyle, hImageList)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
613 { }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
614 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
615
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
616
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
617 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
618 // CCheckListCtrlView - list view control with check boxes
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
619
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
620 template <DWORD t_dwStyle, DWORD t_dwExStyle, DWORD t_dwExListViewStyle>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
621 class CCheckListViewCtrlImplTraits
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
622 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
623 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
624 static DWORD GetWndStyle(DWORD dwStyle)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
625 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
626 return (dwStyle == 0) ? t_dwStyle : dwStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
627 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
628
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
629 static DWORD GetWndExStyle(DWORD dwExStyle)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
630 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
631 return (dwExStyle == 0) ? t_dwExStyle : dwExStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
632 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
633
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
634 static DWORD GetExtendedLVStyle()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
635 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
636 return t_dwExListViewStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
637 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
638 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
639
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
640 typedef CCheckListViewCtrlImplTraits<WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_SHOWSELALWAYS, WS_EX_CLIENTEDGE, LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT> CCheckListViewCtrlTraits;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
641
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
642 template <class T, class TBase = CListViewCtrl, class TWinTraits = CCheckListViewCtrlTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
643 class ATL_NO_VTABLE CCheckListViewCtrlImpl : public ATL::CWindowImpl<T, TBase, TWinTraits >
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
644 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
645 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
646 DECLARE_WND_SUPERCLASS2(NULL, T, TBase::GetWndClassName())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
647
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
648 // Attributes
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
649 static DWORD GetExtendedLVStyle()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
650 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
651 return TWinTraits::GetExtendedLVStyle();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
652 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
653
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
654 // Operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
655 BOOL SubclassWindow(HWND hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
656 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
657 BOOL bRet = ATL::CWindowImpl< T, TBase, TWinTraits >::SubclassWindow(hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
658 if(bRet != FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
659 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
660 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
661 pT->Init();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
662 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
663
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
664 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
665 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
666
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
667 void CheckSelectedItems(int nCurrItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
668 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
669 // first check if this item is selected
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
670 LVITEM lvi = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
671 lvi.iItem = nCurrItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
672 lvi.iSubItem = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
673 lvi.mask = LVIF_STATE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
674 lvi.stateMask = LVIS_SELECTED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
675 this->GetItem(&lvi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
676 // if item is not selected, don't do anything
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
677 if(!(lvi.state & LVIS_SELECTED))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
678 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
679 // new check state will be reverse of the current state,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
680 BOOL bCheck = !this->GetCheckState(nCurrItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
681 int nItem = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
682 int nOldItem = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
683 while((nItem = this->GetNextItem(nOldItem, LVNI_SELECTED)) != -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
684 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
685 if(nItem != nCurrItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
686 this->SetCheckState(nItem, bCheck);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
687 nOldItem = nItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
688 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
689 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
690
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
691 // Implementation
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
692 void Init()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
693 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
694 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
695 (void)pT; // avoid level 4 warning
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
696 ATLASSERT((pT->GetExtendedLVStyle() & LVS_EX_CHECKBOXES) != 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
697 this->SetExtendedListViewStyle(pT->GetExtendedLVStyle());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
698 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
699
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
700 // Message map and handlers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
701 BEGIN_MSG_MAP(CCheckListViewCtrlImpl)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
702 MESSAGE_HANDLER(WM_CREATE, OnCreate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
703 MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
704 MESSAGE_HANDLER(WM_LBUTTONDBLCLK, OnLButtonDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
705 MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
706 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
707
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
708 LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
709 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
710 // first let list view control initialize everything
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
711 LRESULT lRet = this->DefWindowProc(uMsg, wParam, lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
712 if(lRet == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
713 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
714 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
715 pT->Init();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
716 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
717
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
718 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
719 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
720
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
721 LRESULT OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
722 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
723 POINT ptMsg = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
724 LVHITTESTINFO lvh = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
725 lvh.pt = ptMsg;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
726 if((this->HitTest(&lvh) != -1) && (lvh.flags == LVHT_ONITEMSTATEICON) && (::GetKeyState(VK_CONTROL) >= 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
727 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
728 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
729 pT->CheckSelectedItems(lvh.iItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
730 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
731 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
732 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
733 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
734
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
735 LRESULT OnKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
736 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
737 if(wParam == VK_SPACE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
738 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
739 int nCurrItem = this->GetNextItem(-1, LVNI_FOCUSED);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
740 if((nCurrItem != -1) && (::GetKeyState(VK_CONTROL) >= 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
741 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
742 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
743 pT->CheckSelectedItems(nCurrItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
744 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
745 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
746 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
747 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
748 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
749 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
750
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
751 class CCheckListViewCtrl : public CCheckListViewCtrlImpl<CCheckListViewCtrl>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
752 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
753 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
754 DECLARE_WND_SUPERCLASS(_T("WTL_CheckListView"), GetWndClassName())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
755 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
756
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
757
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
758 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
759 // CHyperLink - hyper link control implementation
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
760
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
761 #define HLINK_UNDERLINED 0x00000000
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
762 #define HLINK_NOTUNDERLINED 0x00000001
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
763 #define HLINK_UNDERLINEHOVER 0x00000002
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
764 #define HLINK_COMMANDBUTTON 0x00000004
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
765 #define HLINK_NOTIFYBUTTON 0x0000000C
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
766 #define HLINK_USETAGS 0x00000010
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
767 #define HLINK_USETAGSBOLD 0x00000030
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
768 #define HLINK_NOTOOLTIP 0x00000040
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
769 #define HLINK_AUTOCREATELINKFONT 0x00000080
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
770 #define HLINK_SINGLELINE 0x00000100
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
771
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
772 // Notes:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
773 // - HLINK_USETAGS and HLINK_USETAGSBOLD are always left-aligned
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
774 // - When HLINK_USETAGSBOLD is used, the underlined styles will be ignored
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
775
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
776 template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
777 class ATL_NO_VTABLE CHyperLinkImpl : public ATL::CWindowImpl< T, TBase, TWinTraits >
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
778 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
779 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
780 LPTSTR m_lpstrLabel;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
781 LPTSTR m_lpstrHyperLink;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
782
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
783 HCURSOR m_hCursor;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
784 HFONT m_hFontLink;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
785 HFONT m_hFontNormal;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
786
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
787 RECT m_rcLink;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
788 CToolTipCtrl m_tip;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
789
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
790 COLORREF m_clrLink;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
791 COLORREF m_clrVisited;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
792
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
793 DWORD m_dwExtendedStyle; // Hyper Link specific extended styles
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
794
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
795 bool m_bPaintLabel:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
796 bool m_bVisited:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
797 bool m_bHover:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
798 bool m_bInternalLinkFont:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
799 bool m_bInternalNormalFont:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
800
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
801
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
802 // Constructor/Destructor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
803 CHyperLinkImpl(DWORD dwExtendedStyle = HLINK_UNDERLINED) :
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
804 m_lpstrLabel(NULL), m_lpstrHyperLink(NULL),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
805 m_hCursor(NULL), m_hFontLink(NULL), m_hFontNormal(NULL),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
806 m_clrLink(RGB(0, 0, 255)), m_clrVisited(RGB(128, 0, 128)),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
807 m_dwExtendedStyle(dwExtendedStyle),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
808 m_bPaintLabel(true), m_bVisited(false),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
809 m_bHover(false), m_bInternalLinkFont(false), m_bInternalNormalFont(false)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
810 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
811 ::SetRectEmpty(&m_rcLink);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
812 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
813
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
814 ~CHyperLinkImpl()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
815 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
816 delete [] m_lpstrLabel;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
817 delete [] m_lpstrHyperLink;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
818 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
819
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
820 // Attributes
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
821 DWORD GetHyperLinkExtendedStyle() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
822 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
823 return m_dwExtendedStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
824 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
825
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
826 DWORD SetHyperLinkExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
827 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
828 DWORD dwPrevStyle = m_dwExtendedStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
829 if(dwMask == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
830 m_dwExtendedStyle = dwExtendedStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
831 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
832 m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
833 return dwPrevStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
834 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
835
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
836 bool GetLabel(LPTSTR lpstrBuffer, int nLength) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
837 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
838 if(m_lpstrLabel == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
839 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
840 ATLASSERT(lpstrBuffer != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
841 if(nLength <= lstrlen(m_lpstrLabel))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
842 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
843
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
844 ATL::Checked::tcscpy_s(lpstrBuffer, nLength, m_lpstrLabel);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
845
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
846 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
847 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
848
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
849 bool SetLabel(LPCTSTR lpstrLabel)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
850 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
851 delete [] m_lpstrLabel;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
852 m_lpstrLabel = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
853 int cchLen = lstrlen(lpstrLabel) + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
854 ATLTRY(m_lpstrLabel = new TCHAR[cchLen]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
855 if(m_lpstrLabel == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
856 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
857
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
858 ATL::Checked::tcscpy_s(m_lpstrLabel, cchLen, lpstrLabel);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
859 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
860 pT->CalcLabelRect();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
861
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
862 if(this->m_hWnd != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
863 this->SetWindowText(lpstrLabel); // Set this for accessibility
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
864
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
865 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
866 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
867
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
868 bool GetHyperLink(LPTSTR lpstrBuffer, int nLength) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
869 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
870 if(m_lpstrHyperLink == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
871 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
872 ATLASSERT(lpstrBuffer != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
873 if(nLength <= lstrlen(m_lpstrHyperLink))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
874 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
875
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
876 ATL::Checked::tcscpy_s(lpstrBuffer, nLength, m_lpstrHyperLink);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
877
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
878 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
879 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
880
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
881 bool SetHyperLink(LPCTSTR lpstrLink)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
882 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
883 delete [] m_lpstrHyperLink;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
884 m_lpstrHyperLink = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
885 int cchLen = lstrlen(lpstrLink) + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
886 ATLTRY(m_lpstrHyperLink = new TCHAR[cchLen]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
887 if(m_lpstrHyperLink == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
888 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
889
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
890 ATL::Checked::tcscpy_s(m_lpstrHyperLink, cchLen, lpstrLink);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
891 if(m_lpstrLabel == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
892 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
893 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
894 pT->CalcLabelRect();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
895 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
896
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
897 if(m_tip.IsWindow())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
898 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
899 m_tip.Activate(TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
900 m_tip.AddTool(this->m_hWnd, m_lpstrHyperLink, &m_rcLink, 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
901 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
902
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
903 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
904 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
905
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
906 HFONT GetLinkFont() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
907 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
908 return m_hFontLink;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
909 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
910
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
911 void SetLinkFont(HFONT hFont)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
912 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
913 if(m_bInternalLinkFont)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
914 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
915 ::DeleteObject(m_hFontLink);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
916 m_bInternalLinkFont = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
917 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
918
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
919 m_hFontLink = hFont;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
920
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
921 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
922 pT->CalcLabelRect();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
923 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
924
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
925 int GetIdealHeight() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
926 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
927 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
928 if((m_lpstrLabel == NULL) && (m_lpstrHyperLink == NULL))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
929 return -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
930 if(!m_bPaintLabel)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
931 return -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
932
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
933 UINT uFormat = IsSingleLine() ? DT_SINGLELINE : DT_WORDBREAK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
934
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
935 CClientDC dc(this->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
936 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
937 this->GetClientRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
938 HFONT hFontOld = dc.SelectFont(m_hFontNormal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
939 RECT rcText = rect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
940 dc.DrawText(_T("NS"), -1, &rcText, DT_LEFT | uFormat | DT_CALCRECT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
941 dc.SelectFont(m_hFontLink);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
942 RECT rcLink = rect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
943 dc.DrawText(_T("NS"), -1, &rcLink, DT_LEFT | uFormat | DT_CALCRECT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
944 dc.SelectFont(hFontOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
945 return __max(rcText.bottom - rcText.top, rcLink.bottom - rcLink.top);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
946 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
947
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
948 bool GetIdealSize(SIZE& size) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
949 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
950 int cx = 0, cy = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
951 bool bRet = GetIdealSize(cx, cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
952 if(bRet)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
953 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
954 size.cx = cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
955 size.cy = cy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
956 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
957 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
958 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
959
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
960 bool GetIdealSize(int& cx, int& cy) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
961 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
962 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
963 if((m_lpstrLabel == NULL) && (m_lpstrHyperLink == NULL))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
964 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
965 if(!m_bPaintLabel)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
966 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
967
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
968 CClientDC dc(this->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
969 RECT rcClient = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
970 this->GetClientRect(&rcClient);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
971 RECT rcAll = rcClient;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
972
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
973 if(IsUsingTags())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
974 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
975 // find tags and label parts
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
976 LPTSTR lpstrLeft = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
977 int cchLeft = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
978 LPTSTR lpstrLink = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
979 int cchLink = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
980 LPTSTR lpstrRight = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
981 int cchRight = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
982
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
983 const T* pT = static_cast<const T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
984 pT->CalcLabelParts(lpstrLeft, cchLeft, lpstrLink, cchLink, lpstrRight, cchRight);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
985
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
986 // get label part rects
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
987 UINT uFormat = IsSingleLine() ? DT_SINGLELINE : DT_WORDBREAK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
988
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
989 HFONT hFontOld = dc.SelectFont(m_hFontNormal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
990 RECT rcLeft = rcClient;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
991 dc.DrawText(lpstrLeft, cchLeft, &rcLeft, DT_LEFT | uFormat | DT_CALCRECT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
992
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
993 dc.SelectFont(m_hFontLink);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
994 RECT rcLink = { rcLeft.right, rcLeft.top, rcClient.right, rcClient.bottom };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
995 dc.DrawText(lpstrLink, cchLink, &rcLink, DT_LEFT | uFormat | DT_CALCRECT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
996
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
997 dc.SelectFont(m_hFontNormal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
998 RECT rcRight = { rcLink.right, rcLink.top, rcClient.right, rcClient.bottom };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
999 dc.DrawText(lpstrRight, cchRight, &rcRight, DT_LEFT | uFormat | DT_CALCRECT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1000
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1001 dc.SelectFont(hFontOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1002
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1003 int cyMax = __max(rcLeft.bottom, __max(rcLink.bottom, rcRight.bottom));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1004 ::SetRect(&rcAll, rcLeft.left, rcLeft.top, rcRight.right, cyMax);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1005 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1006 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1007 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1008 HFONT hOldFont = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1009 if(m_hFontLink != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1010 hOldFont = dc.SelectFont(m_hFontLink);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1011 LPTSTR lpstrText = (m_lpstrLabel != NULL) ? m_lpstrLabel : m_lpstrHyperLink;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1012 DWORD dwStyle = this->GetStyle();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1013 UINT uFormat = DT_LEFT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1014 if (dwStyle & SS_CENTER)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1015 uFormat = DT_CENTER;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1016 else if (dwStyle & SS_RIGHT)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1017 uFormat = DT_RIGHT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1018 uFormat |= IsSingleLine() ? DT_SINGLELINE : DT_WORDBREAK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1019 dc.DrawText(lpstrText, -1, &rcAll, uFormat | DT_CALCRECT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1020 if(m_hFontLink != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1021 dc.SelectFont(hOldFont);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1022 if (dwStyle & SS_CENTER)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1023 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1024 int dx = (rcClient.right - rcAll.right) / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1025 ::OffsetRect(&rcAll, dx, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1026 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1027 else if (dwStyle & SS_RIGHT)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1028 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1029 int dx = rcClient.right - rcAll.right;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1030 ::OffsetRect(&rcAll, dx, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1031 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1032 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1033
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1034 cx = rcAll.right - rcAll.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1035 cy = rcAll.bottom - rcAll.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1036
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1037 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1038 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1039
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1040 // for command buttons only
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1041 bool GetToolTipText(LPTSTR lpstrBuffer, int nLength) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1042 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1043 ATLASSERT(IsCommandButton());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1044 return GetHyperLink(lpstrBuffer, nLength);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1045 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1046
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1047 bool SetToolTipText(LPCTSTR lpstrToolTipText)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1048 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1049 ATLASSERT(IsCommandButton());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1050 return SetHyperLink(lpstrToolTipText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1051 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1052
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1053 // Operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1054 BOOL SubclassWindow(HWND hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1055 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1056 ATLASSERT(this->m_hWnd == NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1057 ATLASSERT(::IsWindow(hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1058 if(m_hFontNormal == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1059 m_hFontNormal = (HFONT)::SendMessage(hWnd, WM_GETFONT, 0, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1060
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1061 BOOL bRet = ATL::CWindowImpl< T, TBase, TWinTraits >::SubclassWindow(hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1062 if(bRet != FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1063 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1064 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1065 pT->Init();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1066 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1067
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1068 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1069 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1070
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1071 bool Navigate()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1072 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1073 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1074 bool bRet = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1075 if(IsNotifyButton())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1076 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1077 NMHDR nmhdr = { this->m_hWnd, (UINT_PTR)this->GetDlgCtrlID(), NM_CLICK };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1078 this->GetParent().SendMessage(WM_NOTIFY, this->GetDlgCtrlID(), (LPARAM)&nmhdr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1079 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1080 else if(IsCommandButton())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1081 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1082 this->GetParent().SendMessage(WM_COMMAND, MAKEWPARAM(this->GetDlgCtrlID(), BN_CLICKED), (LPARAM)this->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1083 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1084 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1085 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1086 ATLASSERT(m_lpstrHyperLink != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1087 DWORD_PTR dwRet = (DWORD_PTR)::ShellExecute(0, _T("open"), m_lpstrHyperLink, 0, 0, SW_SHOWNORMAL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1088 bRet = (dwRet > 32);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1089 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1090 if(bRet)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1091 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1092 m_bVisited = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1093 this->Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1094 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1095 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1096 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1097 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1098
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1099 void CreateLinkFontFromNormal()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1100 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1101 if(m_bInternalLinkFont)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1102 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1103 ::DeleteObject(m_hFontLink);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1104 m_bInternalLinkFont = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1105 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1106
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1107 CFontHandle font = (m_hFontNormal != NULL) ? m_hFontNormal : (HFONT)::GetStockObject(SYSTEM_FONT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1108 LOGFONT lf = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1109 font.GetLogFont(&lf);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1110
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1111 if(IsUsingTagsBold())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1112 lf.lfWeight = FW_BOLD;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1113 else if(!IsNotUnderlined())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1114 lf.lfUnderline = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1115
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1116 m_hFontLink = ::CreateFontIndirect(&lf);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1117 m_bInternalLinkFont = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1118 ATLASSERT(m_hFontLink != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1119 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1120
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1121 // Message map and handlers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1122 BEGIN_MSG_MAP(CHyperLinkImpl)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1123 MESSAGE_HANDLER(WM_CREATE, OnCreate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1124 MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1125 MESSAGE_RANGE_HANDLER(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseMessage)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1126 MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1127 MESSAGE_HANDLER(WM_PAINT, OnPaint)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1128 MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1129 MESSAGE_HANDLER(WM_SETFOCUS, OnFocus)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1130 MESSAGE_HANDLER(WM_KILLFOCUS, OnFocus)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1131 MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1132 MESSAGE_HANDLER(WM_MOUSELEAVE, OnMouseLeave)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1133 MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1134 MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1135 MESSAGE_HANDLER(WM_CHAR, OnChar)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1136 MESSAGE_HANDLER(WM_GETDLGCODE, OnGetDlgCode)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1137 MESSAGE_HANDLER(WM_SETCURSOR, OnSetCursor)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1138 MESSAGE_HANDLER(WM_ENABLE, OnEnable)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1139 MESSAGE_HANDLER(WM_GETFONT, OnGetFont)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1140 MESSAGE_HANDLER(WM_SETFONT, OnSetFont)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1141 MESSAGE_HANDLER(WM_UPDATEUISTATE, OnUpdateUiState)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1142 MESSAGE_HANDLER(WM_SIZE, OnSize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1143 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1144
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1145 LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1146 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1147 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1148 pT->Init();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1149 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1150 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1151
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1152 LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1153 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1154 if(m_tip.IsWindow())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1155 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1156 m_tip.DestroyWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1157 m_tip.m_hWnd = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1158 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1159
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1160 if(m_bInternalLinkFont)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1161 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1162 ::DeleteObject(m_hFontLink);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1163 m_hFontLink = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1164 m_bInternalLinkFont = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1165 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1166
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1167 if(m_bInternalNormalFont)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1168 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1169 ::DeleteObject(m_hFontNormal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1170 m_hFontNormal = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1171 m_bInternalNormalFont = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1172 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1173
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1174 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1175 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1176 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1177
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1178 LRESULT OnMouseMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1179 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1180 MSG msg = { this->m_hWnd, uMsg, wParam, lParam };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1181 if(m_tip.IsWindow() && IsUsingToolTip())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1182 m_tip.RelayEvent(&msg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1183 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1184 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1185 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1186
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1187 LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1188 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1189 return 1; // no background painting needed (we do it all during WM_PAINT)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1190 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1191
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1192 LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1193 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1194 if(!m_bPaintLabel)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1195 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1196 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1197 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1198 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1199
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1200 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1201 if(wParam != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1202 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1203 pT->DoEraseBackground((HDC)wParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1204 pT->DoPaint((HDC)wParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1205 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1206 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1207 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1208 CPaintDC dc(this->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1209 pT->DoEraseBackground(dc.m_hDC);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1210 pT->DoPaint(dc.m_hDC);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1211 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1212
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1213 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1214 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1215
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1216 LRESULT OnFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1217 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1218 if(m_bPaintLabel)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1219 this->Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1220 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1221 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1222 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1223 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1224
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1225 LRESULT OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1226 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1227 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1228 if(((m_lpstrHyperLink != NULL) || IsCommandButton()) && ::PtInRect(&m_rcLink, pt))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1229 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1230 ::SetCursor(m_hCursor);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1231 if(IsUnderlineHover())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1232 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1233 if(!m_bHover)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1234 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1235 m_bHover = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1236 this->InvalidateRect(&m_rcLink);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1237 this->UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1238 StartTrackMouseLeave();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1239 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1240 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1241 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1242 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1243 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1244 if(IsUnderlineHover())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1245 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1246 if(m_bHover)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1247 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1248 m_bHover = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1249 this->InvalidateRect(&m_rcLink);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1250 this->UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1251 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1252 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1253 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1254 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1255 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1256 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1257
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1258 LRESULT OnMouseLeave(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1259 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1260 if(IsUnderlineHover() && m_bHover)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1261 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1262 m_bHover = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1263 this->InvalidateRect(&m_rcLink);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1264 this->UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1265 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1266 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1267 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1268
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1269 LRESULT OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1270 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1271 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1272 if(::PtInRect(&m_rcLink, pt))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1273 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1274 this->SetFocus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1275 this->SetCapture();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1276 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1277 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1278 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1279
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1280 LRESULT OnLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1281 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1282 if(GetCapture() == this->m_hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1283 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1284 ReleaseCapture();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1285 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1286 if(::PtInRect(&m_rcLink, pt))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1287 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1288 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1289 pT->Navigate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1290 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1291 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1292 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1293 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1294
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1295 LRESULT OnChar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1296 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1297 if((wParam == VK_RETURN) || (wParam == VK_SPACE))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1298 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1299 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1300 pT->Navigate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1301 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1302 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1303 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1304
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1305 LRESULT OnGetDlgCode(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1306 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1307 return DLGC_WANTCHARS;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1308 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1309
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1310 LRESULT OnSetCursor(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1311 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1312 POINT pt = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1313 GetCursorPos(&pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1314 this->ScreenToClient(&pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1315 if(((m_lpstrHyperLink != NULL) || IsCommandButton()) && ::PtInRect(&m_rcLink, pt))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1316 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1317 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1318 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1319 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1320 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1321 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1322
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1323 LRESULT OnEnable(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1324 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1325 this->Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1326 this->UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1327 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1328 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1329
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1330 LRESULT OnGetFont(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1331 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1332 return (LRESULT)m_hFontNormal;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1333 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1334
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1335 LRESULT OnSetFont(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1336 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1337 if(m_bInternalNormalFont)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1338 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1339 ::DeleteObject(m_hFontNormal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1340 m_bInternalNormalFont = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1341 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1342
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1343 bool bCreateLinkFont = m_bInternalLinkFont;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1344
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1345 m_hFontNormal = (HFONT)wParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1346
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1347 if(bCreateLinkFont || IsAutoCreateLinkFont())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1348 CreateLinkFontFromNormal();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1349
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1350 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1351 pT->CalcLabelRect();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1352
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1353 if((BOOL)lParam)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1354 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1355 this->Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1356 this->UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1357 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1358
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1359 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1360 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1361
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1362 LRESULT OnUpdateUiState(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1363 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1364 // If the control is subclassed or superclassed, this message can cause
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1365 // repainting without WM_PAINT. We don't use this state, so just do nothing.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1366 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1367 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1368
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1369 LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1370 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1371 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1372 pT->CalcLabelRect();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1373 pT->Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1374 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1375 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1376
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1377 // Implementation
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1378 void Init()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1379 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1380 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1381
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1382 // Check if we should paint a label
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1383 const int cchBuff = 8;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1384 TCHAR szBuffer[cchBuff] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1385 if(::GetClassName(this->m_hWnd, szBuffer, cchBuff))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1386 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1387 if(lstrcmpi(szBuffer, _T("static")) == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1388 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1389 this->ModifyStyle(0, SS_NOTIFY); // we need this
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1390 DWORD dwStyle = this->GetStyle() & 0x000000FF;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1391 if((dwStyle == SS_ICON) || (dwStyle == SS_BLACKRECT) || (dwStyle == SS_GRAYRECT) ||
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1392 (dwStyle == SS_WHITERECT) || (dwStyle == SS_BLACKFRAME) || (dwStyle == SS_GRAYFRAME) ||
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1393 (dwStyle == SS_WHITEFRAME) || (dwStyle == SS_OWNERDRAW) ||
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1394 (dwStyle == SS_BITMAP) || (dwStyle == SS_ENHMETAFILE))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1395 m_bPaintLabel = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1396 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1397 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1398
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1399 // create or load a cursor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1400 m_hCursor = ::LoadCursor(NULL, IDC_HAND);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1401 ATLASSERT(m_hCursor != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1402
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1403 // set fonts
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1404 if(m_bPaintLabel)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1405 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1406 if(m_hFontNormal == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1407 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1408 m_hFontNormal = AtlCreateControlFont();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1409 m_bInternalNormalFont = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1410 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1411
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1412 if(m_hFontLink == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1413 CreateLinkFontFromNormal();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1414 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1415
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1416 // create a tool tip
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1417 m_tip.Create(this->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1418 ATLASSERT(m_tip.IsWindow());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1419
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1420 // set label (defaults to window text)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1421 if(m_lpstrLabel == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1422 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1423 int nLen = this->GetWindowTextLength();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1424 if(nLen > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1425 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1426 ATLTRY(m_lpstrLabel = new TCHAR[nLen + 1]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1427 if(m_lpstrLabel != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1428 ATLVERIFY(this->GetWindowText(m_lpstrLabel, nLen + 1) > 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1429 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1430 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1431
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1432 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1433 pT->CalcLabelRect();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1434
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1435 // set hyperlink (defaults to label), or just activate tool tip if already set
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1436 if((m_lpstrHyperLink == NULL) && !IsCommandButton())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1437 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1438 if(m_lpstrLabel != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1439 SetHyperLink(m_lpstrLabel);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1440 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1441 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1442 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1443 m_tip.Activate(TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1444 m_tip.AddTool(this->m_hWnd, m_lpstrHyperLink, &m_rcLink, 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1445 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1446
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1447 // set link colors
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1448 if(m_bPaintLabel)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1449 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1450 ATL::CRegKey rk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1451 LONG lRet = rk.Open(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Internet Explorer\\Settings"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1452 if(lRet == ERROR_SUCCESS)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1453 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1454 const int cchValue = 12;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1455 TCHAR szValue[cchValue] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1456 ULONG ulCount = cchValue;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1457 lRet = rk.QueryStringValue(_T("Anchor Color"), szValue, &ulCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1458 if(lRet == ERROR_SUCCESS)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1459 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1460 COLORREF clr = pT->_ParseColorString(szValue);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1461 ATLASSERT(clr != CLR_INVALID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1462 if(clr != CLR_INVALID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1463 m_clrLink = clr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1464 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1465
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1466 ulCount = cchValue;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1467 lRet = rk.QueryStringValue(_T("Anchor Color Visited"), szValue, &ulCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1468 if(lRet == ERROR_SUCCESS)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1469 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1470 COLORREF clr = pT->_ParseColorString(szValue);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1471 ATLASSERT(clr != CLR_INVALID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1472 if(clr != CLR_INVALID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1473 m_clrVisited = clr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1474 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1475 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1476 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1477 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1478
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1479 static COLORREF _ParseColorString(LPTSTR lpstr)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1480 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1481 int c[3] = { -1, -1, -1 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1482 LPTSTR p = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1483 for(int i = 0; i < 2; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1484 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1485 for(p = lpstr; *p != _T('\0'); p = ::CharNext(p))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1486 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1487 if(*p == _T(','))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1488 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1489 *p = _T('\0');
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1490 c[i] = _ttoi(lpstr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1491 lpstr = &p[1];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1492 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1493 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1494 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1495 if(c[i] == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1496 return CLR_INVALID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1497 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1498 if(*lpstr == _T('\0'))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1499 return CLR_INVALID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1500 c[2] = _ttoi(lpstr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1501
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1502 return RGB(c[0], c[1], c[2]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1503 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1504
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1505 bool CalcLabelRect()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1506 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1507 if(!::IsWindow(this->m_hWnd))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1508 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1509 if((m_lpstrLabel == NULL) && (m_lpstrHyperLink == NULL))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1510 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1511
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1512 CClientDC dc(this->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1513 RECT rcClient = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1514 this->GetClientRect(&rcClient);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1515 m_rcLink = rcClient;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1516 if(!m_bPaintLabel)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1517 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1518
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1519 if(IsUsingTags())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1520 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1521 // find tags and label parts
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1522 LPTSTR lpstrLeft = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1523 int cchLeft = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1524 LPTSTR lpstrLink = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1525 int cchLink = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1526 LPTSTR lpstrRight = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1527 int cchRight = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1528
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1529 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1530 pT->CalcLabelParts(lpstrLeft, cchLeft, lpstrLink, cchLink, lpstrRight, cchRight);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1531 ATLASSERT(lpstrLink != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1532 ATLASSERT(cchLink > 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1533
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1534 // get label part rects
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1535 HFONT hFontOld = dc.SelectFont(m_hFontNormal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1536
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1537 UINT uFormat = IsSingleLine() ? DT_SINGLELINE : DT_WORDBREAK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1538
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1539 RECT rcLeft = rcClient;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1540 if(lpstrLeft != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1541 dc.DrawText(lpstrLeft, cchLeft, &rcLeft, DT_LEFT | uFormat | DT_CALCRECT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1542
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1543 dc.SelectFont(m_hFontLink);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1544 RECT rcLink = rcClient;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1545 if(lpstrLeft != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1546 rcLink.left = rcLeft.right;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1547 dc.DrawText(lpstrLink, cchLink, &rcLink, DT_LEFT | uFormat | DT_CALCRECT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1548
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1549 dc.SelectFont(hFontOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1550
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1551 m_rcLink = rcLink;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1552 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1553 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1554 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1555 HFONT hOldFont = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1556 if(m_hFontLink != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1557 hOldFont = dc.SelectFont(m_hFontLink);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1558 LPTSTR lpstrText = (m_lpstrLabel != NULL) ? m_lpstrLabel : m_lpstrHyperLink;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1559 DWORD dwStyle = this->GetStyle();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1560 UINT uFormat = DT_LEFT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1561 if (dwStyle & SS_CENTER)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1562 uFormat = DT_CENTER;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1563 else if (dwStyle & SS_RIGHT)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1564 uFormat = DT_RIGHT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1565 uFormat |= IsSingleLine() ? DT_SINGLELINE : DT_WORDBREAK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1566 dc.DrawText(lpstrText, -1, &m_rcLink, uFormat | DT_CALCRECT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1567 if(m_hFontLink != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1568 dc.SelectFont(hOldFont);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1569 if (dwStyle & SS_CENTER)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1570 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1571 int dx = (rcClient.right - m_rcLink.right) / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1572 ::OffsetRect(&m_rcLink, dx, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1573 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1574 else if (dwStyle & SS_RIGHT)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1575 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1576 int dx = rcClient.right - m_rcLink.right;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1577 ::OffsetRect(&m_rcLink, dx, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1578 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1579 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1580
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1581 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1582 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1583
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1584 void CalcLabelParts(LPTSTR& lpstrLeft, int& cchLeft, LPTSTR& lpstrLink, int& cchLink, LPTSTR& lpstrRight, int& cchRight) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1585 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1586 lpstrLeft = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1587 cchLeft = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1588 lpstrLink = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1589 cchLink = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1590 lpstrRight = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1591 cchRight = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1592
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1593 LPTSTR lpstrText = (m_lpstrLabel != NULL) ? m_lpstrLabel : m_lpstrHyperLink;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1594 int cchText = lstrlen(lpstrText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1595 bool bOutsideLink = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1596 for(int i = 0; i < cchText; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1597 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1598 if(lpstrText[i] != _T('<'))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1599 continue;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1600
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1601 if(bOutsideLink)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1602 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1603 if(::CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, &lpstrText[i], 3, _T("<A>"), 3) == CSTR_EQUAL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1604 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1605 if(i > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1606 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1607 lpstrLeft = lpstrText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1608 cchLeft = i;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1609 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1610 lpstrLink = &lpstrText[i + 3];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1611 bOutsideLink = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1612 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1613 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1614 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1615 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1616 if(::CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, &lpstrText[i], 4, _T("</A>"), 4) == CSTR_EQUAL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1617 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1618 cchLink = i - 3 - cchLeft;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1619 if(lpstrText[i + 4] != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1620 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1621 lpstrRight = &lpstrText[i + 4];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1622 cchRight = cchText - (i + 4);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1623 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1624 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1625 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1626 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1627 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1628
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1629 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1630
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1631 void DoEraseBackground(CDCHandle dc)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1632 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1633 HBRUSH hBrush = (HBRUSH)this->GetParent().SendMessage(WM_CTLCOLORSTATIC, (WPARAM)dc.m_hDC, (LPARAM)this->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1634 if(hBrush != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1635 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1636 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1637 this->GetClientRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1638 dc.FillRect(&rect, hBrush);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1639 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1640 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1641
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1642 void DoPaint(CDCHandle dc)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1643 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1644 if(IsUsingTags())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1645 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1646 // find tags and label parts
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1647 LPTSTR lpstrLeft = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1648 int cchLeft = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1649 LPTSTR lpstrLink = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1650 int cchLink = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1651 LPTSTR lpstrRight = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1652 int cchRight = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1653
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1654 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1655 pT->CalcLabelParts(lpstrLeft, cchLeft, lpstrLink, cchLink, lpstrRight, cchRight);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1656
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1657 // get label part rects
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1658 RECT rcClient = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1659 this->GetClientRect(&rcClient);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1660
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1661 dc.SetBkMode(TRANSPARENT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1662 HFONT hFontOld = dc.SelectFont(m_hFontNormal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1663
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1664 UINT uFormat = IsSingleLine() ? DT_SINGLELINE : DT_WORDBREAK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1665
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1666 if(lpstrLeft != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1667 dc.DrawText(lpstrLeft, cchLeft, &rcClient, DT_LEFT | uFormat);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1668
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1669 COLORREF clrOld = dc.SetTextColor(this->IsWindowEnabled() ? (m_bVisited ? m_clrVisited : m_clrLink) : (::GetSysColor(COLOR_GRAYTEXT)));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1670 if((m_hFontLink != NULL) && (!IsUnderlineHover() || (IsUnderlineHover() && m_bHover)))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1671 dc.SelectFont(m_hFontLink);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1672 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1673 dc.SelectFont(m_hFontNormal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1674
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1675 dc.DrawText(lpstrLink, cchLink, &m_rcLink, DT_LEFT | uFormat);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1676
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1677 dc.SetTextColor(clrOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1678 dc.SelectFont(m_hFontNormal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1679 if(lpstrRight != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1680 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1681 RECT rcRight = { m_rcLink.right, m_rcLink.top, rcClient.right, rcClient.bottom };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1682 dc.DrawText(lpstrRight, cchRight, &rcRight, DT_LEFT | uFormat);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1683 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1684
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1685 if(GetFocus() == this->m_hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1686 dc.DrawFocusRect(&m_rcLink);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1687
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1688 dc.SelectFont(hFontOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1689 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1690 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1691 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1692 dc.SetBkMode(TRANSPARENT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1693 COLORREF clrOld = dc.SetTextColor(this->IsWindowEnabled() ? (m_bVisited ? m_clrVisited : m_clrLink) : (::GetSysColor(COLOR_GRAYTEXT)));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1694
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1695 HFONT hFontOld = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1696 if((m_hFontLink != NULL) && (!IsUnderlineHover() || (IsUnderlineHover() && m_bHover)))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1697 hFontOld = dc.SelectFont(m_hFontLink);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1698 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1699 hFontOld = dc.SelectFont(m_hFontNormal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1700
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1701 LPTSTR lpstrText = (m_lpstrLabel != NULL) ? m_lpstrLabel : m_lpstrHyperLink;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1702
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1703 DWORD dwStyle = this->GetStyle();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1704 UINT uFormat = DT_LEFT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1705 if (dwStyle & SS_CENTER)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1706 uFormat = DT_CENTER;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1707 else if (dwStyle & SS_RIGHT)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1708 uFormat = DT_RIGHT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1709 uFormat |= IsSingleLine() ? DT_SINGLELINE : DT_WORDBREAK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1710
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1711 dc.DrawText(lpstrText, -1, &m_rcLink, uFormat);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1712
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1713 if(GetFocus() == this->m_hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1714 dc.DrawFocusRect(&m_rcLink);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1715
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1716 dc.SetTextColor(clrOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1717 dc.SelectFont(hFontOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1718 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1719 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1720
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1721 BOOL StartTrackMouseLeave()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1722 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1723 TRACKMOUSEEVENT tme = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1724 tme.cbSize = sizeof(tme);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1725 tme.dwFlags = TME_LEAVE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1726 tme.hwndTrack = this->m_hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1727 return ::TrackMouseEvent(&tme);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1728 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1729
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1730 // Implementation helpers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1731 bool IsUnderlined() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1732 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1733 return ((m_dwExtendedStyle & (HLINK_NOTUNDERLINED | HLINK_UNDERLINEHOVER)) == 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1734 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1735
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1736 bool IsNotUnderlined() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1737 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1738 return ((m_dwExtendedStyle & HLINK_NOTUNDERLINED) != 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1739 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1740
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1741 bool IsUnderlineHover() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1742 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1743 return ((m_dwExtendedStyle & HLINK_UNDERLINEHOVER) != 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1744 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1745
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1746 bool IsCommandButton() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1747 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1748 return ((m_dwExtendedStyle & HLINK_COMMANDBUTTON) != 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1749 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1750
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1751 bool IsNotifyButton() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1752 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1753 return ((m_dwExtendedStyle & HLINK_NOTIFYBUTTON) == HLINK_NOTIFYBUTTON);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1754 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1755
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1756 bool IsUsingTags() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1757 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1758 return ((m_dwExtendedStyle & HLINK_USETAGS) != 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1759 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1760
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1761 bool IsUsingTagsBold() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1762 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1763 return ((m_dwExtendedStyle & HLINK_USETAGSBOLD) == HLINK_USETAGSBOLD);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1764 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1765
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1766 bool IsUsingToolTip() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1767 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1768 return ((m_dwExtendedStyle & HLINK_NOTOOLTIP) == 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1769 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1770
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1771 bool IsAutoCreateLinkFont() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1772 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1773 return ((m_dwExtendedStyle & HLINK_AUTOCREATELINKFONT) == HLINK_AUTOCREATELINKFONT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1774 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1775
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1776 bool IsSingleLine() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1777 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1778 return ((m_dwExtendedStyle & HLINK_SINGLELINE) == HLINK_SINGLELINE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1779 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1780 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1781
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1782 class CHyperLink : public CHyperLinkImpl<CHyperLink>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1783 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1784 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1785 DECLARE_WND_CLASS(_T("WTL_HyperLink"))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1786 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1787
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1788
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1789 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1790 // CWaitCursor - displays a wait cursor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1791
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1792 class CWaitCursor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1793 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1794 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1795 // Data
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1796 HCURSOR m_hWaitCursor;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1797 HCURSOR m_hOldCursor;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1798 bool m_bInUse;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1799
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1800 // Constructor/destructor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1801 CWaitCursor(bool bSet = true, LPCTSTR lpstrCursor = IDC_WAIT, bool bSys = true) : m_hOldCursor(NULL), m_bInUse(false)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1802 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1803 HINSTANCE hInstance = bSys ? NULL : ModuleHelper::GetResourceInstance();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1804 m_hWaitCursor = ::LoadCursor(hInstance, lpstrCursor);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1805 ATLASSERT(m_hWaitCursor != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1806
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1807 if(bSet)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1808 Set();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1809 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1810
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1811 ~CWaitCursor()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1812 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1813 Restore();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1814 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1815
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1816 // Methods
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1817 bool Set()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1818 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1819 if(m_bInUse)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1820 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1821 m_hOldCursor = ::SetCursor(m_hWaitCursor);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1822 m_bInUse = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1823 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1824 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1825
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1826 bool Restore()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1827 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1828 if(!m_bInUse)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1829 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1830 ::SetCursor(m_hOldCursor);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1831 m_bInUse = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1832 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1833 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1834 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1835
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1836
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1837 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1838 // CCustomWaitCursor - for custom and animated cursors
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1839
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1840 class CCustomWaitCursor : public CWaitCursor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1841 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1842 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1843 // Constructor/destructor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1844 CCustomWaitCursor(ATL::_U_STRINGorID cursor, bool bSet = true, HINSTANCE hInstance = NULL) :
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1845 CWaitCursor(false, IDC_WAIT, true)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1846 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1847 if(hInstance == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1848 hInstance = ModuleHelper::GetResourceInstance();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1849 m_hWaitCursor = (HCURSOR)::LoadImage(hInstance, cursor.m_lpstr, IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1850
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1851 if(bSet)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1852 Set();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1853 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1854
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1855 ~CCustomWaitCursor()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1856 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1857 Restore();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1858 ::DestroyCursor(m_hWaitCursor);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1859 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1860 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1861
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1862
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1863 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1864 // CMultiPaneStatusBarCtrl - Status Bar with multiple panes
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1865
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1866 template <class T, class TBase = CStatusBarCtrl>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1867 class ATL_NO_VTABLE CMultiPaneStatusBarCtrlImpl : public ATL::CWindowImpl< T, TBase >
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1868 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1869 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1870 DECLARE_WND_SUPERCLASS2(NULL, T, TBase::GetWndClassName())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1871
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1872 // Data
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1873 enum { m_cxPaneMargin = 3 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1874
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1875 int m_nPanes;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1876 int* m_pPane;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1877
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1878 // Constructor/destructor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1879 CMultiPaneStatusBarCtrlImpl() : m_nPanes(0), m_pPane(NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1880 { }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1881
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1882 ~CMultiPaneStatusBarCtrlImpl()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1883 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1884 delete [] m_pPane;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1885 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1886
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1887 // Methods
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1888 HWND Create(HWND hWndParent, LPCTSTR lpstrText, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | SBARS_SIZEGRIP, UINT nID = ATL_IDW_STATUS_BAR)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1889 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1890 return ATL::CWindowImpl< T, TBase >::Create(hWndParent, this->rcDefault, lpstrText, dwStyle, 0, nID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1891 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1892
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1893 HWND Create(HWND hWndParent, UINT nTextID = ATL_IDS_IDLEMESSAGE, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | SBARS_SIZEGRIP, UINT nID = ATL_IDW_STATUS_BAR)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1894 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1895 const int cchMax = 128; // max text length is 127 for status bars (+1 for null)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1896 TCHAR szText[cchMax] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1897 ::LoadString(ModuleHelper::GetResourceInstance(), nTextID, szText, cchMax);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1898 return Create(hWndParent, szText, dwStyle, nID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1899 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1900
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1901 BOOL SetPanes(int* pPanes, int nPanes, bool bSetText = true)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1902 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1903 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1904 ATLASSERT(nPanes > 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1905
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1906 m_nPanes = nPanes;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1907 delete [] m_pPane;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1908 m_pPane = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1909
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1910 ATLTRY(m_pPane = new int[nPanes]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1911 ATLASSERT(m_pPane != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1912 if(m_pPane == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1913 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1914
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1915 ATL::CTempBuffer<int, _WTL_STACK_ALLOC_THRESHOLD> buff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1916 int* pPanesPos = buff.Allocate(nPanes);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1917 ATLASSERT(pPanesPos != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1918 if(pPanesPos == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1919 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1920
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1921 ATL::Checked::memcpy_s(m_pPane, nPanes * sizeof(int), pPanes, nPanes * sizeof(int));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1922
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1923 // get status bar DC and set font
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1924 CClientDC dc(this->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1925 HFONT hOldFont = dc.SelectFont(this->GetFont());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1926
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1927 // get status bar borders
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1928 int arrBorders[3] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1929 this->GetBorders(arrBorders);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1930
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1931 const int cchBuff = 128;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1932 TCHAR szBuff[cchBuff] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1933 int cxLeft = arrBorders[0];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1934
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1935 // calculate right edge of each part
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1936 for(int i = 0; i < nPanes; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1937 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1938 if(pPanes[i] == ID_DEFAULT_PANE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1939 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1940 // make very large, will be resized later
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1941 pPanesPos[i] = INT_MAX / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1942 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1943 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1944 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1945 ::LoadString(ModuleHelper::GetResourceInstance(), pPanes[i], szBuff, cchBuff);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1946 SIZE size = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1947 dc.GetTextExtent(szBuff, lstrlen(szBuff), &size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1948 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1949 (void)pT; // avoid level 4 warning
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1950 pPanesPos[i] = cxLeft + size.cx + arrBorders[2] + 2 * pT->m_cxPaneMargin;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1951 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1952 cxLeft = pPanesPos[i];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1953 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1954
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1955 BOOL bRet = this->SetParts(nPanes, pPanesPos);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1956
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1957 if(bRet && bSetText)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1958 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1959 for(int i = 0; i < nPanes; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1960 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1961 if(pPanes[i] != ID_DEFAULT_PANE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1962 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1963 ::LoadString(ModuleHelper::GetResourceInstance(), pPanes[i], szBuff, cchBuff);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1964 SetPaneText(m_pPane[i], szBuff);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1965 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1966 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1967 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1968
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1969 dc.SelectFont(hOldFont);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1970 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1971 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1972
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1973 bool GetPaneTextLength(int nPaneID, int* pcchLength = NULL, int* pnType = NULL) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1974 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1975 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1976 int nIndex = GetPaneIndexFromID(nPaneID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1977 if(nIndex == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1978 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1979
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1980 int nLength = this->GetTextLength(nIndex, pnType);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1981 if(pcchLength != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1982 *pcchLength = nLength;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1983
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1984 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1985 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1986
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1987 BOOL GetPaneText(int nPaneID, LPTSTR lpstrText, int* pcchLength = NULL, int* pnType = NULL) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1988 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1989 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1990 int nIndex = GetPaneIndexFromID(nPaneID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1991 if(nIndex == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1992 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1993
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1994 int nLength = this->GetText(nIndex, lpstrText, pnType);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1995 if(pcchLength != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1996 *pcchLength = nLength;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1997
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1998 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1999 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2000
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2001 #ifdef __ATLSTR_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2002 BOOL GetPaneText(int nPaneID, ATL::CString& strText, int* pcchLength = NULL, int* pnType = NULL) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2003 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2004 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2005 int nIndex = GetPaneIndexFromID(nPaneID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2006 if(nIndex == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2007 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2008
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2009 int nLength = this->GetText(nIndex, strText, pnType);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2010 if(pcchLength != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2011 *pcchLength = nLength;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2012
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2013 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2014 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2015 #endif // __ATLSTR_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2016
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2017 BOOL SetPaneText(int nPaneID, LPCTSTR lpstrText, int nType = 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2018 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2019 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2020 int nIndex = GetPaneIndexFromID(nPaneID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2021 if(nIndex == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2022 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2023
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2024 return this->SetText(nIndex, lpstrText, nType);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2025 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2026
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2027 BOOL GetPaneRect(int nPaneID, LPRECT lpRect) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2028 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2029 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2030 int nIndex = GetPaneIndexFromID(nPaneID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2031 if(nIndex == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2032 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2033
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2034 return this->GetRect(nIndex, lpRect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2035 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2036
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2037 BOOL SetPaneWidth(int nPaneID, int cxWidth)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2038 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2039 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2040 ATLASSERT(nPaneID != ID_DEFAULT_PANE); // Can't resize this one
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2041 int nIndex = GetPaneIndexFromID(nPaneID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2042 if(nIndex == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2043 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2044
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2045 // get pane positions
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2046 ATL::CTempBuffer<int, _WTL_STACK_ALLOC_THRESHOLD> buff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2047 int* pPanesPos = buff.Allocate(m_nPanes);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2048 if(pPanesPos == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2049 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2050 this->GetParts(m_nPanes, pPanesPos);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2051 // calculate offset
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2052 int cxPaneWidth = pPanesPos[nIndex] - ((nIndex == 0) ? 0 : pPanesPos[nIndex - 1]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2053 int cxOff = cxWidth - cxPaneWidth;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2054 // find variable width pane
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2055 int nDef = m_nPanes;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2056 for(int i = 0; i < m_nPanes; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2057 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2058 if(m_pPane[i] == ID_DEFAULT_PANE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2059 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2060 nDef = i;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2061 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2062 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2063 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2064 // resize
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2065 if(nIndex < nDef) // before default pane
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2066 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2067 for(int i = nIndex; i < nDef; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2068 pPanesPos[i] += cxOff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2069
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2070 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2071 else // after default one
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2072 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2073 for(int i = nDef; i < nIndex; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2074 pPanesPos[i] -= cxOff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2075 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2076 // set pane postions
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2077 return this->SetParts(m_nPanes, pPanesPos);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2078 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2079
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2080 BOOL GetPaneTipText(int nPaneID, LPTSTR lpstrText, int nSize) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2081 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2082 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2083 int nIndex = GetPaneIndexFromID(nPaneID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2084 if(nIndex == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2085 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2086
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2087 this->GetTipText(nIndex, lpstrText, nSize);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2088 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2089 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2090
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2091 BOOL SetPaneTipText(int nPaneID, LPCTSTR lpstrText)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2092 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2093 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2094 int nIndex = GetPaneIndexFromID(nPaneID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2095 if(nIndex == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2096 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2097
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2098 this->SetTipText(nIndex, lpstrText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2099 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2100 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2101
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2102 BOOL GetPaneIcon(int nPaneID, HICON& hIcon) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2103 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2104 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2105 int nIndex = GetPaneIndexFromID(nPaneID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2106 if(nIndex == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2107 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2108
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2109 hIcon = this->GetIcon(nIndex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2110 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2111 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2112
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2113 BOOL SetPaneIcon(int nPaneID, HICON hIcon)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2114 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2115 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2116 int nIndex = GetPaneIndexFromID(nPaneID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2117 if(nIndex == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2118 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2119
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2120 return this->SetIcon(nIndex, hIcon);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2121 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2122
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2123 // Message map and handlers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2124 BEGIN_MSG_MAP(CMultiPaneStatusBarCtrlImpl< T >)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2125 MESSAGE_HANDLER(WM_SIZE, OnSize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2126 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2127
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2128 LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2129 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2130 LRESULT lRet = this->DefWindowProc(uMsg, wParam, lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2131 if((wParam != SIZE_MINIMIZED) && (m_nPanes > 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2132 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2133 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2134 pT->UpdatePanesLayout();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2135 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2136 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2137 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2138
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2139 // Implementation
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2140 BOOL UpdatePanesLayout()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2141 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2142 // get pane positions
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2143 ATL::CTempBuffer<int, _WTL_STACK_ALLOC_THRESHOLD> buff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2144 int* pPanesPos = buff.Allocate(m_nPanes);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2145 ATLASSERT(pPanesPos != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2146 if(pPanesPos == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2147 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2148 int nRet = this->GetParts(m_nPanes, pPanesPos);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2149 ATLASSERT(nRet == m_nPanes);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2150 if(nRet != m_nPanes)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2151 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2152 // calculate offset
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2153 RECT rcClient = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2154 this->GetClientRect(&rcClient);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2155 int cxOff = rcClient.right - pPanesPos[m_nPanes - 1];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2156 // Move panes left if size grip box is present
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2157 if((this->GetStyle() & SBARS_SIZEGRIP) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2158 cxOff -= ::GetSystemMetrics(SM_CXVSCROLL) + ::GetSystemMetrics(SM_CXEDGE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2159 // find variable width pane
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2160 int i;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2161 for(i = 0; i < m_nPanes; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2162 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2163 if(m_pPane[i] == ID_DEFAULT_PANE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2164 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2165 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2166 // resize all panes from the variable one to the right
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2167 if((i < m_nPanes) && (pPanesPos[i] + cxOff) > ((i == 0) ? 0 : pPanesPos[i - 1]))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2168 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2169 for(; i < m_nPanes; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2170 pPanesPos[i] += cxOff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2171 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2172 // set pane postions
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2173 return this->SetParts(m_nPanes, pPanesPos);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2174 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2175
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2176 int GetPaneIndexFromID(int nPaneID) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2177 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2178 for(int i = 0; i < m_nPanes; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2179 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2180 if(m_pPane[i] == nPaneID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2181 return i;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2182 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2183
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2184 return -1; // not found
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2185 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2186 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2187
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2188 class CMultiPaneStatusBarCtrl : public CMultiPaneStatusBarCtrlImpl<CMultiPaneStatusBarCtrl>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2189 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2190 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2191 DECLARE_WND_SUPERCLASS(_T("WTL_MultiPaneStatusBar"), GetWndClassName())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2192 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2193
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2194
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2195 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2196 // CPaneContainer - provides header with title and close button for panes
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2197
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2198 // pane container extended styles
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2199 #define PANECNT_NOCLOSEBUTTON 0x00000001
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2200 #define PANECNT_VERTICAL 0x00000002
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2201 #define PANECNT_FLATBORDER 0x00000004
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2202 #define PANECNT_NOBORDER 0x00000008
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2203 #define PANECNT_DIVIDER 0x00000010
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2204 #define PANECNT_GRADIENT 0x00000020
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2205
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2206 template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2207 class ATL_NO_VTABLE CPaneContainerImpl : public ATL::CWindowImpl< T, TBase, TWinTraits >, public CCustomDraw< T >
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2208 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2209 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2210 DECLARE_WND_CLASS_EX2(NULL, T, 0, -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2211
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2212 // Constants
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2213 enum
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2214 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2215 m_cxyBorder = 2,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2216 m_cxyTextOffset = 4,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2217 m_cxyBtnOffset = 1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2218
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2219 m_cchTitle = 80,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2220
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2221 m_cxImageTB = 13,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2222 m_cyImageTB = 11,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2223 m_cxyBtnAddTB = 7,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2224
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2225 m_cxToolBar = m_cxImageTB + m_cxyBtnAddTB + m_cxyBorder + m_cxyBtnOffset,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2226
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2227 m_xBtnImageLeft = 6,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2228 m_yBtnImageTop = 5,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2229 m_xBtnImageRight = 12,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2230 m_yBtnImageBottom = 11,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2231
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2232 m_nCloseBtnID = ID_PANE_CLOSE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2233 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2234
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2235 // Data members
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2236 CToolBarCtrl m_tb;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2237 ATL::CWindow m_wndClient;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2238 int m_cxyHeader;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2239 TCHAR m_szTitle[m_cchTitle];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2240 DWORD m_dwExtendedStyle; // Pane container specific extended styles
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2241 HFONT m_hFont;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2242 bool m_bInternalFont;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2243
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2244
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2245 // Constructor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2246 CPaneContainerImpl() : m_cxyHeader(0), m_dwExtendedStyle(0), m_hFont(NULL), m_bInternalFont(false)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2247 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2248 m_szTitle[0] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2249 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2250
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2251 // Attributes
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2252 DWORD GetPaneContainerExtendedStyle() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2253 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2254 return m_dwExtendedStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2255 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2256
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2257 DWORD SetPaneContainerExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2258 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2259 DWORD dwPrevStyle = m_dwExtendedStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2260 if(dwMask == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2261 m_dwExtendedStyle = dwExtendedStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2262 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2263 m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2264 if(this->m_hWnd != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2265 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2266 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2267 bool bUpdate = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2268
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2269 if(((dwPrevStyle & PANECNT_NOCLOSEBUTTON) != 0) && ((m_dwExtendedStyle & PANECNT_NOCLOSEBUTTON) == 0)) // add close button
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2270 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2271 pT->CreateCloseButton();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2272 bUpdate = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2273 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2274 else if(((dwPrevStyle & PANECNT_NOCLOSEBUTTON) == 0) && ((m_dwExtendedStyle & PANECNT_NOCLOSEBUTTON) != 0)) // remove close button
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2275 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2276 pT->DestroyCloseButton();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2277 bUpdate = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2278 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2279
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2280 if((dwPrevStyle & PANECNT_VERTICAL) != (m_dwExtendedStyle & PANECNT_VERTICAL)) // change orientation
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2281 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2282 pT->CalcSize();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2283 bUpdate = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2284 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2285
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2286 if((dwPrevStyle & (PANECNT_FLATBORDER | PANECNT_NOBORDER)) !=
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2287 (m_dwExtendedStyle & (PANECNT_FLATBORDER | PANECNT_NOBORDER))) // change border
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2288 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2289 bUpdate = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2290 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2291
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2292 if((dwPrevStyle & PANECNT_GRADIENT) != (m_dwExtendedStyle & PANECNT_GRADIENT)) // change background
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2293 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2294 bUpdate = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2295 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2296
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2297 if(bUpdate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2298 pT->UpdateLayout();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2299 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2300 return dwPrevStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2301 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2302
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2303 HWND GetClient() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2304 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2305 return m_wndClient;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2306 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2307
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2308 HWND SetClient(HWND hWndClient)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2309 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2310 HWND hWndOldClient = m_wndClient;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2311 m_wndClient = hWndClient;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2312 if(this->m_hWnd != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2313 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2314 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2315 pT->UpdateLayout();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2316 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2317 return hWndOldClient;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2318 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2319
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2320 BOOL GetTitle(LPTSTR lpstrTitle, int cchLength) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2321 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2322 ATLASSERT(lpstrTitle != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2323
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2324 errno_t nRet = ATL::Checked::tcsncpy_s(lpstrTitle, cchLength, m_szTitle, _TRUNCATE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2325
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2326 return ((nRet == 0) || (nRet == STRUNCATE));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2327 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2328
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2329 BOOL SetTitle(LPCTSTR lpstrTitle)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2330 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2331 ATLASSERT(lpstrTitle != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2332
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2333 errno_t nRet = ATL::Checked::tcsncpy_s(m_szTitle, m_cchTitle, lpstrTitle, _TRUNCATE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2334 bool bRet = ((nRet == 0) || (nRet == STRUNCATE));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2335 if(bRet && (this->m_hWnd != NULL))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2336 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2337 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2338 pT->UpdateLayout();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2339 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2340
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2341 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2342 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2343
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2344 int GetTitleLength() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2345 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2346 return lstrlen(m_szTitle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2347 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2348
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2349 // Methods
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2350 HWND Create(HWND hWndParent, LPCTSTR lpstrTitle = NULL, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2351 DWORD dwExStyle = 0, UINT nID = 0, LPVOID lpCreateParam = NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2352 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2353 if(lpstrTitle != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2354 ATL::Checked::tcsncpy_s(m_szTitle, m_cchTitle, lpstrTitle, _TRUNCATE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2355 return ATL::CWindowImpl< T, TBase, TWinTraits >::Create(hWndParent, this->rcDefault, NULL, dwStyle, dwExStyle, nID, lpCreateParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2356 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2357
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2358 HWND Create(HWND hWndParent, UINT uTitleID, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2359 DWORD dwExStyle = 0, UINT nID = 0, LPVOID lpCreateParam = NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2360 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2361 if(uTitleID != 0U)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2362 ::LoadString(ModuleHelper::GetResourceInstance(), uTitleID, m_szTitle, m_cchTitle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2363 return ATL::CWindowImpl< T, TBase, TWinTraits >::Create(hWndParent, this->rcDefault, NULL, dwStyle, dwExStyle, nID, lpCreateParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2364 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2365
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2366 BOOL SubclassWindow(HWND hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2367 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2368 BOOL bRet = ATL::CWindowImpl< T, TBase, TWinTraits >::SubclassWindow(hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2369 if(bRet != FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2370 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2371 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2372 pT->Init();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2373
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2374 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2375 this->GetClientRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2376 pT->UpdateLayout(rect.right, rect.bottom);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2377 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2378
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2379 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2380 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2381
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2382 BOOL EnableCloseButton(BOOL bEnable)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2383 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2384 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2385 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2386 (void)pT; // avoid level 4 warning
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2387 return (m_tb.m_hWnd != NULL) ? m_tb.EnableButton(pT->m_nCloseBtnID, bEnable) : FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2388 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2389
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2390 void UpdateLayout()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2391 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2392 RECT rcClient = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2393 this->GetClientRect(&rcClient);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2394 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2395 pT->UpdateLayout(rcClient.right, rcClient.bottom);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2396 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2397
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2398 // Message map and handlers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2399 BEGIN_MSG_MAP(CPaneContainerImpl)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2400 MESSAGE_HANDLER(WM_CREATE, OnCreate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2401 MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2402 MESSAGE_HANDLER(WM_SIZE, OnSize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2403 MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2404 MESSAGE_HANDLER(WM_GETFONT, OnGetFont)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2405 MESSAGE_HANDLER(WM_SETFONT, OnSetFont)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2406 MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2407 MESSAGE_HANDLER(WM_PAINT, OnPaint)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2408 MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2409 MESSAGE_HANDLER(WM_NOTIFY, OnNotify)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2410 MESSAGE_HANDLER(WM_COMMAND, OnCommand)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2411 FORWARD_NOTIFICATIONS()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2412 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2413
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2414 LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2415 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2416 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2417 pT->Init();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2418
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2419 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2420 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2421
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2422 LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2423 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2424 if(m_bInternalFont)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2425 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2426 ::DeleteObject(m_hFont);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2427 m_hFont = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2428 m_bInternalFont = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2429 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2430
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2431 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2432 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2433
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2434 LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2435 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2436 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2437 pT->UpdateLayout(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2438 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2439 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2440
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2441 LRESULT OnSetFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2442 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2443 if(m_wndClient.m_hWnd != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2444 m_wndClient.SetFocus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2445 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2446 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2447
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2448 LRESULT OnGetFont(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2449 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2450 return (LRESULT)m_hFont;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2451 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2452
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2453 LRESULT OnSetFont(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2454 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2455 if(m_bInternalFont)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2456 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2457 ::DeleteObject(m_hFont);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2458 m_bInternalFont = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2459 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2460
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2461 m_hFont = (HFONT)wParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2462
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2463 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2464 pT->CalcSize();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2465
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2466 if((BOOL)lParam != FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2467 pT->UpdateLayout();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2468
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2469 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2470 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2471
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2472 LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2473 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2474 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2475 pT->DrawPaneTitleBackground((HDC)wParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2476
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2477 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2478 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2479
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2480 LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2481 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2482 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2483 if(wParam != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2484 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2485 pT->DrawPaneTitle((HDC)wParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2486
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2487 if(m_wndClient.m_hWnd == NULL) // no client window
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2488 pT->DrawPane((HDC)wParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2489 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2490 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2491 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2492 CPaintDC dc(this->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2493 pT->DrawPaneTitle(dc.m_hDC);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2494
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2495 if(m_wndClient.m_hWnd == NULL) // no client window
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2496 pT->DrawPane(dc.m_hDC);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2497 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2498
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2499 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2500 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2501
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2502 LRESULT OnNotify(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2503 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2504 if(m_tb.m_hWnd == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2505 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2506 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2507 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2508 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2509
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2510 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2511 (void)pT; // avoid level 4 warning
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2512 LPNMHDR lpnmh = (LPNMHDR)lParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2513 LRESULT lRet = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2514
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2515 // pass toolbar custom draw notifications to the base class
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2516 if((lpnmh->code == NM_CUSTOMDRAW) && (lpnmh->hwndFrom == m_tb.m_hWnd))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2517 lRet = CCustomDraw< T >::OnCustomDraw(0, lpnmh, bHandled);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2518 // tooltip notifications come with the tooltip window handle and button ID,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2519 // pass them to the parent if we don't handle them
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2520 else if((lpnmh->code == TTN_GETDISPINFO) && (lpnmh->idFrom == pT->m_nCloseBtnID))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2521 bHandled = pT->GetToolTipText(lpnmh);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2522 // only let notifications not from the toolbar go to the parent
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2523 else if((lpnmh->hwndFrom != m_tb.m_hWnd) && (lpnmh->idFrom != pT->m_nCloseBtnID))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2524 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2525
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2526 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2527 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2528
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2529 LRESULT OnCommand(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2530 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2531 // if command comes from the close button, substitute HWND of the pane container instead
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2532 if((m_tb.m_hWnd != NULL) && ((HWND)lParam == m_tb.m_hWnd))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2533 return this->GetParent().SendMessage(WM_COMMAND, wParam, (LPARAM)this->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2534
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2535 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2536 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2537 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2538
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2539 // Custom draw overrides
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2540 DWORD OnPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2541 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2542 return CDRF_NOTIFYITEMDRAW; // we need per-item notifications
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2543 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2544
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2545 DWORD OnItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2546 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2547 return CDRF_NOTIFYPOSTPAINT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2548 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2549
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2550 DWORD OnItemPostPaint(int /*idCtrl*/, LPNMCUSTOMDRAW lpNMCustomDraw)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2551 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2552 CDCHandle dc = lpNMCustomDraw->hdc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2553 RECT& rc = lpNMCustomDraw->rc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2554
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2555 RECT rcImage = { m_xBtnImageLeft, m_yBtnImageTop, m_xBtnImageRight + 1, m_yBtnImageBottom + 1 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2556 ::OffsetRect(&rcImage, rc.left, rc.top);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2557 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2558
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2559 if((lpNMCustomDraw->uItemState & CDIS_DISABLED) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2560 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2561 RECT rcShadow = rcImage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2562 ::OffsetRect(&rcShadow, 1, 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2563 CPen pen1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2564 pen1.CreatePen(PS_SOLID, 0, ::GetSysColor(COLOR_3DHILIGHT));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2565 pT->DrawButtonImage(dc, rcShadow, pen1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2566 CPen pen2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2567 pen2.CreatePen(PS_SOLID, 0, ::GetSysColor(COLOR_3DSHADOW));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2568 pT->DrawButtonImage(dc, rcImage, pen2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2569 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2570 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2571 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2572 if((lpNMCustomDraw->uItemState & CDIS_SELECTED) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2573 ::OffsetRect(&rcImage, 1, 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2574 CPen pen;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2575 pen.CreatePen(PS_SOLID, 0, ::GetSysColor(COLOR_BTNTEXT));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2576 pT->DrawButtonImage(dc, rcImage, pen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2577 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2578
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2579 return CDRF_DODEFAULT; // continue with the default item painting
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2580 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2581
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2582 // Implementation - overrideable methods
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2583 void Init()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2584 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2585 if(m_hFont == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2586 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2587 // The same as AtlCreateControlFont() for horizontal pane
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2588 LOGFONT lf = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2589 ATLVERIFY(::SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &lf, 0) != FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2590 if(IsVertical())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2591 lf.lfEscapement = 900; // 90 degrees
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2592 m_hFont = ::CreateFontIndirect(&lf);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2593 m_bInternalFont = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2594 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2595
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2596 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2597 pT->CalcSize();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2598
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2599 if((m_dwExtendedStyle & PANECNT_NOCLOSEBUTTON) == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2600 pT->CreateCloseButton();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2601 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2602
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2603 void UpdateLayout(int cxWidth, int cyHeight)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2604 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2605 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2606 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2607
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2608 if(IsVertical())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2609 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2610 ::SetRect(&rect, 0, 0, m_cxyHeader, cyHeight);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2611 if(m_tb.m_hWnd != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2612 m_tb.SetWindowPos(NULL, m_cxyBorder, m_cxyBorder + m_cxyBtnOffset, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2613
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2614 if(m_wndClient.m_hWnd != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2615 m_wndClient.SetWindowPos(NULL, m_cxyHeader, 0, cxWidth - m_cxyHeader, cyHeight, SWP_NOZORDER);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2616 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2617 rect.right = cxWidth;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2618 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2619 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2620 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2621 ::SetRect(&rect, 0, 0, cxWidth, m_cxyHeader);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2622 if(m_tb.m_hWnd != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2623 m_tb.SetWindowPos(NULL, rect.right - m_cxToolBar, m_cxyBorder + m_cxyBtnOffset, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2624
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2625 if(m_wndClient.m_hWnd != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2626 m_wndClient.SetWindowPos(NULL, 0, m_cxyHeader, cxWidth, cyHeight - m_cxyHeader, SWP_NOZORDER);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2627 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2628 rect.bottom = cyHeight;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2629 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2630
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2631 this->InvalidateRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2632 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2633
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2634 void CreateCloseButton()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2635 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2636 ATLASSERT(m_tb.m_hWnd == NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2637 // create toolbar for the "x" button
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2638 m_tb.Create(this->m_hWnd, this->rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CCS_NODIVIDER | CCS_NORESIZE | CCS_NOPARENTALIGN | CCS_NOMOVEY | TBSTYLE_TOOLTIPS | TBSTYLE_FLAT, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2639 ATLASSERT(m_tb.IsWindow());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2640
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2641 if(m_tb.m_hWnd != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2642 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2643 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2644 (void)pT; // avoid level 4 warning
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2645
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2646 m_tb.SetButtonStructSize();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2647
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2648 TBBUTTON tbbtn = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2649 tbbtn.idCommand = pT->m_nCloseBtnID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2650 tbbtn.fsState = TBSTATE_ENABLED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2651 tbbtn.fsStyle = BTNS_BUTTON;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2652 m_tb.AddButtons(1, &tbbtn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2653
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2654 m_tb.SetBitmapSize(m_cxImageTB, m_cyImageTB);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2655 m_tb.SetButtonSize(m_cxImageTB + m_cxyBtnAddTB, m_cyImageTB + m_cxyBtnAddTB);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2656
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2657 if(IsVertical())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2658 m_tb.SetWindowPos(NULL, m_cxyBorder + m_cxyBtnOffset, m_cxyBorder + m_cxyBtnOffset, m_cxImageTB + m_cxyBtnAddTB, m_cyImageTB + m_cxyBtnAddTB + 1, SWP_NOZORDER | SWP_NOACTIVATE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2659 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2660 m_tb.SetWindowPos(NULL, 0, 0, m_cxImageTB + m_cxyBtnAddTB, m_cyImageTB + m_cxyBtnAddTB + 1, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2661 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2662 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2663
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2664 void DestroyCloseButton()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2665 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2666 if(m_tb.m_hWnd != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2667 m_tb.DestroyWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2668 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2669
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2670 void CalcSize()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2671 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2672 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2673 CFontHandle font = pT->GetTitleFont();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2674 if(font.IsNull())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2675 font = (HFONT)::GetStockObject(SYSTEM_FONT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2676 LOGFONT lf = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2677 font.GetLogFont(lf);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2678 if(IsVertical())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2679 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2680 m_cxyHeader = m_cxImageTB + m_cxyBtnAddTB + m_cxyBorder + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2681 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2682 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2683 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2684 int cyFont = abs(lf.lfHeight) + m_cxyBorder + 2 * m_cxyTextOffset;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2685 int cyBtn = m_cyImageTB + m_cxyBtnAddTB + m_cxyBorder + 2 * m_cxyBtnOffset + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2686 m_cxyHeader = __max(cyFont, cyBtn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2687 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2688 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2689
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2690 HFONT GetTitleFont() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2691 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2692 return m_hFont;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2693 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2694
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2695 BOOL GetToolTipText(LPNMHDR /*lpnmh*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2696 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2697 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2698 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2699
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2700 void DrawPaneTitle(CDCHandle dc)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2701 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2702 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2703 this->GetClientRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2704
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2705 UINT uBorder = BF_LEFT | BF_TOP | BF_ADJUST;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2706 if(IsVertical())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2707 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2708 rect.right = rect.left + m_cxyHeader;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2709 uBorder |= BF_BOTTOM;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2710 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2711 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2712 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2713 rect.bottom = rect.top + m_cxyHeader;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2714 uBorder |= BF_RIGHT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2715 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2716
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2717 if((m_dwExtendedStyle & PANECNT_NOBORDER) == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2718 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2719 if((m_dwExtendedStyle & PANECNT_FLATBORDER) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2720 uBorder |= BF_FLAT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2721 dc.DrawEdge(&rect, EDGE_ETCHED, uBorder);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2722 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2723
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2724 if((m_dwExtendedStyle & PANECNT_DIVIDER) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2725 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2726 uBorder = BF_FLAT | BF_ADJUST | (IsVertical() ? BF_RIGHT : BF_BOTTOM);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2727 dc.DrawEdge(&rect, BDR_SUNKENOUTER, uBorder);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2728 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2729
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2730 // draw title text
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2731 dc.SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2732 dc.SetBkMode(TRANSPARENT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2733 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2734 HFONT hFontOld = dc.SelectFont(pT->GetTitleFont());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2735
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2736 if(IsVertical())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2737 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2738 rect.top += m_cxyTextOffset;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2739 rect.bottom -= m_cxyTextOffset;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2740 if(m_tb.m_hWnd != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2741 rect.top += m_cxToolBar;;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2742
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2743 RECT rcCalc = { rect.left, rect.bottom, rect.right, rect.top };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2744 int cxFont = dc.DrawText(m_szTitle, -1, &rcCalc, DT_TOP | DT_SINGLELINE | DT_END_ELLIPSIS | DT_CALCRECT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2745 RECT rcText = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2746 rcText.left = (rect.right - rect.left - cxFont) / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2747 rcText.right = rcText.left + (rect.bottom - rect.top);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2748 rcText.top = rect.bottom;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2749 rcText.bottom = rect.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2750 dc.DrawText(m_szTitle, -1, &rcText, DT_TOP | DT_SINGLELINE | DT_END_ELLIPSIS);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2751 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2752 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2753 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2754 rect.left += m_cxyTextOffset;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2755 rect.right -= m_cxyTextOffset;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2756 if(m_tb.m_hWnd != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2757 rect.right -= m_cxToolBar;;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2758
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2759 dc.DrawText(m_szTitle, -1, &rect, DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2760 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2761
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2762 dc.SelectFont(hFontOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2763 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2764
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2765 void DrawPaneTitleBackground(CDCHandle dc)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2766 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2767 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2768 this->GetClientRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2769 if(IsVertical())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2770 rect.right = m_cxyHeader;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2771 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2772 rect.bottom = m_cxyHeader;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2773
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2774 if((m_dwExtendedStyle & PANECNT_GRADIENT) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2775 dc.GradientFillRect(rect, ::GetSysColor(COLOR_WINDOW), ::GetSysColor(COLOR_3DFACE), IsVertical());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2776 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2777 dc.FillRect(&rect, COLOR_3DFACE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2778 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2779
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2780 // called only if pane is empty
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2781 void DrawPane(CDCHandle dc)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2782 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2783 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2784 this->GetClientRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2785 if(IsVertical())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2786 rect.left += m_cxyHeader;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2787 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2788 rect.top += m_cxyHeader;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2789 if((this->GetExStyle() & WS_EX_CLIENTEDGE) == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2790 dc.DrawEdge(&rect, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2791 dc.FillRect(&rect, COLOR_APPWORKSPACE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2792 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2793
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2794 // drawing helper - draws "x" button image
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2795 void DrawButtonImage(CDCHandle dc, RECT& rcImage, HPEN hPen)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2796 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2797 HPEN hPenOld = dc.SelectPen(hPen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2798
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2799 dc.MoveTo(rcImage.left, rcImage.top);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2800 dc.LineTo(rcImage.right, rcImage.bottom);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2801 dc.MoveTo(rcImage.left + 1, rcImage.top);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2802 dc.LineTo(rcImage.right + 1, rcImage.bottom);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2803
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2804 dc.MoveTo(rcImage.left, rcImage.bottom - 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2805 dc.LineTo(rcImage.right, rcImage.top - 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2806 dc.MoveTo(rcImage.left + 1, rcImage.bottom - 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2807 dc.LineTo(rcImage.right + 1, rcImage.top - 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2808
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2809 dc.SelectPen(hPenOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2810 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2811
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2812 bool IsVertical() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2813 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2814 return ((m_dwExtendedStyle & PANECNT_VERTICAL) != 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2815 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2816 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2817
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2818 class CPaneContainer : public CPaneContainerImpl<CPaneContainer>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2819 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2820 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2821 DECLARE_WND_CLASS_EX(_T("WTL_PaneContainer"), 0, -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2822 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2823
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2824
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2825 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2826 // CSortListViewCtrl - implements sorting for a listview control
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2827
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2828 // sort listview extended styles
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2829 #define SORTLV_USESHELLBITMAPS 0x00000001
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2830
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2831 // Notification sent to parent when sort column is changed by user clicking header.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2832 #define SLVN_SORTCHANGED LVN_LAST
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2833
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2834 // A LPNMSORTLISTVIEW is sent with the SLVN_SORTCHANGED notification
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2835 typedef struct tagNMSORTLISTVIEW
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2836 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2837 NMHDR hdr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2838 int iNewSortColumn;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2839 int iOldSortColumn;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2840 } NMSORTLISTVIEW, *LPNMSORTLISTVIEW;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2841
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2842 // Column sort types. Can be set on a per-column basis with the SetColumnSortType method.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2843 enum
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2844 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2845 LVCOLSORT_NONE,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2846 LVCOLSORT_TEXT, // default
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2847 LVCOLSORT_TEXTNOCASE,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2848 LVCOLSORT_LONG,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2849 LVCOLSORT_DOUBLE,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2850 LVCOLSORT_DECIMAL,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2851 LVCOLSORT_DATETIME,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2852 LVCOLSORT_DATE,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2853 LVCOLSORT_TIME,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2854 LVCOLSORT_CUSTOM,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2855 LVCOLSORT_LAST = LVCOLSORT_CUSTOM
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2856 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2857
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2858
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2859 template <class T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2860 class CSortListViewImpl
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2861 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2862 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2863 enum
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2864 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2865 m_cchCmpTextMax = 32, // overrideable
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2866 m_cxSortImage = 16,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2867 m_cySortImage = 15,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2868 m_cxSortArrow = 11,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2869 m_cySortArrow = 6,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2870 m_iSortUp = 0, // index of sort bitmaps
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2871 m_iSortDown = 1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2872 m_nShellSortUpID = 133
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2873 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2874
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2875 // passed to LVCompare functions as lParam1 and lParam2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2876 struct LVCompareParam
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2877 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2878 int iItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2879 DWORD_PTR dwItemData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2880 union
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2881 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2882 long lValue;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2883 double dblValue;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2884 DECIMAL decValue;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2885 LPCTSTR pszValue;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2886 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2887 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2888
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2889 // passed to LVCompare functions as the lParamSort parameter
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2890 struct LVSortInfo
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2891 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2892 T* pT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2893 int iSortCol;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2894 bool bDescending;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2895 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2896
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2897 bool m_bSortDescending;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2898 bool m_bCommCtrl6;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2899 int m_iSortColumn;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2900 CBitmap m_bmSort[2];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2901 int m_fmtOldSortCol;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2902 HBITMAP m_hbmOldSortCol;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2903 DWORD m_dwSortLVExtendedStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2904 ATL::CSimpleArray<WORD> m_arrColSortType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2905 bool m_bUseWaitCursor;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2906
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2907 CSortListViewImpl() :
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2908 m_bSortDescending(false),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2909 m_bCommCtrl6(false),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2910 m_iSortColumn(-1),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2911 m_fmtOldSortCol(0),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2912 m_hbmOldSortCol(NULL),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2913 m_dwSortLVExtendedStyle(SORTLV_USESHELLBITMAPS),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2914 m_bUseWaitCursor(true)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2915 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2916 DWORD dwMajor = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2917 DWORD dwMinor = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2918 HRESULT hRet = ATL::AtlGetCommCtrlVersion(&dwMajor, &dwMinor);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2919 m_bCommCtrl6 = SUCCEEDED(hRet) && (dwMajor >= 6);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2920 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2921
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2922 // Attributes
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2923 void SetSortColumn(int iCol)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2924 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2925 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2926 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2927 CHeaderCtrl header = pT->GetHeader();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2928 ATLASSERT(header.m_hWnd != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2929 ATLASSERT((iCol >= -1) && (iCol < m_arrColSortType.GetSize()));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2930
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2931 int iOldSortCol = m_iSortColumn;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2932 m_iSortColumn = iCol;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2933 if(m_bCommCtrl6)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2934 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2935 const int nMask = HDF_SORTUP | HDF_SORTDOWN;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2936 HDITEM hditem = { HDI_FORMAT };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2937 if((iOldSortCol != iCol) && (iOldSortCol >= 0) && header.GetItem(iOldSortCol, &hditem))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2938 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2939 hditem.fmt &= ~nMask;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2940 header.SetItem(iOldSortCol, &hditem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2941 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2942 if((iCol >= 0) && header.GetItem(iCol, &hditem))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2943 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2944 hditem.fmt &= ~nMask;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2945 hditem.fmt |= m_bSortDescending ? HDF_SORTDOWN : HDF_SORTUP;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2946 header.SetItem(iCol, &hditem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2947 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2948 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2949 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2950
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2951 if(m_bmSort[m_iSortUp].IsNull())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2952 pT->CreateSortBitmaps();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2953
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2954 // restore previous sort column's bitmap, if any, and format
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2955 HDITEM hditem = { HDI_BITMAP | HDI_FORMAT };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2956 if((iOldSortCol != iCol) && (iOldSortCol >= 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2957 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2958 hditem.hbm = m_hbmOldSortCol;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2959 hditem.fmt = m_fmtOldSortCol;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2960 header.SetItem(iOldSortCol, &hditem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2961 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2962
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2963 // save new sort column's bitmap and format, and add our sort bitmap
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2964 if((iCol >= 0) && header.GetItem(iCol, &hditem))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2965 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2966 if(iOldSortCol != iCol)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2967 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2968 m_fmtOldSortCol = hditem.fmt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2969 m_hbmOldSortCol = hditem.hbm;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2970 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2971 hditem.fmt &= ~HDF_IMAGE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2972 hditem.fmt |= HDF_BITMAP | HDF_BITMAP_ON_RIGHT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2973 int i = m_bSortDescending ? m_iSortDown : m_iSortUp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2974 hditem.hbm = m_bmSort[i];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2975 header.SetItem(iCol, &hditem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2976 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2977 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2978
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2979 int GetSortColumn() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2980 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2981 return m_iSortColumn;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2982 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2983
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2984 void SetColumnSortType(int iCol, WORD wType)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2985 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2986 ATLASSERT((iCol >= 0) && (iCol < m_arrColSortType.GetSize()));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2987 ATLASSERT((wType >= LVCOLSORT_NONE) && (wType <= LVCOLSORT_LAST));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2988 m_arrColSortType[iCol] = wType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2989 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2990
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2991 WORD GetColumnSortType(int iCol) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2992 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2993 ATLASSERT((iCol >= 0) && (iCol < m_arrColSortType.GetSize()));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2994 return m_arrColSortType[iCol];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2995 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2996
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2997 int GetColumnCount() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2998 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2999 const T* pT = static_cast<const T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3000 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3001 CHeaderCtrl header = pT->GetHeader();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3002 return header.m_hWnd != NULL ? header.GetItemCount() : 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3003 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3004
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3005 bool IsSortDescending() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3006 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3007 return m_bSortDescending;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3008 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3009
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3010 DWORD GetSortListViewExtendedStyle() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3011 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3012 return m_dwSortLVExtendedStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3013 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3014
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3015 DWORD SetSortListViewExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3016 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3017 DWORD dwPrevStyle = m_dwSortLVExtendedStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3018 if(dwMask == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3019 m_dwSortLVExtendedStyle = dwExtendedStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3020 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3021 m_dwSortLVExtendedStyle = (m_dwSortLVExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3022 return dwPrevStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3023 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3024
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3025 // Operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3026 bool DoSortItems(int iCol, bool bDescending = false)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3027 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3028 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3029 ATLASSERT(::IsWindow(pT->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3030 ATLASSERT((iCol >= 0) && (iCol < m_arrColSortType.GetSize()));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3031
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3032 WORD wType = m_arrColSortType[iCol];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3033 if(wType == LVCOLSORT_NONE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3034 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3035
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3036 int nCount = pT->GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3037 if(nCount < 2)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3038 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3039 m_bSortDescending = bDescending;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3040 SetSortColumn(iCol);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3041 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3042 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3043
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3044 CWaitCursor waitCursor(false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3045 if(m_bUseWaitCursor)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3046 waitCursor.Set();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3047
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3048 LVCompareParam* pParam = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3049 ATLTRY(pParam = new LVCompareParam[nCount]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3050 PFNLVCOMPARE pFunc = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3051 TCHAR pszTemp[pT->m_cchCmpTextMax] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3052 bool bStrValue = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3053
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3054 switch(wType)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3055 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3056 case LVCOLSORT_TEXT:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3057 pFunc = (PFNLVCOMPARE)pT->LVCompareText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3058 case LVCOLSORT_TEXTNOCASE:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3059 if(pFunc == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3060 pFunc = (PFNLVCOMPARE)pT->LVCompareTextNoCase;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3061 case LVCOLSORT_CUSTOM:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3062 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3063 if(pFunc == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3064 pFunc = (PFNLVCOMPARE)pT->LVCompareCustom;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3065
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3066 for(int i = 0; i < nCount; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3067 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3068 pParam[i].iItem = i;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3069 pParam[i].dwItemData = pT->GetItemData(i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3070 pParam[i].pszValue = new TCHAR[pT->m_cchCmpTextMax];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3071 pT->GetItemText(i, iCol, (LPTSTR)pParam[i].pszValue, pT->m_cchCmpTextMax);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3072 pT->SetItemData(i, (DWORD_PTR)&pParam[i]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3073 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3074 bStrValue = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3075 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3076 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3077 case LVCOLSORT_LONG:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3078 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3079 pFunc = (PFNLVCOMPARE)pT->LVCompareLong;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3080 for(int i = 0; i < nCount; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3081 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3082 pParam[i].iItem = i;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3083 pParam[i].dwItemData = pT->GetItemData(i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3084 pT->GetItemText(i, iCol, pszTemp, pT->m_cchCmpTextMax);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3085 pParam[i].lValue = pT->StrToLong(pszTemp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3086 pT->SetItemData(i, (DWORD_PTR)&pParam[i]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3087 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3088 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3089 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3090 case LVCOLSORT_DOUBLE:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3091 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3092 pFunc = (PFNLVCOMPARE)pT->LVCompareDouble;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3093 for(int i = 0; i < nCount; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3094 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3095 pParam[i].iItem = i;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3096 pParam[i].dwItemData = pT->GetItemData(i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3097 pT->GetItemText(i, iCol, pszTemp, pT->m_cchCmpTextMax);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3098 pParam[i].dblValue = pT->StrToDouble(pszTemp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3099 pT->SetItemData(i, (DWORD_PTR)&pParam[i]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3100 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3101 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3102 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3103 case LVCOLSORT_DECIMAL:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3104 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3105 pFunc = (PFNLVCOMPARE)pT->LVCompareDecimal;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3106 for(int i = 0; i < nCount; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3107 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3108 pParam[i].iItem = i;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3109 pParam[i].dwItemData = pT->GetItemData(i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3110 pT->GetItemText(i, iCol, pszTemp, pT->m_cchCmpTextMax);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3111 pT->StrToDecimal(pszTemp, &pParam[i].decValue);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3112 pT->SetItemData(i, (DWORD_PTR)&pParam[i]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3113 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3114 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3115 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3116 case LVCOLSORT_DATETIME:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3117 case LVCOLSORT_DATE:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3118 case LVCOLSORT_TIME:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3119 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3120 pFunc = (PFNLVCOMPARE)pT->LVCompareDouble;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3121 DWORD dwFlags = LOCALE_NOUSEROVERRIDE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3122 if(wType == LVCOLSORT_DATE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3123 dwFlags |= VAR_DATEVALUEONLY;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3124 else if(wType == LVCOLSORT_TIME)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3125 dwFlags |= VAR_TIMEVALUEONLY;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3126 for(int i = 0; i < nCount; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3127 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3128 pParam[i].iItem = i;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3129 pParam[i].dwItemData = pT->GetItemData(i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3130 pT->GetItemText(i, iCol, pszTemp, pT->m_cchCmpTextMax);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3131 pParam[i].dblValue = pT->DateStrToDouble(pszTemp, dwFlags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3132 pT->SetItemData(i, (DWORD_PTR)&pParam[i]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3133 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3134 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3135 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3136 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3137 ATLTRACE2(atlTraceUI, 0, _T("Unknown value for sort type in CSortListViewImpl::DoSortItems()\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3138 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3139 } // switch(wType)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3140
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3141 ATLASSERT(pFunc != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3142 LVSortInfo lvsi = { pT, iCol, bDescending };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3143 bool bRet = ((BOOL)pT->DefWindowProc(LVM_SORTITEMS, (WPARAM)&lvsi, (LPARAM)pFunc) != FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3144 for(int i = 0; i < nCount; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3145 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3146 DWORD_PTR dwItemData = pT->GetItemData(i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3147 LVCompareParam* p = (LVCompareParam*)dwItemData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3148 ATLASSERT(p != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3149 if(bStrValue)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3150 delete [] (TCHAR*)p->pszValue;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3151 pT->SetItemData(i, p->dwItemData);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3152 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3153 delete [] pParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3154
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3155 if(bRet)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3156 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3157 m_bSortDescending = bDescending;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3158 SetSortColumn(iCol);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3159 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3160
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3161 if(m_bUseWaitCursor)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3162 waitCursor.Restore();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3163
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3164 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3165 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3166
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3167 void CreateSortBitmaps()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3168 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3169 if((m_dwSortLVExtendedStyle & SORTLV_USESHELLBITMAPS) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3170 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3171 bool bFree = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3172 LPCTSTR pszModule = _T("shell32.dll");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3173 HINSTANCE hShell = ::GetModuleHandle(pszModule);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3174
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3175 if (hShell == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3176 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3177 hShell = ::LoadLibrary(pszModule);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3178 bFree = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3179 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3180
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3181 if (hShell != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3182 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3183 bool bSuccess = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3184 for(int i = m_iSortUp; i <= m_iSortDown; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3185 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3186 if(!m_bmSort[i].IsNull())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3187 m_bmSort[i].DeleteObject();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3188 m_bmSort[i] = (HBITMAP)::LoadImage(hShell, MAKEINTRESOURCE(m_nShellSortUpID + i),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3189 IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3190 if(m_bmSort[i].IsNull())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3191 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3192 bSuccess = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3193 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3194 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3195 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3196 if(bFree)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3197 ::FreeLibrary(hShell);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3198 if(bSuccess)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3199 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3200 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3201 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3202
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3203 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3204 for(int i = m_iSortUp; i <= m_iSortDown; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3205 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3206 if(!m_bmSort[i].IsNull())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3207 m_bmSort[i].DeleteObject();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3208
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3209 CDC dcMem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3210 CClientDC dc(::GetDesktopWindow());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3211 dcMem.CreateCompatibleDC(dc.m_hDC);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3212 m_bmSort[i].CreateCompatibleBitmap(dc.m_hDC, m_cxSortImage, m_cySortImage);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3213 HBITMAP hbmOld = dcMem.SelectBitmap(m_bmSort[i]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3214 RECT rc = { 0, 0, m_cxSortImage, m_cySortImage };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3215 pT->DrawSortBitmap(dcMem.m_hDC, i, &rc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3216 dcMem.SelectBitmap(hbmOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3217 dcMem.DeleteDC();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3218 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3219 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3220
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3221 void NotifyParentSortChanged(int iNewSortCol, int iOldSortCol)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3222 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3223 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3224 int nID = pT->GetDlgCtrlID();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3225 NMSORTLISTVIEW nm = { { pT->m_hWnd, (UINT_PTR)nID, SLVN_SORTCHANGED }, iNewSortCol, iOldSortCol };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3226 ::SendMessage(pT->GetParent(), WM_NOTIFY, (WPARAM)nID, (LPARAM)&nm);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3227 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3228
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3229 // Overrideables
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3230 int CompareItemsCustom(LVCompareParam* /*pItem1*/, LVCompareParam* /*pItem2*/, int /*iSortCol*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3231 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3232 // pItem1 and pItem2 contain valid iItem, dwItemData, and pszValue members.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3233 // If item1 > item2 return 1, if item1 < item2 return -1, else return 0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3234 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3235 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3236
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3237 void DrawSortBitmap(CDCHandle dc, int iBitmap, LPRECT prc)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3238 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3239 dc.FillRect(prc, ::GetSysColorBrush(COLOR_BTNFACE));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3240 HBRUSH hbrOld = dc.SelectBrush(::GetSysColorBrush(COLOR_BTNSHADOW));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3241 CPen pen;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3242 pen.CreatePen(PS_SOLID, 0, ::GetSysColor(COLOR_BTNSHADOW));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3243 HPEN hpenOld = dc.SelectPen(pen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3244 POINT ptOrg = { (m_cxSortImage - m_cxSortArrow) / 2, (m_cySortImage - m_cySortArrow) / 2 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3245 if(iBitmap == m_iSortUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3246 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3247 POINT pts[3] =
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3248 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3249 { ptOrg.x + m_cxSortArrow / 2, ptOrg.y },
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3250 { ptOrg.x, ptOrg.y + m_cySortArrow - 1 },
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3251 { ptOrg.x + m_cxSortArrow - 1, ptOrg.y + m_cySortArrow - 1 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3252 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3253 dc.Polygon(pts, 3);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3254 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3255 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3256 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3257 POINT pts[3] =
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3258 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3259 { ptOrg.x, ptOrg.y },
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3260 { ptOrg.x + m_cxSortArrow / 2, ptOrg.y + m_cySortArrow - 1 },
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3261 { ptOrg.x + m_cxSortArrow - 1, ptOrg.y }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3262 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3263 dc.Polygon(pts, 3);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3264 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3265 dc.SelectBrush(hbrOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3266 dc.SelectPen(hpenOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3267 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3268
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3269 double DateStrToDouble(LPCTSTR lpstr, DWORD dwFlags)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3270 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3271 ATLASSERT(lpstr != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3272 if((lpstr == NULL) || (lpstr[0] == _T('\0')))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3273 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3274
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3275 USES_CONVERSION;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3276 HRESULT hRet = E_FAIL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3277 DATE dRet = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3278 if (FAILED(hRet = ::VarDateFromStr((LPOLESTR)T2COLE(lpstr), LANG_USER_DEFAULT, dwFlags, &dRet)))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3279 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3280 ATLTRACE2(atlTraceUI, 0, _T("VarDateFromStr failed with result of 0x%8.8X\n"), hRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3281 dRet = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3282 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3283 return dRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3284 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3285
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3286 long StrToLong(LPCTSTR lpstr)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3287 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3288 ATLASSERT(lpstr != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3289 if((lpstr == NULL) || (lpstr[0] == _T('\0')))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3290 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3291
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3292 USES_CONVERSION;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3293 HRESULT hRet = E_FAIL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3294 long lRet = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3295 if (FAILED(hRet = ::VarI4FromStr((LPOLESTR)T2COLE(lpstr), LANG_USER_DEFAULT, LOCALE_NOUSEROVERRIDE, &lRet)))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3296 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3297 ATLTRACE2(atlTraceUI, 0, _T("VarI4FromStr failed with result of 0x%8.8X\n"), hRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3298 lRet = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3299 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3300 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3301 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3302
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3303 double StrToDouble(LPCTSTR lpstr)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3304 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3305 ATLASSERT(lpstr != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3306 if((lpstr == NULL) || (lpstr[0] == _T('\0')))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3307 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3308
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3309 USES_CONVERSION;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3310 HRESULT hRet = E_FAIL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3311 double dblRet = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3312 if (FAILED(hRet = ::VarR8FromStr((LPOLESTR)T2COLE(lpstr), LANG_USER_DEFAULT, LOCALE_NOUSEROVERRIDE, &dblRet)))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3313 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3314 ATLTRACE2(atlTraceUI, 0, _T("VarR8FromStr failed with result of 0x%8.8X\n"), hRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3315 dblRet = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3316 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3317 return dblRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3318 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3319
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3320 bool StrToDecimal(LPCTSTR lpstr, DECIMAL* pDecimal)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3321 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3322 ATLASSERT(lpstr != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3323 ATLASSERT(pDecimal != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3324 if((lpstr == NULL) || (pDecimal == NULL))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3325 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3326
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3327 USES_CONVERSION;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3328 HRESULT hRet = E_FAIL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3329 if (FAILED(hRet = ::VarDecFromStr((LPOLESTR)T2COLE(lpstr), LANG_USER_DEFAULT, LOCALE_NOUSEROVERRIDE, pDecimal)))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3330 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3331 ATLTRACE2(atlTraceUI, 0, _T("VarDecFromStr failed with result of 0x%8.8X\n"), hRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3332 pDecimal->Lo64 = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3333 pDecimal->Hi32 = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3334 pDecimal->signscale = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3335 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3336 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3337 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3338 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3339
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3340 // Overrideable PFNLVCOMPARE functions
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3341 static int CALLBACK LVCompareText(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3342 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3343 ATLASSERT((lParam1 != NULL) && (lParam2 != NULL) && (lParamSort != NULL));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3344
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3345 LVCompareParam* pParam1 = (LVCompareParam*)lParam1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3346 LVCompareParam* pParam2 = (LVCompareParam*)lParam2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3347 LVSortInfo* pInfo = (LVSortInfo*)lParamSort;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3348
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3349 int nRet = lstrcmp(pParam1->pszValue, pParam2->pszValue);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3350 return pInfo->bDescending ? -nRet : nRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3351 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3352
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3353 static int CALLBACK LVCompareTextNoCase(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3354 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3355 ATLASSERT((lParam1 != NULL) && (lParam2 != NULL) && (lParamSort != NULL));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3356
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3357 LVCompareParam* pParam1 = (LVCompareParam*)lParam1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3358 LVCompareParam* pParam2 = (LVCompareParam*)lParam2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3359 LVSortInfo* pInfo = (LVSortInfo*)lParamSort;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3360
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3361 int nRet = lstrcmpi(pParam1->pszValue, pParam2->pszValue);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3362 return pInfo->bDescending ? -nRet : nRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3363 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3364
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3365 static int CALLBACK LVCompareLong(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3366 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3367 ATLASSERT((lParam1 != NULL) && (lParam2 != NULL) && (lParamSort != NULL));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3368
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3369 LVCompareParam* pParam1 = (LVCompareParam*)lParam1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3370 LVCompareParam* pParam2 = (LVCompareParam*)lParam2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3371 LVSortInfo* pInfo = (LVSortInfo*)lParamSort;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3372
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3373 int nRet = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3374 if(pParam1->lValue > pParam2->lValue)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3375 nRet = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3376 else if(pParam1->lValue < pParam2->lValue)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3377 nRet = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3378 return pInfo->bDescending ? -nRet : nRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3379 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3380
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3381 static int CALLBACK LVCompareDouble(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3382 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3383 ATLASSERT((lParam1 != NULL) && (lParam2 != NULL) && (lParamSort != NULL));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3384
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3385 LVCompareParam* pParam1 = (LVCompareParam*)lParam1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3386 LVCompareParam* pParam2 = (LVCompareParam*)lParam2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3387 LVSortInfo* pInfo = (LVSortInfo*)lParamSort;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3388
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3389 int nRet = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3390 if(pParam1->dblValue > pParam2->dblValue)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3391 nRet = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3392 else if(pParam1->dblValue < pParam2->dblValue)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3393 nRet = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3394 return pInfo->bDescending ? -nRet : nRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3395 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3396
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3397 static int CALLBACK LVCompareCustom(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3398 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3399 ATLASSERT((lParam1 != NULL) && (lParam2 != NULL) && (lParamSort != NULL));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3400
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3401 LVCompareParam* pParam1 = (LVCompareParam*)lParam1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3402 LVCompareParam* pParam2 = (LVCompareParam*)lParam2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3403 LVSortInfo* pInfo = (LVSortInfo*)lParamSort;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3404
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3405 int nRet = pInfo->pT->CompareItemsCustom(pParam1, pParam2, pInfo->iSortCol);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3406 return pInfo->bDescending ? -nRet : nRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3407 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3408
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3409 static int CALLBACK LVCompareDecimal(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3410 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3411 ATLASSERT((lParam1 != NULL) && (lParam2 != NULL) && (lParamSort != NULL));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3412
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3413 LVCompareParam* pParam1 = (LVCompareParam*)lParam1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3414 LVCompareParam* pParam2 = (LVCompareParam*)lParam2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3415 LVSortInfo* pInfo = (LVSortInfo*)lParamSort;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3416
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3417 int nRet = (int)::VarDecCmp(&pParam1->decValue, &pParam2->decValue);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3418 nRet--;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3419 return pInfo->bDescending ? -nRet : nRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3420 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3421
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3422 BEGIN_MSG_MAP(CSortListViewImpl)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3423 MESSAGE_HANDLER(LVM_INSERTCOLUMN, OnInsertColumn)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3424 MESSAGE_HANDLER(LVM_DELETECOLUMN, OnDeleteColumn)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3425 NOTIFY_CODE_HANDLER(HDN_ITEMCLICKA, OnHeaderItemClick)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3426 NOTIFY_CODE_HANDLER(HDN_ITEMCLICKW, OnHeaderItemClick)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3427 MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3428 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3429
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3430 LRESULT OnInsertColumn(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3431 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3432 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3433 LRESULT lRet = pT->DefWindowProc(uMsg, wParam, lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3434 if(lRet == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3435 return -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3436
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3437 WORD wType = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3438 m_arrColSortType.Add(wType);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3439 int nCount = m_arrColSortType.GetSize();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3440 ATLASSERT(nCount == GetColumnCount());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3441
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3442 for(int i = nCount - 1; i > lRet; i--)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3443 m_arrColSortType[i] = m_arrColSortType[i - 1];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3444 m_arrColSortType[(int)lRet] = LVCOLSORT_TEXT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3445
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3446 if(lRet <= m_iSortColumn)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3447 m_iSortColumn++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3448
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3449 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3450 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3451
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3452 LRESULT OnDeleteColumn(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3453 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3454 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3455 LRESULT lRet = pT->DefWindowProc(uMsg, wParam, lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3456 if(lRet == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3457 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3458
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3459 int iCol = (int)wParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3460 if(m_iSortColumn == iCol)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3461 m_iSortColumn = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3462 else if(m_iSortColumn > iCol)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3463 m_iSortColumn--;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3464 m_arrColSortType.RemoveAt(iCol);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3465
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3466 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3467 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3468
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3469 LRESULT OnHeaderItemClick(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3470 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3471 LPNMHEADER p = (LPNMHEADER)pnmh;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3472 if(p->iButton == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3473 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3474 int iOld = m_iSortColumn;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3475 bool bDescending = (m_iSortColumn == p->iItem) ? !m_bSortDescending : false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3476 if(DoSortItems(p->iItem, bDescending))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3477 NotifyParentSortChanged(p->iItem, iOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3478 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3479 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3480 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3481 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3482
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3483 LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3484 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3485 if(wParam == SPI_SETNONCLIENTMETRICS)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3486 GetSystemSettings();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3487 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3488 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3489 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3490
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3491 void GetSystemSettings()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3492 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3493 if(!m_bCommCtrl6 && !m_bmSort[m_iSortUp].IsNull())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3494 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3495 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3496 pT->CreateSortBitmaps();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3497 if(m_iSortColumn != -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3498 SetSortColumn(m_iSortColumn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3499 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3500 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3501
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3502 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3503
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3504
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3505 typedef ATL::CWinTraits<WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | LVS_REPORT | LVS_SHOWSELALWAYS , WS_EX_CLIENTEDGE> CSortListViewCtrlTraits;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3506
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3507 template <class T, class TBase = CListViewCtrl, class TWinTraits = CSortListViewCtrlTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3508 class ATL_NO_VTABLE CSortListViewCtrlImpl: public ATL::CWindowImpl<T, TBase, TWinTraits>, public CSortListViewImpl<T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3509 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3510 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3511 DECLARE_WND_SUPERCLASS2(NULL, T, TBase::GetWndClassName())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3512
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3513 bool SortItems(int iCol, bool bDescending = false)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3514 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3515 return this->DoSortItems(iCol, bDescending);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3516 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3517
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3518 BEGIN_MSG_MAP(CSortListViewCtrlImpl)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3519 MESSAGE_HANDLER(LVM_INSERTCOLUMN, CSortListViewImpl<T>::OnInsertColumn)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3520 MESSAGE_HANDLER(LVM_DELETECOLUMN, CSortListViewImpl<T>::OnDeleteColumn)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3521 NOTIFY_CODE_HANDLER(HDN_ITEMCLICKA, CSortListViewImpl<T>::OnHeaderItemClick)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3522 NOTIFY_CODE_HANDLER(HDN_ITEMCLICKW, CSortListViewImpl<T>::OnHeaderItemClick)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3523 MESSAGE_HANDLER(WM_SETTINGCHANGE, CSortListViewImpl<T>::OnSettingChange)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3524 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3525 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3526
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3527 class CSortListViewCtrl : public CSortListViewCtrlImpl<CSortListViewCtrl>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3528 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3529 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3530 DECLARE_WND_SUPERCLASS(_T("WTL_SortListViewCtrl"), GetWndClassName())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3531 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3532
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3533
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3534 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3535 // CTabView - implements tab view window
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3536
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3537 // TabView Notifications
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3538 #define TBVN_PAGEACTIVATED (0U-741)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3539 #define TBVN_CONTEXTMENU (0U-742)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3540 #define TBVN_TABCLOSEBTN (0U-743) // return 0 to close page, 1 to keep open
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3541 // internal
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3542 #define TBVN_CLOSEBTNMOUSELEAVE (0U-744)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3543
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3544 // Notification data for TBVN_CONTEXTMENU
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3545 struct TBVCONTEXTMENUINFO
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3546 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3547 NMHDR hdr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3548 POINT pt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3549 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3550
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3551 typedef TBVCONTEXTMENUINFO* LPTBVCONTEXTMENUINFO;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3552
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3553
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3554 // Helper class for tab item hover close button
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3555 class CTabViewCloseBtn : public ATL::CWindowImpl<CTabViewCloseBtn>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3556 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3557 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3558 DECLARE_WND_CLASS_EX(_T("WTL_TabView_CloseBtn"), 0, -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3559
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3560 enum { _xyBtnImageLeftTop = 3, _xyBtnImageRightBottom = 9 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3561
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3562 bool m_bHover;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3563 bool m_bPressed;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3564 CToolTipCtrl m_tip;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3565
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3566 CTabViewCloseBtn() : m_bHover(false), m_bPressed(false)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3567 { }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3568
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3569 // Message map and handlers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3570 BEGIN_MSG_MAP(CTabViewCloseBtn)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3571 MESSAGE_RANGE_HANDLER(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseMessage)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3572 MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3573 MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3574 MESSAGE_HANDLER(WM_MOUSELEAVE, OnMouseLeave)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3575 MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3576 MESSAGE_HANDLER(WM_CAPTURECHANGED, OnCaptureChanged)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3577 MESSAGE_HANDLER(WM_PAINT, OnPaint)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3578 MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3579 FORWARD_NOTIFICATIONS()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3580 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3581
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3582 LRESULT OnMouseMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3583 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3584 MSG msg = { m_hWnd, uMsg, wParam, lParam };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3585 if(m_tip.IsWindow() != FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3586 m_tip.RelayEvent(&msg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3587
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3588 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3589 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3590 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3591
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3592 LRESULT OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3593 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3594 SetCapture();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3595 m_bHover = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3596 m_bPressed = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3597 Invalidate(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3598 UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3599
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3600 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3601 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3602
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3603 LRESULT OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3604 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3605 if(::GetCapture() == m_hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3606 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3607 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3608 ClientToScreen(&pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3609 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3610 GetWindowRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3611 bool bPressed = (::PtInRect(&rect, pt) != FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3612 if(m_bPressed != bPressed)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3613 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3614 m_bPressed = bPressed;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3615 Invalidate(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3616 UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3617 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3618 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3619 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3620 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3621 if(!m_bHover)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3622 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3623 m_bHover = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3624 Invalidate(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3625 UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3626 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3627
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3628 TRACKMOUSEEVENT tme = { sizeof(TRACKMOUSEEVENT), TME_LEAVE, m_hWnd };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3629 ::TrackMouseEvent(&tme);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3630 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3631
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3632 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3633 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3634
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3635 LRESULT OnMouseLeave(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3636 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3637 if(m_bHover)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3638 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3639 m_bHover = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3640 Invalidate(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3641 UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3642 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3643
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3644 NMHDR nmhdr = { m_hWnd, (UINT_PTR)GetDlgCtrlID(), TBVN_CLOSEBTNMOUSELEAVE };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3645 GetParent().SendMessage(WM_NOTIFY, GetDlgCtrlID(), (LPARAM)&nmhdr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3646
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3647 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3648 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3649
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3650 LRESULT OnLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3651 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3652 if(::GetCapture() == m_hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3653 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3654 bool bAction = m_bPressed;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3655 ReleaseCapture();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3656
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3657 if(bAction)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3658 GetParent().SendMessage(WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(), BN_CLICKED), (LPARAM)m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3659 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3660
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3661 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3662 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3663
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3664 LRESULT OnCaptureChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3665 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3666 if(m_bPressed)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3667 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3668 m_bPressed = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3669 Invalidate(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3670 UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3671 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3672
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3673 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3674 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3675
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3676 LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3677 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3678 if(wParam != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3679 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3680 DoPaint((HDC)wParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3681 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3682 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3683 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3684 CPaintDC dc(this->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3685 DoPaint(dc.m_hDC);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3686 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3687
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3688 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3689 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3690
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3691 // painting helper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3692 void DoPaint(CDCHandle dc)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3693 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3694 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3695 GetClientRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3696
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3697 RECT rcImage = { _xyBtnImageLeftTop, _xyBtnImageLeftTop, _xyBtnImageRightBottom + 1, _xyBtnImageRightBottom + 1 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3698 ::OffsetRect(&rcImage, rect.left, rect.top);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3699 if(m_bPressed)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3700 ::OffsetRect(&rcImage, 1, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3701
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3702 // draw button frame and background
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3703 CPen penFrame;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3704 penFrame.CreatePen(PS_SOLID, 0, ::GetSysColor((m_bHover || m_bPressed) ? COLOR_BTNTEXT : COLOR_BTNSHADOW));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3705 HPEN hPenOld = dc.SelectPen(penFrame);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3706
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3707 CBrush brush;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3708 brush.CreateSysColorBrush(m_bPressed ? COLOR_BTNSHADOW : COLOR_WINDOW);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3709 HBRUSH hBrushOld = dc.SelectBrush(brush);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3710
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3711 dc.Rectangle(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3712
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3713 // draw button "X"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3714 CPen penX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3715 penX.CreatePen(PS_SOLID, 0, ::GetSysColor(COLOR_BTNTEXT));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3716 dc.SelectPen(penX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3717
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3718 dc.MoveTo(rcImage.left, rcImage.top);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3719 dc.LineTo(rcImage.right, rcImage.bottom);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3720 dc.MoveTo(rcImage.left + 1, rcImage.top);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3721 dc.LineTo(rcImage.right + 1, rcImage.bottom);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3722
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3723 dc.MoveTo(rcImage.left, rcImage.bottom - 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3724 dc.LineTo(rcImage.right, rcImage.top - 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3725 dc.MoveTo(rcImage.left + 1, rcImage.bottom - 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3726 dc.LineTo(rcImage.right + 1, rcImage.top - 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3727
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3728 dc.SelectPen(hPenOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3729 dc.SelectBrush(hBrushOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3730 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3731 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3732
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3733
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3734 template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3735 class ATL_NO_VTABLE CTabViewImpl : public ATL::CWindowImpl< T, TBase, TWinTraits >
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3736 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3737 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3738 DECLARE_WND_CLASS_EX2(NULL, T, 0, COLOR_APPWORKSPACE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3739
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3740 // Declarations and enums
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3741 struct TABVIEWPAGE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3742 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3743 HWND hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3744 LPTSTR lpstrTitle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3745 LPVOID pData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3746 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3747
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3748 struct TCITEMEXTRA
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3749 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3750 TCITEMHEADER tciheader;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3751 TABVIEWPAGE tvpage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3752
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3753 operator LPTCITEM() { return (LPTCITEM)this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3754 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3755
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3756 enum
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3757 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3758 m_nTabID = 1313,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3759 m_cxMoveMark = 6,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3760 m_cyMoveMark = 3,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3761 m_nMenuItemsMax = (ID_WINDOW_TABLAST - ID_WINDOW_TABFIRST + 1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3762 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3763
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3764 enum { _nAutoScrollTimerID = 4321 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3765
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3766 enum AutoScroll
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3767 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3768 _AUTOSCROLL_NONE = 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3769 _AUTOSCROLL_LEFT = -1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3770 _AUTOSCROLL_RIGHT = 1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3771 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3772
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3773 enum CloseBtn
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3774 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3775 _cxCloseBtn = 14,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3776 _cyCloseBtn = 13,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3777 _cxCloseBtnMargin = 4,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3778 _cxCloseBtnMarginSel = 1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3779
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3780 _nCloseBtnID = ID_PANE_CLOSE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3781 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3782
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3783 // Data members
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3784 ATL::CContainedWindowT<CTabCtrl> m_tab;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3785 int m_cyTabHeight;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3786
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3787 int m_nActivePage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3788
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3789 int m_nInsertItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3790 POINT m_ptStartDrag;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3791
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3792 CMenuHandle m_menu;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3793
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3794 int m_cchTabTextLength;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3795
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3796 int m_nMenuItemsCount;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3797
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3798 ATL::CWindow m_wndTitleBar;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3799 LPTSTR m_lpstrTitleBarBase;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3800 int m_cchTitleBarLength;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3801
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3802 CImageList m_ilDrag;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3803
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3804 AutoScroll m_AutoScroll;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3805 CUpDownCtrl m_ud;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3806
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3807 CTabViewCloseBtn m_btnClose;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3808 int m_nCloseItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3809
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3810 bool m_bDestroyPageOnRemove:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3811 bool m_bDestroyImageList:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3812 bool m_bActivePageMenuItem:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3813 bool m_bActiveAsDefaultMenuItem:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3814 bool m_bEmptyMenuItem:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3815 bool m_bWindowsMenuItem:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3816 bool m_bNoTabDrag:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3817 bool m_bNoTabDragAutoScroll:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3818 bool m_bTabCloseButton:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3819 // internal
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3820 bool m_bTabCapture:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3821 bool m_bTabDrag:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3822 bool m_bInternalFont:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3823
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3824 // Constructor/destructor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3825 CTabViewImpl() :
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3826 m_tab(this, 1),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3827 m_cyTabHeight(0),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3828 m_nActivePage(-1),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3829 m_nInsertItem(-1),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3830 m_cchTabTextLength(30),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3831 m_nMenuItemsCount(10),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3832 m_lpstrTitleBarBase(NULL),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3833 m_cchTitleBarLength(100),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3834 m_AutoScroll(_AUTOSCROLL_NONE),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3835 m_nCloseItem(-1),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3836 m_bDestroyPageOnRemove(true),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3837 m_bDestroyImageList(true),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3838 m_bActivePageMenuItem(true),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3839 m_bActiveAsDefaultMenuItem(false),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3840 m_bEmptyMenuItem(false),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3841 m_bWindowsMenuItem(false),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3842 m_bNoTabDrag(false),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3843 m_bNoTabDragAutoScroll(false),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3844 m_bTabCloseButton(true),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3845 m_bTabCapture(false),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3846 m_bTabDrag(false),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3847 m_bInternalFont(false)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3848 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3849 m_ptStartDrag.x = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3850 m_ptStartDrag.y = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3851 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3852
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3853 ~CTabViewImpl()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3854 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3855 delete [] m_lpstrTitleBarBase;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3856 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3857
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3858 // Message filter function - to be called from PreTranslateMessage of the main window
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3859 BOOL PreTranslateMessage(MSG* pMsg)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3860 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3861 if(this->IsWindow() == FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3862 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3863
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3864 BOOL bRet = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3865
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3866 // Check for TabView built-in accelerators (Ctrl+Tab/Ctrl+Shift+Tab - next/previous page)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3867 int nCount = GetPageCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3868 if(nCount > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3869 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3870 bool bControl = (::GetKeyState(VK_CONTROL) < 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3871 if((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_TAB) && bControl)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3872 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3873 if(nCount > 1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3874 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3875 int nPage = m_nActivePage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3876 bool bShift = (::GetKeyState(VK_SHIFT) < 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3877 if(bShift)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3878 nPage = (nPage > 0) ? (nPage - 1) : (nCount - 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3879 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3880 nPage = ((nPage >= 0) && (nPage < (nCount - 1))) ? (nPage + 1) : 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3881
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3882 SetActivePage(nPage);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3883 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3884 pT->OnPageActivated(m_nActivePage);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3885 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3886
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3887 bRet = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3888 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3889 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3890
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3891 // If we are doing drag-drop, check for Escape key that cancels it
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3892 if(bRet == FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3893 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3894 if(m_bTabCapture && (pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_ESCAPE))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3895 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3896 ::ReleaseCapture();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3897 bRet = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3898 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3899 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3900
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3901 // Pass the message to the active page
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3902 if(bRet == FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3903 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3904 if(m_nActivePage != -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3905 bRet = (BOOL)::SendMessage(GetPageHWND(m_nActivePage), WM_FORWARDMSG, 0, (LPARAM)pMsg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3906 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3907
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3908 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3909 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3910
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3911 // Attributes
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3912 int GetPageCount() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3913 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3914 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3915 return m_tab.GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3916 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3917
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3918 int GetActivePage() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3919 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3920 return m_nActivePage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3921 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3922
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3923 void SetActivePage(int nPage)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3924 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3925 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3926 ATLASSERT(IsValidPageIndex(nPage));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3927
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3928 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3929
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3930 this->SetRedraw(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3931
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3932 if(m_nActivePage != -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3933 ::ShowWindow(GetPageHWND(m_nActivePage), SW_HIDE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3934 m_nActivePage = nPage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3935 m_tab.SetCurSel(m_nActivePage);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3936 ::ShowWindow(GetPageHWND(m_nActivePage), SW_SHOW);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3937
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3938 pT->UpdateLayout();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3939
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3940 this->SetRedraw(TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3941 this->RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3942
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3943 if(::GetFocus() != m_tab.m_hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3944 ::SetFocus(GetPageHWND(m_nActivePage));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3945
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3946 pT->UpdateTitleBar();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3947 pT->UpdateMenu();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3948 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3949
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3950 HIMAGELIST GetImageList() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3951 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3952 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3953 return m_tab.GetImageList();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3954 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3955
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3956 HIMAGELIST SetImageList(HIMAGELIST hImageList)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3957 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3958 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3959 return m_tab.SetImageList(hImageList);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3960 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3961
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3962 void SetWindowMenu(HMENU hMenu)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3963 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3964 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3965
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3966 m_menu = hMenu;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3967
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3968 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3969 pT->UpdateMenu();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3970 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3971
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3972 void SetTitleBarWindow(HWND hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3973 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3974 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3975
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3976 delete [] m_lpstrTitleBarBase;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3977 m_lpstrTitleBarBase = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3978
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3979 m_wndTitleBar = hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3980 if(hWnd == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3981 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3982
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3983 int cchLen = m_wndTitleBar.GetWindowTextLength() + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3984 ATLTRY(m_lpstrTitleBarBase = new TCHAR[cchLen]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3985 if(m_lpstrTitleBarBase != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3986 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3987 m_wndTitleBar.GetWindowText(m_lpstrTitleBarBase, cchLen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3988 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3989 pT->UpdateTitleBar();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3990 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3991 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3992
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3993 // Page attributes
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3994 HWND GetPageHWND(int nPage) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3995 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3996 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3997 ATLASSERT(IsValidPageIndex(nPage));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3998
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3999 TCITEMEXTRA tcix = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4000 tcix.tciheader.mask = TCIF_PARAM;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4001 m_tab.GetItem(nPage, tcix);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4002
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4003 return tcix.tvpage.hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4004 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4005
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4006 LPCTSTR GetPageTitle(int nPage) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4007 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4008 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4009 ATLASSERT(IsValidPageIndex(nPage));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4010
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4011 TCITEMEXTRA tcix = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4012 tcix.tciheader.mask = TCIF_PARAM;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4013 if(m_tab.GetItem(nPage, tcix) == FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4014 return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4015
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4016 return tcix.tvpage.lpstrTitle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4017 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4018
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4019 bool SetPageTitle(int nPage, LPCTSTR lpstrTitle)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4020 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4021 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4022 ATLASSERT(IsValidPageIndex(nPage));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4023
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4024 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4025
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4026 int cchBuff = lstrlen(lpstrTitle) + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4027 LPTSTR lpstrBuff = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4028 ATLTRY(lpstrBuff = new TCHAR[cchBuff]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4029 if(lpstrBuff == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4030 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4031
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4032 ATL::Checked::tcscpy_s(lpstrBuff, cchBuff, lpstrTitle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4033 TCITEMEXTRA tcix = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4034 tcix.tciheader.mask = TCIF_PARAM;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4035 if(m_tab.GetItem(nPage, tcix) == FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4036 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4037
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4038 ATL::CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4039 LPTSTR lpstrTabText = buff.Allocate(m_cchTabTextLength + 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4040 if(lpstrTabText == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4041 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4042
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4043 delete [] tcix.tvpage.lpstrTitle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4044
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4045 pT->ShortenTitle(lpstrTitle, lpstrTabText, m_cchTabTextLength + 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4046
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4047 tcix.tciheader.mask = TCIF_TEXT | TCIF_PARAM;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4048 tcix.tciheader.pszText = lpstrTabText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4049 tcix.tvpage.lpstrTitle = lpstrBuff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4050 if(m_tab.SetItem(nPage, tcix) == FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4051 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4052
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4053 pT->UpdateTitleBar();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4054 pT->UpdateMenu();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4055
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4056 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4057 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4058
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4059 LPVOID GetPageData(int nPage) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4060 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4061 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4062 ATLASSERT(IsValidPageIndex(nPage));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4063
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4064 TCITEMEXTRA tcix = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4065 tcix.tciheader.mask = TCIF_PARAM;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4066 m_tab.GetItem(nPage, tcix);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4067
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4068 return tcix.tvpage.pData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4069 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4070
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4071 LPVOID SetPageData(int nPage, LPVOID pData)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4072 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4073 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4074 ATLASSERT(IsValidPageIndex(nPage));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4075
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4076 TCITEMEXTRA tcix = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4077 tcix.tciheader.mask = TCIF_PARAM;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4078 m_tab.GetItem(nPage, tcix);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4079 LPVOID pDataOld = tcix.tvpage.pData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4080
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4081 tcix.tvpage.pData = pData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4082 m_tab.SetItem(nPage, tcix);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4083
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4084 return pDataOld;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4085 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4086
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4087 int GetPageImage(int nPage) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4088 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4089 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4090 ATLASSERT(IsValidPageIndex(nPage));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4091
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4092 TCITEMEXTRA tcix = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4093 tcix.tciheader.mask = TCIF_IMAGE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4094 m_tab.GetItem(nPage, tcix);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4095
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4096 return tcix.tciheader.iImage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4097 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4098
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4099 int SetPageImage(int nPage, int nImage)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4100 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4101 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4102 ATLASSERT(IsValidPageIndex(nPage));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4103
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4104 TCITEMEXTRA tcix = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4105 tcix.tciheader.mask = TCIF_IMAGE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4106 m_tab.GetItem(nPage, tcix);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4107 int nImageOld = tcix.tciheader.iImage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4108
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4109 tcix.tciheader.iImage = nImage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4110 m_tab.SetItem(nPage, tcix);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4111
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4112 return nImageOld;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4113 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4114
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4115 // Operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4116 bool AddPage(HWND hWndView, LPCTSTR lpstrTitle, int nImage = -1, LPVOID pData = NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4117 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4118 return InsertPage(GetPageCount(), hWndView, lpstrTitle, nImage, pData);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4119 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4120
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4121 bool InsertPage(int nPage, HWND hWndView, LPCTSTR lpstrTitle, int nImage = -1, LPVOID pData = NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4122 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4123 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4124 ATLASSERT((nPage == GetPageCount()) || IsValidPageIndex(nPage));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4125
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4126 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4127
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4128 int cchBuff = lstrlen(lpstrTitle) + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4129 LPTSTR lpstrBuff = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4130 ATLTRY(lpstrBuff = new TCHAR[cchBuff]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4131 if(lpstrBuff == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4132 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4133
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4134 ATL::Checked::tcscpy_s(lpstrBuff, cchBuff, lpstrTitle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4135
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4136 ATL::CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4137 LPTSTR lpstrTabText = buff.Allocate(m_cchTabTextLength + 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4138 if(lpstrTabText == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4139 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4140
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4141 pT->ShortenTitle(lpstrTitle, lpstrTabText, m_cchTabTextLength + 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4142
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4143 this->SetRedraw(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4144
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4145 TCITEMEXTRA tcix = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4146 tcix.tciheader.mask = TCIF_TEXT | TCIF_IMAGE | TCIF_PARAM;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4147 tcix.tciheader.pszText = lpstrTabText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4148 tcix.tciheader.iImage = nImage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4149 tcix.tvpage.hWnd = hWndView;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4150 tcix.tvpage.lpstrTitle = lpstrBuff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4151 tcix.tvpage.pData = pData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4152 int nItem = m_tab.InsertItem(nPage, tcix);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4153 if(nItem == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4154 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4155 delete [] lpstrBuff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4156 this->SetRedraw(TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4157 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4158 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4159
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4160 // adjust active page index, if inserted before it
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4161 if(nPage <= m_nActivePage)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4162 m_nActivePage++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4163
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4164 SetActivePage(nItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4165 pT->OnPageActivated(m_nActivePage);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4166
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4167 if(GetPageCount() == 1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4168 pT->ShowTabControl(true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4169
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4170 pT->UpdateLayout();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4171
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4172 this->SetRedraw(TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4173 this->RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4174
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4175 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4176 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4177
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4178 void RemovePage(int nPage)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4179 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4180 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4181 ATLASSERT(IsValidPageIndex(nPage));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4182
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4183 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4184
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4185 this->SetRedraw(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4186
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4187 if(GetPageCount() == 1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4188 pT->ShowTabControl(false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4189
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4190 if(m_bDestroyPageOnRemove)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4191 ::DestroyWindow(GetPageHWND(nPage));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4192 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4193 ::ShowWindow(GetPageHWND(nPage), SW_HIDE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4194 LPTSTR lpstrTitle = (LPTSTR)GetPageTitle(nPage);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4195 delete [] lpstrTitle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4196
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4197 ATLVERIFY(m_tab.DeleteItem(nPage) != FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4198
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4199 if(m_nActivePage == nPage)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4200 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4201 m_nActivePage = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4202
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4203 if(nPage > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4204 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4205 SetActivePage(nPage - 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4206 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4207 else if(GetPageCount() > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4208 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4209 SetActivePage(nPage);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4210 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4211 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4212 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4213 this->SetRedraw(TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4214 this->Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4215 this->UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4216 pT->UpdateTitleBar();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4217 pT->UpdateMenu();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4218 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4219 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4220 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4221 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4222 nPage = (nPage < m_nActivePage) ? (m_nActivePage - 1) : m_nActivePage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4223 m_nActivePage = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4224 SetActivePage(nPage);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4225 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4226
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4227 pT->OnPageActivated(m_nActivePage);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4228 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4229
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4230 void RemoveAllPages()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4231 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4232 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4233
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4234 if(GetPageCount() == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4235 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4236
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4237 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4238
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4239 this->SetRedraw(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4240
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4241 pT->ShowTabControl(false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4242
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4243 for(int i = 0; i < GetPageCount(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4244 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4245 if(m_bDestroyPageOnRemove)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4246 ::DestroyWindow(GetPageHWND(i));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4247 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4248 ::ShowWindow(GetPageHWND(i), SW_HIDE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4249 LPTSTR lpstrTitle = (LPTSTR)GetPageTitle(i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4250 delete [] lpstrTitle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4251 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4252 m_tab.DeleteAllItems();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4253
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4254 m_nActivePage = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4255 pT->OnPageActivated(m_nActivePage);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4256
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4257 this->SetRedraw(TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4258 this->Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4259 this->UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4260
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4261 pT->UpdateTitleBar();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4262 pT->UpdateMenu();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4263 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4264
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4265 int PageIndexFromHwnd(HWND hWnd) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4266 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4267 int nIndex = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4268
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4269 for(int i = 0; i < GetPageCount(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4270 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4271 if(GetPageHWND(i) == hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4272 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4273 nIndex = i;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4274 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4275 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4276 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4277
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4278 return nIndex;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4279 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4280
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4281 void BuildWindowMenu(HMENU hMenu, int nMenuItemsCount = 10, bool bEmptyMenuItem = true, bool bWindowsMenuItem = true, bool bActivePageMenuItem = true, bool bActiveAsDefaultMenuItem = false)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4282 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4283 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4284
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4285 CMenuHandle menu = hMenu;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4286 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4287 (void)pT; // avoid level 4 warning
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4288 int nFirstPos = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4289
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4290 // Find first menu item in our range
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4291 for(nFirstPos = 0; nFirstPos < menu.GetMenuItemCount(); nFirstPos++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4292 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4293 UINT nID = menu.GetMenuItemID(nFirstPos);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4294 if(((nID >= ID_WINDOW_TABFIRST) && (nID <= ID_WINDOW_TABLAST)) || (nID == ID_WINDOW_SHOWTABLIST))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4295 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4296 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4297
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4298 // Remove all menu items for tab pages
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4299 BOOL bRet = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4300 while(bRet != FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4301 bRet = menu.DeleteMenu(nFirstPos, MF_BYPOSITION);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4302
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4303 // Add separator if it's not already there
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4304 int nPageCount = GetPageCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4305 if((bWindowsMenuItem || (nPageCount > 0)) && (nFirstPos > 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4306 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4307 CMenuItemInfo mii;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4308 mii.fMask = MIIM_TYPE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4309 menu.GetMenuItemInfo(nFirstPos - 1, TRUE, &mii);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4310 if((nFirstPos <= 0) || ((mii.fType & MFT_SEPARATOR) == 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4311 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4312 menu.AppendMenu(MF_SEPARATOR);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4313 nFirstPos++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4314 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4315 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4316
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4317 // Add menu items for all pages
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4318 if(nPageCount > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4319 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4320 // Append menu items for all pages
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4321 const int cchPrefix = 3; // 2 digits + space
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4322 nMenuItemsCount = __min(__min(nPageCount, nMenuItemsCount), (int)m_nMenuItemsMax);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4323 ATLASSERT(nMenuItemsCount < 100); // 2 digits only
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4324 if(nMenuItemsCount >= 100)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4325 nMenuItemsCount = 99;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4326
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4327 for(int i = 0; i < nMenuItemsCount; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4328 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4329 LPCTSTR lpstrTitle = GetPageTitle(i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4330 int nLen = lstrlen(lpstrTitle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4331 ATL::CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4332 LPTSTR lpstrText = buff.Allocate(cchPrefix + nLen + 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4333 ATLASSERT(lpstrText != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4334 if(lpstrText != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4335 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4336 LPCTSTR lpstrFormat = (i < 9) ? _T("&%i %s") : _T("%i %s");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4337 _stprintf_s(lpstrText, cchPrefix + nLen + 1, lpstrFormat, i + 1, lpstrTitle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4338 menu.AppendMenu(MF_STRING, ID_WINDOW_TABFIRST + i, lpstrText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4339 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4340 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4341
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4342 // Mark active page
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4343 if(bActivePageMenuItem && (m_nActivePage != -1))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4344 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4345 if(bActiveAsDefaultMenuItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4346 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4347 menu.SetMenuDefaultItem((UINT)-1, TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4348 menu.SetMenuDefaultItem(nFirstPos + m_nActivePage, TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4349 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4350 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4351 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4352 menu.CheckMenuRadioItem(nFirstPos, nFirstPos + nMenuItemsCount, nFirstPos + m_nActivePage, MF_BYPOSITION);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4353 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4354 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4355 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4356 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4357 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4358 if(bEmptyMenuItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4359 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4360 menu.AppendMenu(MF_BYPOSITION | MF_STRING, ID_WINDOW_TABFIRST, pT->GetEmptyListText());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4361 menu.EnableMenuItem(ID_WINDOW_TABFIRST, MF_GRAYED);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4362 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4363
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4364 // Remove separator if nothing else is there
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4365 if(!bEmptyMenuItem && !bWindowsMenuItem && (nFirstPos > 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4366 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4367 CMenuItemInfo mii;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4368 mii.fMask = MIIM_TYPE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4369 menu.GetMenuItemInfo(nFirstPos - 1, TRUE, &mii);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4370 if((mii.fType & MFT_SEPARATOR) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4371 menu.DeleteMenu(nFirstPos - 1, MF_BYPOSITION);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4372 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4373 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4374
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4375 // Add "Windows..." menu item
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4376 if(bWindowsMenuItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4377 menu.AppendMenu(MF_BYPOSITION | MF_STRING, ID_WINDOW_SHOWTABLIST, pT->GetWindowsMenuItemText());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4378 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4379
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4380 BOOL SubclassWindow(HWND hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4381 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4382 BOOL bRet = ATL::CWindowImpl< T, TBase, TWinTraits >::SubclassWindow(hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4383 if(bRet != FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4384 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4385 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4386 pT->CreateTabControl();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4387 pT->UpdateLayout();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4388 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4389
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4390 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4391 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4392
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4393 // Message map and handlers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4394 BEGIN_MSG_MAP(CTabViewImpl)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4395 MESSAGE_HANDLER(WM_CREATE, OnCreate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4396 MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4397 MESSAGE_HANDLER(WM_SIZE, OnSize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4398 MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4399 MESSAGE_HANDLER(WM_GETFONT, OnGetFont)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4400 MESSAGE_HANDLER(WM_SETFONT, OnSetFont)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4401 MESSAGE_HANDLER(WM_TIMER, OnTimer)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4402 MESSAGE_HANDLER(WM_CONTEXTMENU, OnTabContextMenu)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4403 NOTIFY_HANDLER(m_nTabID, TCN_SELCHANGE, OnTabChanged)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4404 NOTIFY_ID_HANDLER(m_nTabID, OnTabNotification)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4405 NOTIFY_CODE_HANDLER(TTN_GETDISPINFO, OnTabGetDispInfo)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4406 FORWARD_NOTIFICATIONS()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4407 ALT_MSG_MAP(1) // tab control
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4408 MESSAGE_HANDLER(WM_LBUTTONDOWN, OnTabLButtonDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4409 MESSAGE_HANDLER(WM_LBUTTONUP, OnTabLButtonUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4410 MESSAGE_HANDLER(WM_CAPTURECHANGED, OnTabCaptureChanged)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4411 MESSAGE_HANDLER(WM_MOUSEMOVE, OnTabMouseMove)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4412 MESSAGE_HANDLER(WM_MOUSELEAVE, OnTabMouseLeave)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4413 NOTIFY_HANDLER(T::_nCloseBtnID, TBVN_CLOSEBTNMOUSELEAVE, OnTabCloseBtnMouseLeave)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4414 COMMAND_HANDLER(T::_nCloseBtnID, BN_CLICKED, OnTabCloseBtnClicked)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4415 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4416
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4417 LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4418 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4419 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4420 pT->CreateTabControl();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4421
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4422 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4423 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4424
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4425 LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4426 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4427 RemoveAllPages();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4428
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4429 if(m_bDestroyImageList)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4430 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4431 CImageList il = m_tab.SetImageList(NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4432 if(il.m_hImageList != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4433 il.Destroy();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4434 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4435
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4436 if(m_bInternalFont)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4437 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4438 HFONT hFont = m_tab.GetFont();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4439 m_tab.SetFont(NULL, FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4440 ::DeleteObject(hFont);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4441 m_bInternalFont = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4442 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4443
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4444 m_ud.m_hWnd = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4445
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4446 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4447 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4448
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4449 LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4450 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4451 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4452 pT->UpdateLayout();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4453 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4454 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4455
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4456 LRESULT OnSetFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4457 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4458 if(m_nActivePage != -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4459 ::SetFocus(GetPageHWND(m_nActivePage));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4460 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4461 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4462
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4463 LRESULT OnGetFont(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4464 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4465 return m_tab.SendMessage(WM_GETFONT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4466 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4467
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4468 LRESULT OnSetFont(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4469 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4470 if(m_bInternalFont)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4471 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4472 HFONT hFont = m_tab.GetFont();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4473 m_tab.SetFont(NULL, FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4474 ::DeleteObject(hFont);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4475 m_bInternalFont = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4476 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4477
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4478 m_tab.SendMessage(WM_SETFONT, wParam, lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4479
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4480 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4481 m_cyTabHeight = pT->CalcTabHeight();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4482
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4483 if((BOOL)lParam != FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4484 pT->UpdateLayout();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4485
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4486 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4487 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4488
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4489 LRESULT OnTimer(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4490 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4491 if(wParam == _nAutoScrollTimerID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4492 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4493 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4494 pT->DoAutoScroll();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4495 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4496 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4497 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4498 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4499 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4500
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4501 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4502 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4503
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4504 LRESULT OnTabContextMenu(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4505 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4506 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4507 int nPage = m_nActivePage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4508 bool bAction = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4509 if((HWND)wParam == m_tab.m_hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4510 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4511 if((pt.x == -1) && (pt.y == -1)) // keyboard
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4512 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4513 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4514 m_tab.GetItemRect(m_nActivePage, &rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4515 pt.x = rect.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4516 pt.y = rect.bottom;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4517 m_tab.ClientToScreen(&pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4518 bAction = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4519 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4520 else if(::WindowFromPoint(pt) == m_tab.m_hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4521 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4522 TCHITTESTINFO hti = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4523 hti.pt = pt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4524 this->ScreenToClient(&hti.pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4525 nPage = m_tab.HitTest(&hti);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4526
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4527 bAction = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4528 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4529 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4530
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4531 if(bAction)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4532 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4533 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4534 pT->OnContextMenu(nPage, pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4535 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4536 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4537 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4538 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4539 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4540
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4541 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4542 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4543
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4544 LRESULT OnTabChanged(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4545 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4546 if(m_bTabCloseButton && (m_btnClose.m_hWnd != NULL))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4547 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4548 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4549 RECT rcClose = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4550 pT->CalcCloseButtonRect(m_nCloseItem, rcClose);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4551 m_btnClose.SetWindowPos(NULL, &rcClose, SWP_NOZORDER | SWP_NOACTIVATE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4552 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4553
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4554 SetActivePage(m_tab.GetCurSel());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4555 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4556 pT->OnPageActivated(m_nActivePage);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4557
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4558 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4559 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4560
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4561 LRESULT OnTabNotification(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4562 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4563 // nothing to do - this just blocks all tab control
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4564 // notifications from being propagated further
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4565 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4566 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4567
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4568 LRESULT OnTabGetDispInfo(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4569 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4570 LPNMTTDISPINFO pTTDI = (LPNMTTDISPINFO)pnmh;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4571 if(pTTDI->hdr.hwndFrom == m_tab.GetTooltips())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4572 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4573 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4574 pT->UpdateTooltipText(pTTDI);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4575 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4576 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4577 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4578 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4579 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4580
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4581 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4582 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4583
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4584 // Tab control message handlers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4585 LRESULT OnTabLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4586 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4587 if(!m_bNoTabDrag && (m_tab.GetItemCount() > 1))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4588 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4589 m_bTabCapture = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4590 m_tab.SetCapture();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4591
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4592 m_ptStartDrag.x = GET_X_LPARAM(lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4593 m_ptStartDrag.y = GET_Y_LPARAM(lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4594 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4595
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4596 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4597 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4598 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4599
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4600 LRESULT OnTabLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4601 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4602 if(m_bTabCapture)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4603 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4604 if(m_bTabDrag)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4605 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4606 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4607 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4608 int nItem = pT->DragHitTest(pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4609 if(nItem != -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4610 MovePage(m_nActivePage, nItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4611 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4612
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4613 ::ReleaseCapture();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4614 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4615
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4616 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4617 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4618 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4619
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4620 LRESULT OnTabCaptureChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4621 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4622 if(m_bTabCapture)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4623 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4624 m_bTabCapture = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4625
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4626 if(m_bTabDrag)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4627 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4628 m_bTabDrag = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4629
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4630 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4631 if(!m_bNoTabDragAutoScroll)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4632 pT->StartStopAutoScroll(-1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4633
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4634 pT->DrawMoveMark(-1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4635
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4636 m_ilDrag.DragLeave(GetDesktopWindow());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4637 m_ilDrag.EndDrag();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4638
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4639 m_ilDrag.Destroy();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4640 m_ilDrag.m_hImageList = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4641 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4642 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4643
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4644 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4645 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4646 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4647
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4648 LRESULT OnTabMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4649 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4650 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4651
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4652 if(m_bTabCapture)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4653 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4654 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4655
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4656 if(!m_bTabDrag)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4657 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4658 if((abs(m_ptStartDrag.x - GET_X_LPARAM(lParam)) >= ::GetSystemMetrics(SM_CXDRAG)) ||
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4659 (abs(m_ptStartDrag.y - GET_Y_LPARAM(lParam)) >= ::GetSystemMetrics(SM_CYDRAG)))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4660 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4661 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4662 pT->GenerateDragImage(m_nActivePage);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4663
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4664 int cxCursor = ::GetSystemMetrics(SM_CXCURSOR);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4665 int cyCursor = ::GetSystemMetrics(SM_CYCURSOR);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4666 m_ilDrag.BeginDrag(0, -(cxCursor / 2), -(cyCursor / 2));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4667 POINT ptEnter = m_ptStartDrag;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4668 m_tab.ClientToScreen(&ptEnter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4669 m_ilDrag.DragEnter(GetDesktopWindow(), ptEnter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4670
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4671 m_bTabDrag = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4672 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4673 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4674
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4675 if(m_bTabDrag)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4676 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4677 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4678 int nItem = pT->DragHitTest(pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4679
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4680 pT->SetMoveCursor(nItem != -1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4681
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4682 if(m_nInsertItem != nItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4683 pT->DrawMoveMark(nItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4684
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4685 if(!m_bNoTabDragAutoScroll)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4686 pT->StartStopAutoScroll(pt.x);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4687
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4688 m_ilDrag.DragShowNolock((nItem != -1) ? TRUE : FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4689 m_tab.ClientToScreen(&pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4690 m_ilDrag.DragMove(pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4691
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4692 bHandled = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4693 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4694 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4695 else if(m_bTabCloseButton)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4696 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4697 TCHITTESTINFO thti = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4698 thti.pt.x = GET_X_LPARAM(lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4699 thti.pt.y = GET_Y_LPARAM(lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4700
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4701 int nItem = m_tab.HitTest(&thti);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4702 if(nItem >= 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4703 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4704 ATLTRACE(_T("+++++ item = %i\n"), nItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4705
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4706 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4707 if(m_btnClose.m_hWnd == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4708 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4709 pT->CreateCloseButton(nItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4710 m_nCloseItem = nItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4711 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4712 else if(m_nCloseItem != nItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4713 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4714 RECT rcClose = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4715 pT->CalcCloseButtonRect(nItem, rcClose);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4716 m_btnClose.SetWindowPos(NULL, &rcClose, SWP_NOZORDER | SWP_NOACTIVATE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4717 m_nCloseItem = nItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4718 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4719
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4720 TRACKMOUSEEVENT tme = { sizeof(TRACKMOUSEEVENT), TME_LEAVE, m_tab.m_hWnd };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4721 ::TrackMouseEvent(&tme);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4722 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4723 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4724
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4725 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4726 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4727
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4728 LRESULT OnTabMouseLeave(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4729 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4730 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4731
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4732 if(m_btnClose.m_hWnd != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4733 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4734 POINT pt = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4735 ::GetCursorPos(&pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4736 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4737 m_btnClose.GetWindowRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4738 if(::PtInRect(&rect, pt) == FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4739 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4740 m_nCloseItem = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4741 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4742 pT->DestroyCloseButton();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4743 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4744 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4745 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4746 bHandled = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4747 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4748 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4749
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4750 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4751 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4752
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4753 LRESULT OnTabCloseBtnMouseLeave(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4754 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4755 TCHITTESTINFO thti = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4756 ::GetCursorPos(&thti.pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4757 m_tab.ScreenToClient(&thti.pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4758 int nItem = m_tab.HitTest(&thti);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4759 if(nItem == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4760 m_tab.SendMessage(WM_MOUSELEAVE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4761
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4762 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4763 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4764
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4765 LRESULT OnTabCloseBtnClicked(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4766 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4767 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4768 pT->OnTabCloseBtn(m_nCloseItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4769
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4770 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4771 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4772
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4773 // Implementation helpers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4774 bool IsValidPageIndex(int nPage) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4775 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4776 return ((nPage >= 0) && (nPage < GetPageCount()));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4777 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4778
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4779 bool MovePage(int nMovePage, int nInsertBeforePage)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4780 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4781 ATLASSERT(IsValidPageIndex(nMovePage));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4782 ATLASSERT(IsValidPageIndex(nInsertBeforePage));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4783
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4784 if(!IsValidPageIndex(nMovePage) || !IsValidPageIndex(nInsertBeforePage))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4785 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4786
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4787 if(nMovePage == nInsertBeforePage)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4788 return true; // nothing to do
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4789
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4790 ATL::CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4791 LPTSTR lpstrTabText = buff.Allocate(m_cchTabTextLength + 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4792 if(lpstrTabText == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4793 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4794 TCITEMEXTRA tcix = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4795 tcix.tciheader.mask = TCIF_TEXT | TCIF_IMAGE | TCIF_PARAM;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4796 tcix.tciheader.pszText = lpstrTabText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4797 tcix.tciheader.cchTextMax = m_cchTabTextLength + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4798 BOOL bRet = m_tab.GetItem(nMovePage, tcix);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4799 ATLASSERT(bRet != FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4800 if(bRet == FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4801 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4802
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4803 int nInsertItem = (nInsertBeforePage > nMovePage) ? nInsertBeforePage + 1 : nInsertBeforePage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4804 int nNewItem = m_tab.InsertItem(nInsertItem, tcix);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4805 ATLASSERT(nNewItem == nInsertItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4806 if(nNewItem != nInsertItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4807 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4808 ATLVERIFY(m_tab.DeleteItem(nNewItem));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4809 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4810 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4811
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4812 if(nMovePage > nInsertBeforePage)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4813 ATLVERIFY(m_tab.DeleteItem(nMovePage + 1) != FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4814 else if(nMovePage < nInsertBeforePage)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4815 ATLVERIFY(m_tab.DeleteItem(nMovePage) != FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4816
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4817 SetActivePage(nInsertBeforePage);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4818 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4819 pT->OnPageActivated(m_nActivePage);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4820
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4821 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4822 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4823
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4824 // Implementation overrideables
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4825 bool CreateTabControl()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4826 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4827 m_tab.Create(this->m_hWnd, this->rcDefault, NULL, WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | TCS_TOOLTIPS, 0, m_nTabID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4828 ATLASSERT(m_tab.m_hWnd != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4829 if(m_tab.m_hWnd == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4830 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4831
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4832 m_tab.SetFont(AtlCreateControlFont());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4833 m_bInternalFont = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4834
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4835 m_tab.SetItemExtra(sizeof(TABVIEWPAGE));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4836
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4837 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4838 m_cyTabHeight = pT->CalcTabHeight();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4839
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4840 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4841 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4842
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4843 int CalcTabHeight()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4844 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4845 int nCount = m_tab.GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4846 TCHAR szText[] = _T("NS");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4847 TCITEMEXTRA tcix = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4848 tcix.tciheader.mask = TCIF_TEXT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4849 tcix.tciheader.pszText = szText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4850 int nIndex = m_tab.InsertItem(nCount, tcix);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4851
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4852 RECT rect = { 0, 0, 1000, 1000 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4853 m_tab.AdjustRect(FALSE, &rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4854
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4855 RECT rcWnd = { 0, 0, 1000, rect.top };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4856 ::AdjustWindowRectEx(&rcWnd, m_tab.GetStyle(), FALSE, m_tab.GetExStyle());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4857
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4858 int nHeight = rcWnd.bottom - rcWnd.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4859
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4860 m_tab.DeleteItem(nIndex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4861
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4862 return nHeight;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4863 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4864
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4865 void ShowTabControl(bool bShow)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4866 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4867 m_tab.ShowWindow(bShow ? SW_SHOWNOACTIVATE : SW_HIDE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4868 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4869 pT->UpdateLayout();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4870 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4871
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4872 void UpdateLayout()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4873 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4874 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4875 this->GetClientRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4876
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4877 int cyOffset = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4878 if(m_tab.IsWindow() && ((m_tab.GetStyle() & WS_VISIBLE) != 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4879 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4880 m_tab.SetWindowPos(NULL, 0, 0, rect.right - rect.left, m_cyTabHeight, SWP_NOZORDER);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4881 cyOffset = m_cyTabHeight;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4882 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4883
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4884 if(m_nActivePage != -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4885 ::SetWindowPos(GetPageHWND(m_nActivePage), NULL, 0, cyOffset, rect.right - rect.left, rect.bottom - rect.top - cyOffset, SWP_NOZORDER);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4886 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4887
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4888 void UpdateMenu()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4889 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4890 if(m_menu.m_hMenu != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4891 BuildWindowMenu(m_menu, m_nMenuItemsCount, m_bEmptyMenuItem, m_bWindowsMenuItem, m_bActivePageMenuItem, m_bActiveAsDefaultMenuItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4892 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4893
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4894 void UpdateTitleBar()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4895 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4896 if(!m_wndTitleBar.IsWindow() || (m_lpstrTitleBarBase == NULL))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4897 return; // nothing to do
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4898
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4899 if(m_nActivePage != -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4900 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4901 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4902 LPCTSTR lpstrTitle = pT->GetPageTitle(m_nActivePage);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4903 LPCTSTR lpstrDivider = pT->GetTitleDividerText();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4904 int cchBuffer = m_cchTitleBarLength + lstrlen(lpstrDivider) + lstrlen(m_lpstrTitleBarBase) + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4905 ATL::CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4906 LPTSTR lpstrPageTitle = buff.Allocate(cchBuffer);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4907 ATLASSERT(lpstrPageTitle != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4908 if(lpstrPageTitle != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4909 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4910 pT->ShortenTitle(lpstrTitle, lpstrPageTitle, m_cchTitleBarLength + 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4911 ATL::Checked::tcscat_s(lpstrPageTitle, cchBuffer, lpstrDivider);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4912 ATL::Checked::tcscat_s(lpstrPageTitle, cchBuffer, m_lpstrTitleBarBase);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4913 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4914 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4915 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4916 lpstrPageTitle = m_lpstrTitleBarBase;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4917 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4918
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4919 m_wndTitleBar.SetWindowText(lpstrPageTitle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4920 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4921 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4922 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4923 m_wndTitleBar.SetWindowText(m_lpstrTitleBarBase);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4924 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4925 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4926
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4927 void DrawMoveMark(int nItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4928 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4929 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4930
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4931 if(m_nInsertItem != -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4932 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4933 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4934 pT->GetMoveMarkRect(rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4935 m_tab.InvalidateRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4936 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4937
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4938 m_nInsertItem = nItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4939
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4940 if(m_nInsertItem != -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4941 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4942 CClientDC dc(m_tab.m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4943
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4944 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4945 pT->GetMoveMarkRect(rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4946
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4947 CPen pen;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4948 pen.CreatePen(PS_SOLID, 1, ::GetSysColor(COLOR_WINDOWTEXT));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4949 CBrush brush;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4950 brush.CreateSolidBrush(::GetSysColor(COLOR_WINDOWTEXT));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4951
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4952 HPEN hPenOld = dc.SelectPen(pen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4953 HBRUSH hBrushOld = dc.SelectBrush(brush);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4954
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4955 int x = rect.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4956 int y = rect.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4957 POINT ptsTop[3] = { { x, y }, { x + m_cxMoveMark, y }, { x + (m_cxMoveMark / 2), y + m_cyMoveMark } };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4958 dc.Polygon(ptsTop, 3);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4959
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4960 y = rect.bottom - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4961 POINT ptsBottom[3] = { { x, y }, { x + m_cxMoveMark, y }, { x + (m_cxMoveMark / 2), y - m_cyMoveMark } };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4962 dc.Polygon(ptsBottom, 3);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4963
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4964 dc.SelectPen(hPenOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4965 dc.SelectBrush(hBrushOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4966 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4967 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4968
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4969 void GetMoveMarkRect(RECT& rect) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4970 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4971 m_tab.GetClientRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4972
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4973 RECT rcItem = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4974 m_tab.GetItemRect(m_nInsertItem, &rcItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4975
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4976 if(m_nInsertItem <= m_nActivePage)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4977 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4978 rect.left = rcItem.left - m_cxMoveMark / 2 - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4979 rect.right = rcItem.left + m_cxMoveMark / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4980 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4981 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4982 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4983 rect.left = rcItem.right - m_cxMoveMark / 2 - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4984 rect.right = rcItem.right + m_cxMoveMark / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4985 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4986 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4987
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4988 void SetMoveCursor(bool bCanMove)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4989 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4990 ::SetCursor(::LoadCursor(NULL, bCanMove ? IDC_ARROW : IDC_NO));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4991 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4992
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4993 void GenerateDragImage(int nItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4994 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4995 ATLASSERT(IsValidPageIndex(nItem));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4996
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4997 RECT rcItem = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4998 m_tab.GetItemRect(nItem, &rcItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4999 ::InflateRect(&rcItem, 2, 2); // make bigger to cover selected item
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5000
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5001 ATLASSERT(m_ilDrag.m_hImageList == NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5002 m_ilDrag.Create(rcItem.right - rcItem.left, rcItem.bottom - rcItem.top, ILC_COLORDDB | ILC_MASK, 1, 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5003
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5004 CClientDC dc(this->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5005 CDC dcMem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5006 dcMem.CreateCompatibleDC(dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5007 ATLASSERT(dcMem.m_hDC != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5008 dcMem.SetViewportOrg(-rcItem.left, -rcItem.top);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5009
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5010 CBitmap bmp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5011 bmp.CreateCompatibleBitmap(dc, rcItem.right - rcItem.left, rcItem.bottom - rcItem.top);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5012 ATLASSERT(bmp.m_hBitmap != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5013
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5014 HBITMAP hBmpOld = dcMem.SelectBitmap(bmp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5015 m_tab.SendMessage(WM_PRINTCLIENT, (WPARAM)dcMem.m_hDC);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5016 dcMem.SelectBitmap(hBmpOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5017
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5018 ATLVERIFY(m_ilDrag.Add(bmp.m_hBitmap, RGB(255, 0, 255)) != -1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5019 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5020
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5021 void ShortenTitle(LPCTSTR lpstrTitle, LPTSTR lpstrShortTitle, int cchShortTitle)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5022 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5023 if(lstrlen(lpstrTitle) >= cchShortTitle)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5024 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5025 LPCTSTR lpstrEllipsis = _T("...");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5026 int cchEllipsis = lstrlen(lpstrEllipsis);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5027 ATL::Checked::tcsncpy_s(lpstrShortTitle, cchShortTitle, lpstrTitle, cchShortTitle - cchEllipsis - 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5028 ATL::Checked::tcscat_s(lpstrShortTitle, cchShortTitle, lpstrEllipsis);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5029 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5030 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5031 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5032 ATL::Checked::tcscpy_s(lpstrShortTitle, cchShortTitle, lpstrTitle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5033 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5034 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5035
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5036 void UpdateTooltipText(LPNMTTDISPINFO pTTDI)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5037 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5038 ATLASSERT(pTTDI != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5039 pTTDI->lpszText = (LPTSTR)GetPageTitle((int)pTTDI->hdr.idFrom);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5040 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5041
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5042 int DragHitTest(POINT pt) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5043 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5044 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5045 this->GetClientRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5046 if(::PtInRect(&rect, pt) == FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5047 return -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5048
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5049 m_tab.GetClientRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5050 TCHITTESTINFO hti = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5051 hti.pt.x = pt.x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5052 hti.pt.y = rect.bottom / 2; // use middle to ignore
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5053 int nItem = m_tab.HitTest(&hti);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5054 if(nItem == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5055 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5056 int nLast = m_tab.GetItemCount() - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5057 RECT rcItem = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5058 m_tab.GetItemRect(nLast, &rcItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5059 if(pt.x >= rcItem.right)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5060 nItem = nLast;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5061 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5062
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5063 return nItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5064 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5065
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5066 void StartStopAutoScroll(int x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5067 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5068 AutoScroll scroll = _AUTOSCROLL_NONE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5069 if(x != -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5070 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5071 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5072 m_tab.GetClientRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5073 int dx = ::GetSystemMetrics(SM_CXVSCROLL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5074 if((x >= 0) && (x < dx))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5075 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5076 RECT rcItem = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5077 m_tab.GetItemRect(0, &rcItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5078 if(rcItem.left < rect.left)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5079 scroll = _AUTOSCROLL_LEFT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5080 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5081 else if((x >= (rect.right - dx)) && (x < rect.right))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5082 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5083 RECT rcItem = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5084 m_tab.GetItemRect(m_tab.GetItemCount() - 1, &rcItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5085 if(rcItem.right > rect.right)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5086 scroll = _AUTOSCROLL_RIGHT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5087 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5088 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5089
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5090 if(scroll != _AUTOSCROLL_NONE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5091 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5092 if(m_ud.m_hWnd == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5093 m_ud = m_tab.GetWindow(GW_CHILD);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5094
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5095 if(m_AutoScroll != scroll)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5096 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5097 m_AutoScroll = scroll;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5098 this->SetTimer(_nAutoScrollTimerID, 300);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5099 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5100 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5101 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5102 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5103 this->KillTimer(_nAutoScrollTimerID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5104 m_AutoScroll = _AUTOSCROLL_NONE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5105 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5106 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5107
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5108 void DoAutoScroll()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5109 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5110 ATLASSERT(m_AutoScroll != _AUTOSCROLL_NONE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5111
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5112 int nMin = -1, nMax = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5113 m_ud.GetRange(nMin, nMax);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5114 int nPos = m_ud.GetPos();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5115
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5116 int nNewPos = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5117 if((m_AutoScroll == _AUTOSCROLL_LEFT) && (nPos > nMin))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5118 nNewPos = nPos - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5119 else if((m_AutoScroll == _AUTOSCROLL_RIGHT) && (nPos < nMax))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5120 nNewPos = nPos + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5121 if(nNewPos != -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5122 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5123 m_tab.SendMessage(WM_HSCROLL, MAKEWPARAM(SB_THUMBPOSITION, nNewPos));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5124 m_tab.SendMessage(WM_HSCROLL, MAKEWPARAM(SB_ENDSCROLL, 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5125
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5126 POINT pt = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5127 ::GetCursorPos(&pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5128 m_tab.ScreenToClient(&pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5129 m_tab.SendMessage(WM_MOUSEMOVE, NULL, MAKELPARAM(pt.x, pt.y));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5130 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5131 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5132
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5133 // Text for menu items and title bar - override to provide different strings
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5134 static LPCTSTR GetEmptyListText()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5135 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5136 return _T("(Empty)");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5137 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5138
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5139 static LPCTSTR GetWindowsMenuItemText()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5140 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5141 return _T("&Windows...");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5142 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5143
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5144 static LPCTSTR GetTitleDividerText()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5145 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5146 return _T(" - ");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5147 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5148
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5149 // Notifications - override to provide different behavior
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5150 void OnPageActivated(int nPage)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5151 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5152 NMHDR nmhdr = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5153 nmhdr.hwndFrom = this->m_hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5154 nmhdr.idFrom = nPage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5155 nmhdr.code = TBVN_PAGEACTIVATED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5156 this->GetParent().SendMessage(WM_NOTIFY, this->GetDlgCtrlID(), (LPARAM)&nmhdr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5157 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5158
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5159 void OnContextMenu(int nPage, POINT pt)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5160 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5161 TBVCONTEXTMENUINFO cmi = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5162 cmi.hdr.hwndFrom = this->m_hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5163 cmi.hdr.idFrom = nPage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5164 cmi.hdr.code = TBVN_CONTEXTMENU;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5165 cmi.pt = pt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5166 this->GetParent().SendMessage(WM_NOTIFY, this->GetDlgCtrlID(), (LPARAM)&cmi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5167 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5168
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5169 void OnTabCloseBtn(int nPage)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5170 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5171 NMHDR nmhdr = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5172 nmhdr.hwndFrom = this->m_hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5173 nmhdr.idFrom = nPage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5174 nmhdr.code = TBVN_TABCLOSEBTN;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5175 LRESULT lRet = this->GetParent().SendMessage(WM_NOTIFY, this->GetDlgCtrlID(), (LPARAM)&nmhdr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5176 if(lRet == 0) // default - close page
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5177 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5178 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5179 pT->RemovePage(m_nCloseItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5180 m_nCloseItem = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5181 pT->DestroyCloseButton();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5182 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5183 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5184 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5185 m_tab.SendMessage(WM_MOUSELEAVE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5186 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5187 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5188
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5189 // Close button overrideables
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5190 void CreateCloseButton(int nItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5191 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5192 ATLASSERT(m_btnClose.m_hWnd == NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5193
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5194 m_btnClose.m_bPressed = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5195
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5196 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5197 RECT rcClose = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5198 pT->CalcCloseButtonRect(nItem, rcClose);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5199 m_btnClose.Create(m_tab.m_hWnd, rcClose, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0, T::_nCloseBtnID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5200 ATLASSERT(m_btnClose.IsWindow());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5201
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5202 if(m_btnClose.m_hWnd != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5203 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5204 // create a tool tip
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5205 ATLASSERT(m_btnClose.m_tip.m_hWnd == NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5206 m_btnClose.m_tip.Create(m_btnClose.m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5207 ATLASSERT(m_btnClose.m_tip.IsWindow());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5208
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5209 if(m_btnClose.m_tip.IsWindow())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5210 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5211 m_btnClose.m_tip.Activate(TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5212
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5213 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5214 m_btnClose.GetClientRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5215 m_btnClose.m_tip.AddTool(m_btnClose.m_hWnd, LPSTR_TEXTCALLBACK, &rect, T::_nCloseBtnID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5216 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5217 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5218 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5219
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5220 void DestroyCloseButton()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5221 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5222 ATLASSERT(m_btnClose.m_hWnd != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5223
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5224 if(m_btnClose.m_hWnd != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5225 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5226 if(m_btnClose.m_tip.IsWindow())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5227 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5228 m_btnClose.m_tip.DestroyWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5229 m_btnClose.m_tip.m_hWnd = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5230 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5231
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5232 m_btnClose.DestroyWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5233 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5234 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5235
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5236 void CalcCloseButtonRect(int nItem, RECT& rcClose)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5237 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5238 RECT rcItem = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5239 m_tab.GetItemRect(nItem, &rcItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5240
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5241 int cy = (rcItem.bottom - rcItem.top - _cyCloseBtn) / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5242 int cx = (nItem == m_tab.GetCurSel()) ? _cxCloseBtnMarginSel : _cxCloseBtnMargin;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5243 ::SetRect(&rcClose, rcItem.right - cx - _cxCloseBtn, rcItem.top + cy,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5244 rcItem.right - cx, rcItem.top + cy + _cyCloseBtn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5245 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5246 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5247
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5248 class CTabView : public CTabViewImpl<CTabView>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5249 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5250 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5251 DECLARE_WND_CLASS_EX(_T("WTL_TabView"), 0, COLOR_APPWORKSPACE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5252 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5253
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5254 } // namespace WTL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5255
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5256 #endif // __ATLCTRLX_H__