mfc编程步骤,mfc编写简单界面

  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

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: