📄 基于 linux 和 minigui 的嵌入式系统软件开发指南(四).htm
字号:
目前只支持两种映射模式,即MM_ANISOTROPIC 和 MM_TEXT。Get
函数组用来返回映射模式信息,包括偏移量、缩放比例等等,而 Set
函数组用来设置相应的映射信息。<BR><BR> 通常情况下,MiniGUI 的 GDI
函数所指定的坐标参数称为"逻辑坐标",在绘制之前,首先要转化成"设备坐标"。当使用 MM_TEXT
映射模式时,逻辑坐标和设备坐标是等价的。LPtoDP 函数用来完成逻辑坐标到设备坐标的转换,DPtoLP
函数用来完成从设备坐标到逻辑坐标的转换。逻辑坐标和设备坐标的关系可从 LPtoDP
函数中看到(src/gdi/coor.c):
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD width="100%" bgColor=#c0c0c0>61 void GUIAPI LPtoDP(HDC
hdc, POINT* pPt)<BR>62 {<BR>63 PDC pdc;<BR>64 <BR>65 pdc
= dc_HDC2PDC(hdc);<BR>66 <BR>67 if (pdc->mapmode !=
MM_TEXT) {<BR>68 pPt->x = (pPt->x -
pdc->WindowOrig.x)<BR>69 * pdc->ViewExtent.x /
pdc->WindowExtent.x<BR>70 +
pdc->ViewOrig.x;<BR>71 <BR>72 pPt->y = (pPt->y -
pdc->WindowOrig.y)<BR>73 * pdc->ViewExtent.y /
pdc->WindowExtent.y<BR>74 + pdc->ViewOrig.y;<BR>75
}<BR>76 }<BR>77 </TD></TR></TBODY></TABLE></DIV>
<P> 另外,LPtoSP 函数和 SPtoLP
函数完成逻辑坐标和屏幕坐标之间的转换。<BR><BR><B>3
矩形操作和区域操作 </B><BR> <B>3.1
矩形操作 </B><BR> 在 MiniGUI
中,矩形是如下定义的(include/common.h):
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD width="100%" bgColor=#c0c0c0>120 typedef struct
tagRECT<BR>121 {<BR>122 int left;<BR>123 int top;<BR>124 int
right;<BR>125 int bottom;<BR>126 } RECT;<BR>127 typedef RECT*
PRECT;<BR>128 typedef RECT* LPRECT;</TD></TR></TBODY></TABLE></DIV>
<P> 简而言之,矩形就是用来表示屏幕上一个矩形区域的数据结构,定义了矩形左上角的 x, y
坐标(left 和 top)以及右下角的 x, y 坐标(right 和 bottom)。需要注意的是,MiniGUI
中的矩形,其右侧的边和下面的边是不属于该矩形的。例如,要表示屏幕上的一条扫描线,应该用 <BR>RECT rc = {x,
y, x + w + 1, y + 1}; <BR> 表示。其中 x 是扫描线的起点,y
是扫描线的垂直位置,w 是扫描线宽度。<BR><BR> MiniGUI 提供了一组函数,可对
RECT 对象进行操作: </P>
<MENU>
<LI>
<P>SetRect 对 RECT 对象的各个分量进行赋值; </P>
<LI>
<P>SetRectEmpty 将 RECT 对象设置为空。MiniGUI 中的空矩形定义为高度或宽度为零的矩形; </P>
<LI>
<P>IsRectEmpty 判断给定 RECT 对象是否为空。 </P>
<LI>
<P>NormalizeRect 对给定矩形进行正规化处理。MiniGUI 中的矩形,应该满足(right > left 并且
bottom > top)的条件。满足这一条件的矩形又称"正规化矩形",该函数可以对任意矩形进行正规化处理。 </P>
<LI>
<P>CopyRect 复制矩形; </P>
<LI>
<P>EqualRect 判断两个 RECT 对象是否相等,即两个 RECT 对象的各个分量相等; </P>
<LI>
<P>IntersectRect 该函数求两个 RECT 对象之交集。若两个矩形根本不相交,则函数返回
FALSE,且结果矩形未定义;否则返回交矩形。 </P>
<LI>
<P>DoesIntersec 该函数仅仅判断两个矩形是否相交。 </P>
<LI>
<P>IsCovered 该函数判断 RECT 对象 A 是否全部覆盖 RECT 对象 B,即 RECT B 是 RECT A
的真子集。 </P>
<LI>
<P>UnionRect 该函数求两个矩形之并。如果两个矩形根本无法相并,则返回
FALSE。两个相并之后的矩形,其中所包含的任意点,应该属于两个相并矩形之一。 </P>
<LI>
<P>GetBoundRect 该函数求两个矩形的外包最小矩形。 </P>
<LI>
<P>SubstractRect 该函数从一个矩形中减去另外一个矩形。注意,两个矩形相减的结果可能生成 4
个不相交的矩形。该函数将返回结果矩形的个数以及差矩形。详细信息可参见"MiniGUI
体系结构之二――多窗口管理和控件及控件类"一文。 </P>
<LI>
<P>OffsetRect 该函数对给定的 RECT 对象进行平移处理。 </P>
<LI>
<P>InflateRect 该函数对给定的 RECT
对象进行膨胀处理。注意膨胀之后的矩形宽度和高度是给定膨胀值的两倍。 </P>
<LI>
<P>InflateRectToPt 该函数将给定的 RECT 对象膨胀到指定的点。 </P>
<LI>
<P>PtInRect 该函数判断给定的点是否位于指定的 RECT 对象中。<BR><BR>
<B>3.2 区域操作 </B><BR> 在 MiniGUI
中,区域定义为互不相交矩形的集合,在内部用链表形式表示。MiniGUI 的区域可以用来表示窗口的剪切域、无效区域、可见区域等等。在
MiniGUI 中,区域和剪切域的定义是一样的,剪切域定义如下(include/gdi.h):
</P></LI></MENU>
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD width="100%" bgColor=#c0c0c0>76 // Clip Rect<BR>77 typedef
struct tagCLIPRECT<BR>78 {<BR>79 RECT rc;<BR>80 struct
tagCLIPRECT* next;<BR>81 }CLIPRECT;<BR>82 typedef CLIPRECT*
PCLIPRECT;<BR>83<BR>84 // Clip Region<BR>85 typedef struct
tagCLIPRGN<BR>86 {<BR>87 RECT rcBound; // bound rect of clip
region<BR>88 PCLIPRECT head; // clip rect list head<BR>89
PCLIPRECT tail; // clip rect list tail<BR>90 PBLOCKHEAP heap;
// heap of clip rect<BR>91 } CLIPRGN;<BR>92 typedef CLIPRGN*
PCLIPRGN;</TD></TR></TBODY></TABLE></DIV>
<P> 每个剪切域对象有一个 BLOCKHEAP 成员。该成员是剪切域分配 RECT
对象的私有堆。在使用一个剪切域对象之前,首先应该建立一个 BLOCKHEAP 对象,并对剪切域对象进行初始化。如下所示:
<DIV align=center>
<TABLE height=19 cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD width="100%" bgColor=#c0c0c0 height=19>static BLOCKHEAP
sg_MyFreeClipRectList;<BR><BR>...<BR><BR>CLIPRGN
my_region<BR><BR>InitFreeClipRectList
(&sg_MyFreeClipRectList, 20);<BR>InitClipRgn
(&my_regioni,
&sg_MyFreeClipRectList);</TD></TR></TBODY></TABLE></DIV>
<P> 在实际使用当中,多个剪切域可以共享同一个 BLOCKHEAP
对象。<BR><BR> 在初始化剪切域对象之后,可以对剪切域进行如下操作:
<MENU>
<LI>
<P>SetClipRgn 该函数将剪切域设置为仅包含一个矩形的剪切域; </P>
<LI>
<P>ClipRgnCopy 该函数复制剪切域; </P>
<LI>
<P>ClipRgnIntersect 该函数求两个剪切域的交集; </P>
<LI>
<P>GetClipRgnBoundRect 该函数求剪切域的外包最小矩形; </P>
<LI>
<P>IsEmptyClipRgn 该函数判断剪切域是否为空,即是否包含剪切矩形; </P>
<LI>
<P>EmptyClipRgn 该函数释放剪切域中的剪切矩形,并清空剪切域; </P>
<LI>
<P>AddClipRect 该函数将一个剪切矩形追加到剪切域中。注意该操作并不判断该剪切域是否和剪切矩形相交。
</P>
<LI>
<P>IntersectClipRect 该函数求剪切区域和给定矩形相交的剪切区域。 </P>
<LI>
<P>SubtractClipRect 该函数从剪切区域中减去指定的矩形。 </P></LI></MENU>
<P> 矩形和区域的运算构成了窗口管理的主要算法,也是高级 GDI 函数的基本算法之一,在 GUI
编程中占有非常重要的地位。<BR><BR><B>4 基本图形操作 <BR> 4.1
基本绘图属性 </B><BR> 在了解基本绘图函数之前,我们首先了解一下基本绘图属性。在
MiniGUI 的目前版本中,绘图属性比较少,大体包括线条颜色、填充颜色、文本背景模式、文本颜色、TAB 键宽度等等。表 1
给出了这些属性的操作函数。<BR><BR>表 1 基本绘图属性及其操作函数 </P>
<TABLE cellSpacing=1 borderColorDark=#000000
borderColorLight=#ffffff border=1>
<TBODY>
<TR>
<TD borderColorLight=#ffffff align=middle
borderColorDark=#000000>绘图属性</TD>
<TD borderColorLight=#ffffff align=middle
borderColorDark=#000000>操作函数</TD>
<TD borderColorLight=#ffffff align=middle
borderColorDark=#000000>受影响的 GDI 函数</TD></TR>
<TR>
<TD borderColorLight=#ffffff align=middle
borderColorDark=#000000>线条颜色</TD>
<TD borderColorLight=#ffffff align=middle
borderColorDark=#000000>GetPenColor/SetPenColor</TD>
<TD borderColorLight=#ffffff align=middle
borderColorDark=#000000>LineTo、Circle、Rectangle</TD></TR>
<TR>
<TD borderColorLight=#ffffff align=middle
borderColorDark=#000000>填充颜色</TD>
<TD borderColorLight=#ffffff align=middle
borderColorDark=#000000>GetBrushColor/SetBrushColor</TD>
<TD borderColorLight=#ffffff align=middle
borderColorDark=#000000>FillBox</TD></TR>
<TR>
<TD borderColorLight=#ffffff align=middle
borderColorDark=#000000>文本背景模式</TD>
<TD borderColorLight=#ffffff align=middle
borderColorDark=#000000>GetBkMode/SetBkMode</TD>
<TD borderColorLight=#ffffff align=middle
borderColorDark=#000000>TextOut、DrawText</TD></TR>
<TR>
<TD borderColorLight=#ffffff align=middle
borderColorDark=#000000>文本颜色</TD>
<TD borderColorLight=#ffffff align=middle
borderColorDark=#000000>GetTextColor/SetTextColor</TD>
<TD borderColorLight=#ffffff align=middle
borderColorDark=#000000>同上</TD></TR>
<TR>
<TD borderColorLight=#ffffff align=middle
borderColorDark=#000000>TAB 键宽度</TD>
<TD borderColorLight=#ffffff align=middle
borderColorDark=#000000>GetTabStop/SetTabStop</TD>
<TD borderColorLight=#ffffff align=middle
borderColorDark=#000000>同上</TD></TR></TBODY></TABLE>
<P> MiniGUI
目前版本中还定义了刷子和笔的若干函数,这些函数是为将来兼容性而定义的,目前无用。<BR><BR>
<B>4.2 基本绘图函数 </B><BR> MiniGUI
中的基本绘图函数为点、线、圆、矩形、调色板操作等基本函数,原型定义如下(include/gdi.h,版本
1.0.06): </P>
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD width="100%" bgColor=#c0c0c0>433 // Palette support<BR>434
int GUIAPI GetPalette (HDC hdc, int start, int len, gal_color*
cmap);<BR>435 int GUIAPI SetPalette (HDC hdc, int start, int
len, gal_color* cmap);<BR>436 int GUIAPI SetColorfulPalette
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -