时间的痕迹
posts - 16, comments - 128, trackbacks - 0, articles - 261
C++博客
首页
新随笔
联系
管理
聚合
很好的button类 实现文件 2
1
2
#ifdef BTNST_USE_BCMENU
3
LRESULT CButtonST::OnMenuChar(UINT nChar, UINT nFlags, CMenu
*
pMenu)
4
{
5
LRESULT lResult;
6
if
(BCMenu::IsMenu(pMenu))
7
lResult
=
BCMenu::FindKeyboardShortcut(nChar, nFlags, pMenu);
8
else
9
lResult
=
CButton::OnMenuChar(nChar, nFlags, pMenu);
10
return
lResult;
11
}
//
End of OnMenuChar
12
#endif
13
14
#ifdef BTNST_USE_BCMENU
15
void
CButtonST::OnMeasureItem(
int
nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
16
{
17
BOOL bSetFlag
=
FALSE;
18
if
(lpMeasureItemStruct
->
CtlType
==
ODT_MENU)
19
{
20
if
(IsMenu((HMENU)lpMeasureItemStruct
->
itemID)
&&
BCMenu::IsMenu((HMENU)lpMeasureItemStruct
->
itemID))
21
{
22
m_menuPopup.MeasureItem(lpMeasureItemStruct);
23
bSetFlag
=
TRUE;
24
}
//
if
25
}
//
if
26
if
(
!
bSetFlag) CButton::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
27
}
//
End of OnMeasureItem
28
#endif
29
30
void
CButtonST::OnEnable(BOOL bEnable)
31
{
32
CButton::OnEnable(bEnable);
33
34
if
(bEnable
==
FALSE)
35
{
36
CWnd
*
pWnd
=
GetParent()
->
GetNextDlgTabItem(
this
);
37
if
(pWnd)
38
pWnd
->
SetFocus();
39
else
40
GetParent()
->
SetFocus();
41
42
CancelHover();
43
}
//
if
44
}
//
End of OnEnable
45
46
void
CButtonST::OnKillFocus(CWnd
*
pNewWnd)
47
{
48
CButton::OnKillFocus(pNewWnd);
49
CancelHover();
50
}
//
End of OnKillFocus
51
52
void
CButtonST::OnActivate(UINT nState, CWnd
*
pWndOther, BOOL bMinimized)
53
{
54
CButton::OnActivate(nState, pWndOther, bMinimized);
55
if
(nState
==
WA_INACTIVE) CancelHover();
56
}
//
End of OnActivate
57
58
void
CButtonST::OnCancelMode()
59
{
60
CButton::OnCancelMode();
61
CancelHover();
62
}
//
End of OnCancelMode
63
64
BOOL CButtonST::OnSetCursor(CWnd
*
pWnd, UINT nHitTest, UINT message)
65
{
66
//
If a cursor was specified then use it!
67
if
(m_hCursor
!=
NULL)
68
{
69
::SetCursor(m_hCursor);
70
return
TRUE;
71
}
//
if
72
73
return
CButton::OnSetCursor(pWnd, nHitTest, message);
74
}
//
End of OnSetCursor
75
76
void
CButtonST::CancelHover()
77
{
78
//
Only for flat buttons
79
if
(m_bIsFlat)
80
{
81
if
(m_bMouseOnButton)
82
{
83
m_bMouseOnButton
=
FALSE;
84
Invalidate();
85
}
//
if
86
}
//
if
87
}
//
End of CancelHover
88
89
void
CButtonST::OnMouseMove(UINT nFlags, CPoint point)
90
{
91
CWnd
*
wndUnderMouse
=
NULL;
92
CWnd
*
wndActive
=
this
;
93
TRACKMOUSEEVENT csTME;
94
95
CButton::OnMouseMove(nFlags, point);
96
97
ClientToScreen(
&
point);
98
wndUnderMouse
=
WindowFromPoint(point);
99
100
//
If the mouse enter the button with the left button pressed then do nothing
101
if
(nFlags
&
MK_LBUTTON
&&
m_bMouseOnButton
==
FALSE)
return
;
102
103
//
If our button is not flat then do nothing
104
if
(m_bIsFlat
==
FALSE)
return
;
105
106
if
(m_bAlwaysTrack
==
FALSE) wndActive
=
GetActiveWindow();
107
108
if
(wndUnderMouse
&&
wndUnderMouse
->
m_hWnd
==
m_hWnd
&&
wndActive)
109
{
110
if
(
!
m_bMouseOnButton)
111
{
112
m_bMouseOnButton
=
TRUE;
113
114
Invalidate();
115
116
#ifdef BTNST_USE_SOUND
117
//
Play sound ?
118
if
(m_csSounds[
0
].lpszSound)
119
::PlaySound(m_csSounds[
0
].lpszSound, m_csSounds[
0
].hMod, m_csSounds[
0
].dwFlags);
120
#endif
121
122
csTME.cbSize
=
sizeof
(csTME);
123
csTME.dwFlags
=
TME_LEAVE;
124
csTME.hwndTrack
=
m_hWnd;
125
::_TrackMouseEvent(
&
csTME);
126
}
//
if
127
}
else
CancelHover();
128
}
//
End of OnMouseMove
129
130
//
Handler for WM_MOUSELEAVE
131
LRESULT CButtonST::OnMouseLeave(WPARAM wParam, LPARAM lParam)
132
{
133
CancelHover();
134
return
0
;
135
}
//
End of OnMouseLeave
136
137
BOOL CButtonST::OnClicked()
138
{
139
SetFocus();
140
141
#ifdef BTNST_USE_SOUND
142
//
Play sound ?
143
if
(m_csSounds[
1
].lpszSound)
144
::PlaySound(m_csSounds[
1
].lpszSound, m_csSounds[
1
].hMod, m_csSounds[
1
].dwFlags);
145
#endif
146
147
if
(m_bIsCheckBox)
148
{
149
m_nCheck
=
!
m_nCheck;
150
Invalidate();
151
}
//
if
152
else
153
{
154
//
Handle the menu (if any)
155
#ifdef BTNST_USE_BCMENU
156
if
(m_menuPopup.m_hMenu)
157
#else
158
if
(m_hMenu)
159
#endif
160
{
161
CRect rWnd;
162
GetWindowRect(rWnd);
163
164
m_bMenuDisplayed
=
TRUE;
165
Invalidate();
166
167
#ifdef BTNST_USE_BCMENU
168
BCMenu
*
psub
=
(BCMenu
*
)m_menuPopup.GetSubMenu(
0
);
169
if
(m_csCallbacks.hWnd) ::SendMessage(m_csCallbacks.hWnd, m_csCallbacks.nMessage, (WPARAM)psub, m_csCallbacks.lParam);
170
DWORD dwRetValue
=
psub
->
TrackPopupMenu(TPM_LEFTALIGN
|
TPM_LEFTBUTTON
|
TPM_RIGHTBUTTON
|
TPM_NONOTIFY
|
TPM_RETURNCMD, rWnd.left, rWnd.bottom,
this
, NULL);
171
#else
172
HMENU hSubMenu
=
::GetSubMenu(m_hMenu,
0
);
173
if
(m_csCallbacks.hWnd) ::SendMessage(m_csCallbacks.hWnd, m_csCallbacks.nMessage, (WPARAM)hSubMenu, m_csCallbacks.lParam);
174
DWORD dwRetValue
=
::TrackPopupMenuEx(hSubMenu, TPM_LEFTALIGN
|
TPM_LEFTBUTTON
|
TPM_RIGHTBUTTON
|
TPM_NONOTIFY
|
TPM_RETURNCMD, rWnd.left, rWnd.bottom, m_hParentWndMenu, NULL);
175
#endif
176
177
m_bMenuDisplayed
=
FALSE;
178
Invalidate();
179
180
if
(dwRetValue)
181
::PostMessage(m_hParentWndMenu, WM_COMMAND, MAKEWPARAM(dwRetValue,
0
), (LPARAM)NULL);
182
}
//
if
183
else
184
{
185
//
Handle the URL (if any)
186
if
(_tcslen(m_szURL)
>
0
)
187
{
188
SHELLEXECUTEINFO csSEI;
189
190
memset(
&
csSEI,
0
,
sizeof
(csSEI));
191
csSEI.cbSize
=
sizeof
(SHELLEXECUTEINFO);
192
csSEI.fMask
=
SEE_MASK_FLAG_NO_UI;
193
csSEI.lpVerb
=
_T(
"
open
"
);
194
csSEI.lpFile
=
m_szURL;
195
csSEI.nShow
=
SW_SHOWMAXIMIZED;
196
::ShellExecuteEx(
&
csSEI);
197
}
//
if
198
}
//
else
199
}
//
else
200
201
return
FALSE;
202
}
//
End of OnClicked
203
204
void
CButtonST::DrawItem(LPDRAWITEMSTRUCT lpDIS)
205
{
206
CDC
*
pDC
=
CDC::FromHandle(lpDIS
->
hDC);
207
208
//
Checkbox?
209
if
(m_bIsCheckBox)
210
{
211
m_bIsPressed
=
(lpDIS
->
itemState
&
ODS_SELECTED)
||
(m_nCheck
!=
0
);
212
}
//
if
213
else
//
Normal button OR other button style
214
{
215
m_bIsPressed
=
(lpDIS
->
itemState
&
ODS_SELECTED);
216
217
//
If there is a menu and it's displayed, draw the button as pressed
218
if
(
219
#ifdef BTNST_USE_BCMENU
220
m_menuPopup.m_hMenu
221
#else
222
m_hMenu
223
#endif
224
&&
m_bMenuDisplayed) m_bIsPressed
=
TRUE;
225
}
//
else
226
227
m_bIsFocused
=
(lpDIS
->
itemState
&
ODS_FOCUS);
228
m_bIsDisabled
=
(lpDIS
->
itemState
&
ODS_DISABLED);
229
230
CRect itemRect
=
lpDIS
->
rcItem;
231
232
pDC
->
SetBkMode(TRANSPARENT);
233
234
//
Prepare draw
paint button background
235
236
//
Draw transparent?
237
if
(m_bDrawTransparent)
238
PaintBk(pDC);
239
else
240
OnDrawBackground(pDC,
&
itemRect);
241
242
//
Draw button border
243
OnDrawBorder(pDC,
&
itemRect);
244
245
//
Read the button's title
246
CString sTitle;
247
GetWindowText(sTitle);
248
249
CRect captionRect
=
lpDIS
->
rcItem;
250
251
//
Draw the icon
252
if
(m_csIcons[
0
].hIcon)
253
{
254
DrawTheIcon(pDC,
!
sTitle.IsEmpty(),
&
lpDIS
->
rcItem,
&
captionRect, m_bIsPressed, m_bIsDisabled);
255
}
//
if
256
257
if
(m_csBitmaps[
0
].hBitmap)
258
{
259
pDC
->
SetBkColor(RGB(
255
,
255
,
255
));
260
DrawTheBitmap(pDC,
!
sTitle.IsEmpty(),
&
lpDIS
->
rcItem,
&
captionRect, m_bIsPressed, m_bIsDisabled);
261
}
//
if
262
263
//
Write the button title (if any)
264
if
(sTitle.IsEmpty()
==
FALSE)
265
{
266
DrawTheText(pDC, (LPCTSTR)sTitle,
&
lpDIS
->
rcItem,
&
captionRect, m_bIsPressed, m_bIsDisabled);
267
}
//
if
268
269
if
(m_bIsFlat
==
FALSE
||
(m_bIsFlat
&&
m_bDrawFlatFocus))
270
{
271
//
Draw the focus rect
272
if
(m_bIsFocused)
273
{
274
CRect focusRect
=
itemRect;
275
focusRect.DeflateRect(
3
,
3
);
276
pDC
->
DrawFocusRect(
&
focusRect);
277
}
//
if
278
}
//
if
279
}
//
End of DrawItem
280
281
void
CButtonST::PaintBk(CDC
*
pDC)
282
{
283
CClientDC clDC(GetParent());
284
CRect rect;
285
CRect rect1;
286
287
GetClientRect(rect);
288
289
GetWindowRect(rect1);
290
GetParent()
->
ScreenToClient(rect1);
291
292
if
(m_dcBk.m_hDC
==
NULL)
293
{
294
m_dcBk.CreateCompatibleDC(
&
clDC);
295
m_bmpBk.CreateCompatibleBitmap(
&
clDC, rect.Width(), rect.Height());
296
m_pbmpOldBk
=
m_dcBk.SelectObject(
&
m_bmpBk);
297
m_dcBk.BitBlt(
0
,
0
, rect.Width(), rect.Height(),
&
clDC, rect1.left, rect1.top, SRCCOPY);
298
}
//
if
299
300
pDC
->
BitBlt(
0
,
0
, rect.Width(), rect.Height(),
&
m_dcBk,
0
,
0
, SRCCOPY);
301
}
//
End of PaintBk
Posted on 2007-04-12 11:46
艾凡赫
阅读(1000)
评论(0)
编辑
收藏
引用
所属分类:
MFC技术
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
利用VC从DLL传递消息到EXE
CEdit 颜色设置
文本框字体色,对话框和静态文件背景色设置方法(OnCtlColor消息)
很好的button类 实现文件 4
很好的button类 实现文件 3
很好的button类 实现文件 2
很好的button类 实现文件 1
很好的button类 头文件
CBitmapDialog 的使用
CFormView 设置背景色
网站导航:
博客园
IT新闻
BlogJava
博问
Chat2DB
管理
<
2007年4月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(19)
给我留言
查看公开留言
查看私人留言
随笔分类
(12)
ADO(2)
Arithmetic
C/C++(1)
COM
DLL
MFC(4)
NET WORK(1)
ORACLE
OTL
OTL
SQL Server
STL
Thread
traits技术
设计模式
兴致所至(4)
随笔档案
(16)
2008年9月 (1)
2007年1月 (8)
2006年12月 (1)
2006年10月 (1)
2006年3月 (1)
2005年9月 (4)
文章分类
(295)
ADO.NET(1)
ADO编程技术(19)
C++(71)
COM(11)
C语言(5)
DLL 技术(13)
Linux(2)
MFC技术(41)
ORACLE(17)
P2P(7)
SqlServer(9)
win32 sdk 编程(7)
Windows Mobile开发(8)
多线程(8)
共享内存
好 玩(1)
基础知识(16)
加密解密(1)
其 他(2)
设计模式
手机编程
数据库(14)
数据类型(7)
算 法(12)
网络编程(23)
文章档案
(261)
2007年12月 (1)
2007年11月 (3)
2007年9月 (1)
2007年4月 (40)
2007年3月 (4)
2007年1月 (1)
2006年12月 (4)
2006年11月 (15)
2006年10月 (4)
2006年9月 (50)
2006年7月 (1)
2006年4月 (5)
2006年1月 (20)
2005年12月 (47)
2005年11月 (56)
2005年10月 (9)
收藏夹
美文
C#
COM
MFC
【 Visual C++ 教 程 】
MFC 教程
VC编程技巧
VC编程网
VC学习
Web
基础知识
PE文件格式详解
汇编语言
数据结构
网络教学
开发学习
天新网
移动开发网
网络
注册过的论坛网站
最新随笔
1. 麦兜故事
2. 转载--地主与长工
3. 呵呵,还不怎么会用,差点出事
4. 第一次
5. 呵呵!开业大吉!!!
搜索
积分与排名
积分 - 483346
排名 - 42
最新评论
1. re: 哈夫曼编码的源代码[未登录]
有没有联系方式,大神求带,本人qq1984425565,大神求带
--无
2. re: 消除回溯算法的程序实现
设计内容及要求:构造一程序,实现:消除文法每一条产生式候选式的公共左因子。对于用户任意输入的文法G,输出一个无回溯的等价文法,可显示输出,或输出到指定文件中。
--王康
3. re: MFC规则DLL 简单的例子
这个文章是从课本上复制的不?
--张亚成
4. re: _variant_t 到 CString 转换
帮了我一把!拜谢
--苦想者
5. re: ADO连接字符串
评论内容较长,点击标题查看
--BestEssays rewiew
阅读排行榜
1. 使用wxWidgets开发跨平台的GUI程序(转)(4461)
2. CRichEditCtrl (3465)
3. 转载--地主与长工 (2645)
4. VC中自动改变控件位置和大小的对话框类(转)(2196)
5. VC6.0中使用Stream Object读取数据中流文件并显示Bmp,JPG等图片 (转)(1756)
评论排行榜
1. 呵呵!开业大吉!!!(5)
2. 转载--地主与长工 (4)
3. 麦兜故事(1)
4. 第一次(1)
5. 呵呵,还不怎么会用,差点出事(1)