VC MFC菜單

來源:互聯網
上載者:User
VC MFC菜單

功能表項目屬性說明:
ID 標識菜單的唯一常量。
Caption    功能表項目標題,“&" 後面的字元為快速鍵,在功能表項目後的字元將加底線。
Separator 水平線,其它屬性無效。
Pop_up      有子功能表
Grayed     無效,標題以灰色顯示
Inactive 無效,標題正常顯示
Checked    在標題前加一個對鉤
break     為None時,使它和它的兄弟們一行或一列顯示。
Help      只對最上層功能表項目有效,使它及後面的最上層菜單移到視窗的右上方。
Prompt    當滑鼠指向它時的提示資訊
多文檔應用程式除了產生IDR_MAINFRAME外,還產生標識符為IDR_xxxxTYPE,其中xxxx為應用程式名稱。它們分別對應無文檔和有文檔時。
一個菜單id可以在多個類有響應函數,但只會有一個響應。
我實驗得出的結果,CChildFrame,CCMenuApp,CCMenuDoc,CCMenuView,CMainFrame(我的應用程式名為CMenu)的響應順序為:
在IDR_MAINFRAME中,CMainFrame,CCMenuApp其它三個不響應.
在IDR_XXXXTYPE 中,CCMenuView,CCMenuDoc,CChildFrame,CCMenuApp,CMainFrame.
ctrl+w開啟ClassWizard,選好工程,類(最常選的是xxxView),在id中選擇我們要修改的功能表項目。
雙擊COMMAND(或UPDATE_COMMAND_UI)點確定就可以了。再在成員函數中雙擊我們剛剛加的函數,就可以編輯函數了。
當使用者單擊菜單時,我們剛剛編輯的函數會執行。
如果我們雙擊的是UPDATA_COMMAND_UI,則響應形式類似如下:
void ... OnUpdate...(CCmdUI * pCmdUI)
{
    pCmdUI->SetCheck(true);//在功能表項目前加一個對鉤
    pCmdUI->Enable(true);// 使功能表項目能夠使用
}
因為此函數往往影響到它的外形,故在它的“父親”或“祖父”被選中時就會執行。

CWnd類中與菜單有關的幾個函數。
SetMeun(CMenu *pMenu);
修改視窗的菜單,為NULL,則表示刪除。
常用的還有
GetMenu();
GetSystemMenu();

CMenu的一些函數。
AppendMenu()函數指定的菜單最後附加一個新功能表項目,同時可以指定功能表項目的相關情況,它有兩個文法。
nFlag指定狀態,可以是以下四組之一或相組合而成,還可以與MF_POPUP組合表示添加的是彈出式菜單。
MF_CHECKED,MF_CHECKED
MF_DISABLED,MF_ENABLED,MF_GRAYED
MF_STRING,MF_OWNERDRAW,MF_SEPARATOR,MF_BITMAP功能表項目是字串,自畫型,分隔線,位元影像。
MF_MENUBARBREAK,MF_MENUBREAK
nIDNewItem 指定功能表項目的id.
lpszNewItem指定功能表項目的內容,與nFlag有關。為MF_OWNERDRAW時,該參數為資料指標,用來傳送資料,系統在發送訊息WM_MEASUREITEM和WM_DRAWITEM時將該資料存入參數
的(DRAWITEMSTRUCT結構)itemData域;nFlag為MF_STRING時該參數為功能表標題。
InsertMenu
nFlags指定功能表項目位置和狀態,狀態選項參見AppendMenu()函數,位置選項為MF_BYCOMMAND,MF_BYPOSITION.
nPositin若為MF_BYCOMMAND,新功能表項目插在指定功能表項目之前;或為MF_BYPOSITION,該參數指定新功能表項目的位置,為-1插到最後。
ModifyMenu()參數與InsertMenu類似。
DeleteMenu刪除功能表項目
RemoveMenu移去功能表項目

設定和顯示浮動菜單
BOOL TrackPopupMenu(UINT nFlags,int x,int y,
                      CWnd *pWnd,LPCRECT = NULL);
nFlag浮動式菜單座標設定方式及滑鼠操作方式,有效值如下:
TPM_CENTERALIGN     TPM_LEFTALIGN    TPM_RIGHTALIGN
TPM_LEFTBUTTON      TPM_RIGHTBUTTON
x,y浮動式菜單座標
pWnd指定操作菜單的視窗
lpRect指定滑鼠操作範圍
在客戶區單擊左鍵就會彈出捷徑功能表,方法二需要在資源編輯器中編輯一個新菜單,方法三必須有主菜單。
方法一:
void CHeView::OnLButtonDown(UINT nFlags, CPoint point)
{
CMenu PopupMenu;
PopupMenu.CreatePopupMenu();
PopupMenu.AppendMenu(MF_STRING,ID_FILE_NEW,"NEW..");
//...

ClientToScreen(&point);
PopupMenu.TrackPopupMenu(TPM_CENTERALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);

CView::OnLButtonDown(nFlags, point);
}

方法二:
void CHeView::OnLButtonDown(UINT nFlags, CPoint point)
{

CMenu menu;
menu.LoadMenu(IDR_DUMMY);
CMenu *pMenu=menu.GetSubMenu(0);
ASSERT(pMenu!=NULL);

ClientToScreen(&point);
          pMenu->TrackPopupMenu(TPM_CENTERALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);
CView::OnLButtonDown(nFlags, point);
}

  

方法三:
void CHeView::OnLButtonDown(UINT nFlags, CPoint point)
{
CWnd *pWnd=AfxGetApp()->GetMainWnd();
CMenu * pMenu=pWnd->GetMenu();
pMenu=pMenu->GetSubMenu(0);
      ASSERT(pMenu!=NULL);

ClientToScreen(&point);
pMenu->TrackPopupMenu(TPM_CENTERALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);

}
習題:
動態菜單,使用者點擊“更多菜單”,增加一些功能表項目。
其實,自畫菜單原理不難理解.AppendMenu的風格選自畫,將自畫用的資訊(指標)強制轉化成LPCTSTR,再重

載DrawItem就行了,注意自畫用的資訊不要提前delete了.
樣本如下:
COwnerMenu.h中
class CMenuItem
{
public:
CString m_szText;
COLORREF m_color;
CMenuItem(CString szText,COLORREF color)
{
    m_szText = szText;
    m_color    = color;
}

};

#include <afxtempl.h>

class COwnerMenu : public CMenu
{
public:
void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );
bool AppendMenu(UINT nIDNewItem,CString caption,COLORREF color);
COwnerMenu();

CTypedPtrList<CPtrList,CMenuItem *> m_MenuList;
virtual ~COwnerMenu();

};

COwnerMenu.cpp中
COwnerMenu::~COwnerMenu()
{
while(m_MenuList.GetCount())
{
    CMenuItem *pMenuItem = m_MenuList.GetHead();
    delete pMenuItem;
    m_MenuList.RemoveHead();
}
}

bool COwnerMenu::AppendMenu(UINT nIDNewItem, CString caption, COLORREF color)
{
CMenuItem * pMenuItem = new CMenuItem(caption,color);
m_MenuList.AddTail(pMenuItem);

return CMenu::AppendMenu(MF_OWNERDRAW,nIDNewItem,(LPCTSTR)pMenuItem);
}

void COwnerMenu::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
pDC->SetTextColor(((CMenuItem*)lpDrawItemStruct->itemData)->m_color);
pDC->TextOut(0,0,((CMenuItem*)lpDrawItemStruct->itemData)->m_szText);

}

在使用菜單的地方(不要忘記了加標頭檔):
void COwnerMenuView::OnRButtonDown(UINT nFlags, CPoint point)
{
COwnerMenu menu;
menu.CreatePopupMenu();

menu.AppendMenu(ID_1,"1",RGB(0,0,128));
ClientToScreen(&point);

menu.TrackPopupMenu(TPM_LEFTBUTTON|TPM_LEFTALIGN,point.x,point.y,this);
CView::OnRButtonDown(nFlags, point);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.