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;
}

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

时间: 2024-10-10 00:48:36

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

C++MFC编程笔记day07 MFC单文档绘图保存、多文档绘图保存

完善绘图例子(day06中的),加上保存功能 1 设计和编写图形类 CShape 1.1 成员变量 CPoint m_ptBegin; CPoint m_ptEnd; UINT m_nType; 1.2 支持序列化 1.2.1 继承自CObject 1.2.2 添加序列化的声明宏和实现宏 1.2.3 重写虚函数Serilize(),在函数中,完成成员变量的序列化 2 由于保存多个图形,引入MFC的集合类CObArray,保存的是CObject 对象的地址. 3 图形数据需要保存到文档类中,在该类

C++MFC编程笔记day08 MFC对话框的使用

一 MFC对话框 1 分类 模式和非模式 2 相关类 CDialog类-父类是CWnd,本质上是一个窗口,对话框类的父类. CCommonDialog类以及子类-通用对话框,颜色对话框.文件对话框. 查找替换对话框.字体设置对话框.打印设置对话框和 打印对话框. CPropertyPage类-属性页对话框. 3 在Win32向导中,使用MFC的类创建对话框程序 3.1 模式对话框 3.1.1 创建和显示对话框 CDialog::DoModal() 3.1.2 对话框的关闭(无需用户处理) CDi

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

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

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编程笔记day06 MFC向导、MFC绘图类使用

MFC绘图 MFC绘图类包括绘图设备类和绘图对象类 1 绘图设备类 CDC类-父类是CObject,封装的是一般的绘图设备,例如:显示器, 打印机等. CWindowDC类-父类是CDC类,封装的是窗口对象,包括客户区和非 客户区. CClientDC类-父类是CDC类,封装的仍然是窗口,但是只包括客户区. CPaintDC类-父类是CDC类,封装的是窗口的客户区.但是,它只用 在窗口的WM_PAINT消息处理函数中. CMetaFileDC类-父类是CDC类,作用保存绘制命令. 2 使用 创建

C++MFC编程笔记day07 MFC的文件操作、序列化和保存

一 MFC的文件操作 1 相关类 CFile类-封装了文件句柄以及操作文件的API函数. CFileFind类-提供文件查找功能. 2 CFile类的使用 2.1 打开或者新建文件 CFile::Open 2.2 文件读写 注意:1 文件指针位置 2 异常处理 CFile::Write CFile::Read CFile::SeekToBegin 2.3 关闭文件 CFile::Close 2.4 设置/获取文件属性 CFile::SetStatus/GetStatus 3 CFileFind类

MFC编程入门之五(MFC消息映射机制概述)

在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息,通过对消息的处理实现相应的操作.比较典型的过程是,用户操作窗口,然后有消息产生,送给窗口的消息处理函数处理,对用户的操作做出响应. 一.什么是消息?  窗口消息一般由三个部分组成:1.一个无符号整数,是消息值:2.消息附带的WPARAM类型的参数:3.消息附带的LPARAM类型的参数.其实,我们一般所说的消息是侠义上的消息值,也就是一个无符号整数,经常被定义为宏. 二.什么是消息映射机制?  MFC使用一种消息映射机制来处理消息,在应

VS2010/MFC编程入门之五(MFC消息映射机制概述)

VS2010/MFC编程入门之五(MFC消息映射机制概述)-软件开发-鸡啄米 http://www.jizhuomi.com/software/147.html     上一讲鸡啄米为大家简单分析了MFC应用程序框架,这一讲是关于MFC消息映射机制的内容.        前面已经说过,Windows应用程序是消息驱动的.在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息,通过对消息的处理实现相应的操作.比较典型的过程是,用户操作窗口,然后有消息产生,送给窗口的消息处理函数处理,对用户的

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

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