[wxWidgets]XRC和动态子菜单
1. 什么是XRC
XRC是基于XML的资源系统。它的基本出发点是将界面布局和程序逻辑分离,即将界面布局代码保存在分离的XML文件中,在程序中不涉及控件的创建和布局,只需要加载相应的资源并处理事件绑定即可。
2. XRC文件格式
<?xml version="1.0"?>
<resource version="2.3.0.1">
<object class="wxFrame" name="ID_MAIN_FRAME">
<size>200, 300</size>
…
</object>
</resource>
3. XRC文件中菜单资源的相关属性
wxMenuBar
style Menu bar style: wxMB_DOCKABLE
wxMenu
style Menu style: wxMENU_TEAROFF
label Text: label of the menu.
help Text: displayed help string.
wxMenuItem
style Menu style: wxMENU_TEAROFF
label Text: label of the menu.
accel Text: accelerator associated to this item ( Alt-X for example ).
help Text: displayed help string.
radio bool value(0/1): 1 if this item is a radio menu item.
checkable bool value(0/1): 1 if this item is a check menu item.
enabled bool value(0/1): 1 if this item is initially enabled.
checked bool value(0/1): 1 if this (check) item is initially checked.
bitmap Text: path to a bitmap to draw at the left of the item.
4. 使用XRC创建菜单
创建一个包含菜单布局信息的XML资源文件(.xrc):
// MenuBar.xrc
<?xml version="1.0" encoding="utf-8" ?>
<resource version="2.3.0.1" xmlns="http://www.wxwindows.org/wxxrc">
<object class="wxMenuBar" name="ID_MENUBAR">
<object class="wxMenu" name="ID_MENU_FILE">
<label>&File</label>
<object class="wxMenuItem" name="wxID_CLOSE">
<label>E&xit</label>
<accel>Ctrl+Q</accel>
<help>Quit the application</help>
</object>
</object>
<object class="wxMenu" name="ID_MENU_VIEW">
<label>&View</label>
</object>
<object class="wxMenu" name="ID_MENU_TOOLS">
<label>&Tools</label>
<object class="wxMenuItem" name="wxID_OPTIONS">
<label>&Options…</label>
</object>
</object>
<object class="wxMenu" name="ID_MENU_HELP">
<label>&Help</label>
<object class="wxMenuItem" name="wxID_CHECKFORUPDATES">
<label>Check for &Updates…</label>
</object>
<object class="separator" />
<object class="wxMenuItem" name="wxID_ABOUT">
<label>&About…</label>
</object>
</object>
</object>
</resource>
初始化并且加载资源文件
// MainApp.cpp
bool MainApp::OnInit()
{
wxXmlResource* pResource = wxXmlResource::Get();
pResource->AddHandler(new wxMenuBarXmlHandler);
pResource->AddHandler(new wxMenuXmlHandler);
pResource->Load(wxT("resources/MenuBar.xrc"));
…
}
// MainFrame.cpp
MainFrame::MainFrame(const wxString& title) : wxFrame(NULL, wxID_ANY, title)
{
m_menuBar = NULL;
InitMenuBar();
}
bool MainFrame::InitMenuBar()
{
if (m_menuBar)
{
SetMenuBar(NULL);
delete m_menuBar;
}
// Initialize the resource system
m_menuBar = wxXmlResource::Get()->LoadMenuBar(wxT("ID_MENUBAR"));
if (!m_menuBar)
{
wxLogError(wxT("Cannot load main menu from resource file"));
return false;
}
SetMenuBar(m_menuBar);
return true;
}
5. 在XRC菜单上添加动态子菜单
在资源文件中添加一个新的菜单项(wxID_LANGUAGES)
<object class="wxMenu" name="ID_MENU_VIEW">
<label>&View</label>
<object class="wxMenu" name="wxID_LANGUAGE">
<label>&Language</label>
<object class="wxMenuItem" name="wxID_LANGUAGES">
<label>Get Additional/Update language pack</label>
<help>Downloading Additional/Update language pack</help>
</object>
<object class="separator" />
</object>
</object>
// Initialize the resource system
m_menuBar = wxXmlResource::Get()->LoadMenuBar(wxT("ID_MENUBAR"));
if (!m_menuBar)
{
wxLogError(wxT("Cannot load main menu from resource file"));
return false;
}
/*
* 这里很奇怪,在XRC文件wxID_LANGUAGE的类型明明是wxMenu,可在这里确只能用wxMenuItem。
* 查看wxWidgets源代码发现XRC系统只会把最上层的class为wxMenu的object创建为wxMenu对象。
* 其它的则都被创建成了wxMenuItem对象。
*/
// 使用XRCID方法获取控件ID,创建动态子菜单
wxMenuItem* menuItem = m_menuBar->FindItem(XRCID("wxID_LANGUAGE"));
if (menuItem)
{
wxMenu* subMenu = menuItem->GetSubMenu();
subMenu->AppendRadioItem(wxID_LANGUAGE_LOWEST + 1, wxT("English"));
subMenu->AppendRadioItem(wxID_LANGUAGE_LOWEST + 2, wxT("Chinese(Simplified)"));
}
SetMenuBar(m_menuBar);
return true;
代码下载
[wxWidgets]XRC和动态子菜单相关推荐
- 如何动态添加菜单/菜单项、子菜单、右键菜单
有关菜单的操作主要用到 CMenu 类,当然也可用相应 API 函数, CMenu 类只是 MFC 对 API 中操作菜单的函数的封装而已. 不过能用类就尽量用类,类的组织方式好呗,代码看着也舒服. ...
- js动态加载div显示主菜单和子菜单+jquery获取动态id
最近在做项目重构的主界面工作中,需要动态显示主菜单以及子菜单(各个界面的链接),查看原来老系统采用的是asp控件,但是重构的时候采用mvc框架,而且这些菜单并不是死的,而是通过其他界面来配置的,主菜单 ...
- MFC : 给主菜单动态添加删除一级子菜单
添加删除一级子菜单 private:BOOL AddDyMenu(DWORD dwMenuRcId, TCHAR* pMenuName);BOOL DelDyMenu(TCHAR* pMenuName ...
- 不使用输入框如何实现下拉_如何利用Axure实现下拉子菜单?
Axure RP是一款专业的快速原型设计工具,让我们能够快速设计并创建出应用软件或Web页面的具备高保真和交互能力的原型.通过原型设计,不但能更好地与客户进行交流确认,也能明确地给开发人员以成品效果作 ...
- 8 使用SubMenu创建子菜单
8-1 动态添加SubMenu子菜单 (10:06) package com.imooc.summenudemo;import android.os.Bundle; import android.ap ...
- android菜单详解四:子菜单
创建子菜单们 一个子菜单是一个在已有菜单的某个菜单项上打开的菜单.你可以向任何菜单添加子菜单.当你的程序拥有很多功能并可按类别组织起来,那么子菜单是最佳选择.比如PC 程序中的菜单栏 (File, E ...
- 【Android基础知识】选项菜单、上下文菜单、子菜单的使用
Android菜单类型 菜单是为了增加更多的功能,不占用屏幕的空间.Android中菜单类型有三类,选项菜单(OptionMenu).上下文菜单(ContextMenu).子菜单(SubMenu),下 ...
- Android菜单详解——子菜单(SubMenu)
1,子菜单就是将功能相同或相似的分组进行多级显示的一种菜单. 2,创建子菜单的步骤: a) 覆盖Activity的onCreateOptionsMenu()方法,调用Menu的addSubMenu() ...
- 选项菜单_上下文菜单_子菜单_图标菜单_自定义菜单_联系人标记弹出菜单
菜单控件<Menu > 选项菜单(Option Menu) 单击Menu实体按钮弹出,android中把它叫做option menu 上下文菜单(ContextMenu 是Menu的子接口 ...
最新文章
- PHP拿到别人项目如何修改为自己
- sersync 文件同步系统(一) 服务初步搭建
- 关于一道简单的Java 基础面试题的剖析: short s1=1;s1 = s1 +1会报错吗?
- 【python】python 中的三元表达式(三目运算符)
- SuperSlide
- python有三个包如何只导入两个包_云计算开发学习笔记:Python3如何从一个包中导入*...
- ASP.NET 3.5控件和组件开发技术之客户端回发/回调揭密
- paip.VS2010未能加载类型
- 虚拟服务器不识别网银盾,建行u盾插电脑没反应网页不自动跳出 3步教你快速解决...
- docker安装redis并挂载配置文件
- oracle 体系架构图
- 小米8成功刷入Win11ARM64完整版系统
- 百度网盘下载速度太慢,百度网盘下载慢怎么解决
- Linux查看文件数量
- html自动写对联,HTML 实现网站对联广告位
- 全面的IE兼容性调试问题
- 获取两个向量中间位置的点
- centos dns 修改配置
- mysql计算员工的日薪_mysql 综合练习(一)
- Linux的磁盘挂载/yum/镜像挂载