Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15317524
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类: C/C++

2007-08-17 10:44:08

对于字符串的剪切绘制,具体实现可能比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
  }
}

阅读(3044) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~