android 模糊查询控件_第三十二篇:在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,该功能默认关闭。生成成功后,你的“输出文件”的内容可能是下面的样子:6146166839ea5b7a17a735546a0dbfb0.png
//stamp:0ae7b68801b8deb8/**//*该文件由uiresbuilder生成,请不要手动修改*//**/#pragma once#include namespace SOUI{    const SNamedID::NAMEDVALUE namedXmlID[]={        {L"btnSelectGif",65540},        {L"btn_display",65541},        {L"btn_hidetst",65542},        {L"btn_lrc",65543},        {L"btn_menu",65536},        {L"ctrl_flash",65538},        {L"gif_test",1000},        {L"giftest",65539},        {L"tab_main",65537}        };    class _R{    public:        class _name{        public:        _name(){            btnSelectGif = namedXmlID[0].strName;            btn_display = namedXmlID[1].strName;            btn_hidetst = namedXmlID[2].strName;            btn_lrc = namedXmlID[3].strName;            btn_menu = namedXmlID[4].strName;            ctrl_flash = namedXmlID[5].strName;            gif_test = namedXmlID[6].strName;            giftest = namedXmlID[7].strName;            tab_main = namedXmlID[8].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    =    65540;        const static int btn_display    =    65541;        const static int btn_hidetst    =    65542;        const static int btn_lrc    =    65543;        const static int btn_menu    =    65536;        const static int ctrl_flash    =    65538;        const static int gif_test    =    1000;        const static int giftest    =    65539;        const static int tab_main    =    65537;        }id;        class _string{        public:        const static int mccol_1    =    0;        const static int mccol_2    =    1;        const static int mccol_3    =    2;        const static int mccol_4    =    3;        const static int mccol_5    =    4;        const static int mccol_6    =    5;        const static int title    =    6;        const static int ver    =    7;        }string;        class _color{        public:        const static int blue    =    0;        const static int gray    =    1;        const static int green    =    2;        const static int red    =    3;        const static int white    =    4;        }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指定的值。

0fa4e47add8dab8e1ed53f8a2dac9eec.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

天池 在线编程 有序队列

文章目录1. 题目2. 解题1. 题目 给出了一个由小写字母组成的字符串 S。 然后,我们可以进行任意次数的移动。 在每次移动中,我们选择前 K 个字母中的一个(从左侧开始),将其从原位置移除,并放置在字符串的末…

网站搜索功能怎么实现_电商网站上的搜索功能是如何实现的?

今天是刘小爱自学Java的第159天。感谢你的观看,谢谢你。学习计划安排如下:索引库本质上和数据库类似,也是存储数据的,既然如此自然也会有增删改查。那么这个索引库到底有何特别应用呢?索引库的特别之处在于它的查询&am…

android蓝牙通信_Flutter通过BasicMessageChannel实现Flutter 与Android iOS 的双向通信

题记:——不到最后时刻,千万别轻言放弃,无论结局成功与否,只要你拼博过,尽力过,一切问心无愧。通过 Flutter 来进行移动应用开发,打包 Android 、iOS 双平台应用程序,在调用如相机、…

MapReduce既是编程模型又是计算框架

learn from 从0开始学大数据&#xff08;极客时间&#xff09; MapReduce 编程模型 包含 Map 和 Reduce 两个过程 map 的主要输入是一对 <Key, Value> 值&#xff0c;输出一对 <Key, Value> 值将相同 Key 合并&#xff0c;形成 <Key, Value 集合 >再将这个…

MapReduce 计算框架如何运作

learn from 从0开始学大数据&#xff08;极客时间&#xff09; 1. MapReduce 作业启动和运行机制 作业涉及三类关键进程&#xff1a; 大数据应用进程 这类进程是启动 MapReduce 程序的主入口&#xff0c;主要是指定 Map 和 Reduce 类、输入输出文件路径等&#xff0c;并提交作业…

linux忘记mysql密码_Linux下忘记Mysql密码的找回方法(图)

Mysql隔一段时间不访问&#xff0c;也许你会忘记访问密码&#xff0c;这时该怎么办&#xff0c;重装mysql吗&#xff1f;这个代价也太大了&#xff0c;我们这里介绍两种恢复密码的方法。方法一&#xff1a;因为Mysql密码存储于数据库mysql中的user表中&#xff0c;所以我们只要…

Yarn 资源调度框架

learn from 从0开始学大数据&#xff08;极客时间&#xff09; Hadoop 主要是由三部分组成&#xff1a; 分布式文件系统 HDFS分布式计算框架 MapReduce分布式集群资源调度框架 Yarn Yarn 的架构

mysql mtop 使用_MYSQLMTOP监控环境搭建

MySQLMTOP是一个由PythonPHP开发的MySQL企业级监控系统。系统由Python实现多进程数据采集和告警&#xff0c;PHP实现WEB展示和管理。最重要是MySQL服务器无需安装任何Agent&#xff0c;只需在监控WEB界面配置相关数据库信息功能非常强大&#xff1a;可对上百台MySQL数据库的状态…

Hive是如何让MapReduce实现SQL操作的?

learn from 从0开始学大数据&#xff08;极客时间&#xff09; 1. MapReduce 实现 SQL 的原理 SELECT pageid, age, count(1) FROM pv_users GROUP BY pageid, age;实现过程&#xff1a; 2. Hive 的架构 Hive 能够直接处理我们输入的 SQL 语句&#xff08;Hive SQL 语法与 标…

mysql spring隔离级别_MySQL事务与Spring隔离级别实现

1、事务具有ACID特性原子性(atomicity)&#xff1a;一个事务被事务不可分割的最小工作单元&#xff0c;要么全部提交&#xff0c;要么全部失败回滚。一致性(consistency)&#xff1a;数据库总是从一致性状态到另一个一致性状态&#xff0c;它只包含成功事务提交的结果隔离型(is…

Java JDK 安装配置

文章目录1. 下载安装2. 配置环境变量3. 检查安装成功1. 下载安装 下载地址&#xff1a;https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html&#xff08;需要注册下载&#xff09; 以下操作环境&#xff1a;WIN 10 2. 配置环境变量 JAVA_HOME 为…

mqtt如何判断设备离线_反渗透纯水设备膜元件如何离线清洗?

原标题&#xff1a;反渗透纯水设备膜元件如何离线清洗&#xff1f;在反渗透设备正常运行&#xff0c;无故障时&#xff0c;反渗透系统一般都用在线清洗保养、冲击性杀菌以及定期保护。但是&#xff0c;如果当反渗透膜元件重度污染时&#xff0c;在线清洗就显得无能为力了&#…

Java 变量、数据类型

文章目录1. 变量、常量2. 数据类型1. 变量、常量 final 修饰常量 public class Variable {static final int YEAR 365;// 常量使用 final 修饰, 不可修改&#xff0c;类似C的 conststatic int day 0;// 成员变量public static void main(String[] args){System.out.println…

html背景图不显示_批量显示多张有序排列的图标,使用精灵图CSS Sprites这种办法...

让你显示一个天气图标你会怎么显示呢&#xff1f;让你做一个简单的动图你会怎么采用什么方式呢&#xff1f;让你输出一个长期固定的图标列表你会怎么编写代码呢&#xff1f;如果不管性能&#xff0c;不用css&#xff0c;不用js&#xff0c;可能你会这么写html&#xff1a;<类…

mysql堵塞等级_MySQL 事务隔离级别

前言简单来说&#xff0c;数据库事务就是保证一组数据操作要么全部成功&#xff0c;要么全部失败。在 MySQL 中&#xff0c;事务是在引擎层实现的。原生的 MyISAM 引擎不支持事务&#xff0c;也是为什么 InnoDB 会取代它的重要原因之一。隔离性与隔离级别当数据库上有多个事务同…

Java 运算符、表达式、语句

文章目录1. 运算符2. 表达式3. 语句1. 运算符 赋值运算 , -, *, /, % 算术运算 , -, !, ~ 一元运算 关系运算 >, <, >, <, , ! 返回布尔 递增&#xff0c;递减--&#xff0c;支持&#xff08;float&#xff0c;double&#xff09;1, -1 逻辑运算 &&…

arrays中copyof复制两个数组_Java的数组初识和拷贝用法

方法重载&#xff1a;方法名称相同&#xff0c;参数列表不同。不能有两个名字相同、参数类型相同&#xff0c;返回值不同的方法。在进行方法重载时&#xff0c;方法的返回值一定相同&#xff01;&#xff01;&#xff01;方法递归特点&#xff1a;1.必须有结束条件2.每次递归处…

你不知道的 字符集和编码(编码字符集与字符集编码)

我的上篇文章&#xff0c;有朋友提出字符集和编码的区别&#xff0c;我在此立文和大家讨论下 常说的字符集和编码区别&#xff0c;其实就是编码字符集和字符集编码的区别&#xff0c;其实&#xff0c;单单如果只是说字符集&#xff0c;没有任何编码的概念的话&#xff0c;那么字…

hook 监控文件 c++_技术分享 | Linux 入侵检测中的进程创建监控

作者简介&#xff1a;张博&#xff0c;网易高级信息安全工程师。0x00 简介在入侵检测的过程中&#xff0c;进程创建监控是必不可少的一点&#xff0c;因为攻击者的绝大多数攻击行为都是以进程的方式呈现&#xff0c;所以及时获取到新进程创建的信息能帮助我们快速地定位攻击行为…

hive 创建表_2min快速了解,Hive内部表和外部表

在了解内部表和外部表区别前&#xff0c;我们需要先了解一下Hive架构 &#xff1a;大家可以简单看一下这个架构图&#xff0c;我介绍其中要点&#xff1a;Hive的数据分为两种&#xff0c;一种为普通数据&#xff0c;一种为元数据。元数据存储着表的基本信息&#xff0c;增删改查…