📄 sy0401.htm
字号:
<html>
<HEAD>
<TITLE>Visual C++与计算机接口</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=gb2312" >
</HEAD>
<body>
<font color="#0000FF">添加消息处理函数或重载MFC类成员函数</font>
<p>
(一)实验目的:<BR>
练习为窗口添加消息处理函数或重载MFC类成员函数的方法<BR><BR>
(二)实验内容:<BR>
·用ClassWizard自动添加一个消息处理函数或重载类成员函数<BR>
·手工添加一个消息处理函数<BR>
·手工添加命令范围消息处理函数<BR><BR>
(三)实验步骤:<BR><BR>
1、利用ClassWizard为窗口自动添加消息处理函数或重载类成员函数<BR>
添加方法与映射菜单消息和添加控件消息处理函数或对话框的消息映射函数一样:<BR>
(1)打开ClassWizard<BR>
(2)从Class name组合框中选取想添加消息处理函数或重载成员函数的类<BR>
(3)在Object IDs列表框中,选取类的名称(其他项是菜单和工具栏命令ID)<BR>
·此时,Messages列表框显示该类的几乎全部可重载成员函数和窗口消息<BR>
·可重载成员函数显示在列表的上部,以实际虚构成员函数的大小写字母来表示<BR>
·其他为窗口消息,以大写字母出现,描述了窗口所能响应的消息ID<BR>
(4)选取想要添加的重载函数或消息处理函数,单击Add Function按钮<BR>
(5)ClassWizard将添加该函数到Member function表中,并附简单注释<BR>
(6)点击OK或Edit Code,ClassWizard正式将此函数添加到相应文件中<BR>
<p align="center"><span style="FONT-SIZE: 9pt"><img height="226" width="672" alt="添加消息处理函数" src="sy0401.jpg" ></span></p>
<p align="center"><span style="FONT-SIZE: 9pt">图1.4.1 使用ClassWizard添加一个消息处理函数</span></p>
如果要删除一个处理函数或重载函数,可从Member function表中选中它并单击Delete Function按钮。<BR>
注意,ClassWizard并不删除此函数的具体实现,需要使用者手工删除。<BR><BR>
2、手工添加一个消息处理函数<BR><BR>
利用ClassWizard为窗口自动添加了消息处理函数或菜单响应函数后,我们可以查看一下相应文件,可以发现它实际上是添加了三个地方:<BR>
·在头文件中,DECLARE_MESSAGE_MAP()之前,//{{AFX_MSG(CMyWindow) 与 //}}AFX_MSG 之间有:<BR>
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);<BR>
或 afx_msg void OnMyMenu();<BR>
·在cpp文件中,有函数的具体实现。当然,现在是空的,需要你来加内容<BR>
int CTttView::OnCreate(LPCREATESTRUCT lpCreateStruct) <BR>
{<BR>
if (CView::OnCreate(lpCreateStruct) == -1)<BR>
return -1;<BR>
// TODO: Add your specialized creation code here<BR>
return 0;<BR>
}<BR>
·在cpp文件上部,在宏 BEGIN_MESSAGE_MAP(CTttView, CView) 和宏 END_MESSAGE_MAP() 之间有:<BR>
ON_WM_CREATE()<BR>
或 ON_COMMAND(ID_MYMENU, OnMyMenu)<BR>
上述第一个和第二个很好理解,是所定义函数的声明和具体实现,而第三个就是消息映射的方法,利用宏 ON_WM_CREATE 或 ON_COMMAND 等,将消息与函数联系在一起,这样,当窗口接受到消息后,会自动执行响应函数。<BR><BR>
理解了这些,我们就可以手工添加一个消息处理函数:<BR>
(1)在类的.h文件中添加处理函数的声明,在 //}}AFX_MSG 与 DECLARE_MESSAGE_MAP() 之间加入声明:<BR>
protected:<BR>
//{{AFX_MSG(CTttView)<BR>
//}}AFX_MSG<BR>
afx_msg void OnDestroy();<BR>
DECLARE_MESSAGE_MAP()<BR>
(2)在用户类的.cpp文件中的消息映像区中,在 //}}AFX_MSG_MAP 和 END_MESSAGE_MAP() 之间加入消息映射宏:<BR>
BEGIN_MESSAGE_MAP(CTttView, CView)<BR>
//{{AFX_MSG_MAP(CTttView)<BR>
//}}AFX_MSG_MAP<BR>
ON_WM_DESTROY()<BR>
END_MESSAGE_MAP()<BR>
要想了解消息映像宏的全部内容,参见MSDN。<BR>
(3)最后,可以在文件中添加消息处理函数的具体实现。<BR>
void CWzdClass::OnDestroy()<BR>
{<BR>
}<BR><BR>
3、手工添加命令范围消息处理函数<BR><BR>
ON_COMMAND_RANGE宏接收所有ID在某一范围之内的命令消息(WM_COMMAND消息)。使用这个宏,可以在一个函数中处理多条菜单或工具条按钮命令。<BR>
ON_UPDATE_COMMAND_UI_RANGE宏截取一定范围内的消息中更新用户界面的请求。使用这个宏,可以集中处理多条菜单或工具栏按钮的显示状态。<BR><BR>
类似于上面的手工添加消息处理函数的方法:<BR>
(1)在类的.h文件中添加处理函数的声明:<BR>
protected:<BR>
//{{AFX_MSG(CTttView)<BR>
//}}AFX_MSG<BR>
afx_msg void OnWzdCommandRange(UINT nID);<BR>
DECLARE_MESSAGE_MAP()<BR>
(2)在用户类的.cpp文件中的消息映像区中加入消息映射宏:<BR>
BEGIN_MESSAGE_MAP(CTttView, CView)<BR>
//{{AFX_MSG_MAP(CTttView)<BR>
//}}AFX_MSG_MAP<BR>
ON_COMMAND_RANGE(ID_TEST_WZD1,ID_TEST_WZD4,OnWzdCommandRange)<BR>
END_MESSAGE_MAP()<BR>
(3)最后,在文件中添加函数的具体实现,参数nID是要处理命令的ID。<BR>
void CWzdView::OnWzdCommandRange(UINT nID)<BR>
{<BR>
switch (nID)<BR>
{<BR>
case ID_TEST_WZD1: ... b r e a k ;<BR>
case ID_TEST_WZD2: ... b r e a k ;<BR>
case ID_TEST_WZD3: ... b r e a k ;<BR>
case ID_TEST_WZD4: ... b r e a k ;<BR>
}<BR>
}<BR>
或 void CWzdView::OnWzdCommandRange(UINT nID)<BR>
{<BR>
CString st;<BR>
st.Format("%d",nID-ID_TEST_WZD1);<BR>
AfxMessageBox(st);<BR>
}<BR><BR>
ON_UPDATE_COMMAND_UI_RANGE宏的响应函数原型为:<BR>
afx_msg void OnUpdateWzdCommandRange(CCmdUI* pCCmdUI);<BR>
其中 pCmdUI->m_nID 指明了菜单的ID。<BR>
手工添加ON_UPDATE_COMMAND_UI_RANGE宏的响应函数,请大家自己试验一下。<BR>
<p></p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -