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就是容 ...
随机推荐
- doxygen文件配置
主要配置修改 整个程序配置分几个部分 Project related configuration options 项目相关,包括: 项目名 输出目录 输出语言 是否显示继承属性 是否对C.Java.F ...
- [R] venn.diagram保存pdf格式文件?
vennDiagram包中的主函数绘图时,好像不直接支持PDF格式文件: dat = list(a = group_out[[1]][,1],b = group_out[[2]][,1]) names ...
- Linux openssl 升级、降级
Linux openssl 升级.降级 最近遇到一些朋友使用微信退款,报openssl版本为问题,需要对openssl进行降级. 现在环境的openssl版本如下: root@c215a2b695ef ...
- STM32驱动直流电机的程序与电路设计(IR2110S自举电路+H桥+高级定时器和死区PWM)
https://blog.csdn.net/geek_monkey/article/details/82079435
- Apache RocketMQ分布式消息传递和流数据平台及大厂面试宝典v4.9.2
概述 **本人博客网站 **IT小神 www.itxiaoshen.com 定义 Apache RocketMQ官网地址 https://rocketmq.apache.org/ Latest rel ...
- A Child's History of England.47
CHAPTER 13 ENGLAND UNDER RICHARD THE FIRST, CALLED THE LION-HEART In the year of our Lord one thousa ...
- RocketMQ集群搭建方式
各角色介绍 Producer:消息的发送者:举例:发信者 Consumer:消息接收者:举例:收信者 Broker:暂存和传输消息:举例:邮局 NameServer:管理Broker:举例:各个邮局的 ...
- 安全相关,xss
XSS XSS,即 Cross Site Script,中译是跨站脚本攻击:其原本缩写是 CSS,但为了和层叠样式表(Cascading Style Sheet)有所区分,因而在安全领域叫做 XSS. ...
- 【并发编程】Java并发编程-看懂AQS的前世今生
在我们可以深入学习AbstractQueuedSynchronizer(AQS)之前,必须具备了volatile.CAS和模板方法设计模式的知识,本文主要想从AQS的产生背景.设计和结构.源代码实现及 ...
- Java对象的创建过程:类的初始化与实例化
一.Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化.在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象 ...