如果像我一样初学的,可以留下邮箱索取源码。
//MainFrm.hafx_msg void OnMenuMsg(); //菜单命令消息afx_msg void OnMenuItem(UINT uId); //范围消息,不限菜单afx_msg void OnMenuItemUI(CCmdUI *pCmdUI); //命令消息接口afx_msg void OnToolMsg(); //工具条命令消息afx_msg LRESULT OnUserMsg(WPARAM wp,LPARAM lp);//自定义消息afx_msg void OnSendUserMsg();//发送定义消息
//MainFrm.cpp//自定义消息宏,固定格式#define WM_USER_MSG WM_USER + 1001
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
ON_WM_CREATE() //定义消息映射不加分号 ON_COMMAND(ID_MENU_MSG, &CMainFrame::OnMenuMsg) //菜单命令消息 ON_COMMAND_RANGE(ID_0,ID_2, &CMainFrame::OnMenuItem) //范围消息映射 ON_UPDATE_COMMAND_UI_RANGE(ID_0,ID_2, &CMainFrame::OnMenuItemUI) //命令用户接口//ON_UPDATE_COMMAND_UI(ID_0, &CMainFrame::OnMenuItemUI)//单个定义 ON_COMMAND(ID_TOOL_MSG, &CMainFrame::OnToolMsg) //工具条命令消息 ON_MESSAGE(WM_USER_MSG, &CMainFrame::OnUserMsg) //自定义消息映射 ON_COMMAND(ID_USER_MSG, &CMainFrame::OnSendUserMsg) //发送自定义消息 ON_COMMAND(ID_VIEW_CUSTOMIZE, &CMainFrame::OnViewCustomize)
ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR, &CMainFrame::OnToolbarCreateNew)
END_MESSAGE_MAP()
void CMainFrame::OnMenuMsg()
{
AfxMessageBox(_T("menu msg"));
}
void CMainFrame::OnToolMsg()
{
//AfxMessageBox(_T("tool msg")); CDlg dlg;
dlg.DoModal();
}
void CMainFrame::OnMenuItem(UINT uId)
{
//可根据id生成不同的响应。//我曾经用map//m_map[uId]();}
void CMainFrame::OnMenuItemUI(CCmdUI *pCmdUI)
{
pCmdUI->SetCheck(1); //设置按下 pCmdUI->Enable(FALSE); //设置禁用 int nMenuId = pCmdUI->m_nID;//菜单项ID}
LRESULT CMainFrame::OnUserMsg(WPARAM wp,LPARAM lp)
{
UINT uWp = wp;
AfxMessageBox(_T("user msg"));
return 1L;
}
void CMainFrame::OnSendUserMsg()
{
SendMessage(WM_USER_MSG,123,456);
}
//Dlg.h 消息响应函数定义DECLARE_MESSAGE_MAP()
afx_msg void OnBtnMsg(); //按钮命令消息afx_msg void OnEditChangeMsg(); //编辑框改变消息afx_msg void OnContextMenu(CWnd *pWnd,CPoint point); //上下文菜单消息
//Dlg.cppvoid CDlg::OnBtnMsg()
{
AfxMessageBox(_T("btn msg"));
}
void CDlg::OnEditChangeMsg()
{
AfxMessageBox(_T("edit change msg"));
}
void CDlg::OnContextMenu(CWnd *pWnd,CPoint point)
{
AfxMessageBox(_T("context menu msg"));
}
//定义消息映射BEGIN_MESSAGE_MAP(CDlg, CDialog)
ON_COMMAND(IDC_BTN,CDlg::OnBtnMsg) //命令消息映射 ON_EN_CHANGE(IDC_EDIT_MSG, &CDlg::OnEditChangeMsg) //控件通知消息映射 ON_WM_CONTEXTMENU() //上下文菜单消息映射END_MESSAGE_MAP()
url:http://greatverve.cnblogs.com/archive/2012/11/04/mfc-message.html
参考一:
众所周知,windows是基于消息驱动的,作好消息处理是WINDOWS编程的关键任务之一,用VC制作WINDOWS程式同样离不开消息的处理。这就要求我们对 VC中消息的处理有一个比较清淅的认识。只有这样才可能在必要的时候亲自动手完成一些复杂的消息映射处理。
在MFC中消息是通过一种的消息映射机制来处理的。其实质是一张消息及其处理函数的一一对应表以及分析处理这张表的应用框架内部的一些程序代码.这样的好处是可以避免像早期的SDK编程一样需要罗列一大堆的CASE语句来处理各种消息。由于不同种类的消息其处理方法是不同的,所以我们有必要先弄清楚 WINDOWS消息的种类。
WINDOWS 消息的种类:
1、标准WINDOWS消息:这类消息是以WM_为前缀,不过WM_COMMAND例外。 例如: WM_MOVE、WM_QUIT等。
2、命令消息:命令消息以WM_COMMAND为消息名。在消息中含有命令的标志符ID,以区分具体的命令。由菜单,工具栏等命令接口对象产生。
3、控件通知消息:控件通知消息也是以WM_COMMAND为消息名。由编辑框、列表框和子窗口发送给父窗口的通知消息。在消息中包含控件通知码,以区分具体控件的通知消息。
其中从CWnd派生的类可以接受上面的三种消息,从CCmdTarget派生的类能够接收命令消息。在使用MFCAppWizard创建的应用程序中,消息传递的机制是:
App 类与Doc类都是从CCmdTarget类派生而来,所以只能接收命令消息(如单击菜单产生的消息),View类与Frame框架类都是从CWnd类派生而来,所以能够接收上面的三种消息。对于以上三种消息,期响应的顺序是这样的:首先由框架类接收到该消息,框架类将该消息递交给其子窗口View,如果View没有对该消息进行响应,则由View递交给Doc,如果Doc也没有对该消息进行响应,那么它回再次将该消息回交给View,View再回交给Frame框架,框架检查自己是否对该消息有相应的处理函数,如果没有则递交给App,如果App也没有则由Windows系统自己处理。
命令消息:
在以上三种消息中,标准的WINDOWS消息映射是相当简单的。可直接通过类向导完成不同消息的映射处理,所以不在本文讨论之列。
凡是从CcmdTarget类派生的类都可以有消息映射,消息映射包括如下两方面的内容:
1、在类的定义文件中(.H)中加上一条宏调用(通常这条语句中类定义的最后):
DECLARE_MESSAGE_MAP()
2、在类的实现文件(.CPP)中加上消息映射表:
1
BEGIN_MESSAGE_MAP(类名,父类名)2………..3消息映射入口项.4……….5END_MESSAGE_MAP( )6
幸运的是除了某些类(如没有基类的类或直接从CobjectO类派生的类)外,其它许多类均可由类向导生成.尽管生成的类只是一个框架,需要我们补充内容。但消息映射表已经为我们加好了,只是入口项有待我们加入。命令消息映射入口项是一个ON_COMMAND的宏。比如文件菜单下的"打开…"菜单(ID值为ID_FILE_OPEN)对应的消息映射入口项为:
ON_COMMAND(ID_FILE_NEW,OnFileOpen)
3、加入消息映射入口项之后需要完成消息处理函数。在类中消息处理函数都是类的成员函数,要响应一个消息,就必须定义一个该消息的处理