duilib 入门一之界面库基本原理
2015-11-21 23:16
337 查看
欲行千里,必积跬步!!
关于UI控件的控制事件和响应,无论在PC还是在手机或者其他设备,处理方式基本是一样的。
如何理解呢?你可以试着想一下,假如有这个一个需求,
1、你只能得到显示器的分辨率,比如1024*1280,以及鼠标点击坐标,以及移动的坐标;
2、设备只提供几个画图的函数,你可以画几个框框,并进行背景设置等等;
3、你需要在这个设备上面开发一个窗口,窗口上面有一个按钮;
4、程序运行后,设备会提供一个函数,调用这个函数,你会得到当前窗口在屏幕中的位置,假设为函数名为 GetCurProcecssWindowPos();
5、点击下这个按钮,设备会做点什么,这由其他人完成;
然后到此结束
当你接到这个案子,你会怎么做?试着思考一下。
如果你见过windows窗体,你可能会按照下面的步骤进行
1、程序运行后,先使用画图函数画一个窗体,窗体上面有标题栏,关闭按钮,以及需求中的提到的按钮,并记下窗体上面各个按钮的相对位置
2、记下窗体中各个按钮的相对位置(这是因为主窗口的位置随时变,记下绝对位置没用)
3、主窗体固定后,调用GetCurProcecssWindowPos函数获得窗体在屏幕中的位置
4、定时去获取鼠标的点击位置
5、获取鼠标位置了,通过计算,并对比是否鼠标点击的位置是否在我们需要的按钮上面,如果是,则调用鼠标响应的函数。
抛开操作系统,我们是不是可以按照上面的方式设计一个窗体程序?答案是肯定的。
回到windows上面,windows操作系统提供的大量的函数和系统事件,我们可以按照上面的逻辑设计一套窗体系统,为了达到更好的结构,我们或许会想着把逻辑和界面的部分分离开来。
首先,我们需要一个文件来描述控件的布局,控件使用的图片,控件的特征,控件的标示等等,假定该文件为UI.xml,描述如下面所示,
<HorizontalLayout width="97" align="left">
<Button name="checkRemKey" width="17" height="17" normalimage="image\CheckBoxNormal.png" hotimage="image\CheckBoxHot.png" pushedimage="image\CheckHot.png" />
</HorizontalLayout>
然后我们会去设计一个线程,专门用来解析UI.xml,并进行相应的绘制,我们还可能设计一个线程专门用来监控windows的各种事件(设备的输入输出,系统消息),该线程实现可能会是这样
switch(GetMsg())
case WM_LBUTTONDOWN:
XXX;
break;
case WM_TIMER:
XXX;
于是,一个逻辑和界面分开的程序就被设计出来了,
以上就是各种界面库的原理
关于UI控件的控制事件和响应,无论在PC还是在手机或者其他设备,处理方式基本是一样的。
如何理解呢?你可以试着想一下,假如有这个一个需求,
1、你只能得到显示器的分辨率,比如1024*1280,以及鼠标点击坐标,以及移动的坐标;
2、设备只提供几个画图的函数,你可以画几个框框,并进行背景设置等等;
3、你需要在这个设备上面开发一个窗口,窗口上面有一个按钮;
4、程序运行后,设备会提供一个函数,调用这个函数,你会得到当前窗口在屏幕中的位置,假设为函数名为 GetCurProcecssWindowPos();
5、点击下这个按钮,设备会做点什么,这由其他人完成;
然后到此结束
当你接到这个案子,你会怎么做?试着思考一下。
如果你见过windows窗体,你可能会按照下面的步骤进行
1、程序运行后,先使用画图函数画一个窗体,窗体上面有标题栏,关闭按钮,以及需求中的提到的按钮,并记下窗体上面各个按钮的相对位置
2、记下窗体中各个按钮的相对位置(这是因为主窗口的位置随时变,记下绝对位置没用)
3、主窗体固定后,调用GetCurProcecssWindowPos函数获得窗体在屏幕中的位置
4、定时去获取鼠标的点击位置
5、获取鼠标位置了,通过计算,并对比是否鼠标点击的位置是否在我们需要的按钮上面,如果是,则调用鼠标响应的函数。
抛开操作系统,我们是不是可以按照上面的方式设计一个窗体程序?答案是肯定的。
回到windows上面,windows操作系统提供的大量的函数和系统事件,我们可以按照上面的逻辑设计一套窗体系统,为了达到更好的结构,我们或许会想着把逻辑和界面的部分分离开来。
首先,我们需要一个文件来描述控件的布局,控件使用的图片,控件的特征,控件的标示等等,假定该文件为UI.xml,描述如下面所示,
<HorizontalLayout width="97" align="left">
<Button name="checkRemKey" width="17" height="17" normalimage="image\CheckBoxNormal.png" hotimage="image\CheckBoxHot.png" pushedimage="image\CheckHot.png" />
</HorizontalLayout>
然后我们会去设计一个线程,专门用来解析UI.xml,并进行相应的绘制,我们还可能设计一个线程专门用来监控windows的各种事件(设备的输入输出,系统消息),该线程实现可能会是这样
switch(GetMsg())
case WM_LBUTTONDOWN:
XXX;
break;
case WM_TIMER:
XXX;
于是,一个逻辑和界面分开的程序就被设计出来了,
以上就是各种界面库的原理
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性
- C++ Custom Control控件向父窗体发送对应的消息