方法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控件关联优化的更多相关文章

  1. Android 性能优化——之控件的优化

    Android 性能优化——之控件的优化 前面讲了图像的优化,接下来分享一下控件的性能优化,这里主要是面向自定义View的优化. 1.首先先说一下我们在自定义View中可能会犯的3个错误: 1)Use ...

  2. MFC 如何为控件关联变量

    所关联的变量常见有两种,一种就是控件变量,一种就是数字变量. 为控件关联变量的方法也有两种,一种是通过软件工具添加,一种是手动添加代码. 软件工具添加,方便简单,但是根据软件的版本不同,以及不同的空间 ...

  3. 安卓常用的xml控件配件的使用包含shape,declare-styleable、selector

    今天就讲我所遇到的常用到的一些通过xml文件制作的背景效果,以后用到的话就直接使用啦!哈哈,我一向就是这么懒! 接下来,就开始介绍了 1.shape的使用,可以混合使用 xml控件配置属性 andro ...

  4. MFC 可编辑文本框,MFC控件关联变量总结

    Edit Control控件,默认状态下,按回车会调用OnOK()关闭窗体.解决此bug可以,类视图中单击CMFCApplication3Dlg,下方重写OnOK(),注释掉其中的代码即可. Edit ...

  5. Binding(二):控件关联和代码提升

    上节我们讲到,使用Binding,我们可以关联后台代码中的属性,在某些情况下,我们可能需要将两个控件关联起来,借助Binding,我们也可以轻松的实现. 关联控件 设想这样一个场景,界面中有个Chec ...

  6. C++代码优化之nim_duilib控件关联

    前言 使用nim_duilib关联控件,优化后.的确减少了代码量,那么,执行效率呢? 时间执行的长短与硬件.软件有关,以下内容仅为参考. 测试代码 下面的代码,分为两部分, 循环使用for,非循环则直 ...

  7. LODOP打印控件关联输出各内容

    Lodop打印控件利用SET_PRINT_STYLEA里面的“LinkedItem”可以把多个独立的内容关联起来,让它们顺序打印.这样,就可以实现很多效果,例如一些内容紧跟着表格下方输出,关联表格后就 ...

  8. Android滚动栏控件的优化

    背景 由于普通TextView的跑马灯效果与焦点获取有关 所以不能直接使用 之前查找到的控件在数据设置方面存在问题 所以通过寻找github上的开源控件 并修改源码 得到一个目前感觉不错的效果 原理  ...

  9. 第18章 Active控件

    转自: https://blog.csdn.net/u014162133/article/details/46573873 容器和服务器程序 容器应用程序时可以嵌入或链接对象的应用程序.Word就是容 ...

随机推荐

  1. doxygen文件配置

    主要配置修改 整个程序配置分几个部分 Project related configuration options 项目相关,包括: 项目名 输出目录 输出语言 是否显示继承属性 是否对C.Java.F ...

  2. [R] venn.diagram保存pdf格式文件?

    vennDiagram包中的主函数绘图时,好像不直接支持PDF格式文件: dat = list(a = group_out[[1]][,1],b = group_out[[2]][,1]) names ...

  3. Linux openssl 升级、降级

    Linux openssl 升级.降级 最近遇到一些朋友使用微信退款,报openssl版本为问题,需要对openssl进行降级. 现在环境的openssl版本如下: root@c215a2b695ef ...

  4. STM32驱动直流电机的程序与电路设计(IR2110S自举电路+H桥+高级定时器和死区PWM)

    https://blog.csdn.net/geek_monkey/article/details/82079435

  5. Apache RocketMQ分布式消息传递和流数据平台及大厂面试宝典v4.9.2

    概述 **本人博客网站 **IT小神 www.itxiaoshen.com 定义 Apache RocketMQ官网地址 https://rocketmq.apache.org/ Latest rel ...

  6. 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 ...

  7. RocketMQ集群搭建方式

    各角色介绍 Producer:消息的发送者:举例:发信者 Consumer:消息接收者:举例:收信者 Broker:暂存和传输消息:举例:邮局 NameServer:管理Broker:举例:各个邮局的 ...

  8. 安全相关,xss

    XSS XSS,即 Cross Site Script,中译是跨站脚本攻击:其原本缩写是 CSS,但为了和层叠样式表(Cascading Style Sheet)有所区分,因而在安全领域叫做 XSS. ...

  9. 【并发编程】Java并发编程-看懂AQS的前世今生

    在我们可以深入学习AbstractQueuedSynchronizer(AQS)之前,必须具备了volatile.CAS和模板方法设计模式的知识,本文主要想从AQS的产生背景.设计和结构.源代码实现及 ...

  10. Java对象的创建过程:类的初始化与实例化

    一.Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化.在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象 ...