CN102253841A - 一种小型图形用户界面系统 - Google Patents

一种小型图形用户界面系统 Download PDF

Info

Publication number
CN102253841A
CN102253841A CN2011102270660A CN201110227066A CN102253841A CN 102253841 A CN102253841 A CN 102253841A CN 2011102270660 A CN2011102270660 A CN 2011102270660A CN 201110227066 A CN201110227066 A CN 201110227066A CN 102253841 A CN102253841 A CN 102253841A
Authority
CN
China
Prior art keywords
scene
user interface
situation elements
model unit
cur
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN2011102270660A
Other languages
English (en)
Other versions
CN102253841B (zh
Inventor
张福庆
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
DONGGUAN BILLION LAND TECHNOLOGY Ltd
Original Assignee
DONGGUAN BILLION LAND TECHNOLOGY Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by DONGGUAN BILLION LAND TECHNOLOGY Ltd filed Critical DONGGUAN BILLION LAND TECHNOLOGY Ltd
Priority to CN201110227066.0A priority Critical patent/CN102253841B/zh
Publication of CN102253841A publication Critical patent/CN102253841A/zh
Application granted granted Critical
Publication of CN102253841B publication Critical patent/CN102253841B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Processing Or Creating Images (AREA)

Abstract

本发明涉及信息技术,尤其涉及在已有操作系统平台下设计和实现较少依赖于操作系统的图形用户界面系统,包括有应用程序及按树状层次排列形成的可匹配应用程序驱动运作的模型单元,模型单元包括有场景元素、场景、绘制功能、图形设备接口;所述场景就是屏幕上可以显示的一块区域,在微软视窗操作系统下面,这个区域就是窗口区域的子区域;所述场景元素是场景或上级场景元素的子区域,用它来表示图形用户界面元素,场景是模型单元的根结点。本发明同其它现有技术相比,系统规模小,满足应用程序对图形用户界面的需要,且能够很容易的从视窗系列操作系统移植到其它软硬件平台上。系统具有简单、快速和可移植的特性。

Description

一种小型图形用户界面系统
技术领域
 本发明涉及信息技术,尤其涉及在已有操作系统平台下设计和实现较少依赖于操作系统的图形用户界面系统。
背景技术
习知,要构造一套图形用户界面系统需要有图形绘制功能,图形绘制功能依据其实现的复杂程度,将其划分为基本图形绘制功能和高级图形绘制功能。基本图形绘制功能包括在显示器的屏幕上绘制点、线、填充矩形等;高级图形绘制功能包括在显示器的屏幕上绘制文字、图片文件等。在特定的操作系统下,例如微软视窗操作系统下,有GDI、Open GL、Direct Draw、Direct 3D等不同实现方式的图形绘制功能。目前,在微软视窗操作下的图形用户界面系统主要有视窗系统的窗口与消息机制,微软基础类,第三方工具库QT等。其中视窗系统的窗口与消息机制是所有软件开发者在视窗系统下构造包含图形用户界面程序的基本编程接口;而其他图形用户界面系统如微软基础类、第三方工具库QT都是在此基础上封装了微软图形用户界面编程接口然后提供自己的编程接口,归根结底还是需要使用微软图形用户界面编程接口。
现有图形用户界面系统之微软窗口和消息机制,是操作系统提供的图形用户界面编程接口,该套接口使用虽然简单,但由于其是操作系统提供的接口,该套系统提供的图形界面元素也都与操作系统本身风格一致,导致用户想设计自己风格的图形用户界面元素困难。此外,该系统提供的图形用户界面元素也类型也有限,仅仅是一些基本的类型。再者,由于该系统提供的接口比较基础,软件开发人员往往为了实现一种没有现存的图形用户界面元素编写大量的代码。综合上述原因,用该系统开发应用程序的图形用户界面效率比较低。
现有图形用户界面系统之微软基础类,虽然封装了微软窗口消息机制,减少了应用程序代码编写量,但难于使用,对于非微软编译器支持不好。
现有图形用户界面系统之第三方工具库QT,虽然开源且有大量的文档,但是QT库本身是个庞然大物,而且编译应用程序还要先经过QT的预编译工具,不符合标准的C/C++语法。
为此,本申请人针对现有图形用户界面系统存在的问题,秉持着研究创新、精益求精之精神,利用其专业眼光和专业知识,研究出一种符合产业及学习使用的小型图形用户界面系统。
发明内容
本发明的目的在于提供一种简单,快速和可移植的小型的图形用户界面系统,方便应用程序开发;该系统主要为应用程序提供一套独立于操作系统且便于移植的图形用户界面库,作用相当于微软基础类的图形用户界面部分、QT开源库的图形用户界面部分。
为实现上述目的,本发明采用如下技术方案:
一种小型图形用户界面系统,包括有应用程序及按树状层次排列形成的可匹配应用程序驱动运作的模型单元,模型单元包括有场景元素、场景、绘制功能、图形设备接口;所述场景就是屏幕上可以显示的一块区域,在微软视窗操作系统下面,这个区域就是窗口区域的子区域;所述场景元素是场景或上级场景元素的子区域,用它来表示图形用户界面元素,场景是模型单元的根结点。
所述应用程序在更新显示时,依次将需要显示的部分叠加起来构成最终在屏幕上看到的效果。
所述模型单元实现把传递给应用程序的窗口消息转换为场景元素的消息,场景元素在收到消息后作出相应的动作。
所述模型单元具有一种基于模型单元的按钮场景元素,该按钮场景元素能够设置自己在场景中的位置和区域大小,能够在他自己的区域上面显示一个背景图片和文字提示,能够接收到鼠标的移动和鼠标上的按钮按下和释放的消息,并作出相应的动作。
所述模型单元具有一种基于模型单元的标签场景元素,该标签场景元素能够设置自己在场景中的位置和区域大小,能够在他自己的区域上面显示文字提示信息。
所述模型单元具有一种基于模型单元的文字编辑框元素,该文字编辑框元素能够设置自己在场景中的位置个区域大小,能够让用户输入文字信息同时将用户输入的文字信息显示在其区域上。
所述模型单元具有一种基于模型单元的图片显示区域元素,该图片显示区域元素能够设置自己在场景中的位置和区域大小,能够显示图像文件到其区域上。
所述模型单元具有一种基于模型单元的滑动区域元素,该滑动区域元素能够设置自己在场景中的位置和区域大小,能够将其他场景元素放置于其内做为它的孩子结点,它允许孩子结点的区域大小超过滑动区域元素的区域大小,并能显示孩子结点区域的一部分。
所述模型单元具有一种基于模型单元的列表容器元素,该列表容器元素能够设置自己在场景中的位置和区域大小,能够将其他若干个场景元素做为它的孩子结点,并能管理这些孩子结点元素的位置和区域大小。
本发明同其它现有技术相比,系统规模小,满足应用程序对图形用户界面的需要,且能够很容易的从视窗系列操作系统移植到其它软硬件平台上。系统具有简单、快速和可移植的特性;让使用者能够清楚的知道内部做了什么操作以及自己该做什么操作。当用户使用本图形用户界面系统来构造包含图形界面的应用程序时,程序本身运行的很快,占用的处理器和内存资源相对较少,能迅速响应用户输入的操作。当用户使用本图形用户界面系统来构造包含图形界面的应用程序时,开发过程是很快的,用户接口简单。目前本图形用户界面系统已经在微软视窗操作XP和Wince 6.0下有实现,将来还可以将其移植到Linux、Mac OS等操作系统下。
附图说明:
附图1为本发明的结构原理图;
附图2为是一个空的场景示意图;
附图3是含有一个场景和一个场景元素,场景元素在场景内部的示意图;
附图4是含有一个场景和两个场景元素,一个较小场景元素在另一个较大的场景元素里面,较大的场景元素又在场景里面的示意图;
附图5是一个由场景与场景元素构成的树状结构示意图;
附图6是本发明之图形用户界面系统的软件堆栈框图。
具体实施方式:
以下结合附图对本发明进一步说明:
参阅图1~6所示,本发明提供的一种小型图形用户界面系统,其包括有应用程序1及按树状层次排列形成的可匹配应用程序驱动运作的模型单元,模型单元包括有场景2、场景元素3、绘制功能4、图形设备接口5;所述场景2就是屏幕上可以显示的一块区域,在微软视窗操作系统下面,这个区域就是窗口区域的子区域;所述场景元素是场景或上级场景元素的子区域,用它来表示图形用户界面元素,场景是模型单元的根结点。当应用程序在更新显示时,依次将需要显示的部分叠加起来构成最终在屏幕上看到的效果,而模型单元实现把传递给应用程序的窗口消息转换为场景元素的消息,场景元素在收到消息后作出相应的动作。
本发明中,模型单元具有一种基于模型单元的按钮场景元素,该按钮场景元素能够设置自己在场景中的位置和区域大小,能够在他自己的区域上面显示一个背景图片和文字提示,能够接收到鼠标的移动和鼠标上的按钮按下和释放的消息,并作出相应的动作。
所述模型单元具有一种基于模型单元的标签场景元素,该标签场景元素能够设置自己在场景中的位置和区域大小,能够在他自己的区域上面显示文字提示信息。
所述模型单元具有一种基于模型单元的文字编辑框元素,该文字编辑框元素能够设置自己在场景中的位置个区域大小,能够让用户输入文字信息同时将用户输入的文字信息显示在其区域上。
所述模型单元具有一种基于模型单元的图片显示区域元素,该图片显示区域元素能够设置自己在场景中的位置和区域大小,能够显示图像文件到其区域上。
所述模型单元具有一种基于模型单元的滑动区域元素,该滑动区域元素能够设置自己在场景中的位置和区域大小,能够将其他场景元素放置于其内做为它的孩子结点,它允许孩子结点的区域大小超过滑动区域元素的区域大小,并能显示孩子结点区域的一部分。
所述模型单元具有一种基于模型单元的列表容器元素,该列表容器元素能够设置自己在场景中的位置和区域大小,能够将其他若干个场景元素做为它的孩子结点,并能管理这些孩子结点元素的位置和区域大小。
如图6所示,是本发明之图形用户界面系统的软件堆栈框图。两条直线构成的平行线将软件堆栈框图分成了上中下三个部分,最上面的部分是使用本发明之图形用户界面系统的应用程序,中间部分为本发明之图形用户界面系统,最下层为本发明图形用户界面系统所依赖的部分。在这个框图里面,上层功能的完成依赖于在其下层的功能。例如,GDI依赖于显示设备接口。GDI生成需要显示图像数据,再调用显示设备接口完成显示功能,显示设备接口最终完成绘图的功能。各种场景元素(如按钮,标签,文字编辑框,图片区域,滑动区域,列表容器)依赖于场景和场景元素模型。场景和场景元素模型依赖于绘图接口(如绘制点,线,填充矩形,文字,图片)。绘图接口依赖操作系统的绘图功能,在微软操作系统下有四种绘图功能的实现,分别是GDI、Open GL、Direct Draw和Direct 3D;但本发明图形用户界面系统并不是同时依赖这四种绘图功能,而只是依赖这四种中的任何一种或者不依赖这四种中的任何一种。如果依赖这四种中的一种,则本发明的绘图接口只是对所依赖的绘图功能的封装。如果不依赖这四种中的任意一种,则本发明的绘图接口自己抽象了图形设备接口,且自己实现了所有绘图操作。其所抽象的图形设备接口认为屏幕就是固定宽和高的矩阵,每行含有固定宽度个的像素,每列含有固定高度个像素,屏幕共含有固定宽度乘以固定高度个像素点,每个像素点就是一种颜色,这种颜色可以是灰度值也可以是彩色值。这个抽象的图形设备接口对外提供的接口就是能随机读和写这个固定宽度和固定高度的矩阵中的任意位置的的像素值。这个抽象的图形设备相当于一幅固定宽高的特定像素格式的图片,故可以用定义一张图片的方式来定义这个抽象的图形设备。
定义抽象图形设备结构:
struct ztimage{
    int   width;    //定义图片的宽度,单位为像素
    int   height;   //定义图片的高度,单位为像素
    int   channel_depth; //定义图片每个通道的深度,单位为比特。
    int   num_channel;   //定义图片所含通道个数,最多为四个通道的
    int   color_type;    //定义图片的颜色类型
    unsigned char **data; //定义图片的数据矩阵
};
typedef ztimage ztdisplay_device;  //定义图片即为抽象图形设备
抽象图形设备或者图片的功能有创建指定像素格式和制定宽度和高度的图片,销毁该图片,设置图片某个位置的像素值,和获取图片某个位置的像素值。
 
对颜色的定义:
struct ztcolor{
      unsigned char red;      //8位的红分量
      unsigned char green;    //8位的绿分量
      unsigned char blue;     //8位的蓝分量
      unsigned char alpha;    //8位的透明度分量
};
绘制像素点功能:
输入:
屏幕上一个像素点的位置坐标(x,y)。
要绘制的像素值(v)。
输出:
    将屏幕指定位置(x,y)的像素点的值改变为(v)。
计算方法:
步骤1,如果当前绘图接口依赖GDI,则调用GDI相应绘制像素点的功能,完毕。
步骤2,如果当前绘图接口依赖Open GL,目前尚未实现。
步骤3,如果当前绘图接口依赖Direct Draw,目前尚未实现。
步骤4,如果当前绘图接口依赖Direct 3D,目前尚未实现。
步骤5,即当前绘图接口不依赖以上四种绘图功能,则在抽象的图形设备上面绘制像素点,完毕。
 
绘制直线功能:
输入:
屏幕上一个像素点的位置坐标(x1,y1),表示直线的起点。
屏幕上一个像素点的位置坐标(x2,y2),表示直线的终点。
要绘制的直线的像素值 (v)。
计算方法:
步骤1,如果当前绘图接口依赖GDI,则调用GDI相应绘制直线的功能,完毕。
步骤2,如果当前绘图接口依赖Open GL,目前尚未实现。
步骤3,如果当前绘图接口依赖Direct Draw,目前尚未实现。
步骤4,如果当前绘图接口依赖Direct 3D,目前尚未实现。
步骤5,即当前绘图接口不依赖以上四种绘图功能,则用Bresenham算法(详细实现请参考计算机图形学,如何绘制直线)在抽象的图形设备上面绘制直线,完毕。
 
绘制填充矩形功能:
输入:
屏幕上一个像素点的位置坐标(x1,y1),表示矩形的左上角。
屏幕上一个像素点的位置坐标(x2,y2),表示矩形的右下角。
要绘制的矩形的填充颜色像素值 (v)。
计算方法:
步骤1,如果当前绘图接口依赖GDI,则调用GDI相应绘制填充矩形的功能,完毕。
步骤2,如果当前绘图接口依赖Open GL,目前尚未实现。
步骤3,如果当前绘图接口依赖Direct Draw,目前尚未实现。
步骤4,如果当前绘图接口依赖Direct 3D,目前尚未实现。
步骤5,即当前绘图接口不依赖以上四种绘图功能,则令y等于y1到y2,依次绘制(y2-y1)条直线,则(y2-y1)条直线的起点和终点为(x1,y),(x2,y)。绘制直线可以调用上面所述绘制直线功能,这里不再多说。完毕。
 
绘制文字功能:
说明:
本发明图形用户界面系统的绘制文字部分采用开源库freetype2,支持从字体文件中读取对应字符(包括英文,数字,汉字和一些符号)的字形,然后绘制到屏幕上。
输入:
待输出字符串首地址。
待输出字符串的字符个数。
屏幕上一个像素点的坐标(x1,y1),表示待输出到的矩形的左上角。
屏幕上一个像素点的坐标(x2,y2),表示待输出到的矩形的右下角。
颜色使用默认颜色,一般为黑色,可以设置。
输出:
    将制定的字符串输出到屏幕制定的矩形区域里面。
计算方法:
步骤1,如果当前绘图接口依赖GDI,则调用GDI相应绘制文字的功能,完毕。
步骤2,如果当前绘图接口依赖Open GL,目前尚未实现。
步骤3,如果当前绘图接口依赖Direct Draw,目前尚未实现。
步骤4,如果当前绘图接口依赖Direct 3D,目前尚未实现。
步骤5,即当前绘图接口不依赖以上四种绘图功能,调用freetype2功能,获取字形,然后绘制到抽象图形设备里面,完成。
 
绘制图片功能:
说明:
本发明图形用户界面系统的绘制图片部分采用开源库libpng,目前只支持可移植网络图形格式文件的编解码,将图片解码后,然后绘制到屏幕上。
输入:
源矩形(图片)待显示位置的左上角(xsrc,ysrc)
源矩形(图片)待显示的宽度与高度(wsrc,ysrc),单位为像素。
目标矩形(绘制到哪里)待显示位置的左上角(xdst,ydst)。
目标矩形(绘制到哪里)待显示位置的宽度与高度(wdst,hdst),单位为像素。
输出:
    将图片里面的一个矩形区域(xsrc,ysrc,wsrc,hsrc)绘制到目标的一个矩形区域(xdst,ydst,wdst,hdst)。
计算方法:
步骤1,载入图形文件,确定是可移植网络图形文件格式,解码。
步骤2,如果当前绘图接口依赖GDI,则创建内存设备上下文,将解码后的图片传送到内存设备上下文,然后再将内存设备上下文显示到屏幕上。
步骤3,如果当前绘图接口依赖Open GL,目前尚未实现。
步骤4,如果当前绘图接口依赖Direct Draw,目前尚未实现。
步骤5,如果当前绘图接口依赖Direct 3D,目前尚未实现。
步骤6,即当前绘图接口不依赖以上四种绘图功能,则直接将解码后的图片传送至抽象显示设备。
步骤7,释放图片文件所占用的资源以及关闭文件。
 
模型单元:
如图2所示,是单个场景,场景内没有任何东西,只有场景本身的背景图。
如图3所示,是一个场景和一个场景元素,场景元素在场景里面,即场景元素区域在场景区域里面。
如图4所示,是一个场景和两个场景元素,较小的场景元素在较大的场景元素里面,而较大的场景元素又在场景里面。也就是说,较小的场景元素区域在较大的场景元素区域里面,而较大的场景元素区域又在场景区域里面。这种区域之间包含的关系构成了一种层次结构。这种关系类似于国家—省份—城市—区县—乡镇—街道和村的行政区域划分。反之,场景类似于国家,场景元素类似省份、城市、区县、乡镇、街道和村。这种按照层次排列的结构很容易用树这种数据结构来表示。
本发明图形用户界面系统用孩子兄弟二叉树来表示这种按照层次排列的树。而且规定,场景只关联到这棵孩子兄弟二叉树的根节点。孩子兄弟链表结构定义如下:
struct Node{
      int           data;
      struct Node * firstchild;
      struct Node * nextsibling;
};
其中data结点用于表示孩子兄弟链表结点的数据,firstchild指向该结点的首个孩子结点,nextsibling指向该结点的下一个兄弟节点。本发明扩展了该结构,用于保存场景元素。
扩展后的结点信息如下(C/C++代码):
class ZtGraphicsItem
{
public:
    ZtGraphicsItem();
    virtual ~ZtGraphicsItem();
    virtual void setRect(RECT rect);
    virtual RECT boundingRect();
    virtual void paint(ztimage *canvas,HDC hdc,RECT *prc) = 0;
    virtual void update();
    virtual void advance();
    virtual void mapFromParent(long x,long y,long *px,long *py);
    virtual void mapToParent(long x,long y,long *px,long *py);
    virtual void onLButtonDownEvent(WPARAM wparam,LPARAM lparam);
    virtual void onLButtonUpEvent(WPARAM wparam,LPARAM lparam);
    virtual void onMouseMoveEvent(WPARAM wparam,LPARAM lparam);
    virtual void onChar(WPARAM wparam,LPARAM lparam);
    virtual void onSlideEvent(unsigned int msg,WPARAM wparam,LPARAM lparam);
    virtual void addItem(ZtGraphicsItem *item);
    virtual void removeItem(ZtGraphicsItem *item);
    ZtGraphicsItem *realParent();
    ZtGraphicsItem *parent;
    ZtGraphicsItem *firstchild;
    ZtGraphicsItem *nextsibling;
    int id;
    int z;//显示靠近里面还是外面。0---最里面
    ZtScene *scene;
protected:
    RECT m_rect;
};
ZtGraphicsItem是场景场景元素的抽象基类,所有具体实现的场景元素均继承该场景元素。从以上代码可以看到,ZtGraphicsItem包含了构造孩子兄弟链表二叉树的firstchild和nextsibling指针,还添加了parent指针,指向该结点的上一级结点指针。ZtGraphicsItem的各个成员变量和函数作用如下:
设置与获取ZtGraphicsItem矩形区域在其亲父亲结点区域大小
RECT m_rect;
virtual void setRect(RECT rect);
virtual RECT boundingRect();
m_rect用于记录该场景元素的区域位置和大小。
setRect函数用于设置改变m_rect的值,该场景元素在其亲父亲场景元素中的矩形区域位置和大小。若该场景元素的亲父亲场景元素为空,则该场景元素直接处于场景中,此时设置的矩形区域为该场景元素在场景中的矩形位置和大小。
boundingRect用于返回m_rect的值,该场景元素在其亲父亲场景元素中的矩形位置和大小。若场景元素的亲父亲场景元素为空,则该场景元素直接处于场景中,此时返回的矩形区域为该场景元素在场景中的矩形位置和大小。
 
建立与改变层次关系相关成员与函数
virtual void addItem(ZtGraphicsItem *item);
virtual void removeItem(ZtGraphicsItem *item);
ZtGraphicsItem *realParent();
addItem用于将一个场景元素加到该场景元素中,使加入的场景元素成为该场景元素的子节点。
removeItem 用于从该场景元素中移除一个场景元素结点。
 
与绘制场景元素相关
virtual void paint(ztimage *canvas,HDC hdc,RECT *prc) = 0;
virtual void update();
paint是场景元素的绘制函数,在界面需要更新的时候由场景来调用该函数。
update 是场景元素的更新函数,调用该函数后,该场景元素会通知场景更新该场景元素,相应的更新了屏幕的显示。
 
与事件处理有关:
virtual void onLButtonDownEvent(WPARAM wparam,LPARAM lparam);
virtual void onLButtonUpEvent(WPARAM wparam,LPARAM lparam);
virtual void onMouseMoveEvent(WPARAM wparam,LPARAM lparam);
virtual void onChar(WPARAM wparam,LPARAM lparam);
virtual void onSlideEvent(unsigned int msg,WPARAM wparam,LPARAM lparam);
onLButtonDownEvent是场景元素在鼠标左键按下时触发此事件,该事件由场景调用。
onLButtonUpEvent 是场景元素在鼠标左键释放是除非此事件,该事件由场景调用。
onMouseMoveEvent 是场景元素在鼠标指针移动到该场景元素矩形区域内触发,该事件由场景调用。
onChar 是场景元素的字符事件,在该场景元素接受到用户输入字符时触发,该事件由场景调用。
onSlideEvent 是场景元素的滑动事件,增加此事件是为了支持滑动操作,该事件由场景调用,也可由场景元素的其他事件处理程序调用。
 
其他:
ZtGraphicsItem();
virtual ~ZtGraphicsItem();
virtual void advance();
virtual void mapFromParent(long x,long y,long *px,long *py);
virtual void mapToParent(long x,long y,long *px,long *py);
int id;
int z;//显示靠近里面还是外面。0---最里面
ZtScene *scene;
ZtGraphicsItem 是场景元素的构造函数。
~ZtGraphicsItem是场景元素的析构函数。
andvance 是场景元素的脉动动画函数,由场景调用,一般可忽略。
mapFromParent 是用于产生滑动效果的坐标映射函数,该函数定义怎么从亲父亲的坐标转换到该场景元素的内部坐标。
mapToParent 是用于产生滑动效果的坐标映射函数,该函数定义怎么从该场景元素坐标转换到其亲父亲的坐标。
id 是该场景元素的一个编号,用于区别其他场景元素。
scene 是场景的指针,一旦该场景元素被加入到场景中,scene就只向该场景元素所在的场景。
z 用于表示该场景元素是比较靠近里面还是外面,很少用到,一般可忽略。
 
场景的构成如下:
class ZtScene
{
public:
    ZtScene(HWND hwnd);
    virtual ~ZtScene();
    void setRect(RECT rect);
    RECT getRect();
    void update(RECT rect);
    void update(ZtGraphicsItem *item = NULL);
    void advance();
    void addItem(ZtGraphicsItem *item);
    void removeItem(ZtGraphicsItem *item);
    bool contain(ZtGraphicsItem *item);
    HDC  getMemDC();
    void setCapture(ZtGraphicsItem *item);
    void releaseCapture();
    std::vector<ZtGraphicsItem *> items(int x,int y);
    ZtGraphicsItem *itemAt(int x,int y);
    void positionWinToItem(ZtGraphicsItem *item,long xw,long yw,long *pxi,long *pyi);
    void positionItemToWin(ZtGraphicsItem *item,long xi,long yi,long *pxw,long *pyw);
    virtual void paint(HDC hdc,RECT rect);
    virtual void onEraseBackground();
    virtual void onMouseMoveEvent(WPARAM wparam,LPARAM lparam);
    virtual void onLButtonDownEvent(WPARAM wparam,LPARAM lparam);
    virtual void onLButtonUpEvent(WPARAM wparam,LPARAM lparam);
    virtual void onChar(WPARAM wparam,LPARAM lparam);
    virtual void onDataEvent(WPARAM wparam,LPARAM lparam);
    HWND  m_hwnd;
    int   x,y;//当前坐标
protected:
    HDC      m_bkdc;   //辅助绘图表面,绘制文字使用这个
    HBITMAP  m_bkbmp;  //Windows兼容内存位图,与m_bkdc相关联。
    ztimage *m_canvas; //主要绘图表面,绘制图片,线条使用这个
    RECT     m_rect;
    ZtGraphicsItem *m_iroot;
    ZtGraphicsItem *m_captured;
    ZtGraphicsItem *m_focus;
};
这里不对其结构做繁琐的一一列举,只说明如下问题:
1.     场景怎么管理场景元素。
2.     如何将场景和场景元素显示到屏幕上。
3.     用户事件怎么传递到场景元素。
 
如何管理场景元素:
   场景本身有addItem与removeItem这两个方法。场景的addItem直接将一个场景元素添加到场景中,添加之后的场景元素的父亲结点指针是空的。场景的removeItem将查找由所有在场景中的场景元素构成的孩子兄弟链表二叉树中寻找是否存在该场景元素,若存在则移除该场景元素。场景元素本身也有addItem和removeItem这两个方法,用于在场景元素之间相互组合,以构成各种复杂的层次关系满足应用程序的需求,最后最高层的场景元素通过调研场景的addItem,将自己添加到场景中。这样就构成了一个由场景和场景元素组成的孩子兄弟二叉树。
详情请参考如下代码(C/C++):
void ZtScene::addItem(ZtGraphicsItem *item)
{
    ZtGraphicsItem *cur,*child;
    std::queue<ZtGraphicsItem *> Q;
    if(!item)
        return;
    //第一步,插入item结点
    if(!m_iroot)
    {
        m_iroot = item;
        item->parent = 0;
    }
    else
    {
        cur = m_iroot;
        while(cur->nextsibling)
            cur = cur->nextsibling;
        cur->nextsibling = item;
        item->parent = cur;
    }
    //第二步,更新item结点极其子孙结点的场景指针
    item->scene = this;
    Q.push(NULL);
    Q.push(item);
    while(!Q.empty())
    {
        cur = Q.front();
        Q.pop();
        if(!cur)
        {
            cur = Q.front();
            Q.pop();
            cur->scene = this;//更新子孙节点的场景指针
            child = cur->firstchild;
        }
        else
        {
            cur->scene = this;//更新子孙节点的场景指针
            child = cur->firstchild;
            while(cur->nextsibling)
            {
                Q.push(NULL); //插入空指针表明,后面的节点的兄弟节点已经被遍历。
                Q.push(cur->nextsibling);
                cur = cur->nextsibling;
            }
        }
        if(child)
            Q.push(child);
    }
}
void ZtScene::removeItem(ZtGraphicsItem *item)
{
    ZtGraphicsItem *cur,*child,*parent;
    std::queue<ZtGraphicsItem *> Q;
    ZtGraphicsItem *oroot = 0; /* 旧(old)的根结点 */
    bool found = false;
    if(!m_iroot)
        return;
    if(!item)//item为空表示全部删除
    {
        oroot = m_iroot;//待更新场景指针
        m_iroot = NULL;
        return;
    }
    else if(contain(item))
    {
        found = true;
        cur = item;
        if(cur->parent)
        {
            parent = cur->parent;
            if(cur==parent->firstchild)
                parent->firstchild = cur->nextsibling;
            else
                parent->nextsibling = cur->nextsibling;
            if(cur->nextsibling)
                    cur->nextsibling->parent = parent;
        }
        else
        {
            if(cur->nextsibling)
            {
                m_iroot = cur->nextsibling;
            }
            else
                m_iroot = NULL;
        }
        cur->nextsibling = NULL;
    }
    //第三步,更新item结点的所以子孙结点的场景指针
    if(oroot)
    {
        Q.push(oroot);
    }
    else if(found)
    {
        item->scene = 0;
        Q.push(NULL);//插入空指针表明跳过该节点的兄弟结点。
        Q.push(item);
    }
    while(!Q.empty())
    {
        cur = Q.front();
        Q.pop();
        if(!cur)
        {
            cur = Q.front();
            Q.pop();
            cur->scene = 0;//更新子孙节点的场景指针
            child = cur->firstchild;
        }
        else
        {
            cur->scene = 0;//更新子孙节点的场景指针
            child = cur->firstchild;
            while(cur->nextsibling)
            {
                Q.push(NULL); //插入空指针表明,后面的节点的兄弟节点已经被遍历。
                Q.push(cur->nextsibling);
                cur = cur->nextsibling;
            }
        }
        if(child)
            Q.push(child);
    }
}
void ZtGraphicsItem::addItem(ZtGraphicsItem *item)
{
    ZtGraphicsItem *cur,*child;
    std::queue<ZtGraphicsItem *> Q;
    if(!item)
        return;
    //第一步,插入item节点
    if(!firstchild)
    {
        firstchild = item;
        item->parent = this;
    }
    else
    {
        cur = firstchild;
        while(cur->nextsibling)
            cur = cur->nextsibling;
        cur->nextsibling = item;
        item->parent = cur;
    }
    //第二步,更新item结点极其子孙结点的场景指针
    item->scene = scene;
    Q.push(NULL);
    Q.push(item);
    while(!Q.empty())
    {
        cur = Q.front();
        Q.pop();
        if(!cur)
        {
            cur = Q.front();
            Q.pop();
            cur->scene = scene;//更新子孙节点的场景指针
            child = cur->firstchild;
        }
        else
        {
            cur->scene = scene;//更新子孙节点的场景指针
            child = cur->firstchild;
            while(cur->nextsibling)
            {
                Q.push(NULL); //插入空指针表明,后面的节点的兄弟节点已经被遍历。
                Q.push(cur->nextsibling);
                cur = cur->nextsibling;
            }
        }
        if(child)
            Q.push(child);
    }
}
void ZtGraphicsItem::removeItem(ZtGraphicsItem *item)
{
    ZtGraphicsItem *cur,*child,*parent;
    std::queue<ZtGraphicsItem *> Q;
    bool found = false;
    if(!item || item==this)
        return;
    //第一步,寻找item结点
    Q.push(NULL);//插入空指针表明跳过该节点的兄弟结点。
    Q.push(this);
    while(!Q.empty())
    {
        cur = Q.front();
        Q.pop();
        if(!cur)
        {
            cur = Q.front();
            Q.pop();
            if(cur==item)
            {
                found = true;
                break;
            }
            else
                child = cur->firstchild;
        }
        else
        {
            if(cur==item)
            {
                found = true;
                break;
            }
            else
            {
                child = cur->firstchild;
                while(cur->nextsibling)
                {
                    Q.push(NULL); //插入空指针表明,后面的节点的兄弟节点已经被遍历。
                    Q.push(cur->nextsibling);
                    cur = cur->nextsibling;
                }
            }
        }
        if(child)
            Q.push(child);
    }
    if(!found)
        return;
    //第二步,删除item结点
    if(cur->parent)
    {
        parent = cur->parent;
        if(cur==parent->firstchild)
            parent->firstchild = cur->nextsibling;
        else
            parent->nextsibling = cur->nextsibling;
        if(cur->nextsibling)
            cur->nextsibling->parent = parent;
    }
    cur->nextsibling = NULL;
    //第三步,更新item结点的所以子孙结点的场景指针
    item->scene = 0;
    Q.push(NULL);//插入空指针表明跳过该节点的兄弟结点。
    Q.push(item);
    while(!Q.empty())
    {
        cur = Q.front();
        Q.pop();
        if(!cur)
        {
            cur = Q.front();
            Q.pop();
            cur->scene = 0;//更新子孙节点的场景指针
            child = cur->firstchild;
        }
        else
        {
            cur->scene = 0;//更新子孙节点的场景指针
            child = cur->firstchild;
            while(cur->nextsibling)
            {
                Q.push(NULL); //插入空指针表明,后面的节点的兄弟节点已经被遍历。
                Q.push(cur->nextsibling);
                cur = cur->nextsibling;
            }
        }
        if(child)
            Q.push(child);
    }
}
如何将场景和场景元素显示到屏幕上
简单的来说就是按照层次树结构来叠加图像,直到所有层都更新完毕,然后将层层叠加的图像显示到屏幕上。首先,场景依次更新场景下的直接场景元素。在这个过程中更新的每个场景元素,首先都会将自身绘制出来,然后再对其孩子结点调用paint。这样层层调用导致,图像不断的被叠加,形成最终屏幕显示的图像。
代码如下(C/C++):
void ZtScene::update(ZtGraphicsItem *item)
{
    ZtGraphicsItem *cur;
    RECT rect;
    if(!item)
        onEraseBackground();
    if(!m_iroot)
        return;
    if(!item)/* 全部更新 */
    {
        cur = m_iroot;
        while(cur)
        {
            rect = cur->boundingRect();
            cur->mapFromParent(rect.left,rect.top,&rect.left,&rect.top);
            cur->mapFromParent(rect.right,rect.bottom,&rect.right,&rect.bottom);
            cur->paint(m_canvas,m_bkdc,&rect);
            cur = cur->nextsibling;
        }
        update(m_rect);
    }
    else if(contain(item))
    {
        rect = item->boundingRect();
        item->mapFromParent(rect.left,rect.top,&rect.left,&rect.top);
        item->mapFromParent(rect.right,rect.bottom,&rect.right,&rect.bottom);
        item->paint(m_canvas,m_bkdc,&rect);
        positionItemToWin(item,rect.left,rect.top,&rect.left,&rect.top);
        positionItemToWin(item,rect.right,rect.bottom,&rect.right,&rect.bottom);
        update(rect);
    }
}
用户事件怎么传递到场景元素
简单来说,用户事件(不论鼠标,键盘,字符,还是触摸屏,其他所有事件)首先被场景接收到。若是鼠标或触摸屏事件,场景根据相应的点找到包含改点的所有场景元素。然后将消息传递给这些场景元素中的最外面且是最后的一个。
代码如下(C/C++):
bool ZtScene::contain(ZtGraphicsItem *item)
{
    ZtGraphicsItem *cur,*child;
    std::queue<ZtGraphicsItem *> Q;
    bool found = false;
    if(item && m_iroot)
    {
        Q.push(m_iroot);
        while(!Q.empty())
        {
            cur = Q.front();
            Q.pop();
            if(!cur)
            {
                cur = Q.front();
                Q.pop();
                if(cur==item)
                {
                    found = true;
                    break;
                }
                else
                    child = cur->firstchild;
            }
            else
            {
                if(cur==item)
                {
                    found = true;
                    break;
                }
                else
                {
                    child = cur->firstchild;
                    while(cur->nextsibling)
                    {
                        Q.push(NULL); //插入空指针表明,后面的节点的兄弟节点已经被遍历。
                        Q.push(cur->nextsibling);
                        cur = cur->nextsibling;
                    }
                }
            }
            if(child)
                Q.push(child);
        }
    }
    return found;
}
ZtGraphicsItem *ZtScene::itemAt(int x,int y)
{
    ZtGraphicsItem *maxz = NULL;
    std::vector<ZtGraphicsItem *> list = items(x,y);
    std::vector<ZtGraphicsItem *>::iterator it = list.begin();
    while(it!=list.end())/*寻找最后一个最大的z*/
    {
        if(!maxz)
            maxz = *it;
        else if((*it)->z >= maxz->z)
            maxz = *it;
        it++;
    }
    return maxz;
}
void ZtScene::onLButtonDownEvent(WPARAM wparam,LPARAM lparam)
{
    if(m_captured)
    {
        m_captured->onLButtonDownEvent(wparam,lparam);
    }
    else
    {
        ZtGraphicsItem *item = itemAt((int)(short)(lparam & 0xffff),(int)(short)((lparam>>16) & 0xffff));
        if(item)
            item->onLButtonDownEvent(wparam,lparam);
    }
}
按钮场景元素
按钮场景元素继承自场景元素,重写了场景元素的一些方法。主要是响应用户的点击操作,然后更新按钮场景元素显示,再按钮场景元素发送消息通知其父亲结点按钮已被按下。
 
标签场景元素
标签场景元素同样继承自场景元素,并重写了场景元素的一些方法。主要是其绘制方法,显示预设的文字。
 
文字编辑框场景元素
文字编辑框场景同样继承自场景元素,并重写了场景元素的一些方法。主要是响应字符消息,焦点得到与失去消息,键盘消息,和绘制方法。
 
图片区域场景元素
图片区域场景元素同样继承自场景元素,并重写了场景元素的一些方法。主要是其绘制方法,显示预设的图片。
 
滑动区域场景元素
滑动区域场景元素同样继承自场景元素,并重写了场景元素的一些方法。主要是坐标映射方法,滑动消息,和绘制方法。坐标映射方法实现了把一个比较小的实际矩形区域虚拟成一个相对较大的矩形区域。对外看来,滑动区域只有其指定的区域(由boundingRect方法所确定)那么大;但对于在内部来说,不止有指定的区域那么大,但对于用户可见的区域就只有指定的区域那么大。而且放置于滑动区域内部的场景元素的绘制方法必须严格实现在其绘制事件所指定的区域绘制,不得超出指定区域。
 
列表容器场景元素
列表容器场景元素同样继承自场景元素,并重写了场景元素的一些方法。主要是绘制方法。列表元素将一些列放置于其内的场景元素按照次序组合在一起。
 
综上所述,本发明同其它现有技术相比,系统规模小,满足应用程序对图形用户界面的需要,且能够很容易的从视窗系列操作系统移植到其它软硬件平台上,具有简单、快速和可移植的特性,大大提升图形用户界面系统的运行率和可操作性。

Claims (9)

1.、一种小型图形用户界面系统,其特征在于:包括有应用程序及按树状层次排列形成的可匹配应用程序驱动运作的模型单元,模型单元包括有场景元素、场景、绘制功能、图形设备接口;所述场景就是屏幕上可以显示的一块区域,在微软视窗操作系统下面,这个区域就是窗口区域的子区域;所述场景元素是场景或上级场景元素的子区域,用它来表示图形用户界面元素,场景是模型单元的根结点。
2.根据权利要求1所述的一种小型图形用户界面系统,其特征在于:所述应用程序在更新显示时,依次将需要显示的部分叠加起来构成最终在屏幕上看到的效果。
3.根据权利要求1所述的一种小型图形用户界面系统,其特征在于:所述模型单元实现把传递给应用程序的窗口消息转换为场景元素的消息,场景元素在收到消息后作出相应的动作。
4.根据权利要求1或3所述的一种小型图形用户界面系统,其特征在于:所述模型单元具有一种基于模型单元的按钮场景元素,该按钮场景元素能够设置自己在场景中的位置和区域大小,能够在他自己的区域上面显示一个背景图片和文字提示,能够接收到鼠标的移动和鼠标上的按钮按下和释放的消息,并作出相应的动作。
5.根据权利要求1或3所述的一种小型图形用户界面系统,其特征在于:所述模型单元具有一种基于模型单元的标签场景元素,该标签场景元素能够设置自己在场景中的位置和区域大小,能够在他自己的区域上面显示文字提示信息。
6.根据权利要求1或3所述的一种小型图形用户界面系统,其特征在于:所述模型单元具有一种基于模型单元的文字编辑框元素,该文字编辑框元素能够设置自己在场景中的位置个区域大小,能够让用户输入文字信息同时将用户输入的文字信息显示在其区域上。
7.根据权利要求1或3所述的一种小型图形用户界面系统,其特征在于:所述模型单元具有一种基于模型单元的图片显示区域元素,该图片显示区域元素能够设置自己在场景中的位置和区域大小,能够显示图像文件到其区域上。
8.根据权利要求1或3所述的一种小型图形用户界面系统,其特征在于:所述模型单元具有一种基于模型单元的滑动区域元素,该滑动区域元素能够设置自己在场景中的位置和区域大小,能够将其他场景元素放置于其内做为它的孩子结点,它允许孩子结点的区域大小超过滑动区域元素的区域大小,并能显示孩子结点区域的一部分。
9.根据权利要求1或3所述的一种小型图形用户界面系统,其特征在于:所述模型单元具有一种基于模型单元的列表容器元素,该列表容器元素能够设置自己在场景中的位置和区域大小,能够将其他若干个场景元素做为它的孩子结点,并能管理这些孩子结点元素的位置和区域大小。
CN201110227066.0A 2011-08-09 2011-08-09 一种小型图形用户界面系统 Expired - Fee Related CN102253841B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201110227066.0A CN102253841B (zh) 2011-08-09 2011-08-09 一种小型图形用户界面系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201110227066.0A CN102253841B (zh) 2011-08-09 2011-08-09 一种小型图形用户界面系统

Publications (2)

Publication Number Publication Date
CN102253841A true CN102253841A (zh) 2011-11-23
CN102253841B CN102253841B (zh) 2014-07-23

Family

ID=44981121

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201110227066.0A Expired - Fee Related CN102253841B (zh) 2011-08-09 2011-08-09 一种小型图形用户界面系统

Country Status (1)

Country Link
CN (1) CN102253841B (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104731440A (zh) * 2013-12-20 2015-06-24 晨星半导体股份有限公司 画面绘制方法、画面更新方法、与相关移动电子装置
CN105659199A (zh) * 2013-09-30 2016-06-08 微软技术许可有限责任公司 沿可平移的画布方向的可扩展刀片序列
CN111258471A (zh) * 2020-01-13 2020-06-09 维沃移动通信有限公司 一种对象的显示方法及电子设备

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20020054125A1 (en) * 1996-01-25 2002-05-09 Oliver Salomon Graphical user interface for the programming of programmable controllers
CN101814024A (zh) * 2009-10-23 2010-08-25 深圳创维-Rgb电子有限公司 一种跨平台3d界面设计架构和工具

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20020054125A1 (en) * 1996-01-25 2002-05-09 Oliver Salomon Graphical user interface for the programming of programmable controllers
CN101814024A (zh) * 2009-10-23 2010-08-25 深圳创维-Rgb电子有限公司 一种跨平台3d界面设计架构和工具

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
王云博等: "一种轻量级嵌入式GUI系统及其实现", 《计算机应用》, vol. 26, no. 9, 30 September 2006 (2006-09-30), pages 2244 - 2246 *
王卓: "基于UIMS用户界面管理系统的机顶盒用户界面开发", 《中国优秀硕士学位论文全文数据库 信息科技辑》, no. 8, 15 August 2009 (2009-08-15), pages 13 - 57 *

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105659199A (zh) * 2013-09-30 2016-06-08 微软技术许可有限责任公司 沿可平移的画布方向的可扩展刀片序列
CN104731440A (zh) * 2013-12-20 2015-06-24 晨星半导体股份有限公司 画面绘制方法、画面更新方法、与相关移动电子装置
CN104731440B (zh) * 2013-12-20 2018-03-23 晨星半导体股份有限公司 画面绘制方法、画面更新方法、与相关移动电子装置
CN111258471A (zh) * 2020-01-13 2020-06-09 维沃移动通信有限公司 一种对象的显示方法及电子设备
CN111258471B (zh) * 2020-01-13 2021-05-25 维沃移动通信有限公司 一种对象的显示方法及电子设备

Also Published As

Publication number Publication date
CN102253841B (zh) 2014-07-23

Similar Documents

Publication Publication Date Title
CN106062705B (zh) 跨平台渲染引擎
AU2010313045B2 (en) Image file generation device, image processing device, image file generation method, image processing method, and data structure for image files
US8571338B2 (en) Image file generation device, image processing device, image file generation method, and image processing method
CN103092612B (zh) 实现安卓操作系统3d桌面贴图的方法及电子装置
US7061498B2 (en) Screen display processing apparatus, screen display processing method and computer program
CN106233326A (zh) 图形处理中基于显现目标的灵活显现
CN104216752A (zh) 一种基于窗口的信息加载方法及装置
CN101421761A (zh) 视件和场景图接口
CN103677777B (zh) 调用应用程序组件的方法及装置
JP5368254B2 (ja) 画像ファイル生成装置、画像処理装置、画像ファイル生成方法、画像処理方法、および画像ファイルのデータ構造
CN102907069A (zh) 执行图形应用的方法和系统
WO2016099317A1 (ru) Способ и система визуального управления данными
CN104823220A (zh) 用于图形处理的图形存储器加载掩模
US10628909B2 (en) Graphics processing unit resource dependency viewer
CN111596919A (zh) 图文绘制结果的展示方法、装置、计算机设备及存储介质
CN102253841B (zh) 一种小型图形用户界面系统
CN102023805B (zh) 一种软件界面文本信息的辅助浏览方法
US20130063482A1 (en) Application programming interface for a bitmap composition engine
CN115691772A (zh) 运营可视化系统及相应计算机设备和存储介质
CN100405293C (zh) 点阵图形界面开发方法
CN103092578A (zh) 嵌入式Linux平台下的显示方法
CN102801936A (zh) 实现在屏显示的方法
CN117234655B (zh) 基于安卓系统运行Linux桌面程序的方法、装置、设备及介质
KR100484347B1 (ko) 화면 생성 시스템 및 방법
Walmsley Graphics programming in C++: writing graphics applications for Windows 98

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20140723

Termination date: 20210809