小时候偷偷吃泡面,长大后偷偷吃泡面,小时候怕爸妈知道,长大后怕爸妈知道,以前没钱吃泡面,现在没钱吃泡面。。。
---- 网易云热评
一、菜单栏
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);
}
欢迎关注公众号:顺便编点程