Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1009247
  • 博文数量: 238
  • 博客积分: 2842
  • 博客等级: 少校
  • 技术积分: 2765
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-16 00:20
个人简介

stdlf

文章分类

全部博文(238)

文章存档

2013年(6)

2012年(13)

2011年(82)

2010年(89)

2009年(48)

我的朋友

分类:

2010-03-07 16:46:05

对于字符串的剪切绘制,具体实现可能比GUI_Clear复杂一些,但是过程区别不大,
先来看看下面的一个字符串遮盖剪切效果图,

μC/GUI中各种文字显示函数最后都会归结到对GUI__DispLine()函数的调用,
如GUI_DispString(const char GUI_UNI_PTR *s)字符串显示函数,
1.首先会根据当前字符集GUI_Context.pAFont,计算一个字符的长宽高,
  根据当前字符集的长宽高以及对齐方式微调GUI_Context.DispPosX和GUI_Context.DispPosY
2.读取待显示字符串s的一行数据(μC/GUI中符号\n为一行结尾标志),
  根据GUI_Context.DispPosX和GUI_Context.DispPosY计算显示该行数据所需的矩形r,
  r.x0 = GUI_Context.DispPosX -= xAdjust;
  r.x1 = r.x0 + xLineSize - 1;
  r.y0 = GUI_Context.DispPosY;
  r.y1 = r.y0 + FontSizeY - 1;
3.调用GUI__DispLine()将该行字符数据显示在矩形r内
4.计算下一次待显示数据的位置坐标GUI_Context.DispPosX和GUI_Context.DispPosY
5.如果还存在下一行数据,那么跳转到第1步,继续显示

来看看GUI__DispLine()函数代码
void GUI__DispLine(const char GUI_UNI_PTR *s, int MaxNumChars, const GUI_RECT* pr) {
  GUI_RECT r;
  {
    r = *pr;
    #if GUI_WINSUPPORT
    WM_ADDORG(r.x0, r.y0);
    WM_ADDORG(r.x1, r.y1);
    WM_ITERATE_START(&r) {//计算显示的剪切窄条域矩形
    #endif
      GUI_Context.DispPosX = r.x0;//复位该数据显示的起始地址
      GUI_Context.DispPosY = r.y0;//复位该数据显示的起始地址
//该函数会综合GUI_Context.DispPosX和GUI_Context.DispPosY
//以及GUI_Context.ClipRect剪切矩形窄条,进行位于窄条剪切矩形中的数据部分绘制
      _DispLine(s, MaxNumChars, &r);
    #if GUI_WINSUPPORT
    } WM_ITERATE_END();//尝试计算下一个剪切窄条域矩形
    WM_SUBORG(GUI_Context.DispPosX, GUI_Context.DispPosY);
    #endif
  }
}
阅读(973) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~