C++MFC编程笔记day02 MFC消息映射机制、菜单资源使用

机制3:MFC消息映射机制:

类内声明,类外定义宏,绑定消息处理函数
派生自CCmdTarget
类内声明宏:DECLARE_MESSAGE_MAP()
类外添加实现宏:
BEGIN_MESSAGE_MAP(类名,父类名)
END_MESSAGE_MAP()
//数据结构
struct AFX_MSGMAP_ENTRY
{
UINT nMessage;   // 消息ID
UINT nCode;      // 通知码
UINT nID;        // 控件ID或消息
UINT nLastID;    // 最后控制ID
UINT nSig;       // 消息处理函数类型
AFX_PMSG pfn;    // 消息处理函数
};
//宏定义的静态变量
struct AFX_MSGMAP
{
const AFX_MSGMAP* pBaseMap;//父类静态变量地址
const AFX_MSGMAP_ENTRY* lpEntries;//本类静态数组地址
};
调用过程:
Afx_WndProc()
{
CWnd* pWnd=CWnd::FromHandlePermanent(hWnd);
AfxCallWndProc(pWnd)
{
pWnd->WindowProc(...)//this指针为pFrame
{
OnWndMsg(...)
{
AFX_MSGMAP*pMessageMap=GetMessageMap()
{
//调用宏绑定的重写的消息处理
}
}
}
}
}
windows标准消息示例:
class CMyFrameWnd:public CFrameWnd
{
DECLARE_MESSAGE_MAP()
public:
LRESULT OnCreate(WPARAM wparam,LPARAM lparam);
};
BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)
ON_MESSAGE(WM_CREATE,OnCreate)
END_MESSAGE_MAP()
LRESULT CMyFrameWnd::OnCreate(WPARAM wparam,LPARAM lparam)
{
AfxMessageBox("OnCreate");
return 0;
}
(具体消息函数要查MSDN):
#include "stdafx.h"
class CMyFrameWnd:public CFrameWnd
{
DECLARE_MESSAGE_MAP()
public:
afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct);
LRESULT OnPaint(WPARAM wparam,LPARAM lparam);
};
BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)
ON_WM_CREATE()
ON_MESSAGE(WM_PAINT,OnPaint)
END_MESSAGE_MAP()
int CMyFrameWnd::OnCreate( LPCREATESTRUCT lpCreateStruct)
{
AfxMessageBox("afx_msg:OnCreate");
return CFrameWnd::OnCreate(lpCreateStruct);
}
LRESULT CMyFrameWnd::OnPaint(WPARAM wparam,LPARAM lparam)
{
PAINTSTRUCT ps={0};
HDC hdc=::BeginPaint(this->m_hWnd,&ps);
::TextOut(hdc,100,100,"hello",5);
::EndPaint(this->m_hWnd,&ps);
return 0;
}
class CMyWinApp:public CWinApp
{
public:
virtual BOOL InitInstance();
};
CMyWinApp theApp;
BOOL CMyWinApp::InitInstance()
{
CMyFrameWnd *pFrame=new CMyFrameWnd;
pFrame->Create(NULL,"MFCmsg");
m_pMainWnd=pFrame;
pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateWindow();
return TRUE;
}

day80 am over!
自定义消息
#define  WM_MYMSG WM_USER+100
//类内声明
afx_msg LRESULT OnMyMsg(WPARAM wparam, LPARAM lparam);
//类外实现
LRESULT CMyFrameWnd::OnMyMsg(WPARAM wparam, LPARAM lparam)
{
CString s;
s.Format("%d,%d",wparam,lparam);
AfxMessageBox(s);
return 0;
}
//消息映射
BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)
ON_MESSAGE(WM_MYMSG,OnMyMsg)
END_MESSAGE_MAP()
//点击时发消息触发
void CMyFrameWnd::OnLButtonUp( UINT flags, CPoint point)
{
TCHAR s[20]={0};
sprintf(s,"point %d,%d",point.x,point.y);
AfxMessageBox(s);
::PostMessage(m_hWnd,WM_MYMSG,1,2);
}
命令消息映射示例:
//创建按钮
::CreateWindowEx(0,"BUTTON","Test1",
WS_CHILD|WS_VISIBLE,100,100,100,40,
m_hWnd,(HMENU)1001,AfxGetInstanceHandle(),NULL);
//映射
BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)
ON_COMMAND(1001,OnTest1)
//ON_COMMAND_RANGE(1002,1003,OnTest);//多个控件使用一个处理函数
END_MESSAGE_MAP()
//类内声明
afx_msg void OnTest1();
//afx_msg void OnTest( UINT nID );//多控件处理函数原型

//类外实现
void CMyFrameWnd::OnTest1()
{
AfxMessageBox("OnTest1");
}
通知消息:
ON_通知码(如:ON_EN_CHANGE、ON_BN_CLICKED)
//创建控件
::CreateWindowEx(0,"EDIT","edit1",
WS_CHILD|WS_VISIBLE|WS_BORDER,200,100,100,40,
m_hWnd,(HMENU)1004,AfxGetInstanceHandle(),NULL);
//消息映射
ON_EN_CHANGE(1004,OnEnChange);
//类内声明
afx_msg void OnEnChange();
//类外实现
void CMyFrameWnd::OnEnChange()
{
AfxMessageBox("OnEnChange");
}

MFC菜单(CMenu)

CMenu类封装了对菜单操作的各种函数,还封装了m_hMenu 菜单句柄
1.插入菜单资源,并新建几项,把.res和resource.h文件插入到工程,在.cpp中包含resource.h
2.加载菜单
方式1,创建时传入,其他值默认值:
pFrame->Create(NULL,"MFCmenu",WS_OVERLAPPEDWINDOW,CFrameWnd::rectDefault,NULL,MAKEINTRESOURCE(IDR_MENU1));
方式2,在WM_CREATE中挂载菜单:
class CMyFrameWnd:public CFrameWnd
{
DECLARE_MESSAGE_MAP()
public:
afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct);
};
BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)
ON_WM_CREATE()
END_MESSAGE_MAP()
int CMyFrameWnd::OnCreate( LPCREATESTRUCT lpCreateStruct)
{
CMenu menu;
menu.LoadMenu(IDR_MENU1);
SetMenu(&menu);
return CFrameWnd::OnCreate(lpCreateStruct);
}

//消息
ON_WM_INITMENUPOPUP() //将要显示菜单时的消息
//消息原型
afx_msg void OnInitMenuPopup(CMenu* menu,UINT flag,BOOL IsWindowMenu);
void CMyFrameWnd::OnInitMenuPopup(CMenu* menu,UINT flag,BOOL IsWindowMenu)
{
//::CheckMenuItem(menu->m_hMenu,IDM_new,MF_BYCOMMAND|MF_CHECKED);//win32
menu->CheckMenuItem(IDM_new,MF_BYCOMMAND|MF_CHECKED);//mfc
}
//菜单项目点击事件绑定
ON_COMMAND(IDM_new,OnNew)
//函数原型和实现
afx_msg void OnNew();
void CMyFrameWnd::OnNew()
{
AfxMessageBox("OnNew");
}
day80 pm over!
WM_COMMAND消息处理顺序:CView>CFrameWnd>CWinApp

3、显示菜单:右键菜单
ON_WM_CONTEXTMENU()
afx_msg void OnContextMenu( CWnd* pwin, CPoint point);
void CMyFrameWnd::OnContextMenu( CWnd* pwin, CPoint point )
{
CMenu menu;
menu.LoadMenu(IDR_MENU1);
CMenu * menufile=menu.GetSubMenu(0);//获取弹出菜单部分
//::TrackPopupMenu(menufile->m_hMenu,TPM_LEFTALIGN,point.x,point.y,NULL,m_hWnd,NULL);//显示菜单
menufile->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,pwin,NULL);

}

综合示例,插入菜单资源,包含resource.h头文件:

// MFCmenu.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "resource.h"
class CMyFrameWnd:public CFrameWnd
{
	DECLARE_MESSAGE_MAP()
public:
	afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct);
	afx_msg void OnNew();
	afx_msg void OnInitMenuPopup(CMenu* menu,UINT flag,BOOL IsWindowMenu);
	afx_msg void OnContextMenu( CWnd* pwin, CPoint point );
};
BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)
ON_WM_CREATE()
//ON_COMMAND(IDM_new,OnNew)
ON_WM_CONTEXTMENU()
ON_WM_INITMENUPOPUP()
END_MESSAGE_MAP()
void CMyFrameWnd::OnContextMenu( CWnd* pwin, CPoint point )
{
	CMenu menu;
	menu.LoadMenu(IDR_MENU1);
	CMenu * menufile=menu.GetSubMenu(0);//获取弹出菜单部分
	//::TrackPopupMenu(menufile->m_hMenu,TPM_LEFTALIGN,point.x,point.y,NULL,m_hWnd,NULL);//显示菜单
	menufile->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,pwin,NULL);
}
void CMyFrameWnd::OnInitMenuPopup(CMenu* menu,UINT flag,BOOL IsWindowMenu)
{
	//::CheckMenuItem(menu->m_hMenu,IDM_new,MF_BYCOMMAND|MF_CHECKED);//win32 API函数
	menu->CheckMenuItem(IDM_new,MF_BYCOMMAND|MF_CHECKED);//mfc函数
}
void CMyFrameWnd::OnNew()
{
	AfxMessageBox("CMyFrameWnd::OnNew");
}
int CMyFrameWnd::OnCreate( LPCREATESTRUCT lpCreateStruct)
{
	CMenu menu;
	menu.LoadMenu(IDR_MENU1);
	this->SetMenu(&menu);
	return CFrameWnd::OnCreate(lpCreateStruct);
}
class CMyWinApp:public CWinApp
{
	DECLARE_MESSAGE_MAP()
public:
	virtual BOOL InitInstance();
	afx_msg void OnNew();
};
BEGIN_MESSAGE_MAP(CMyWinApp,CWinApp)
	ON_COMMAND(IDM_new,OnNew)
END_MESSAGE_MAP()
void CMyWinApp::OnNew()
{
	AfxMessageBox("CMyWinApp::OnNew");
}
CMyWinApp theApp;
BOOL CMyWinApp::InitInstance()
{
	CMyFrameWnd *pFrame=new CMyFrameWnd;
	pFrame->Create(NULL,"MFCmenu"/*,WS_OVERLAPPEDWINDOW,CFrameWnd::rectDefault,
		NULL,MAKEINTRESOURCE(IDR_MENU1)*/);
	m_pMainWnd=pFrame;
	pFrame->ShowWindow(SW_SHOW);
	pFrame->UpdateWindow();
	return TRUE;
}
时间: 2024-12-28 04:55:53

C++MFC编程笔记day02 MFC消息映射机制、菜单资源使用的相关文章

C++MFC编程笔记day01 MFC介绍、创建MFC程序和重写消息处理

一.MFC概念和作用 1.全称Microsoft Foundation Class Library,我们称为微软基础类库,封闭了绝大部分的win32 Api函数,C++语法中的数据结构,程序的执行流程MFC就是一个库(动态库,静态库)MFC还是一个程序框架 2.为什么使用MFC基于框架编程,提高工作效率,减少开发周期,节约开发成本. 二.几个重要的头文件 afx.h    -绝大部分类的声明头文件 afxwin.h -包含了afx.h和windows.h afxext.h -提供了扩展窗口类的支

C++MFC编程笔记day03 MFC工具栏、状态栏、视图窗口

MFC工具栏 相关类: CToolBarCtrl - 父类是 CWnd  封装了工具栏控件相关操作 CToolBar - 父类是CControlBar  封装了工具栏和框架窗口之间的关系 工具栏使用: //把工具栏对象定义为 CMyFrameWnd成员: CToolBar toolbar; //在窗口创建时,加载工具栏资源 int CMyFrameWnd::OnCreate(LPCREATESTRUCT lpc) {toolbar.CreateEx(this,TBSTYLE_FLAT,WS_CH

C++MFC编程笔记day06 MFC向导、MFC绘图类使用

 MFC绘图    MFC绘图类包括绘图设备类和绘图对象类    1 绘图设备类      CDC类-父类是CObject,封装的是一般的绘图设备,例如:显示器,            打印机等.      CWindowDC类-父类是CDC类,封装的是窗口对象,包括客户区和非            客户区.      CClientDC类-父类是CDC类,封装的仍然是窗口,但是只包括客户区.      CPaintDC类-父类是CDC类,封装的是窗口的客户区.但是,它只用           

孙鑫VC++讲座笔记-(4)MFC消息映射机制的剖析

孙鑫VC++讲座笔记-(4)MFC消息映射机制的剖析 一,消息映射机制 1,消息响应函数:(例:在CDrawView类响应鼠标左键按下消息) 1)在头文件(DrawView.h)中声明消息响应函数原型. //{{AFX_MSG(CDrawView) //注释宏 afx_msg void OnLButtonDown(UINT nFlags, CPoint point); //}}AFX_MSG //注释宏 说明: 在注释宏之间的声明在VC中灰色显示.afx_msg宏表示声明的是一个消息响应函数.

MFC的消息映射机制揭秘

MFC的设计者们在设计MFC时,紧紧把握一个目标,那就是尽可能使得MFC的代码要小,速度尽可能快.为了这个目标,他们使用了许多技巧,其中很多技巧体现在宏的运用上,实现MFC的消息映射的机制就是其中之一.  同MFC消息映射机制有关的宏有下面几个:  DECLARE_MESSAGE_MAP()宏  BEGIN_MESSAGE_MAP(theClass, baseClass)和END_MESSAGE_MAP()宏  弄懂MFC消息映射机制的最好办法是将找出一个具体的实例,将这些宏展开,并找出相关的数

c++-C++ 6.0关于函数的消息映射机制的发问

问题描述 C++ 6.0关于函数的消息映射机制的发问 看了一些文章介绍,C++ 6.0的消息映射以后,函数接收到消息处理以后就返回系统控制权了,但是能得到当前消息的上一个消息么?我想知道这个消息是否执行过了 解决方案 http://blog.csdn.net/hxh129/article/details/9313897

MFC教程(4)-- 消息映射的实现(2)

但是在当前例子中,当前对象的类CTview没有覆盖该函数,所以CWnd的WindowProc被调用. 这个函数把下一步的工作交给OnWndMsg函数来处理.如果OnWndMsg没有处理,则交给DefWindowProc来处理. OnWndMsg和DefWindowProc都是CWnd类的虚拟函数. OnWndMsg的原型如下: BOOL CWnd::OnWndMsg( UINT message, WPARAM wParam, LPARAM lParam,RESULT*pResult ); 该函数

C++MFC编程笔记day05 文档类-单文档和多文档应用程序

 文档类    1 相关类    CDocument类-父类是CCmdTarget类,所以,文档类也可以处理菜单等               命令消息.作用保存和管理数据.    注意事项:如何解决断言错误    2 在视图中显示文档中的数据     2.1 CView::OnInitialUpdate         作用初始化视图,在附加文档之后,显示之前,由框架调用.     2.2 CView::GetDocument         获取与视图相关的文档     2.3 CFrame

C++MFC编程笔记day04 运行时类信息和窗口的动态、静态切分

运行时类信息 程序在运行时,获取对象类的信息及类的继承关系实现:1.定义类继承自CObject类.2.类内声明宏DECLARE_DYNAMIC(),类外实现宏IMPLEMENT_DYNAMIC()3.使用:BOOL IsKindOf(CRuntimeClass* pClass)//对象是否属于某个类CRuntimeClass* GetRuntimeClass( );//获取对象运行时类信息,经常使用RUNTIME_CLASS(类名)代替. 示例: #include "stdafx.h"