第08章笔记

第8章 菜单的建立


主要内容

建立和使用菜单


菜单的种类:

1:下拉菜单;

2:快捷菜单,又称弹出菜单或右键菜单;

3:系统菜单,又称控制菜单。


菜单和菜单项

菜单和菜单项的关系类似于文件夹和文件。真正实现具体功能的是菜单项,如:“新建”、“打开”、“保存”等;而菜单的作用则是容纳一组相关的菜单项,如“文件”菜单,“编辑”菜单。


菜单资源的建立

1:创建”Resource Script“文件;

2:在”ResourceView“中插入新菜单;

3:修改菜单ID(可选);

4:创建菜单资源中的菜单项:

    菜单只需要设置”Caption“选项,并需要选中”Pop-up“ 选项;

    菜单项需要设置”ID“和”Caption“两项。要注意的是,如果菜单项想使用系统提供的ID,如退出程序”ID_APP_EXIT“,必须要在下拉列表里面选,不可以自己输,否则会资源ID重复定义的错误。


普通菜单的操作

一:菜单的载入

方法1:利用CFrameWnd::Create()方法。

    Create方法声明(详见第2章)

BOOL virtual CFrameWnd::Create(
    LPCTSTR lpszClassName,
    LPCTSTR lpszWindowName,
    DWORD dwStyle = WS_OVERLAPPEDWINDOW,
    const RECT &rect = rectDefault,
    CWnd *pParentWnd = NULL,
    LPCTSRT lpszMenuName = NULL,
    DWORD dwExStyle = 0,
    CCreateContext *pContext = NULL)

    其中的参数lpszMenuName就是一个定义在资源文件(RC文件)中的菜单名称。注意:如果要以菜单的资源ID代表菜单,要使用如下方式:MAKEINTRESOURCE(菜单资源ID)。


方法2:利用CMenu对象以及CMenu::LoadMenu()方法。

操作步骤:

1:声明CMenu对象。

2:利用CMenu.LoadMenu(菜单资源ID )载入菜单。

3:利用CFrameWnd::SetMenu(CMenu*)方法为视窗框架对象绑定菜单。

如:

class MyFrame : public CFrameWnd
{
private:
    CMenu *pMenu;
public:
    MyFrame()
    {
        Create(NULL, "My Frame");
        pMenu = new CMenu;
        pMenu->LoadMenu(IDR_MENU1);
        SetMenu(pMenu);
    }
};


方法3:利用CMenu::Attach()方法。

声明:BOOL CMenu::Attach(HMENU hMenu)

参数为指向菜单的指针。


二:菜单资源与CMenu对象的分离

当删除CMenu对象时,需要先将其绑定的菜单资源与其分离。

方法:HMENU CMenu::Detach()


三:获取子菜单

CMenu* CMenu::GetSubMenu(int nPos)

参数nPos为子菜单的序号,第一个子菜单为0。


四:获取指定位置的菜单项的识别符

UINT CMenu::GetMenuItemID(int nPos)


五:在菜单中插入新的子菜单或菜单项

在指定位置插入:

    BOOL CMenu::InsertMenu(

        UINT nPosition,

        UINT nFlags,

        UINT nIDNewItem = 0,

        LPCTSTR lpszNewItem = NULL)

参数说明:

1:nPosition

在nPosition指定的位置前插入新菜单。

nPosition可以是菜单项的序号,也可以是资源ID,方式由第二个参数nFlags指定。

2:nFlags

作用一:指定nPosition是菜单序号还是资源ID;

作用二:控制插入菜单(项)的属性和状态。

旗标说明

控制nPosition的旗标
MF_BYPOSITION
nPosition的值应为菜单项的序号
MF_BYCOMMAND
nPosition的值因为菜单项的资源ID



MF_DISABLED
菜单项不可用
MF_ENABLED
菜单项有效
MF_GRAYED
菜单项为灰色



MF_STRING

MF_OWNERDRAW

MF_SEPARATOR
分割线
MF_POPUP
弹出式子菜单



MF_MENUBARBREAK

MF_MENUBREAK



MF_CHECKED
菜单项被选中
MF_UNCHECKED
菜单项未被选中

3:nIDNewItem

新菜单的ID。


4:lpszNewItem

新菜单的Caption。在nFlags中指定旗标MF_STRING。


在菜单的尾部追加新菜单

BOOL CMenu::AppendMenu(

    UINT nFlags,

    UINT nIDNewItem = 0,

    LPCTSTR  lpszNewItem = NULL)

参数定义同InsertMenu方法。


六:设置菜单项是否被勾选

UINT CMenu::CheckMenuItem(UINT nIDCheckItem, UINT nCheck)

参数说明:

1:nIDCheckItem:指定相应的菜单项,可以是序号或ID,由参数nCheck控制。

2:nCheck:由两组旗标构成,第一组旗标为MF_BYCOMMAND或MF_BYPOSITION,用于指定第一个参数是菜单项的序号还是ID;第二组旗标为MF_CHECK或MF_UNCHECK,用于指定菜单项是否被选中。两组旗标用“|”符号连接。

注:设置菜单项是否被勾选的较常用的方法是OnUpdate方法。


七:修改菜单项

修改菜单项其实是用新的菜单项替换掉指定的菜单项。

BOOL CMenu::ModifyMenu(

    UINT nPosition,

    UINT nFlags,

    UINT nIDNewItem = 0,

    LPCTSTR lpszNewItem = NULL)

说明:用资源ID为nIDNewItem、Caption为lpszNewItem的菜单项替换掉菜单项nPosition。nFlags参数同InsertMenu。


八:删除菜单项

BOOL CMenu::DeleteMenu(UINT nPosition, UINT nFlags)

说明:删除nPosition指定的菜单项;nFlags的值为MF_BYCOMMAND或MF_BYPOSITION。


系统菜单的操作

一:获取系统菜单

CMenu *CWnd::GetSystemMenu(BOOL bRevert) const

说明:如果bRevert为FALSE,则返回当前窗口的系统菜单;如果为TRUE,返回值不确定。

二:其他操作菜单的方法同普通菜单。


弹出式菜单的操作

当按下鼠标右键时,会产生ON_WM_CONTEXTMENU消息,该消息会调用CWnd::OnContextMenu方法,在该方法中,利用CMenu::TrackPopupMenu建立弹出式菜单。


未完待续。。。

你可能感兴趣的:(mfc,菜单)