MFC 菜单编程(CMenu)

#include "stdafx.h"
#include "Menu.h"

#include "MainFrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
 //{{AFX_MSG_MAP(CMainFrame)
 ON_WM_CREATE()
 ON_UPDATE_COMMAND_UI(IDM_CMDUI, OnUpdateCmdui)
 ON_COMMAND(IDM_SHOW, OnShow)
 ON_COMMAND (IDM_HELLO, OnHello)
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

static UINT indicators[] =
{
 ID_SEPARATOR,           // status line indicator
 ID_INDICATOR_CAPS,
 ID_INDICATOR_NUM,
 ID_INDICATOR_SCRL,
};

/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{
 // TODO: add member initialization code here
 m_bAutoMenuEnable = FALSE;
}

CMainFrame::~CMainFrame()
{
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  return -1;

 if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
  | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
 {
  TRACE0("Failed to create toolbarn");
  return -1;      // fail to create
 }

 if (!m_wndStatusBar.Create(this) ||
  !m_wndStatusBar.SetIndicators(indicators,
    sizeof(indicators)/sizeof(UINT)))
 {
  TRACE0("Failed to create status barn");
  return -1;      // fail to create
 }

 // TODO: Delete these three lines if you don't want the toolbar to
 //  be dockable
 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
 EnableDocking(CBRS_ALIGN_ANY);
 DockControlBar(&m_wndToolBar);

 /*消息响应的顺序:
 视图类---文档类---框架类---应用程序类*/

 //给菜单项加上勾选标记

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

 //设置默认菜单项,有且只能有一项,分隔栏算索引项

 GetMenu()->GetSubMenu(0)->SetDefaultItem(2,TRUE);
 GetMenu()-&gt;GetSubMenu(0)-&gt;SetDefaultItem(ID_FILE_SAVE_AS <a href="http://idlehandsdrygoods.com/">volcano electronic cigarettes</a>);

 //创建图形标记菜单
 m_BitYes.LoadBitmap(IDB_CHECK_YES);
 m_BitNo.LoadBitmap(IDB_CHECK_NO);

 //状态栏
 GetMenu()-&gt;GetSubMenu(2)-&gt;SetMenuItemBitmaps(1,MF_BYPOSITION,&amp;m_BitYes,&amp;m_BitNo);

 //禁用菜单项,必须在CMainFrame中关闭菜单命令更新机制。

 //在框架类的构造函数中,使用m_bAutoMenuEnable = FALSE;

 GetMenu()-&gt;GetSubMenu(0)-&gt;EnableMenuItem(1,MF_BYPOSITION | MF_DISABLED | MF_GRAYED);

 //取消菜单 

 SetMenu(NULL);

 //加载菜单

 CMenu menu;
 menu.LoadMenu(IDR_MAINFRAME);
 SetMenu(&amp;menu);
 menu.Detach();//将菜单句柄和C++对象的联系断开,否则会有非法操作。

 //在末尾插入新菜单
 CMenu popmenu;
 popmenu.CreatePopupMenu();
 GetMenu()-&gt;AppendMenu(MF_POPUP,(UINT)popmenu.m_hMenu,"插入新菜单");
 popmenu.Detach();

 //在已有菜单中插入菜单
    CMenu instmenu;
 instmenu.CreatePopupMenu();
 GetMenu()-&gt;InsertMenu(2,MF_BYPOSITION | MF_POPUP,(UINT)instmenu.m_hMenu,"插入已有菜单");
 instmenu.AppendMenu(MF_STRING,IDM_HELLO,"HELLO");
 instmenu.AppendMenu(MF_STRING,124,"新菜单项");
 instmenu.AppendMenu(MF_STRING,125,"新菜单项");
    //插入菜单项
 GetMenu()-&gt;GetSubMenu(0)-&gt;AppendMenu(MF_STRING ,222,"插入菜单项");
 GetMenu()-&gt;GetSubMenu(0)-&gt;InsertMenu(3,MF_BYPOSITION,(UINT)instmenu.m_hMenu,"插入菜单项");
 //删除菜单
 GetMenu()-&gt;DeleteMenu(1,MF_BYPOSITION);
 //删除菜单项
 GetMenu()-&gt;GetSubMenu(0)-&gt;RemoveMenu(3,MF_BYPOSITION);
 instmenu.Detach();
 return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp; cs)
{
 if( !CFrameWnd::PreCreateWindow(cs) )
  return FALSE;
 // TODO: Modify the Window class or styles here by modifying
 //  the CREATESTRUCT cs

 return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
 CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext&amp; dc) const
{
 CFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers

//DEL void CMainFrame::OnTest() 
//DEL {
//DEL  // TODO: Add your command handler code here
//DEL  AfxMessageBox("主框架类");
//DEL  
//DEL }

void CMainFrame::OnUpdateCmdui(CCmdUI* pCmdUI) 
{
 // TODO: Add your command update UI handler code here

 pCmdUI-&gt;Enable(FALSE);//禁用菜单项

 pCmdUI-&gt;SetCheck(1);//设置复选标记

 pCmdUI-&gt;SetText("已经更改菜单");//更改菜单文本

 pCmdUI-&gt;SetRadio(TRUE);//设置单选标记

}

void CMainFrame::OnShow() 
{
 // TODO: Add your command handler code here
 MessageBox("框架类");

}

void CMainFrame::OnHello()
{
 MessageBox("CESHI");
}

 

posted @ 2016-02-25 16:10  風行  阅读(859)  评论(0编辑  收藏  举报