Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15531824
  • 博文数量: 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-07-13 10:35:34

浅析μC/GUI-v3.90a之GUI_DispString函数

文章来源:http://gliethttp.cublog.cn

-------------------------------------------------------------------------------------
1.GUI_DispString()函数
gui/core/GUI_DispString.c
void GUI_DispString(const char GUI_UNI_PTR *s) {
  int xAdjust, yAdjust, xOrg;
  int FontSizeY;
  if (!s)
    return;
  GUI_LOCK();
  FontSizeY = GUI_GetFontDistY();                          //Font的y大小,默认8
  xOrg = GUI_Context.DispPosX;
 /* Adjust vertical position */
  yAdjust = GUI_GetYAdjust();                              //垂直对齐方式
  GUI_Context.DispPosY -= yAdjust;
  for (; *s; s++) {
    GUI_RECT r;
    int LineNumChars = GUI__GetLineNumChars(s, 0x7fff);    //获取一行\0或\n 8bits字节数[该版本只能显示英文]
    int xLineSize = GUI__GetLineDistX(s, LineNumChars);    //这些数据所占用x轴上横向点阵数
  /* Check if x-position needs to be changed due to h-alignment */
    switch (GUI_Context.TextAlign & GUI_TA_HORIZONTAL) {   //水平对齐方式
      case GUI_TA_CENTER: xAdjust = xLineSize / 2; break;
      case GUI_TA_RIGHT: xAdjust = xLineSize; break;
      default: xAdjust = 0;
    }
    r.x0 = GUI_Context.DispPosX -= xAdjust;
    r.x1 = r.x0 + xLineSize - 1;
    r.y0 = GUI_Context.DispPosY;
    r.y1 = r.y0 + FontSizeY - 1;                           //该行字体显示矩形区域r
    GUI__DispLine(s, LineNumChars, &r);                    //显示该行数据
    GUI_Context.DispPosY = r.y0;
    s += GUI_UC__NumChars2NumBytes(s, LineNumChars);       //s指向下一行待显示的数据区
    if ((*s == '\n') || (*s == '\r')) {
      switch (GUI_Context.TextAlign & GUI_TA_HORIZONTAL) {
      case GUI_TA_CENTER:
      case GUI_TA_RIGHT:
        GUI_Context.DispPosX = xOrg;                       //居中和右对齐,传递函数原始位置xOrg
        break;
      default:
        GUI_Context.DispPosX = GUI_Context.LBorder;
        break;
      }
      if (*s == '\n')
        GUI_Context.DispPosY += FontSizeY;                 //回车,转入下一行
    } else {
      GUI_Context.DispPosX = r.x0 + xLineSize;             //接着上一行的结束位置,继续显示
    }
    if (*s == 0)                                           //待显示数据已经显示完毕
      break;
  }
  GUI_Context.DispPosY += yAdjust;                         //将垂直对齐方式还原成未调用GUI_DispString之前值
  GUI_Context.TextAlign &= ~GUI_TA_HORIZONTAL;             //清除文本水平对齐方式
  GUI_UNLOCK();
}
-------------------------------------------------------------------------------------
2.GUI__DispLine()函数 2007-07-11 gliethttp
gui/core/GUICharLine.c
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);                                 //将矩形(r.x0,r.y0)平移到(GUI_Context.xOff,GUI_Context.yOff)坐标处
    WM_ITERATE_START(&r) {                                 //计算剪切域,另用《浅析μC/GUI-v3.90a之WM_ITERATE_START剪切域计算宏》专门讨论
    #endif
      GUI_Context.DispPosX = r.x0;
      GUI_Context.DispPosY = r.y0;
      /* Do the actual drawing via routine call. */
      _DispLine(s, MaxNumChars, &r);
    #if GUI_WINSUPPORT
    } WM_ITERATE_END();
    WM_SUBORG(GUI_Context.DispPosX, GUI_Context.DispPosY);
    #endif
  }
}

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

chinaunix网友2009-12-12 11:48:44

这样理解你应该就明白了,LCD坐标系默认使用左上角(0,0)为原点,r.x0和r.y0指的是将原点坐标设置为(r.x0,r.y0) 这个回复,我还是没有理解,呵呵 可以具体点不,麻烦了, 其实我是想了解的还是UCGUI各部分的框架,架构等,只有先了解了那些,只有大体了解那些,才能在看源代码时,知道知其所以然。 可是,没有那么完美的事,,世界上的各个人都忙各个的事。。。。呵呵

chinaunix网友2009-12-12 11:32:30

还是不太满意, 你好象没有直接回答我的问题, 好象从另外一个角度回答,

gliethttp2009-12-11 12:48:33

这样理解你应该就明白了,LCD坐标系默认使用左上角(0,0)为原点,r.x0和r.y0指的是将原点坐标设置为(r.x0,r.y0)

chinaunix网友2009-12-11 10:18:33

你的回答,不太满意,呵呵, 没有理解我的意思, 我的意思是说,既然H,W是必须的,但是程序中,好象没有考虑到这方面, switch (GUI_Context.TextAlign & GUI_TA_HORIZONTAL) { //水平对齐方式 case GUI_TA_CENTER: xAdjust = xLineSize / 2; break; case GUI_TA_RIGHT: xAdjust = xLineSize; break; default: xAdjust = 0; } r.x0 = GUI_Context.DispPosX -= xAdjust; 要显示的字符串的位置,r.x0完全跟外边文本框的W有关哦?????

gliethttp2009-12-10 22:37:42

你说的是对的,h和w这是肯定必须的,所以没有提到