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