现在的位置: 首页 > 综合 > 正文

ucgui窗口系统原理

2019年05月28日 ⁄ 综合 ⁄ 共 1699字 ⁄ 字号 评论关闭

UC/GUI特点

  • 适用于任何8位/16位/32位CPU,可允许于支持ANSI C的任何编译器
  • 适用于任何控制器驱动任何LCD(单色,灰度,或彩色)
  • 通过配置宏,可支持任何接口
  • 可配置显示尺寸
  • 可在LCD的任何一点上显示字符和画位图
  • 对于显示尺寸和速度提供优化进程,编译时间依赖于采用的优化进程
  •  

    ucgui窗口系统剪切过程

    一、剪切特点
      ucgui窗口系统是采用逐点剪裁的,即在每次绘图时都重新计算剪切区域矩形,然后根据剪切矩形来确定绘图的范围的,这种方式是比较耗费时间的,但比较省内存空间。
      ucgui在计算剪切区域时用到了递归调用,在窗口或空间层次较多时要考虑栈空间是否够用

    二、剪切相关的宏

     剪切起始宏 WM_ITERATE_START,根据给定的矩形区域初始化本次剪切计算并设置第一个剪切域,同时返回是否有剪切域标准,
     宏定义如下:

    #define WM_ITERATE_START(pRect)                   /
      {                                               /
        if (WM__InitIVRSearch(pRect))                 /
          do {

     剪切结束宏 WM_ITERATE_END,计算下一个剪切域,如果没有剪切域则退出循环,如果有则继续绘图。
     宏定义如下:

    #define WM_ITERATE_END()                          /
        } while (WM__GetNextIVR());                   /
      }

     由以上两个宏可以看出,一次绘图要经过多次剪切才能完成。

     另外剪裁只有在 GUI_WINSUPPORT 有效时才起作用。

    二、剪切相关的函数
     int WM__InitIVRSearch(const GUI_RECT* pMaxRect) 这函数用给定的区域,初始化剪切用到的变量,
    同时计算出第一个剪切区域,如果有有效区域则返回1,否则返回0.
        这个函数在最后调用WM__GetNextIVR函数计算得到剪切区域

     int  WM__GetNextIVR(void) 计算本次的剪切区域,并设置图形上下文的剪切区域,返回1,有有效区域,0无有效区域

     计算剪切区域的过程是:
     从指定区域的左上角开始,按从左到右,从上到下的顺序,逐个计算出暴露的部分矩形区域,对应每次计算
      1、确定y0, 
      2、计算最小的y1,
      3、计算x0(计算方法是以 (x0, y0), (x0, y1))的线段和窗口的各个矩形进行相交计算,的到最大的x0
      4、将x1设置为给定矩形的最大值,以((x0,y0), (x1,y1))为矩形和窗口的各个矩形进行相交计算,计算得到最小的x1
     之后是计算然后根据这个矩形区域绘图。

    三、以画线为例看剪切过程

    void GUI_DrawHLine(int y0, int x0, int x1) {

      #if (GUI_WINSUPPORT)
        GUI_RECT r;
      #endif

      GUI_LOCK();
      #if (GUI_WINSUPPORT)
        WM_ADDORG(x0,y0);    
        WM_ADDORGX(x1);         //调整坐标为绝对坐标
        r.x0 = x0;
        r.x1 = x1;
        r.y1 = r.y0 = y0;       //得到绘制直线的矩形区域

        if (WM__InitIVRSearch(pRect))    //根据绘图区域,计算剪切区域
          do {
      #endif

        LCD_HL_DrawHLine(x0, y0, x1); //绘制线段,函数内部会根据计算的剪切区域跳转本次画线的坐标,使只绘制区域内的部分

      #if (GUI_WINSUPPORT)
        } while (WM__GetNextIVR());  //计算下一个剪切区域
      #endif
      GUI_UNLOCK();
    }

     

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/abel__2008/archive/2008/01/03/2020684.aspx

    抱歉!评论已关闭.