zoukankan      html  css  js  c++  java
  • 菜单

    1、在菜单项前添加标记

    用到的函数

    GetMenu()  作用 :获取菜单栏;GetSubMenu() 作用: 获取子菜单;

    CheckMenuItem()作用:菜单标记;

     函数功能:该函数取得与指定菜单项相联系的菜单标志。如果该菜单项打开了一个子菜单,该函数也返回子菜单里的菜单项数。

     

     函数原型:DWORD CheckMenuItem(HMENU hmenu, UINT uIDCheckItem, UINT uCheck); 

     

     参数:

     

      hmenu:含有其菜单项的标志将被提取得的菜单的句柄。一般为缺省值,可以省略。

     

      uIDCheckItem:指定要修改的菜单项。这个参数取决于第三个参数,若第三个参数为MF_BYCOMMAND,则该参数是所选菜单项的ID号,若为MF_BYPOSITION,则该参数是所选菜单的索引值。

     

      uCheck:表示标记的状态。此参数可取下列值之一:

     

      MF_BYCOMMAND:表示参数uId给出菜单项的标识符。如果MF_BYCOMMAND和MF_BYPOSITION都没被指定,则MF_BYCOMMAND是缺省值。

     

      MF_BYPOSITION:表示参数uId给出菜单项相对于零的位置。

          其中MF_BYCOMMAND和MF_BYPOSITION均可以与菜单项相关的菜单标志一起使用。
     

     

      返回值:如果指定的项不存在,返回值是OXFFFFFFFF;如果菜单项打开了一个子菜单,则返回值的低位含有与菜单相联系的菜单标志,高位含有子菜单的项数。否则,返回           值是莱单标志的掩码(布尔OR)。

     

      下面列出与菜单项相关的菜单标志。

     

      MF_CHECKED:放置选取标记于菜单项旁边(只用于下拉式菜单、子菜单或快捷菜单)。

     

      MF_DISABLED:使菜单项无效。MF_GRAYED:使菜单项无效并交灰。MF_HILITE:加亮菜单项。

     

      MF_MENUBARBREAK:对下拉式菜单、子菜单和快捷菜单,新列和旧列由垂直线隔开,其余功能同MF_MENUBREAK标志。

     

      MF_MENUBREAK:将菜单项放于新行(对菜单条)或无分隔列地放于新列(对下拉式菜单、子菜单或快捷菜单)。

     

      MF_SEPARATOR:创建一个水平分隔线(只用于下拉式菜单、子菜单或快捷菜单)。

     

      MF_UNCHECKED: 相当于MF_CHECKED 的反作用,取消放置于菜单项旁边的标记。

    例如:对文件-新建菜单前添加一个标记,可在CMainFrame类 oncreat()下添加如下代码:

          GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION|MF_CHECKED);

    或GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW,MF_BYCOMMOND|MF_CHECKED);


    2、创建缺省菜单项

    用到的函数:

    SetDaultItem()

    函数原型:BOOL SetDefaultItem(UINT UItem,BOOL fByPos = FALSE

    第二个参数缺省值是FALSE,若第二个参数是FALSE,则第一个参数是菜单项的ID,若若第二个参数是TRUE,则第一个参数是菜单项的索引值;

    例如:将文件-打开设置为缺省菜单,可在CMainFrame类 oncreat()下添加如下代码:

    GetMenu()->GetSubMenu(0)->SetDefaultItem(1,TRUE);

    GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_OPEN,FALSE);

    GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_OPEN);

    注意:在一个菜单项中只能有一个缺省菜单


    3、创建图形标记菜单

    用到的函数:SetMenuItemBitmaps

    函数原型:BOOL SetMenuItemBitmaps( UINT nPosition, UINT nFlags, const CBitmap* pBmpUnchecked, const CBitmap* pBmpChecked );

    第一个参数取决于第二个参数,若第二个参数是MF_BYPOSITION,第一个参数则为菜单项的索引,若第二个参数是MF_BYCOMMOND,第一个参数则为菜单项的ID.第三个参数是选择菜单项时菜单项前标记的位图,第四个参数是不选菜单项时它前边的位图标记。

    添加步骤

    a、新建一个bitmap

    b、在CMainFrame中添加成员变量 CBitmap bitmap;

    c、在oncreat中添加代码:

    bitmap.LoadBitmap(IDB_BITMAP1);
    GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,&bitmap,&bitmap);

    注意:图形标记菜单位图bitma的大小,可以先获取bitmap大小,通过以下代码:

    GetSystemMetrics()是获取系统信息;参数是指想获取关于哪方面的信息

    可以先获取图形标记菜单位图的大小

    CString str;
    str.Format("x = %d,y = %d",GetSystemMetrics(SM_CXMENUCHECK),GetSystemMetrics(SM_CYMENUCHECK));

    MessageBox(str);

    其中GetSystemMetrics(SM_CXMENUCHECK))和GetSystemMetrics(SM_CYMENUCHECK))分别是获取图形标记菜单位图的宽度和高度;

    通过 MessageBox输出。


    4、使菜单不可用

    用到的函数:

    EnableMenuItem()

    函数原型:BOOL EnableMenuItem(UINT uIDEnableItem, UINT uEnable);

    作用:允许或禁止指定的菜单条目

    但是在用EnableMenuItem()禁止指定的菜单条目时,应先在构造函数中赋值 m_bAutoMenuEnable = FALSE;

    例如: 将文件-保存设为不可用

    CMainFrame::CMainFrame()
    {
    m_bAutoMenuEnable = FALSE;
    }

    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {

    。。。

    GetMenu()->GetSubMenu(0)->EnableMenuItem(2,MF_BYPOSITION|MF_GRAYED);

    GetMenu()->GetSubMenu(0)->EnableMenuItem(ID_FILE_SAVE,MF_BYCOMMAND|MF_GRAYED);

    }

    (注意,若用索引,只能设置菜单的可用与不可用,而不能控制工具栏中图标的可用和不可用,但是,用ID号可以使控制菜单项状态与工具栏状态一致)

    5、取消和添加整个菜单

    取消菜单:

    在oncreat中添加代码 SetMenu(NULL);即可

    添加菜单:

    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {

            。。。

    CMenu menu;                                                  //定义变量
    menu.LoadMenu(IDR_MAINFRAME);                 //加载菜单
    SetMenu(&menu);                                            //添加菜单
    menu.Detach();                                                //将菜单句柄和c++断开,必须有。

    }

    命令更新机制:

    菜单项状态的维护是依赖于CN_UPDATE_COMMAND_UI消息,谁捕获了CN_UPDATE_COMMAND_UI消息,MFC就在其中创建了一个CCmdUI对象。可以通过类向导在消息映射中添加ON_UPDATE_COMMAND_UI宏来捕获CN_UPDATE_COMMAND_UI消息。

    在后台所作的工作是:操作系统发出WM_INITMEUPOPUP消息,然后由MFC基类如CFrameWnd接管。他创建一个CCmdUI对象,并与第一个菜单项相关联,调用对象的一个成员函数,DoUpdate()。这个函数发出CN_UPDATE_COMMAND_UI消息,这条消息带有指向CCmdUI对象的指针。同一个CCmdUI对象就设置为与第二个菜单项相关联,这样顺序进行,直到完成所有菜单项。

    更新命令UI处理程序仅应用于弹出式菜单项的项目,不能应用于永久显示的顶级菜单项目。

    利用这样的更新机制使菜单项能或不能使用可以用一下的方法:

    1、查看——建立类向导

    2、在object ids 中选择ID_FILE_NEW 在message中选择ON_UPDATE_COMMAND_UI,点击Addfunction。点击Edit。在函数中输入代码:

    pCmdUI->Enable(FALSE);

    3、运行,可以看到菜单上新建已经禁用。

    为了保证菜单项和工具栏中的工具相一致,一般用ID进行索引。

    6、右键弹出菜单功能

    工程——增加到工程——组建和控件——visual c++ components——pop-up-menu——insert——确定——add pop-up-menu to 中选择cmainmenu——关闭;

    运行,右击鼠标,弹出菜单;

    用到的函数:

    trackpopupmenu()

    函数功能:该函数在指定位置显示快捷菜单,并跟踪菜单项的选择。快捷菜单可出现在屏幕上的任何位置。

     

      函数原型:BOOL TrackPopupMenu(HMENU hMenu,UINT uFlags,int x,int y,int nReserved,HWND hWnd,CONST RECT* prcRect);

     

      hMenu:被显示的快捷菜单的句柄。此句柄可为调用CreatePopupMenu创建的新快捷菜单的句柄,也可以为调用GetSubMenu取得的与一个已存在菜单项相联系的子菜单的句柄。

     

      uFlags:一种指定功能选项的位标志。用下列标志位之一来确定函数如何水平放置快捷菜单:

     

      TPM_CENTERALIGN:若设置此标志,函数将按参数x指定的坐标水平居中放置快捷菜单。

     

      TPM_LEFTALIGN:若设置此标志,函数使快捷菜单的左边界与由参数X指定的坐标对齐。

     

      TPM_RIGHTALIGN:若设置此标志,函数使快捷菜单的右边界与由参数X指定的坐标对齐。

     

      用下列标志位之一来确定函数如何垂直放置快捷菜单:

     

      TPM_BOTTOMALIGN:若设置此标志,函数使快捷菜单的下边界与由参数y指定的坐标对齐。

     

      TPM_TOPALIGN:若设置此标志,函数使快捷菜单的上边界与由参数y指定的坐标对齐。

     

      TPM_VCENTERALIGN;若设置此标志,函数将按参数y指定的坐标垂直居中放置快捷菜单

     

      用下列标志位之一来确定在菜单没有父窗口的情况下用户的选择:

     

      TPM_NONOTIFY:若设置此标志,当用户单击菜单项时函数不发送通知消息。

     

      TPM_RETURNCMD;若设置此标志;函数将用户所选菜单项的标识符返回到返回值里。

     

      (补充:当TrackPopupMenu的返回值大于0,就说明用户从弹出菜单中选择了一个菜单。以返回的ID号为参数wParam的值,程序给自己发送了一个WM_SYSCOMMAND消息)

     

      用下列标志位之一来确定在快捷菜单跟踪哪一个鼠标键:

     

      TPM_LEFTBUTTON:若设置此标志,用户只能用鼠标左键选择菜单项。

     

      TPM_RIGHTBUTTON:若设置此标志,用户能用鼠标左、右键选择菜单项。

     

      X:在屏幕坐标下,快捷菜单的水平位置。

     

      Y:在屏幕坐标下,快捷菜单的垂直位置。

     

      NReserved:保留值,必须为零。

     

      HWnd:拥有快捷菜单的窗口的句柄。此窗口接收来自菜单的所有消息。函数返回前,此窗口不接受来自菜单的WM_COMMAND消息。

     

      如果在参数uFlags里指定了TPM_NONOTIFY值,此函数不向hWnd标识的窗口发消息。 但必须给hWnd里传一个窗口句柄,可以是应用程序里的任一个窗口句柄。

     

      PrcRect:未用。

     

      返回值:如果在参数uFlags里指定了TPM_RETURNCMD值,则返回值是用户选择的菜单项的标识符。如果用户未作选择就取消了菜单或发生了错误,则退回值是零。如果没在参数uFlags里指定TPM_RETURNCMD值,若函数调用成功,返回非零值,若函数调用失败,返回零。若想获得更多的错误信息,清调用GetLastError

    手动添加弹出菜单方法:

    1、在menu中添加菜单

    2、在从view中添加句柄,在window消息句柄中选择WM_RBUTTONDOWN,添加句柄。

    3、在OnRButtonDown中添加代码如下:

    void CMenuView::OnRButtonDown(UINT nFlags, CPoint point)
    {
    // TODO: Add your message handler code here and/or call default
    CMenu menu;
    menu.LoadMenu(IDR_MENU1); //加载弹出菜单
    CMenu *pPopup = menu.GetSubMenu(0);
    ClientToScreen(&point); //将客户区窗口转为屏幕窗口
    pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
       GetParent());     //GetParent()是指向cmainframe的指针,这样可以响应在cmainframe中添加的消息响应函数。
    CView::OnRButtonDown(nFlags, point);
    }

    4、运行。

    动态添加、删除、操作菜单:

    用到的函数 AppendMenu(在现有菜单后添加菜单) creatpopupmenu(创建空的弹出菜单,将他和CMENU的一个对象关联起来)

    eg:添加一个弹出菜单:

    eg:插入一个弹出菜单:

    InsertMenu

    eg:删除一个菜单

    DeleteMenu

    手动添加响应函数:

    1、定义ID号

    在resource中的Header File下的Resource.h中添加

    #define IDM_HELLO          111(定义ID号)

    2. 添加函数

    a、在头文件中写:afx_msg void OnHello()      //消息原型

    b、ON_COMMAND (IDM_HELLO,OnHello()       //添加消息响应

    c、添加函数

    void CMainFrame::OnHello()
    {
    MessageBox("hello!");
    }

    d、运行,就可以发现winsun下的hello是可用的

  • 相关阅读:
    使用aws和tomcat搭建服务器过程中的一些坑.
    10
    9
    8
    7
    6
    5
    hihoCoder 1582 Territorial Dispute 【凸包】(ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)
    hihoCoder 1584 Bounce 【数学规律】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)
    hihoCoder 1578 Visiting Peking University 【贪心】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)
  • 原文地址:https://www.cnblogs.com/liyuanjinglyj/p/4656647.html
Copyright © 2011-2022 走看看