第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建立彈出式菜單。


未完待續。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章