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和动态子菜单相关推荐

  1. 如何动态添加菜单/菜单项、子菜单、右键菜单

    有关菜单的操作主要用到 CMenu 类,当然也可用相应 API 函数, CMenu 类只是 MFC 对 API 中操作菜单的函数的封装而已. 不过能用类就尽量用类,类的组织方式好呗,代码看着也舒服. ...

  2. js动态加载div显示主菜单和子菜单+jquery获取动态id

    最近在做项目重构的主界面工作中,需要动态显示主菜单以及子菜单(各个界面的链接),查看原来老系统采用的是asp控件,但是重构的时候采用mvc框架,而且这些菜单并不是死的,而是通过其他界面来配置的,主菜单 ...

  3. MFC : 给主菜单动态添加删除一级子菜单

    添加删除一级子菜单 private:BOOL AddDyMenu(DWORD dwMenuRcId, TCHAR* pMenuName);BOOL DelDyMenu(TCHAR* pMenuName ...

  4. 不使用输入框如何实现下拉_如何利用Axure实现下拉子菜单?

    Axure RP是一款专业的快速原型设计工具,让我们能够快速设计并创建出应用软件或Web页面的具备高保真和交互能力的原型.通过原型设计,不但能更好地与客户进行交流确认,也能明确地给开发人员以成品效果作 ...

  5. 8 使用SubMenu创建子菜单

    8-1 动态添加SubMenu子菜单 (10:06) package com.imooc.summenudemo;import android.os.Bundle; import android.ap ...

  6. android菜单详解四:子菜单

    创建子菜单们 一个子菜单是一个在已有菜单的某个菜单项上打开的菜单.你可以向任何菜单添加子菜单.当你的程序拥有很多功能并可按类别组织起来,那么子菜单是最佳选择.比如PC 程序中的菜单栏 (File, E ...

  7. 【Android基础知识】选项菜单、上下文菜单、子菜单的使用

    Android菜单类型 菜单是为了增加更多的功能,不占用屏幕的空间.Android中菜单类型有三类,选项菜单(OptionMenu).上下文菜单(ContextMenu).子菜单(SubMenu),下 ...

  8. Android菜单详解——子菜单(SubMenu)

    1,子菜单就是将功能相同或相似的分组进行多级显示的一种菜单. 2,创建子菜单的步骤: a) 覆盖Activity的onCreateOptionsMenu()方法,调用Menu的addSubMenu() ...

  9. 选项菜单_上下文菜单_子菜单_图标菜单_自定义菜单_联系人标记弹出菜单

    菜单控件<Menu > 选项菜单(Option Menu) 单击Menu实体按钮弹出,android中把它叫做option menu 上下文菜单(ContextMenu 是Menu的子接口 ...

最新文章

  1. PHP拿到别人项目如何修改为自己
  2. sersync 文件同步系统(一) 服务初步搭建
  3. 关于一道简单的Java 基础面试题的剖析: short s1=1;s1 = s1 +1会报错吗?
  4. 【python】python 中的三元表达式(三目运算符)
  5. SuperSlide
  6. python有三个包如何只导入两个包_云计算开发学习笔记:Python3如何从一个包中导入*...
  7. ASP.NET 3.5控件和组件开发技术之客户端回发/回调揭密
  8. paip.VS2010未能加载类型
  9. 虚拟服务器不识别网银盾,建行u盾插电脑没反应网页不自动跳出 3步教你快速解决...
  10. docker安装redis并挂载配置文件
  11. oracle 体系架构图
  12. 小米8成功刷入Win11ARM64完整版系统
  13. 百度网盘下载速度太慢,百度网盘下载慢怎么解决
  14. Linux查看文件数量
  15. html自动写对联,HTML 实现网站对联广告位
  16. 全面的IE兼容性调试问题
  17. 获取两个向量中间位置的点
  18. centos dns 修改配置
  19. mysql计算员工的日薪_mysql 综合练习(一)
  20. Linux的磁盘挂载/yum/镜像挂载

热门文章

  1. 如何看懂电路图--电源电路单元
  2. 计算机软件专业技术资格考试-软考介绍
  3. java计算机毕业设计高校选课系统源码+mysql数据库+系统+lw文档+部署
  4. JDY-31 蓝牙模块使用(HC-06)
  5. emui免root改MAC,手机机型修改免root
  6. 值得收藏极速PDF阅读器和编辑器快捷键大全
  7. ios 与 安卓 移动端浏览器兼容笔记
  8. Niushop B2C 使用教程目录
  9. Win11系统进入BIOS的方法/UEFI的三种方法
  10. 【调剂】2.28计算机考研其余调剂信息