EDN首页   博客首页

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)。为确保剪切域中矩形互不相交,该函数首先计算与每个剪切矩形的相交矩形,然

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

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

 

系统分类: 嵌入式
用户分类: 嵌入式GUI
标签: gui 裁剪
来源: 整理
发表评论 阅读全文(711) | 回复(0)

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)的步骤隐藏该窗口,再将该窗口从窗口列表中移除;如果该窗口已经被隐藏,则直接将该窗口从窗口列表中移除。  
系统分类: 嵌入式
用户分类: 嵌入式GUI
标签: 嵌入式 窗口系统 GUI
来源: 整理
发表评论 阅读全文(573) | 回复(0)

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,就要对窗口系统了解。这样才能提高一个复杂应用系统的性能。

 

系统分类: 嵌入式
用户分类: 嵌入式GUI
标签: GUI OS Windows
来源: 原创
发表评论 阅读全文(786) | 回复(3)

0

关于投票
窗口裁减算法

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

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

 

1

 

 

 

 

2

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

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

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

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

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

系统分类: 嵌入式
用户分类: 嵌入式GUI
标签: 嵌入式 窗口系统 GUI
来源: 原创
发表评论 阅读全文(685) | 回复(0)

1

关于投票
存储设备

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

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

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

系统分类: 嵌入式
用户分类: 嵌入式GUI
标签: UC GUI 嵌入式
来源: 原创
发表评论 阅读全文(751) | 回复(1)
总共 , 当前 /