现在很多应用程序的界面基本是用配置文件来规划界面的,在这个时候就得学会自定义菜单栏和工具栏之类的。
VS Feature Pack是为微软新推出的界面库(听说是买BCG的授权,然后对之进行改造的),其中的主要的界面类可以和BCG的界面类可以对应起来,类的使用和BCG的也大同小异。但是有些做法还是很不一样,比如这次我要提到的自定义菜单栏。这里的自定义菜单栏是指去除系统默认的菜单栏,然后动态创建菜单栏。今天摸索了一下,大致搞清楚了(说实话,这方面网上的资料很少)。
首先我们新建一个MFC的单文档工程:DynamicMenu,基本设置如下:
这里要提一下的是VS Feature Pack的应用程序其中的菜单栏操作主要由CMFCMenuBar来负责。因此下面的编码也主要针对该类来进行。
首先我们实现编码实现删除默认的所有系统菜单项,其代码如下:
[cpp] view plaincopy
// 删除默认的所有系统菜单项
static void DelAllMenu(HMENU hMenu)
{
int Menucount = ::GetMenuItemCount(hMenu);
for (int i = Menucount-1;i>-1;i--)
{
::DeleteMenu(hMenu,i, MF_BYPOSITION);
}
}
然后我们定义两个菜单资源ID:
[cpp] view plaincopy
#define ID_NEW_MENUBAR_OPEN 5000
#define ID_NEW_MENUBAR_SAVE 5001
为CMainFrame类添加一个创建菜单栏的成员函数:
[cpp] view plaincopy
void CMainFrame::NewMenuBar()
{
CMenu menu;
menu.CreateMenu();
CString strMenu;
strMenu = _T("打开文件");
menu.AppendMenu(MF_ENABLED|MF_STRING,ID_NEW_MENUBAR_OPEN,strMenu);
strMenu = _T("保存文件");
menu.AppendMenu(MF_ENABLED|MF_STRING,ID_NEW_MENUBAR_SAVE,strMenu);
CString strMenuBarTitle;
strMenuBarTitle = _T("文件");;
m_wndMenuBar.InsertButton (CMFCToolBarMenuButton (0, menu, -1,strMenuBarTitle));
}
我们在CMainFrame类的OnCreate函数调用这个函数,这里只给出部分代码:
[cpp] view plaincopy
if (!m_wndMenuBar.Create(this))
{
TRACE0("Failed to create menubar/n");
return -1; // fail to create
}
m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY);
HMENU hm = m_wndMenuBar.GetDefaultMenu();
// 删除默认菜单栏
if (NULL!=hm)
{
DelAllMenu(hm);
}
// 创建新的菜单栏
NewMenuBar();
现在我们看看效果如何,如下图:
我们发现默认菜单栏去掉了,但是新的菜单栏并没有出来。到网上搜资料,但是并没有搜到适用的,看了看Visual C++ 2008 Feature Pack Demo中提供的DynamicMenu的源码,了解了要增加AFX_WM_RESETMENU消息的处理函数,在函数里调用创建菜单栏,具体增加的代码如下:
[cpp] view plaincopy
// MainFrm.h : interface of the CMainFrame classafx_msg
// AFX_WM_RESETMENU消息的处理函数声明
LRESULT OnResetMenu(WPARAM,LPARAM);
// MainFrm.cpp : implementation of the CMainFrame class
// 消息宏中增加
ON_REGISTERED_MESSAGE(AFX_WM_RESETMENU,&CMainFrame::OnResetMenu)
LRESULT CMainFrame::OnResetMenu(WPARAM,LPARAM)
{
NewMenuBar();
return 0;
}
我们再删除程序的注册表相关项重新编译(使用VS Feature Pack开发删除注册表这一项非常重要,Feature Pack的界面设计保存思路实际上和BCG是一样的,把上次用户设定的界面配置信息都保存在注册表,如果不删除注册表相关项,往往不能更新界面,注册表相关项一般在HKEY_CURRENT_USER/Software/Local AppWizard-Generated Applications/你的工程名称(英文版VS),HKEY_CURRENT_USER/Software/应用程序向导生成的本地应用程序/你的工程名称(中文版VS))。
我们再看看效果,如下图:
你可能会发现菜单是灰的,那是没有添加菜单的命令响应函数的缘故。本文的编译环境为:Windows XP + sp3, VS C++ 2008 + sp1。
后来查了一下MSDN对AFX_WM_RESETMENU消息的解释,如下:
Message
Description
[in] wParam
lParam (All parameters are [in] unlessotherwise stated.)
ReturnValue
AFX_WM_RESETMENU
Theframework sends this message to the menu owner (a frame window) when the user resetsan application frame menu during customization。
The menu resource ID. Not used. Not used.
温馨提示:内容为网友见解,仅供参考
CMFCMenuBar如何改变子菜单的状态
\/\/ 删除默认菜单栏 if (NULL!=hm){ DelAllMenu(hm);} \/\/ 创建新的菜单栏 NewMenuBar();现在我们看看效果如何,如下图:我们发现默认菜单栏去掉了,但是新的菜单栏并没有出来。到网上搜资料,但是并没有搜到适用的,看了看Visual C++ 2008 Feature Pack Demo中提供的DynamicMenu的源码,了解了要...
各位老大,CMFCMenubar应当怎样操作子Menu-CSDN论坛
使用了VS2008 FeaturePack或者VS2008 SP1或者BCG或者XTP,如果要CheckMenItem和EnableMenuItem,请使用ON_UPDATE_COMMAND_UI宏:pCmdUI->SetCheck(TRUE);pCmdUI->Enable(TRUE);等等。
VS2010 做MFC 自绘菜单,从网上找的资料里看,都是继承CMenu类
CMenu是CObject的派生类。单文档应用程序有啊。
如何用VC++5在菜单中增加位图或图标
MFC的CMenu类有一个成员函数SetMenuItemBitmaps,可以用于往菜单中增加图标。具体方法如下:在应用程序的资源文件中添加想要增加的位图,并将其ID命名为IDB_OPEN1和IDB_OPEN2;---在应用程序的视图类中添加CBitmap类的对象,不妨取名为bm_open1和bm_open2。在视图类的构造函数中添加以下代码:bm_open1....
在mfc怎样在工具条中添加编辑框
TRACE0("未能创建菜单栏\\n");return -1; \/\/ 未能创建 } m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY);\/\/ 防止菜单栏在激活时获得焦点 CMFCPopupMenu::SetForceMenuFocus(FALSE);if (!m_wndToolBar.CreateEx(this, TBSTYLE...
如何将现有MFC应用程序迁移到BCGControlBar VC界面库中
8、如果你想添加一个菜单栏(带菜单的类似MS Office可停靠控制栏),只需添加以下成员到CMainFrame类中:CBCGPMenuBar m_wndMenuBar,并初始化它,以同样的方式作为工具栏成员。9、在CMainFrame::OnCreate()的开头设置应用程序视觉风格:CBCGPVisualManager::SetDefaultManager(RUNTIME_CLASS(manager));
想用MFC做窗口图标变换,做完以后没有错误但是图标不能变换,各位帮我看...
函数里面的 HICON m_icon[10];里面的内容都是空的,当然不会有效果.你仅仅是定义了10个图标句柄而已.里面什么都没有.注意局部变量和全局变量之间的区别,OnTimer(UINT_PTR nIDEvent)函数里面的HICON m_icon[10];只是一个新定义的局部变量,与你前面保存有加载图标句柄的那一个图标句柄数组是两回事.
如何在mfc中使用xttoolkitpro
1、 创建MFC的SDI应用程序 2、 在stdafx.h添加 include <XTToolkitPro.h> \/\/ Xtreme Toolkit Pro component library 3、 修改mainfrm.h的CMainFrame基类,MDI对应为 CXTPMDIFrameWnd class CMainFrame : public CXTPFrameWnd 4、 修改CMainFrame::OnCreate函数 \/\/ Initialize the command bars if...
HMAP是什么
菜单项增加步骤如下:在Workspace中打开ResourceView标签窗口,选择Menubar中的IDR_MAINFRAME,并鼠标双击它.(见图3.2.3.1.1)在右边的工作区下部有菜单创建栏显示,双击空白菜单项,弹出Menu Item Properties窗口.(见图3.2.3.1.2)在General标签项填入ID和Caption项.(ID:ID_APP_EXIT Caption :Exit)(见图3.2.3.1.3)...
如何使用 wxwidgets开发界面
SetMenuBar(menuBar); \/\/将菜单条放到窗体上 wxPanel *panel = new wxPanel(this); \/\/建立一个Panel wxButton *button = new wxButton(panel, wxID_ABOUT, "关于", wxPoint(20, 20), wxSize(50, 30)); \/\/建立一个Button CreateStatusBar(2); \/\/建立一个两栏的状态栏 SetStatusText(_T("欢迎使用wx...