⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 基于 linux 和 minigui 的嵌入式系统软件开发指南(四).htm

📁 Programming Embedded Systems in C and C
💻 HTM
📖 第 1 页 / 共 4 页
字号:
            目前只支持两种映射模式,即MM_ANISOTROPIC 和 MM_TEXT。Get 
            函数组用来返回映射模式信息,包括偏移量、缩放比例等等,而 Set 
            函数组用来设置相应的映射信息。<BR><BR>&nbsp;&nbsp;&nbsp; 通常情况下,MiniGUI 的 GDI 
            函数所指定的坐标参数称为"逻辑坐标",在绘制之前,首先要转化成"设备坐标"。当使用 MM_TEXT 
            映射模式时,逻辑坐标和设备坐标是等价的。LPtoDP 函数用来完成逻辑坐标到设备坐标的转换,DPtoLP 
            函数用来完成从设备坐标到逻辑坐标的转换。逻辑坐标和设备坐标的关系可从 LPtoDP 
            函数中看到(src/gdi/coor.c):&nbsp; 
            <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&nbsp;<BR>65 pdc 
                  = dc_HDC2PDC(hdc);<BR>66&nbsp;<BR>67 if (pdc-&gt;mapmode != 
                  MM_TEXT) {<BR>68 pPt-&gt;x = (pPt-&gt;x - 
                  pdc-&gt;WindowOrig.x)<BR>69 * pdc-&gt;ViewExtent.x / 
                  pdc-&gt;WindowExtent.x<BR>70 + 
                  pdc-&gt;ViewOrig.x;<BR>71&nbsp;<BR>72 pPt-&gt;y = (pPt-&gt;y - 
                  pdc-&gt;WindowOrig.y)<BR>73 * pdc-&gt;ViewExtent.y / 
                  pdc-&gt;WindowExtent.y<BR>74 + pdc-&gt;ViewOrig.y;<BR>75 
                  }<BR>76 }<BR>77&nbsp;</TD></TR></TBODY></TABLE></DIV>
            <P>&nbsp;&nbsp;&nbsp; 另外,LPtoSP 函数和 SPtoLP 
            函数完成逻辑坐标和屏幕坐标之间的转换。<BR><BR><B>3 
            矩形操作和区域操作&nbsp;</B><BR>&nbsp;&nbsp;&nbsp; <B>3.1 
            矩形操作&nbsp;</B><BR>&nbsp;&nbsp;&nbsp; 在 MiniGUI 
            中,矩形是如下定义的(include/common.h):&nbsp; 
            <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>&nbsp;&nbsp;&nbsp; 简而言之,矩形就是用来表示屏幕上一个矩形区域的数据结构,定义了矩形左上角的 x, y 
            坐标(left 和 top)以及右下角的 x, y 坐标(right 和 bottom)。需要注意的是,MiniGUI 
            中的矩形,其右侧的边和下面的边是不属于该矩形的。例如,要表示屏幕上的一条扫描线,应该用&nbsp;<BR>RECT rc = {x, 
            y, x + w + 1, y + 1};&nbsp;<BR>&nbsp;&nbsp;&nbsp; 表示。其中 x 是扫描线的起点,y 
            是扫描线的垂直位置,w 是扫描线宽度。<BR><BR>&nbsp;&nbsp;&nbsp; MiniGUI 提供了一组函数,可对 
            RECT 对象进行操作:&nbsp;</P>
            <MENU>
              <LI>
              <P>SetRect 对 RECT 对象的各个分量进行赋值;&nbsp; </P>
              <LI>
              <P>SetRectEmpty 将 RECT 对象设置为空。MiniGUI 中的空矩形定义为高度或宽度为零的矩形; </P>
              <LI>
              <P>IsRectEmpty 判断给定 RECT 对象是否为空。&nbsp; </P>
              <LI>
              <P>NormalizeRect 对给定矩形进行正规化处理。MiniGUI 中的矩形,应该满足(right &gt; left 并且 
              bottom &gt; top)的条件。满足这一条件的矩形又称"正规化矩形",该函数可以对任意矩形进行正规化处理。 </P>
              <LI>
              <P>CopyRect 复制矩形; </P>
              <LI>
              <P>EqualRect 判断两个 RECT 对象是否相等,即两个 RECT 对象的各个分量相等; </P>
              <LI>
              <P>IntersectRect 该函数求两个 RECT 对象之交集。若两个矩形根本不相交,则函数返回 
              FALSE,且结果矩形未定义;否则返回交矩形。 </P>
              <LI>
              <P>DoesIntersec 该函数仅仅判断两个矩形是否相交。&nbsp; </P>
              <LI>
              <P>IsCovered 该函数判断 RECT 对象 A 是否全部覆盖 RECT 对象 B,即 RECT B 是 RECT A 
              的真子集。&nbsp; </P>
              <LI>
              <P>UnionRect 该函数求两个矩形之并。如果两个矩形根本无法相并,则返回 
              FALSE。两个相并之后的矩形,其中所包含的任意点,应该属于两个相并矩形之一。&nbsp; </P>
              <LI>
              <P>GetBoundRect 该函数求两个矩形的外包最小矩形。&nbsp; </P>
              <LI>
              <P>SubstractRect 该函数从一个矩形中减去另外一个矩形。注意,两个矩形相减的结果可能生成 4 
              个不相交的矩形。该函数将返回结果矩形的个数以及差矩形。详细信息可参见"MiniGUI 
              体系结构之二――多窗口管理和控件及控件类"一文。&nbsp; </P>
              <LI>
              <P>OffsetRect 该函数对给定的 RECT 对象进行平移处理。&nbsp; </P>
              <LI>
              <P>InflateRect 该函数对给定的 RECT 
              对象进行膨胀处理。注意膨胀之后的矩形宽度和高度是给定膨胀值的两倍。&nbsp; </P>
              <LI>
              <P>InflateRectToPt 该函数将给定的 RECT 对象膨胀到指定的点。 </P>
              <LI>
              <P>PtInRect 该函数判断给定的点是否位于指定的 RECT 对象中。<BR><BR>&nbsp;&nbsp;&nbsp; 
              <B>3.2 区域操作&nbsp;</B><BR>&nbsp;&nbsp;&nbsp; 在 MiniGUI 
              中,区域定义为互不相交矩形的集合,在内部用链表形式表示。MiniGUI 的区域可以用来表示窗口的剪切域、无效区域、可见区域等等。在 
              MiniGUI 中,区域和剪切域的定义是一样的,剪切域定义如下(include/gdi.h):&nbsp; 
            </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>&nbsp;&nbsp;&nbsp; 每个剪切域对象有一个 BLOCKHEAP 成员。该成员是剪切域分配 RECT 
            对象的私有堆。在使用一个剪切域对象之前,首先应该建立一个 BLOCKHEAP 对象,并对剪切域对象进行初始化。如下所示:&nbsp; 
            <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 
                  (&amp;sg_MyFreeClipRectList, 20);<BR>InitClipRgn 
                  (&amp;my_regioni, 
            &amp;sg_MyFreeClipRectList);</TD></TR></TBODY></TABLE></DIV>
            <P>&nbsp;&nbsp;&nbsp; 在实际使用当中,多个剪切域可以共享同一个 BLOCKHEAP 
            对象。<BR><BR>&nbsp;&nbsp;&nbsp; 在初始化剪切域对象之后,可以对剪切域进行如下操作:&nbsp; 
            <MENU>
              <LI>
              <P>SetClipRgn 该函数将剪切域设置为仅包含一个矩形的剪切域;&nbsp; </P>
              <LI>
              <P>ClipRgnCopy 该函数复制剪切域;&nbsp; </P>
              <LI>
              <P>ClipRgnIntersect 该函数求两个剪切域的交集;&nbsp; </P>
              <LI>
              <P>GetClipRgnBoundRect 该函数求剪切域的外包最小矩形;&nbsp; </P>
              <LI>
              <P>IsEmptyClipRgn 该函数判断剪切域是否为空,即是否包含剪切矩形;&nbsp; </P>
              <LI>
              <P>EmptyClipRgn 该函数释放剪切域中的剪切矩形,并清空剪切域;&nbsp; </P>
              <LI>
              <P>AddClipRect 该函数将一个剪切矩形追加到剪切域中。注意该操作并不判断该剪切域是否和剪切矩形相交。&nbsp; 
</P>
              <LI>
              <P>IntersectClipRect 该函数求剪切区域和给定矩形相交的剪切区域。&nbsp; </P>
              <LI>
              <P>SubtractClipRect 该函数从剪切区域中减去指定的矩形。 </P></LI></MENU>
            <P>&nbsp;&nbsp;&nbsp; 矩形和区域的运算构成了窗口管理的主要算法,也是高级 GDI 函数的基本算法之一,在 GUI 
            编程中占有非常重要的地位。<BR><BR><B>4 基本图形操作&nbsp;<BR>&nbsp;&nbsp;&nbsp; 4.1 
            基本绘图属性&nbsp;</B><BR>&nbsp;&nbsp;&nbsp; 在了解基本绘图函数之前,我们首先了解一下基本绘图属性。在 
            MiniGUI 的目前版本中,绘图属性比较少,大体包括线条颜色、填充颜色、文本背景模式、文本颜色、TAB 键宽度等等。表 1 
            给出了这些属性的操作函数。<BR><BR>表 1 基本绘图属性及其操作函数&nbsp;</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>&nbsp;&nbsp;&nbsp; MiniGUI 
            目前版本中还定义了刷子和笔的若干函数,这些函数是为将来兼容性而定义的,目前无用。<BR><BR>&nbsp;&nbsp;&nbsp; 
            <B>4.2 基本绘图函数&nbsp;</B><BR>&nbsp;&nbsp;&nbsp; MiniGUI 
            中的基本绘图函数为点、线、圆、矩形、调色板操作等基本函数,原型定义如下(include/gdi.h,版本 
            1.0.06):&nbsp;</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 + -