nim_duilib(18)之xml控件关联优化
方法1
直接调用函数FindControl函数,返回Control*类型,对返回的类型强制转换
ui::CheckBox* pcheckbox = (ui::CheckBox*)(FindControl(L"checkbox1"));
典型C的强制转换。
方法2
使用C++关键字dynamic_cast完成转换,一个例子
ui::CheckBox* pcheckbox = dynamic_cast<ui::CheckBox*>(FindControl(L"checkbox1"));
很明显,增加了类型转换。
方法1 和 方法2的缺点
要写很多代码;当界面控件多了以后, 每个控件关联都需要调用函数FindControl,完成绑定,代码量增加。
我们可以采用C++11新特性实现优化。
C++11优化
思考
我们可以写一个函数,函数体内完成下面两件事
- 查找xml中的控件
- 将
Control*转为目标类型
通过对比可以发现,关联控件所用的代码重复率高,采用模板,实现优化。
方案1
设计函数
- 函数返回值为目标类型的指针变量。 用事先声明在类中的成员变量保存即可
- 通过函数参数的方式传递目标类型。
函数源码如下:
template<typename T>
auto find_control(const std::wstring&& str_name, T args)
{
// 取得传进来的参数类型
using ele_type = decltype(args) ;
// 读取xml文件中的控件
ui::Control* pctrl = nullptr;
pctrl = FindControl(str_name);
if (pctrl)
{
// 转为目标类型指针
args = dynamic_cast<ele_type>(pctrl);
}
return args;
}
目标控件类型不确定,所以,采用关键字auto自动推导。 调用代码如下:
ui::Button *pbtntmp = nullptr;
ui::Button *pbutton = find_control(std::wstring(L"btn_blue"), pbtntmp);
pbutton 函数的返回值。
分析
该方法看上去有所转变,但实际上没有任何意义,反而使得阅读性降低。
方案 2
方案1的基础上继续改进,调用函数时,将需目标变量也传进去。 这样,函数内部完成转换。 函数体如下:
// 取得传进来的参数类型
using ele_type2 = typename std::decay<T>::type;
// 读取xml文件中的控件
ui::Control* pctrl = nullptr;
pctrl = FindControl(str_name);
if (pctrl)
{
// 转为目标类型指针
args = dynamic_cast<ele_type2>(pctrl);
}
这样,函数内部完成了转换,避免了接收函数的返回值。 调用示例。
// 定义了3个buttons
ui::Button *pbtn_arr_[count_3];
find_control2(std::wstring(L"btn_blue"), pbtn_arr_[0]);
find_control2(std::wstring(L"btn_white"), pbtn_arr_[1]);
find_control2(std::wstring(L"btn_red"), pbtn_arr_[2]);
瞧,相对方法1和方法2 ,减少了不少代码量。
思考
当让,还可以继续优化。 比如, 伪代码 如下:
template<typename T>
void find_control(const std::wstring name_arr[], T** t)
{
// to do ...
}
将xml中的name和控件同时以数组传递到函数中,函数内完成转换
nim_duilib(18)之xml控件关联优化的更多相关文章
- Android 性能优化——之控件的优化
Android 性能优化——之控件的优化 前面讲了图像的优化,接下来分享一下控件的性能优化,这里主要是面向自定义View的优化. 1.首先先说一下我们在自定义View中可能会犯的3个错误: 1)Use ...
- MFC 如何为控件关联变量
所关联的变量常见有两种,一种就是控件变量,一种就是数字变量. 为控件关联变量的方法也有两种,一种是通过软件工具添加,一种是手动添加代码. 软件工具添加,方便简单,但是根据软件的版本不同,以及不同的空间 ...
- 安卓常用的xml控件配件的使用包含shape,declare-styleable、selector
今天就讲我所遇到的常用到的一些通过xml文件制作的背景效果,以后用到的话就直接使用啦!哈哈,我一向就是这么懒! 接下来,就开始介绍了 1.shape的使用,可以混合使用 xml控件配置属性 andro ...
- MFC 可编辑文本框,MFC控件关联变量总结
Edit Control控件,默认状态下,按回车会调用OnOK()关闭窗体.解决此bug可以,类视图中单击CMFCApplication3Dlg,下方重写OnOK(),注释掉其中的代码即可. Edit ...
- Binding(二):控件关联和代码提升
上节我们讲到,使用Binding,我们可以关联后台代码中的属性,在某些情况下,我们可能需要将两个控件关联起来,借助Binding,我们也可以轻松的实现. 关联控件 设想这样一个场景,界面中有个Chec ...
- C++代码优化之nim_duilib控件关联
前言 使用nim_duilib关联控件,优化后.的确减少了代码量,那么,执行效率呢? 时间执行的长短与硬件.软件有关,以下内容仅为参考. 测试代码 下面的代码,分为两部分, 循环使用for,非循环则直 ...
- LODOP打印控件关联输出各内容
Lodop打印控件利用SET_PRINT_STYLEA里面的“LinkedItem”可以把多个独立的内容关联起来,让它们顺序打印.这样,就可以实现很多效果,例如一些内容紧跟着表格下方输出,关联表格后就 ...
- Android滚动栏控件的优化
背景 由于普通TextView的跑马灯效果与焦点获取有关 所以不能直接使用 之前查找到的控件在数据设置方面存在问题 所以通过寻找github上的开源控件 并修改源码 得到一个目前感觉不错的效果 原理 ...
- 第18章 Active控件
转自: https://blog.csdn.net/u014162133/article/details/46573873 容器和服务器程序 容器应用程序时可以嵌入或链接对象的应用程序.Word就是容 ...
随机推荐
- R语言与医学统计图形【4】直方图、金字塔图
R语言基础绘图系统 基础图形--直方图.金字塔图 3.直方图 参数设置及比较. op <- par(mfrow=c(2,3)) data <- rnorm(100,10,5) hist(d ...
- centos yum安装mongodb,php扩展
一,安装mongodb,php扩展 ? 1 [root@localhost ~]# yum install php-pecl-mongo mongodb mongodb-devel mongodb-s ...
- Vulnstack内网靶场5
实验环境搭建 漏洞详情 (qiyuanxuetang.net) "此次靶场虚拟机共用两个,一个外网一个内网,用来练习红队相关内容和方向,主要包括常规信息收集.Web攻防.代码审计.漏洞利用. ...
- WINDOWS中使用svn
官网:https://tortoisesvn.net/index.zh.html (SVN安装包) 然后下载对应的64位安装包(语言包) 安装完后运行 可以存到D盘,新建一个文件夹存放 右键桌面会多 ...
- Python中的随机采样和概率分布(一)
Python(包括其包Numpy)中包含了了许多概率算法,包括基础的随机采样以及许多经典的概率分布生成.我们这个系列介绍几个在机器学习中常用的概率函数.先来看最基础的功能--随机采样. 1. rand ...
- JVM1 JVM与Java体系结构
目录 JVM与Java体系结构 虚拟机与Java虚拟机 虚拟机 Java虚拟机 JVM的位置 JVM的整体结构 Java代码执行流程 JVM的架构模型 基于栈的指令级架构 基于寄存器的指令级架构 两种 ...
- linux安装redis报错
问题:You need tcl 8.5 or newer in order to run the Redis test 解决办法: wget http://downloads.sourceforge. ...
- canal整合springboot实现mysql数据实时同步到redis
业务场景: 项目里需要频繁的查询mysql导致mysql的压力太大,此时考虑从内存型数据库redis里查询,但是管理平台里会较为频繁的修改增加mysql里的数据 问题来了: 如何才能保证mysql的数 ...
- 【Linux】【Commands】trouble shooting命令详解目录
1. 简介 1.1. 最近看到阿里的运维招聘需要熟练掌握以下的命令,我就针对这几个命令做一下总结,有些命令我觉得别人总结的挺好了,我就不赘述了 1.2. 还有一些其他我觉得用得到的命令的用法会在第三部 ...
- tomcat 之 session服务器 (memcache)
#: 在tomcat各节点安装memcached [root@node1 ~]# yum install memcached -y #: 下载tomcat所需的jar包(此处在视频中找软件) [roo ...