一、菜单栏
1、CMenu:封装了关于菜单的各种操作,还封装了一个非常重要的成员变量,m_hMenu(菜单句柄)
2、创建框架
#include <afxwin.h> //创建自己的框架类 class CMyFrameWnd :public CFrameWnd //CCmdTarget是CFramWnd的子类 { }; class CMywinApp :public CWinApp { public: virtual BOOL InitInstance(); }; CMywinApp theApp; BOOL CMywinApp::InitInstance() { CMyFrameWnd* pFrame = new CMyFrameWnd; pFrame->Create(NULL, "aiyou"); m_pMainWnd = pFrame; pFrame->ShowWindow(SW_SHOW); pFrame->UpdateData(); return TRUE; }
3、添加菜单资源,修改属性ID
4、将菜单显示到窗口
包含资源头文件,#include "resource.h"
第一种方法:在创建框架窗口传参数
Create(NULL, "aiyou",
WS_OVERLAPPEDWINDOW,//显示风格
CFrameWnd::rectDefault,//默认的位置大小
NULL,
(char*)IDR_MENU1);//菜单ID
第二种方法:利用消息机制
内部外部分别添加类
重写OnCreate方法
class CMyFrameWnd :public CFrameWnd //CCmdTarget是CFramWnd的子类 { DECLARE_MESSAGE_MAP() public: CMenu menu;//为了延长生命周期 afx_msg int OnCreate(LPCREATESTRUCT IpCreateStruct); }; int CMyFrameWnd::OnCreate(LPCREATESTRUCT IpCreateStruct) { //CMenu menu; menu.LoadMenu(IDR_MENU1);//加载菜单,将菜单句柄和menu对象建立绑定关系 SetMenu(&menu);//显示 return CFrameWnd::OnCreate(IpCreateStruct); }
运行结果
5、命令消息(WM_COMMAND)的处理
框架类不处理会找应用类处理
//添加要处理的宏信息 ON_COMMAND(ID_XJ,xinjian) //声明xinjian函数 afx_msg void xinjian(); //重写xinjian函数 void CMyFrameWnd::xinjian() { AfxMessageBox("框架类处理信件被点击发出COMMAND消息"); }
运行结果:
6、设置菜单项状态
//添加处理状态的宏 ON_WM_INITMENUPOPUP() //声明函数 afx_msg void OnInitMenuPopup(CMenu* pPopup, UINT nPos, BOOL i); //重写函数 void CMyFrameWnd::OnInitMenuPopup(CMenu* pPopup, UINT nPos, BOOL i) { ::CheckMenuItem(pPopup->m_hMenu,ID_XJ,MF_CHECKED);//第一个要修改的菜单句柄,修改的id,要修改的模式(选中) }
运行结果:
7、上下文菜单(右键菜单)
//添加处理上下文菜单的宏 ON_WM_CONTEXTMENU() //声明函数 afx_msg void OnConTextMenu(CWnd* pWnd,CPoint pt); //重写函数 void CMyFrameWnd::OnContextMenu(CWnd* pWnd, CPoint pt) { CMenu menu; menu.LoadMenu(IDR_MENU1); CMenu* pPopup= menu.GetSubMenu(0);//文件的索引为0 ::TrackPopupMenu(pPopup->m_hMenu, TPM_CENTERALIGN | TPM_VCENTERALIGN,pt.x,pt.y,0,this->m_hWnd,NULL); }