第三十二篇:在SOUI2.0中像android一样使用资源
SOUI2.0之前,在SOUI中使用资源通常是直接使用这个资源的name(一个字符串)来引用。使用字符串的好处在于字符串能够表达这个资源的意义,因此使用字符串也是现代UI引擎常用的方式。
尽管直接使用字符串有意义明确的优点,它同样也有缺点:
1、字符串写错了,编译器不知道。这可能导致一些很难发现的BUG。
2、控件查询,比较时基于字符串,相对来说性能会差一点(好在现在CPU够强,这点性能损失通常可以忽略)。
做过Android开发的朋友可能知道,在Android中要引用一个资源如图片、字符串、颜色等可以使用R.id.xxx, R.string.xxx,R.color.xxx这样的形式来引用。
Android内部全部自动转换成ID,整数比较显然比字符串比较快,这里不作讨论。
这种方式一个好处在于Android的自动补全功能能够帮助你快速的输入你需要的资源,除了加快了编码速度,还大大减少了输入错误。
SOUI2.0把Android的这种资源引用方式引入了进来。
关键在于uiresbuilder。原来SOUI中的uiresbuilder只提供将资源转换成.rc2功能,方便将资源编译到EXE/DLL中。
2.0版本新增加name提取,id生成,字符串表ID生成,颜色表ID生成功能。它们会输出到一个C++头文件(由命令行参数指定)。
要使用该功能首先要保证所有的布局XML所在的资源类型为"Layout",然后在uiresbuilder的命名行中加入: -h “输出文件名” idtable。-h 后面紧跟输出文件名,idtable指示需要给没有指定ID的控件自动生成ID,该功能默认关闭。
生成成功后,你的“输出文件”的内容可能是下面的样子:
//stamp:0ae7b68801b8deb8
/*<------------------------------------------------------------------------------------------------->*/
/*该文件由uiresbuilder生成,请不要手动修改*/
/*<------------------------------------------------------------------------------------------------->*/
#pragma once
#include <res.mgr/snamedvalue.h>
namespace SOUI
{
const SNamedID::NAMEDVALUE namedXmlID[]={
{L"btnSelectGif",},
{L"btn_display",},
{L"btn_hidetst",},
{L"btn_lrc",},
{L"btn_menu",},
{L"ctrl_flash",},
{L"gif_test",},
{L"giftest",},
{L"tab_main",} };
class _R{
public:
class _name{
public:
_name(){
btnSelectGif = namedXmlID[].strName;
btn_display = namedXmlID[].strName;
btn_hidetst = namedXmlID[].strName;
btn_lrc = namedXmlID[].strName;
btn_menu = namedXmlID[].strName;
ctrl_flash = namedXmlID[].strName;
gif_test = namedXmlID[].strName;
giftest = namedXmlID[].strName;
tab_main = namedXmlID[].strName;
}
const wchar_t * btnSelectGif;
const wchar_t * btn_display;
const wchar_t * btn_hidetst;
const wchar_t * btn_lrc;
const wchar_t * btn_menu;
const wchar_t * ctrl_flash;
const wchar_t * gif_test;
const wchar_t * giftest;
const wchar_t * tab_main;
}name; class _id{
public:
const static int btnSelectGif = ;
const static int btn_display = ;
const static int btn_hidetst = ;
const static int btn_lrc = ;
const static int btn_menu = ;
const static int ctrl_flash = ;
const static int gif_test = ;
const static int giftest = ;
const static int tab_main = ;
}id; class _string{
public:
const static int mccol_1 = ;
const static int mccol_2 = ;
const static int mccol_3 = ;
const static int mccol_4 = ;
const static int mccol_5 = ;
const static int mccol_6 = ;
const static int title = ;
const static int ver = ;
}string; class _color{
public:
const static int blue = ;
const static int gray = ;
const static int green = ;
const static int red = ;
const static int white = ;
}color; }; const _R R;
}
第一行保留的是一个时间戳,如果资源中布局相关的资源没有变化,则不再生成。
首先会自动生成一个name, id映射表:SNamedID::NAMEDVALUE,这是一个结构体数组,保留每一个控件的名字及ID(自动生成的及XML中定义的,自动生成的ID自动从65536开始,因此自己定义时应该小于这个值)。
接下来定义了一个类 class _R。_R中有4个子类:_name, _id, _string, _color,每个类有一个实例,对应的名字为:name, id, string, color。
最后定义一个_R的实例R。
到这里你应该已经知道在SOUI中R这个对象有哪几个成员了。
那么在代码中如何使用R这个对象呢?
如何使用name对象:
观察R这个对象,你可能已经发现,在代码直接使用R.name.btnSelectGif就等价于在代码中输入L“btnSelectGif”,这样的好处在于你在输入R.name.btn后VS或者VA可能就给你补全后面的SelectGif,既提高了编码效率,又保证了不会出错。(对象name修改以后也可以使用VA的变量重命名功能自动批量修改)。
如何使用ID对象:
前面提到使用字符串来查找窗口对象相对来说较ID比较会慢一点,那么如何使用ID对象呢?要使用ID对象,有一个要求:由于自动生成的ID并没有修改到原有的XML中,直接从XML中初始化布局时是没有ID属性的。为此SOUI2.0的SApplication对象增加了一个方法:InitXmlNamedID,参见demo(注意调用位置):
//如果需要在代码中使用R::id::namedid这种方式来使用控件必须要这一行代码:2016年2月2日,R::id::namedXmlID是由uiresbuilder 增加-h .\res\resource.h idtable 这3个参数后生成的。
theApp->InitXmlNamedID(namedXmlID,ARRAYSIZE(namedXmlID),TRUE);
在布局创建前给App对象初始化一个自动生成的Name转ID表。
控件创建并初始化name属性时,自动从该表中查询ID。
如此,在代码中可以直接使用R.id.btnSelectGif来查找对应的控件了。
如何使用string, color对象:
在布局XML中使用使用string, color对象和android一样:采用@string/str-name, @color/color-name来分别引用在string,color中定义的对应的字符串或者颜色值。
这里重点讲一下在代码中使用这两个对象:
//演示R.color.xxx,R.string.xxx在代码中的使用。
COLORREF crRed = GETCOLOR(R.color.red);
SStringW strVer = GETSTRING(R.string.ver);
上面是demo:winmain中一个使用示例。
R.color.red, R.string.ver是自动生成的两个整数,GETCOLOR, GETSTRING这两个宏会自动从资源中的字符串表及颜色表中获取对应的ID指定的值。
启程软件 2016年2月22日
第三十二篇:在SOUI2.0中像android一样使用资源的更多相关文章
- 第三十二篇、iOS 10开发
1.语音识别 苹果官方在文档中新增了API Speech,那么在以前我们处理语音识别非常的繁琐甚至很多时候可能需要借助于第三方框架处理,那么苹果推出了这个后,我们以后处理起来就非常的方便了,spe ...
- 第三十二篇-NavigationView导航抽屉的使用
效果图: 导航抽屉所用到的布局是DrawerLayout,可以在里面添加一个线性布局和TextView组件,TextView组件的文本信息就是"主页面".然后和线性布局平行添加一个 ...
- Python之路(第三十二篇) 网络编程:udp套接字、简单文件传输
一.UDP套接字 服务端 # udp是无链接的,先启动哪一端都不会报错 # udp没有链接,与tcp相比没有链接循环,只有通讯循环 server = socket.socket(socket.AF_I ...
- 第六十二篇、AFN3.0封装网络请求框架,支持缓存
1.网络请求 第一种实现方式: 功能:GET POST 请求 缓存逻辑: 1.是否要刷新本地缓存,不需要就直接发起无缓存的网络请求,否则直接读取本地数据 2.需要刷新本地缓存,先读取本地数据,有就返回 ...
- 第三十二篇 -- CreateFile、ReadFile、WriteFile
一.CreateFile 这是一个多功能的函数,可打开或创建文件或者I/O设备,并返回可访问的句柄:控制台,通信资源,目录(只读打开),磁盘驱动器,文件,邮槽,管道. 函数原型: HANDLE WIN ...
- Android UI开发第三十二篇——Creating a Navigation Drawer
Navigation Drawer是从屏幕的左侧滑出,显示应用导航的视图.官方是这样定义的: The navigation drawer is a panel that displays the ap ...
- 第三十二篇 玩转数据结构——AVL树(AVL Tree)
1.. 平衡二叉树 平衡二叉树要求,对于任意一个节点,左子树和右子树的高度差不能超过1. 平衡二叉树的高度和节点数量之间的关系也是O(logn) 为二叉树标注节点高度并计算平衡因子 AVL ...
- Python之路【第三十二篇】:django 分页器
Django的分页器paginator 文件为pageDemo models.py from django.db import models # Create your models here. cl ...
- 第三十二篇:vue的响应式原理
好家伙 什么是响应式?比较官方的回答: Vue.js 的核心包括一套"响应式系统". "响应式",是指当数据改变后,Vue 会通知到使用该数据的代码. 例如,视 ...
随机推荐
- CSS3的filter用法
最近到处看到有人在说CSS3的filter一直没有时间自己去测试这效果.今天终于抽出时间学习这个CSS3的Filter.不整不知道呀,一整才让我感到吃惊,太强大了.大家先来看个效果吧: 我想光看上面的 ...
- MVC IIS环境部署注意事项
环境:MVC3.0,IIS7 Mvc3.0的部署除像正常部署aspx程序一样外,另外还需要注意的几点: 1. 安装MVC3.0 确保服务器上安装了MVC3.0,默认版本是“3.0.20105.0” 2 ...
- Eclipse启动Tomcat时server.xml和content.xml自动还原问题
当我们在处理中文乱码或是配置数据源时,我们要修改Tomcat下的server.xml和content.xml文件. 但是当我们修改完后重启Tomcat服务器时发现xml文件又被还原了,修改无效果. 为 ...
- mfc+vtk
MFC中view类主要处理显示视图,doc类处理文档,mainframe主要为整个窗口的和工程的设置管理.由此,VTK与MFC联合编程时,需要主要的是数据操作,以及显示要很好的与MFC中的结构结合,做 ...
- c++文件输入输出流fstream,对输入>>和输出<<重载
1. fstream 继承自iostream --> 要包含头文件#include<fstream> 2. 建立文件流对象 3. 打开文件夹 4. 测试是否打开成功 5. 进行读写操 ...
- Excel文件转plist文件出现的文件编码问题
今天在测试时遇到了需要将大量整理好的Excel数据转换为plist文件的情况.百度了一下教程,发现虽然别人也遇到过类似的情况,但是有些讲的还是不够细致.所以做如下整理. 百度到的内容中有使用Mes ...
- acm的ubuntu (ubuntu16.04 安装指南,chrome安装,vim配置,git设置和github,装QQ)
日常手贱把ubuntu14.04更新到了16.04,然后就game over了.mdzz,不然泥萌也看不到这篇博客了=.= 然后花了些时间重装了一个16.04版的,原来那个14.04的用可以用,就是动 ...
- java从基础知识(七)java集合
一.集合类介绍 1.List(元素有放入顺序,可重复) 1.1.List的实现 1.1.1.ArrayList ArrayList就是动态数组(需要连续的存储空间),用MSDN中的说法,就是Array ...
- 深入浅析JAVA注解
注解,相信大家都会知道,像@requestMapping,@Resource,@Controller等等的一些注解,大家都用过,那么,他的工具类你用过吗?下面就和大家一起来分享一下注解工具类. 注解的 ...
- ExecutorService线程池
ExecutorService 建立多线程的步骤: 1.定义线程类 class Handler implements Runnable{} 2.建立ExecutorService线程池 Executo ...