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就是容 ...
随机推荐
- 回文字符串 Manacher
1. Manacher 忘光了,忘光了. 首先将字符串所有字符之间(包括头尾)插入相同分隔符,再在最前方插入另一个分隔符防止越界. 设以 \(s_i\) 为对称中心的回文串中,最长的回文半径为 \(p ...
- R语言与医学统计图形-【13】ggplot2几何对象之盒形图
ggplot2绘图系统--几何对象之盒形图 参数: geom_boxplot(mapping = , #lower,middle,upper,x,ymax,ymin必须(有默认) #alpha/col ...
- Python基础之流程控制for循环
目录 1. 语法 2. for+break 3. for+continue 4. for循环嵌套 1. 语法 while循环可以对任何内容循环,但循环次数不可控 for循环基于容器类型的长度,循环次数 ...
- javaSE中级篇3——集合体系(另外一种存储容器)——更新完毕
集合还是一种工具,所以它们的包都在java.util包下 1.集合的整个体系结构(是需要掌握的体系,完全体系不是这样) 对图中所说的 序和重复 这两词的说明: 序:指的是添加进去的元素和取出来的元素 ...
- Js数组内对象去重
let person = [ {id: 0, name: "小明"}, {id: 1, name: "小张"}, {id: 2, name: "小李& ...
- Android 开源框架Universal-Image-Loader加载https图片
解决方案就是 需要 android https HttpsURLConnection 这个类忽略证书 1,找到 Universal-Image-Loader的library依赖包下面com.nostr ...
- Activity 详解
1.活动的生命周期 1.1.返回栈 Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈.栈是一种先进后出的数据结构,在默认情况下,每当我们启 ...
- Android 高级UI组件(二)
1.ExpandableListView 显示垂直滚动两级列表的条目,只允许两个层次 整体思路: 要给ExpandableListView设置适配器,那么必须先设置数据源. 数据源,就是此处的适配器类 ...
- ebs 初始化登陆
BEGIN fnd_global.APPS_INITIALIZE(user_id => youruesr_id, esp_id => yourresp_id, resp_appl_id = ...
- 【Spring Framework】Spring注解设置Bean的初始化、销毁方法的方式
bean的生命周期:创建---初始化---销毁. Spring中声明的Bean的初始化和销毁方法有3种方式: @Bean的注解的initMethod.DestroyMethod属性 bean实现Ini ...