最新日志

发表于:2007-11-8 23:57:34
标签:gui  裁剪  

0

minigui窗口剪切方法

窗口剪切算法
    有了窗口 Z 序,我们就可以计算每个窗口的剪切域。我们把因为窗口 Z 序而产生的剪切域称为“全局剪切域”,这是相对于窗口自身定

义的剪切域而言的,我们把后者称为“局部剪切域”。窗口中的所有输出,首先要受到全局剪切域的影响,其次受到局部剪切域的影响。我们

在这里重点讲解窗口的全局剪切域的生成和维护。
全局剪切域的生成和维护
    在 MiniGUI 中,剪切域表示为若干互不相交的矩形之并集,这些矩形称为剪切矩形。最初,屏幕上没有任何窗口时,桌面的剪切域由一

个矩形组成,即屏幕矩形;当屏幕上只有一个窗口时,该窗口的剪切域由一个矩形组成,该矩形即为窗口在屏幕上的矩形,而桌面的剪切域却

可能是由多个矩形组成的。

    读者很容易看出,在只有一个窗口的情况下,形成桌面剪切域的矩形最多只能有四个。

    此时,如果有一个新的窗口出现,则新的窗口将同时剪切旧的窗口和桌面。而这时,桌面和旧窗口的剪切域将多出一些矩形,这些矩形应

该是原有剪切域中的每个矩形受到新窗口矩形影响之后生成的剪切矩形。同样,原有剪切域中的每个矩形只能最多只能派生出4个新剪切域,

而某些矩形根本不会受到新窗口矩形的影响。

    这样,我们可以将某个窗口全局剪切域归纳为原有剪切域中排除(Exclude)某个矩形而生成的:

    窗口的全局剪切域初始化为窗口矩形。
    当窗口之上有其他窗口覆盖时,则该窗口的全局剪切域为排除新窗口矩形之后的剪切域。
沿 Z 序迭代第 2 步,直到最顶层窗口。
    清单 1 中的代码是在显示一个新窗口时,MiniGUI 处理被该窗口所覆盖的其他所有窗口的代码。这段代码调用了剪切域维护接口中的

SubtractClipRect 函数计算新的剪切域。

清单 1  显示新窗口时计算被新窗口覆盖的窗口的全局剪切域
// clip all windows under this window.
static void clip_windows_under_this (ZORDERINFO* zorder, PMAINWIN pWin, RECT* rcWin)
{
    PZORDERNODE pNode;
    PGCRINFO pGCRInfo;

    pNode = zorder->pTopMost;
    while (pNode->hWnd != (HWND)pWin)
        pNode = pNode->pNext;
    pNode = pNode->pNext;

    while (pNode)
    {
        if (((PMAINWIN)(pNode->hWnd))->dwStyle & WS_VISIBLE) {
            pGCRInfo = ((PMAINWIN)(pNode->hWnd))->pGCRInfo;

            pthread_mutex_lock (&pGCRInfo->lock);
            SubtractClipRect (&pGCRInfo->crgn, rcWin);
            pGCRInfo->age ++;
            pthread_mutex_unlock (&pGCRInfo->lock);
        }

        pNode = pNode->pNext;
    }
}

    与排除矩形相反的操作是包含(Include)某个矩形到剪切域中。这个操作用于隐藏或者销毁某个窗口时。当一个窗口被隐藏或销毁时,

该窗口之下的所有窗口将受到影响,此时,要将被隐藏或销毁窗口的矩形包含到这些受影响窗口的全局剪切域中。为此,MiniGUI 的剪切域维

护接口中有一个函数专用于该类操作(IncludeClipRect)。为确保剪切域中矩形互不相交,该函数首先计算与每个剪切矩形的相交矩形,然

后将自己添加到该剪切域中。

    但是,在某些情况下,我们必须重新计算所有窗口的全局剪切域,比如在移动某个窗口时。

 

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 整理

评论(0) | 阅读(660)
发表于:2007-11-4 21:53:37
标签:嵌入式  窗口系统  GUI  

0

一种窗口系统剪切方法

1.一种确定图形用户界面中窗口剪切关系的方法,其特征在于: 1)每次创建新的窗口时,按照其Z序插入到所有窗口列表的合适位置,计算该窗口被按Z序大于它的所有窗口剪切而形成的剪切域,对剪切域这一集合中的各矩形进行标记,标记方法是:如果该矩形区域其上不被任何窗口遮盖,则标记为0,否则,其上如有N个窗口遮盖,则标记为-N; 2)每次显示已经创建的窗口时,遍历所有Z序小于它的窗口的原有剪切域中各矩形区域,如果某个矩形区域和待显示窗口相交,则计算该矩形区域被待显示窗口剪裁的剪切域,该下层窗口的剪切域为原有剪切域减去该矩形区域后和该矩形区域剪切域的并集,也按照1)中的叙述标记规则进行标记; 3)每次隐藏已经显示的窗口时,遍历所有Z序小于它的窗口的原有剪切域中各矩形区域,如果某个矩形区域和待显示窗口相交,则将该矩形区域的标记加一,如果标记达到0,则意味着该矩形区域将被显示; 4)每次移动已经显示的窗口时,在移动过程中只重画,不修改剪切域,当移动结束后,将利用3)的步骤隐藏原位置窗口,利用2)的步骤在新位置显示窗口; 5)每次在已显示的窗口中切换,则利用3)的步骤,将该窗口隐藏,修改该窗口的Z序到最顶层,按照2)的步骤显示该窗口,但只需要遍历所有Z序大于该窗口原有Z序的窗口; 6)每次销毁已有的窗口时,如果该窗口已经被显示,则先利用3)的步骤隐藏该窗口,再将该窗口从窗口列表中移除;如果该窗口已经被隐藏,则直接将该窗口从窗口列表中移除。  

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 整理

评论(0) | 阅读(535)
发表于:2007-11-1 23:38:30
标签:GUI  OS  Windows  

0

GUI?OS?windows?

这一段时间一直在学习GUI的内部机制,现有的资料都没有讲到GUI内部的原理,所以一切都是推断。

GUI?OS?windows?现在嵌入式应用最复杂的可以说就是GUI的应用了。现在流行的嵌入式GUI应用有miniGUI,UCGUI,QT,microwindow,openGUI,WindML等等,应该算是很多了,他们有一个共同的特点就是基于某种OS的(当然也不全是这样的,有的GUI可能是无操作系统,但是复杂的GUI系统都是基于操作系统的)。但是实际上一个GUI系统就包含了操作系统的功能(这里所说的是复杂的GUI系统),比如UCGUI,他内部有信号量,多任务机制,内存管理等等,就是一个操作系统。说到操作系统我们最熟悉的就是Windows操作系统了,为什么微软选择Windows作为操作系统的名字呢?因为它最自豪的就是他的窗口控制系统,也就是windows操作系统的核心。
说了这么多就是要把,GUI,OS,Windows联系起来。要学习GUI就要了解OS,就要对窗口系统了解。这样才能提高一个复杂应用系统的性能。

 

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 原创

评论(3) | 阅读(742)
发表于:2007-10-24 23:18:43
标签:uc  gui  重绘  

0

uc/gui重绘机制

一个控件根据它的特性绘制自己。这一工作通过调用WMAPI函数WM_Exec()来完成。如果在程序中没有调用WM_Exec(),就必须调用WM_Paint函数来绘制控件。在多任务环境的uC/GUI,一个后台任务通常用于调用WM_Exec()并更新控件(及其它所有带有回调函数的窗口)。这样就不必手动的调用WM_Paint();然而,手工调用仍然是合法的,如果你想保证控件能立即内重绘的话,这样做也没有意义。

当一个控件的属性的改变时,控件的窗口(或者它的一部分)被标记为无效,但是它不会立即重绘。因此,这部分代码运行非常快。重绘在后面的时间通过WM完成,或通过为控件调用WM_Paint函数(或者WM_Exec(),直到所有的窗口都被重绘)来强制执行。

用于控件的动态存储器

      在嵌入式应用当中,通常来说,使用动态存储器确实不是非常合适,因为存储残片效果的缘故。有很多不同的方式可以用来这种情况,但是它们都工作在一个受限制的方式里,随时内存区域都可能被应用程序中的一个指针引用。因为这个原因,uC/GUI使用一个不同的方法:所有物体(以及所有在运行时存储的数据)被存入一个句柄引用的内存区域当中。这会使以分配好的内存区域在运行时重新分配成为可能。因而避免了使用指针时出现的长时间分配的问题。所有控件因此通过句柄引用。

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 整理

评论(1) | 阅读(698)
发表于:2007-10-23 17:30:00
标签:照片  

2

八楼的春夏秋冬

终于把照片传上去了,我实验室在八楼,还有不到一年的时间就要离开这里了。这些照片是不同季节在同一个角度用手机拍的。希望能留下我美好的回忆。

http://www.ednchina.com/blog/yanshen/12792/gallery.aspx

点击此处查看原文 >>

系统分类: 生活点滴   |    用户分类:    |    来源: 原创

评论(2) | 阅读(831)
发表于:2007-10-22 22:50:51
标签:嵌入式  窗口系统  GUI  

0

窗口裁减算法

       窗口裁减的含义就是将窗口因为重叠而不会显示出来的部分裁剪掉不用,这样做的好处是在进行显示写屏的时候,窗口不需要显示的部分不会进行写屏操作,可以减少写屏的操作量,提高窗口显示的速度。

这里裁减的原理是计算没有覆盖部分的左上角坐标和长宽,并且记录在每个窗口的裁减链表里。计算方法如下所示:

 

1

 

 

 

 

2

设黑色的窗口是win1,白色窗口是win2,如图1所示。当用win2剪裁win1(即win2win1上面将win1部分覆盖)时,如图2所示。

1.  计算两个窗口的相交部分即win2_a的坐标;

2.  将黑色窗口不相交的部分分为三部分即win_awin_bwin_c,此处计算方法是将黑色窗口的左上点坐标与相交的坐标比较得出剪裁出的三部分坐标。

3.  在裁减链上删除以前的黑色坐标,添加新剪裁过的三个坐标。

如上述的方法,用新的窗口剪裁每一个窗口下剪裁链的块即可得到最后的结果。

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 原创

评论(0) | 阅读(654)
发表于:2007-10-19 13:06:16
标签:UC  GUI  嵌入式  

1

存储设备

UCGUI中的存储设备可以用在多种情况下,主要防治显示屏在有对象重叠的绘图操作时的闪烁现象。基本思路很简单。没有使用存储设备时,绘图操作直接写屏。屏幕在绘图操作在执行时更新,当不同的更新在执行时会产生闪烁。例如:如果你想绘一幅位图作为背景,以一些透明的文字作为前景,你首先必须绘位图,然后是文字,最终结果文字会是闪烁的。

然而,如果这样的操作使用一个存储设备的话,所有的操作在存储设备内执行。只有在所有的操作执行完毕后最终结果才显示在屏幕上,具有无闪烁的优点。

二者的区别总结如下:如果不使用存储设备。绘图的操作的效果看起来是一步一步的,带来闪烁的缺点。而使用存储设备,所有程序执行的效果看起来象但不操作,没有中间步骤,显示屏的闪烁完全消除。

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 原创

评论(1) | 阅读(720)
发表于:2007-10-18 0:00:39
标签:GUI  嵌入式  内存管理  

1

UCGUI内存管理

UCGUI的内存管理是由静态数组和双向链表共同管理的。静态数组定义了整个范围大小,双向链表负责动态的管理使用内存。这样做可以在一定的内存区域内动态使用。

内存申请的时候返回句柄,而不是内存的地址,这样做的优点是用户不直接使用内存地址,可以进行碎片整理。在进行内存申请的时候,首先查询链表是否有空闲的句柄,如果有的话再从链表头开始查询是否由足够的空间,如果有足够的空间就分配,如果一直到最后一个句柄也没有足够空间,就进行内存整理(有全局变量控制内存整理的打开和关闭)。

在释放内存的时候,直接将句柄在链表中删掉就可以了。

内存整理是从链表表头开始查询两个相邻句柄是否有空闲空间,如果有的话就将后面的数据拷贝到前一数据的后面。这样移动,知道找到足够的申请空间。

这里面的关键还有在内存管理的时候进行内存管理的加锁和解锁。

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类: 无分类    |    来源: 原创

评论(3) | 阅读(642)
发表于:2007-10-16 23:23:00
标签:UCGUI内存管理  

1

最近在做GUI的开发

刚刚写了UCGUI的内存管理,结果想新加分类,写的东西就没有了,郁闷啊,明天再写吧....

点击此处查看原文 >>

系统分类: 汽车电子   |    用户分类:    |    来源: 原创

评论(1) | 阅读(545)
发表于:2007-6-12 20:31:21
标签:嵌入式  交易  

4

朋友做的嵌入式交易网站

      嵌入式交易网站!!!

     如果您有成熟的嵌入式方案、产品或者技术,希望能发挥其最大效益,获得最大的投入产出比,请您在网站发布“供应”信息;如果您希望购买成熟的嵌入式方案或者产品,或者进行开发合作,以尽可能少的投入,在最快的时间内将嵌入式产品推向市场,请您在本网站发布“需求”信息。用户免费注册,免费使用本网站提供的各种服务项目。

    网址http://www.embelief.com/

点击此处查看原文 >>

系统分类: 商务交流   |    用户分类:    |    来源: 原创

评论(0) | 阅读(1207)
2345678910>>下一页总共 , 当前 /