mfc编程步骤,mfc编写简单界面
菜单结构
菜单栏可以有几个子菜单,子菜单可以有几个菜单项。
对于菜单栏中的子菜单,从0开始从左向右索引。
对于特定子菜单的菜单项,从0开始的索引是从上到下建立的。
您可以通过索引或标识来访问子菜单和菜单项。对于在窗口的客户区右击弹出的菜单,如果弹出菜单属于视图窗口,则菜单项只能在响应视图和文档消息时被点击。如果弹出菜单属于框架窗口,则弹出菜单上的消息路由遵循View -DOC-MainFrame-APP的响应顺序。
与菜单相关的重要功能
CMenu * GetMenu();//获取菜单指针CMenu * Get submenu();//获取子菜单指针,即弹出菜单指针UINT check menuitem();//添加或删除菜单项的(复选标记)。
A.如果第一个参数是ID号,第二个参数必须是MF_BYCOMMAND MF_CHECKED的组合。
B.如果第一个参数是索引号,第二个参数必须是MF _ by position MF _ CHECKED BOOL SetDefaultItem()的组合;//设置默认菜单,即以粗体显示菜单项。
A.如果第一个参数是索引号,则第二个参数必须为true
B.如果第一个参数是ID号,第二个参数必须是false
*注意:一个子菜单最多只能有一个默认菜单项BOOL SetMenuItemBitmaps();//设置位图标记,标记大小为13*13像素。
A.如果第一个参数是ID号,第二个参数必须是MF_BYCOMMAND。
B.如果第一个参数是索引号,第二个参数必须是MF_BYPOSITION
,第三个参数是未选中时的位图,第四个参数是标记时的位图UINT enable menuitem();//使菜单项有效、无效或变灰
A.如果第一个参数是ID号,第二个参数必须是MF_BYCOMMAND和valid、invalid或灰显的组合。
B.如果第一个参数是索引号,第二个参数必须是MF_BYPOSITION和有效、无效或灰显的组合。
*注意:要使该函数生效,必须在mainfrm构造函数中添加:m_bAutoMenuEnable=false。
此时,其他灰显的菜单项会恢复到非灰显状态,BOOL SetMenu( CMenu* pMenu)会有副作用;//设置新菜单或删除当前窗口中的菜单。
如果参数为0,则删除菜单。
创建您自己的菜单{ CMenu menu菜单。load menu(IDR _ menu 1);
SetMenu(菜单);菜单。detach();} HMENU Detach();//如果将CMenu对象设置为局部对象,则使用Detach()将窗口菜单句柄与菜单对象分离,这样在析构菜单对象时,窗口菜单资源不会被破坏。
菜单相关操作的实现方法
A.添加复选标记:
方法一:get menu()-get submenu(0)-check menuitem(0,MF _ by position MF _ checked);//按索引
方法二:get menu()-get submenu(0)-check menuitem(id _ file _ new,MF _ by command MF _ checked);//按ID
B.设置默认菜单项:
每个子菜单最多只能有一个默认菜单项。
方法一:get menu()-get submenu(0)-setdefaultitem(1,true);//按索引
方法二:get menu()-get submenu(0)-set default item(id _ file _ open,false);//按ID
C.添加图形标记:
方法1:通行证ID
CBitmap位图;//必须设置为全局对象
位图。load bitmap(IDB _ bitmap 1);
GetMenu()-get submenu(0)-SetMenuItemBitmaps(ID _ FILE _ NEW,MF_BYCOMMAND,bitmap,bitmap);
方法2:通过索引
CBitmap位图;//必须设置为全局对象
位图。load bitmap(IDB _ bitmap 1);
GetMenu()-get submenu(0)-SetMenuItemBitmaps(0,MF_BYPOSITION,bitmap,bitmap);
D.使菜单无效并变灰
//必须添加在构造函数中:m _ bAutoMenuEnable=false
get menu()-get submenu(0)-enable menuitem(ID _ FILE _ OPEN,MF _ by command MF _ DISABLED MF _ GRAYED);
E.删除菜单
SetMenu(0);
F.添加菜单
CMenu菜单;
菜单。load menu(IDR _ MAINFRAME);
SetMenu(菜单);
菜单。detach();
图形尺寸
获取系统位图标记的大小:
CString字符串;
海峡。Format(x=%d,y=%d ,getsystem metrics(SM _ CXMENUCHECK),getsystem metrics(SM _ CYMENUCHECK));
MessageBox(str);
命令更新机制
菜单的UPDATE_COMMAND_UI消息响应
{
pCmdUI- Enable(假);//true和false来设置是否可以使用或灰显。
PCM dui-set check(true);//true和false来设置标签
PCM dui-SetText(" cut ");//更改菜单项的文本内容
}
动态菜单创建
首先定义几个常数:
#define 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
//在最后一个菜单项后添加一个菜单项
BOOL AppendMenu ( UINT nFlags,UINT nIDNewItem=0,LPCTSTR lpszNewItem=NULL);
BOOL AppendMenu ( UINT nFlags,UINT nIDNewItem,const cbit map * pBmp);
//插入菜单项
BOOL InsertMenu( UINT nPosition,UINT nFlags,UINT nIDNewItem=0,LPCTSTR lpszNewItem=NULL);
BOOL InsertMenu( UINT nPosition,UINT nFlags,UINT nIDNewItem,const cbit map * pBmp);
//删除菜单项
BOOL RemoveMenu( UINT nPosition,UINT nFlags);
//删除菜单项
BOOL DeleteMenu( UINT nPosition,UINT nFlags);
首先,创建一个不使用资源的非弹出菜单。
(A)创建一个非下拉菜单。
1。在window类的OnCreate函数中创建一个CMenu对象。如果您正在创建应用程序主框架窗口
,也可以在InitInstance()函数中。
2。声明一个CMenu对象:CMenu MyMenu
3。调用我的菜单。CreateMenu()或MyMenu。LoadMenu()
4。调用我的菜单。AppendMenu()或MyMenu。多次插入Menu(),并创建一个
菜单项。
5。打电话给MyMneu。SetMenu()将菜单附加到窗口。
6。调用我的菜单。分离()。
示例:
int CMyWnd:OnCreate(LPCREATESTRUCT LPCREATESTRUCT)
{
CMenu MyMenu
我的菜单。create menu();
Mymenu.appendmenu (MF _ string,IDM _ menu0, file );
Mymenu.appendmenu (MF _ string,IDM _ menu1, edit );
Mymenu.appendmenu (MF _ string,IDM _ menu2, view );
Mymenu.appendmenu (MF _ string,IDM _ menu3, Help );
My menu.insert menu (IDM _ menu2,MF _ by命令,IDM _ item0,相关);
this- SetMenu(我的菜单);
我的菜单。detach();
返回0;
}//每个函数的细节我就不说了。最好看在线帮助。
这个方法是先创建菜单,然后粘贴到窗口上,再用Detach()将菜单从MyMenu对象中分离出来,因为MyMenu对象很快就会超出范围,这一步是必须的。
(B)在不使用资源的情况下创建下拉菜单。
当鼠标移动到菜单项上点击时,这个菜单并不执行某个程序,而是弹出来。
下拉菜单。这需要用前面的方法创建两个菜单。第一种是没有点击鼠标的时候。
那个菜单,另一个是作为下拉菜单的菜单。示例:
int CMyWnd:OnCreate(LPCREATESTRUCT LPCREATESTRUCT)
{
CMenu MyMenu0,MyMenu1
//以下项目创建下拉菜单
MyMenu1。create menu();
Mymenu1.appendmenu (MF _ string,IDM _ item0, copy );
Mymenu1.appendmenu (MF _ string,IDM _ item1, cut );
Mymenu1.appendmenu (MF _ string,IDM _ item2, paste );
MyMenu1。AppendMenu(MF_SEPARATOR,IDM_ITEM3, );
Mymenu1.appendmenu (MF _ string,IDM _ item4,全选);
MyMenu1。AppendMenu(MF_SEPARATOR,IDM_ITEM5, );
Mymenu1.appendmenu (MF _ string,IDM _ item6, delete );
//下面两个创建了当鼠标没有被点击时你看到的菜单。
//第二句把下拉菜单贴到第一个菜单。
MyMenu0。create menu();
Mymenu0.appendmenu (MF _ popup,(uint) mymenu1.m _ hmenu, edit );
this-SetMenu(my menu 0);//将菜单发布到窗口
MyMenu0。detach();//肯定有
MyMenu1。detach();//肯定有
返回0;
}
第二,创建没有资源的弹出式菜单。
在很多程序中,只要用鼠标右键点击窗口的客户区,鼠标位置就会弹出一个弹出窗口。
一个菜单,这叫做右键菜单。我们可以用CMenu类来实现它。
制作这种菜单比制作第一种菜单稍微复杂一些。首先,向窗口类添加一个成员更改。
数量:CMenu * MyMenu2
然后添加一条语句,在window类的构造函数中(或者在OnCreate()函数中)创建一个菜单,然后
在析构函数中添加销毁菜单的语句,最后在OnRButtonDown()函数中添加显示菜单。
的声明。
创建菜单时,CMenu类对象应分配新的。
示例:
CMyWnd:CMyWnd()
{
//cmynd是从CWnd加拿大)派生来的。
//先把菜单创建起来。
我的菜单2=新建cm菜单:
我的菜单2-createpoppmenu();
MyMenu2- AppendMenu(MF_STRING,IDM_ITEM0,拷贝);
MyMenu2- AppendMenu(MF_STRING,IDM_ITEM1,剪切);
MyMenu2- AppendMenu(MF_STRING,IDM_ITEM2,粘贴);
我的菜单2-追加菜单(MF _ separator,IDM_ITEM3,);
MyMenu2- AppendMenu(MF_STRING,IDM_ITEM4,全选);
我的菜单2-追加菜单(MF _ separator,IDM_ITEM3,);
MyMenu2- AppendMenu(MF_STRING,IDM_ITEM5,删除);
}
cm ywond:~ cm ywond()
{
我的菜单2-destromenu();//销毁菜单所占用的系统资源
删除MyMenu2://销毁菜单类对象
}
请参阅cmynd:onrbuttondtown(uint NFL标签,cpoint点)
{
直线型;
GetWindowRect(矩形);
//显示菜单
我的菜单双轨道弹出菜单(TPM _ right align、point.x rect.left、point.y)
rect.top,this,null
}
发件人:http://博客。。net/ltag 0110 RTG/文章/详细信息/7368633