ucgui窗口系统剪切过程

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();
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
version : 3.1.0.0 1、修改了选择不同窗体属性窗口不更新的BUG; 2、修改了只能打开一个ucGUIBuilder的功能,现在可以同时启动多个; 3、修复了拖放非ucfrm引起软件错误的Bug; 4、添加了控件ID自动增加功能; 5、添加了控件ID检查功能,控件ID有重复时会有警告; 6、添加了用户自定义字体功能; 7、支持英文切换(但功能不够完善); 8、支持自动检查更新; 9、修改了不能保存用户自定义ID的BUG; version : 1.0.0.0 功能很不完善; 还有好多BUG; 目前只能生成资源表; 暂时不能生成其他代码; version : 2.0.0.5 优化了控件库; 修复了一些Bug; 可以生成完整的C文件(包括 资源表,初始化代码等); 修改了部分功能; version : 2.1.0.5 优化了控件库; 修复了一些Bug; 代码生成窗口添加了C语言语法高亮显示功能; C文件模板做了部分修改; 支持设计的窗体保存为文件,并可以打开; 对所有控件属性添加了Description(在属性窗口最下面显示); 窗体布局可以保存,可以自定义为自己喜欢的窗体布局; 修改了部分功能; version : 3.0.0.0 重写了部分内核,运行更稳定; 支持窗体设计器的复制、粘贴、剪切、删除、撤销、等基本操作; 支持多控件,对齐、公共属性修改等基本操作; 支持将.ucfrm文件与ucGUIBuilder关联功能; 支持控件自定义ID; 添加了窗体预览功能; 添加了对控件事件的支持; 添加了在线检查更新功能; 等……
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值