vccmenu派生类:CMenu类的使用方法



CMenu类从CObject类派生而来为什么要使用CMenu类呢?AppWzard不是把菜单做好了吗?在资源编辑器上修改菜单不是很方便吗?我是个vc初学者自从当斑竹以来天天看贴子也学到了不少东西感觉学vc稍微深入点好至少要能搞清楚AppWizard在背后都干了些什么东西
事实上mfc就是用CMenu类来生成菜单让我们就从CMenu开始吧CMenu生成菜单有两种:Popup类型和非Popup类型这两种思路方法里又可以分成使用资源编辑器生成菜单资源和不使用这个资源对于非Popup类型菜单必须在创建出来后把它张贴到某个窗口上它才会显示出来从而才有用处Po
pup菜单却不能张贴到窗口上
介绍说明的前先定义几个常量:
# IDM_MENU0 0
# IDM_MENU1 1
# IDM_MENU2 2
# IDM_MENU3 3
# IDM_ITEM0 10
# IDM_ITEM1 11
# IDM_ITEM2 12
# IDM_ITEM3 13
# IDM_ITEM4 14
# IDM_ITEM5 15
# IDM_ITEM6 16


创建非Popup类型菜单不使用资源
()创建非下拉菜单
1在窗口类OnCreate里创建CMenu对象如果是创建运用主框架窗口也可以在InitInstance
2声明个CMenu对象:CMenu MyMenu;
3MyMenu.CreateMenu或MyMenu.LoadMenu
4若干次MyMenu.AppendMenu或MyMenu.InsertMenu次创建个菜单项
5MyMneu.SetMenu将菜单Attach到窗口上
6MyMenu.Detach

例子:
CMyWnd::OnCreate( LPCREATESTRUCT lpCreateStruct )
{
{
CMenu MyMenu;
MyMenu.CreateMenu;
MyMenu.AppendMenu(MF_STRING,IDM_MENU0,"文件");
MyMenu.AppendMenu(MF_STRING,IDM_MENU1,"编辑");
MyMenu.AppendMenu(MF_STRING,IDM_MENU2,"查看");
MyMenu.AppendMenu(MF_STRING,IDM_MENU3,"帮助");
MyMenu.InsertMenu(IDM_MENU2,MF_BYCOMMAND,IDM_ITEM0,"有关");
this->SetMenu(&MyMenu);
MyMenu.Detach;
0;
}//各个细节就不讲解了看联机帮助是最好
这个思路方法是先把菜单创建好后再贴到窗口上去然后用Detach使菜单和My Menu对象脱离关系MyMenu对象马上就要超出作用域了步是必须


( 2)创建下拉菜单不使用资源
这种菜单当鼠标移动到菜单条目上面点击时不是去执行某段而是弹出个下拉菜单这需要用前面思路方法创建两个菜单个是鼠标未点击时看到那个菜单个就是扮演下拉菜单菜单例子:
CMyWnd::OnCreate( LPCREATESTRUCT lpCreateStruct )
{
CMenu MyMenu0,MyMenu1;
//下面这几条创建下拉菜单
MyMenu1.CreateMenu;
MyMenu1.AppendMenu(MF_STRING,IDM_ITEM0,"拷贝");
MyMenu1.AppendMenu(MF_STRING,IDM_ITEM1,"剪切");
MyMenu1.AppendMenu(MF_STRING,IDM_ITEM2,"粘贴");
MyMenu1.AppendMenu(MF_SEPARATOR,IDM_ITEM3,"");
MyMenu1.AppendMenu(MF_STRING,IDM_ITEM4,"全选");
MyMenu1.AppendMenu(MF_SEPARATOR,IDM_ITEM5,"");
MyMenu1.AppendMenu(MF_STRING,IDM_ITEM6,"删除");
//下面这两条创建鼠标未点击时看到那个菜单
//其中第 2句将下拉菜单张贴到第个菜单上
MyMenu0.CreateMenu;
MyMenu0.AppendMenu(MF_POPUP,(UINT)MyMenu1.m_hMenu,"编辑");

this->SetMenu(&MyMenu0);//将菜单张贴到窗口上
MyMenu0.Detach;//必须有
MyMenu1.Detach;//必须有
0;
}

2创建Popup类型菜单也不用资源
很多只要用鼠标右键点下窗口客户区就会在鼠标位置弹出个菜单这叫右键菜单我们可以用CMenu类来制作
制作这种菜单比制作第类菜单稍微复杂点首先要在窗口类里加个成员变量:CMenu *MyMenu2;
然后在窗口类构造里(或OnCreate里)加上创建菜单语句再在析构里加上销毁菜单语句最后在OnRButtonDown里加上显示菜单语句
创建菜单时CMenu类对象应该用来分配
例子:

CMyWnd::CMyWnd
{
//CMyWnd是从CWnd派生来
//先把菜单创建起来
MyMenu2= CMenu;
MyMenu2->CreatePopupMenu;
MyMenu2->AppendMenu(MF_STRING,IDM_ITEM0,"拷贝");
MyMenu2->AppendMenu(MF_STRING,IDM_ITEM1,"剪切");
MyMenu2->AppendMenu(MF_STRING,IDM_ITEM2,"粘贴");
MyMenu2->AppendMenu(MF_SEPARATOR,IDM_ITEM3,"");
MyMenu2->AppendMenu(MF_STRING,IDM_ITEM4,"全选");
MyMenu2->AppendMenu(MF_SEPARATOR,IDM_ITEM3,"");
MyMenu2->AppendMenu(MF_STRING,IDM_ITEM5,"删除");

}
CMyWnd::~CMyWnd
{
MyMenu2->DestroyMenu;//销毁菜单所占用系统资源
delete MyMenu2;//销毁菜单类对象
}
void CMyWnd::OnRButtonDown(UINT nFlags, CPo po)
{
RECT rect;
GetWindowRect(&rect);
//显示菜单
MyMenu2->TrackPopupMenu(TPM_RIGHTALIGN,po.x+rect.left,po.y+
rect.top,this,NULL);
}

3使用资源编辑器做好菜单只能做非POPUP类型菜单
如果使用资源创建菜单确实非常简单了只须在窗口类OnCreate
里加几句话就行了:
CMyWnd::OnCreate( LPCREATESTRUCT lpCreateStruct )
{
CMenu MyMenu3;
MyMenu3.LoadMenu(IDR_MENU1);//IDR_MENU1是你菜单资源ID
this->SetMenu(&MyMenu3);
MyMenu3.Detach;
0;
}



CMenu类还有很多成员使你可以在运行中对菜单进行裁剪比如加上几项或减去几项等等使用非常方便大家可以去看msdn

如果要实验以上菜单创建思路方法可以用个非常简单mfc来搞:


//这是个非常简单mfc必要自己去加吧
#



CMyApp : public CWinApp
{
public:
virtual BOOL InitInstance;
};
};

CMyWnd : public CWnd
{
public:
DECLARE_MESSAGE_MAP
};

CMyApp MyApp;

BEGIN_MESSAGE_MAP(CMyWnd,CWnd)
END_MESSAGE_MAP

BOOL CMyApp::InitInstance
{
RECT rect={30,30,400,300};
CMyWnd* pCWindow= CMyWnd;
pCWindow->CreateEx
(
NULL,
AfxRegisterWndClass(NULL,0,(HBRUSH)::GetStockObject(WHITE_BRU
SH),0),
"实验",
WS_OVERLAPPEDWINDOW,
rect,NULL,NULL,NULL
);
m_pMainWnd = pCWindow;
pCWindow->ShowWindow(m_nCmdShow);
pCWindow->UpdateWindow;

TRUE;
}

Tags:  cmenumenu cmenumfc cmenu vccmenu派生类

延伸阅读

最新评论

发表评论