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

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

📁 Programming Embedded Systems in C and C
💻 HTM
📖 第 1 页 / 共 4 页
字号:
                  (HDC hdc);<BR>437<BR>438 // General drawing support<BR>439 
                  void GUIAPI SetPixel (HDC hdc, int x, int y, gal_pixel 
                  c);<BR>440 void GUIAPI SetPixelRGB (HDC hdc, int x, int y, int 
                  r, int g, int b);<BR>441 gal_pixel GUIAPI GetPixel (HDC hdc, 
                  int x, int y);<BR>442 void GUIAPI GetPixelRGB (HDC hdc, int x, 
                  int y, int* r, int* g, int* b);<BR>443 gal_pixel GUIAPI 
                  RGB2Pixel (HDC hdc, int r, int g, int b);<BR>444&nbsp;<BR>445 
                  void GUIAPI LineTo (HDC hdc, int x, int y);<BR>446 void GUIAPI 
                  MoveTo (HDC hdc, int x, int y);<BR>447&nbsp;<BR>448 void 
                  GUIAPI Circle (HDC hdc, int x, int y, int r);<BR>449 void 
                  GUIAPI Rectangle (HDC hdc, int x0, int y0, int x1, int 
              y1);</TD></TR></TBODY></TABLE></DIV>
            <P>&nbsp;&nbsp;&nbsp; 这里有两个基本的概念需要明确区分,即象素值和 RGB 值。RGB 
            是计算机中通过三原色的不同比例表示某种颜色的方法。通常,RGB 中的红、绿、蓝可取 0 ~ 255 当中的任意值,从而可以表示 
            255x255x255 种不同的颜色。而在显示内存当中,要显示在屏幕上的颜色并不是用 RGB 
            这种方式表示的,显存当中保存的其实是所有象素的象素值。象素值的范围根据显示模式的不同而变化。在 16 色显示模式下,象素值范围为 [0, 
            15];而在 256 色模式下,象素值范围为 [0, 255];在 16 位色模式下,象素值范围为 [0, 2^16 - 
            1]。通常我们所说显示模式是多少位色,就是指象素的位数。<BR><BR>&nbsp;&nbsp;&nbsp; 在 MiniGUI 
            中,设置某个象素点的颜色,既可以直接使用象素值(SetPixel),也可以间接通过 RGB 值来设置(SetPixelRGB),并且通过 
            RGB2Pixel 函数,可以将 RGB 值转换为象素值。<BR><BR>&nbsp;&nbsp;&nbsp; 
            调色板是低颜色位数的模式下(比如 256 色或者更少的颜色模式),用来建立有限的象素值和 RGB 对应关系的一个线性表。在 
            MiniGUI 当中,可以通过 SetPalette和 GetPalette 进行调色板的操作,而SetColorfulePalette 
            将调色板设置为默认的调色板。一般而言,在更高的颜色位数,比如 15 
            位色以上,因为象素值范围能够表达的颜色已经非常丰富了,加上存储的关系,就不再使用调色板建立象素值和 RGB 
            的对应关系,而使用更简单的方法建立 RGB 
            和实际象素之间的关系,如下所示(src/gal/native/native.h):&nbsp; 
            <DIV align=center>
            <TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
              <TBODY>
              <TR>
                <TD width="100%" bgColor=#c0c0c0>174 /* Truecolor color 
                  conversion and extraction macros */<BR>175 /*<BR>176 * 
                  Conversion from RGB to gal_pixel<BR>177 */<BR>178 /* create 24 
                  bit 8/8/8 format pixel (0x00RRGGBB) from RGB triplet*/<BR>179 
                  #define RGB2PIXEL888(r,g,b) \<BR>180 (((r) &lt;&lt; 16) | ((g) 
                  &lt;&lt; 8) | (b))<BR>181&nbsp;<BR>182 /* create 16 bit 5/6/5 
                  format pixel from RGB triplet */<BR>183 #define 
                  RGB2PIXEL565(r,g,b) \<BR>184 ((((r) &amp; 0xf8) &lt;&lt; 8) | 
                  (((g) &amp; 0xfc) &lt;&lt; 3) | (((b) &amp; 0xf8) &gt;&gt; 
                  3))<BR>185&nbsp;<BR>186 /* create 15 bit 5/5/5 format pixel 
                  from RGB triplet */<BR>187 #define RGB2PIXEL555(r,g,b) 
                  \<BR>188 ((((r) &amp; 0xf8) &lt;&lt; 7) | (((g) &amp; 0xf8) 
                  &lt;&lt; 2) | (((b) &amp; 0xf8) &gt;&gt; 
                  3))<BR>189&nbsp;<BR>190 /* create 8 bit 3/3/2 format pixel 
                  from RGB triplet*/<BR>191 #define RGB2PIXEL332(r,g,b) \<BR>192 
                  (((r) &amp; 0xe0) | (((g) &amp; 0xe0) &gt;&gt; 3) | (((b) 
                  &amp; 0xc0) &gt;&gt; 6))<BR></TD></TR></TBODY></TABLE></DIV>
            <P>&nbsp;&nbsp;&nbsp; RGB2PIXEL888 将 [0, 255] 的 RGB 值转换为 24 位色的象素值;而 
            RGB2PIXEL565 转换为 16 位色的象素值;RGB2PIXEL555 和RGB2PIXEL332 分别转换为 15 位色和 8 
            位色。<BR><BR>&nbsp;&nbsp;&nbsp; <B>4.3 
            剪切域操作函数&nbsp;</B><BR>&nbsp;&nbsp;&nbsp; 
            在利用设备上下文进行绘图时,还可以进行剪切处理。MiniGUI 
            提供了如下函数完成对指定设备上下文的剪切处理(include/gdi.h):&nbsp; 
            <DIV align=center>
            <TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
              <TBODY>
              <TR>
                <TD width="100%" bgColor=#c0c0c0>468 // Clipping 
                  support<BR>469 void GUIAPI ExcludeClipRect (HDC hdc, int left, 
                  int top,&nbsp;<BR>470 int right, int bottom);<BR>471 void 
                  GUIAPI IncludeClipRect (HDC hdc, int left, int 
                  top,&nbsp;<BR>472 int right, int bottom);<BR>473 void GUIAPI 
                  ClipRectIntersect (HDC hdc, const RECT* prc);<BR>474 void 
                  GUIAPI SelectClipRect (HDC hdc, const RECT* prc);<BR>475 void 
                  GUIAPI SelectClipRegion (HDC hdc, const CLIPRGN* pRgn);<BR>476 
                  void GUIAPI GetBoundsRect (HDC hdc, RECT* pRect);<BR>477 BOOL 
                  GUIAPI PtVisible (HDC hdc, const POINT* pPt);<BR>478 BOOL 
                  GUIAPI RectVisible (HDC hdc, const RECT* 
            pRect);</TD></TR></TBODY></TABLE></DIV>
            <P>&nbsp;&nbsp;&nbsp; ExcludeClipRect 
            从设备上下文的当前可见区域中排除给定的矩形区域,设备上下文的可见区域将缩小;IncludeClipRect 
            向当前设备上下文的可见区域中添加一个矩形区域,设备上下文的可见区域将扩大;ClipRectIntersect 
            将设备上下文的可见区域设置为已有区域和给定矩形区域的交集;SelectClipRect 
            将设备上下文的可见区域重置为一个矩形区域;SelectClipRegion 
            将设备上下文的可见区域设置为一个指定的区域;GetBoundsRect 获取当前可见区域的外包最小矩形;PtVisible 和 
            RectVisible 用来判断给定的点或者矩形是否可见,即是否全部或部分落在可见区域当中。<BR><BR><B>5 
            位图操作函数&nbsp;</B><BR>&nbsp;&nbsp;&nbsp; 在 MiniGUI 的 GDI 
            函数中,位图操作函数占有非常重要的地位。实际上,许多高级绘图操作函数均建立在位图操作函数之上,比如文本输出函数。MiniGUI 
            的主要位图操作函数如下所示(include/gdi.h):&nbsp; 
            <DIV align=center>
            <TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
              <TBODY>
              <TR>
                <TD width="100%" bgColor=#c0c0c0>495 void GUIAPI FillBox (HDC 
                  hdc, int x, int y, int w, int h);<BR>496 void GUIAPI 
                  FillBoxWithBitmap (HDC hdc, int x, int y, int w, int h,<BR>497 
                  PBITMAP pBitmap);<BR>498 void GUIAPI FillBoxWithBitmapPart 
                  (HDC hdc, int x, int y, int w, int h,<BR>499 int bw, int bh, 
                  PBITMAP pBitmap, int xo, int yo);<BR>500&nbsp;<BR>501 void 
                  GUIAPI BitBlt (HDC hsdc, int sx, int sy, int sw, int 
                  sh,&nbsp;<BR>502 HDC hddc, int dx, int dy, DWORD 
                  dwRop);<BR>503 void GUIAPI StretchBlt (HDC hsdc, int sx, int 
                  sy, int sw, int sh,&nbsp;<BR>504 HDC hddc, int dx, int dy, int 
                  dw, int dh, DWORD dwRop);<BR></TD></TR></TBODY></TABLE></DIV>
            <P>&nbsp;&nbsp;&nbsp; FillBox 用当前填充色填充矩形框;FillBoxWithBitmap 
            用设备相关位图对象填充矩形框,可以用来扩大或者缩小位图;FillBoxWithBitmapPart 
            用设备相关位图对象的部分填充矩形框,也可以扩大或缩小位图。BitBlt 
            函数用来实现两个不同设备上下文之间的显示内存复制。StretchBlt 则在 BitBlt 
            的基础上进行缩放操作。<BR><BR>&nbsp;&nbsp;&nbsp; 通过 MiniGUI 的 LoadBitmap 
            函数,可以将某种位图文件装载为 MiniGUI 设备相关的位图对象,即 BITMAP 
            对象。设备相关的位图指的是,位图当中包含的是与指定设备上下文的显示模式相匹配的象素值,而不是设备无关的位图信息。MiniGUI 
            目前可以用来装载BMP 文件、JPG 文件、GIF 文件以及 PCX、TGA 等格式的位图文件,而 LoadMyBitmap 
            函数则用来将位图文件装载成设备无关的位图对象。在 MiniGUI 中,设备相关的位图对象和设备无关的位图对象分别用 BITMAP 和 
            MYBITMAP 两种数据结构表示。相关函数的原型如下(include/gdi.h):&nbsp; 
            <DIV align=center>
            <TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
              <TBODY>
              <TR>
                <TD width="100%" bgColor=#c0c0c0>666 int GUIAPI LoadMyBitmap 
                  (HDC hdc, PMYBITMAP pMyBitmap, RGB* pal, const char* 
                  spFileName);<BR>667 int GUIAPI LoadBitmap (HDC hdc, PBITMAP 
                  pBitmap, const char* spFileName);<BR>668 #ifdef 
                  _SAVE_BITMAP<BR>669 int GUIAPI SaveBitmap (HDC hdc, PBITMAP 
                  pBitmap, const char* spFileName);<BR>670 #endif<BR>671 void 
                  GUIAPI UnloadBitmap (PBITMAP pBitmap);<BR>672&nbsp;<BR>673 int 
                  GUIAPI ExpandMyBitmap (HDC hdc, const MYBITMAP* pMyBitmap, 
                  const RGB* pal, PBITMAP pBitmap);<BR>674&nbsp;<BR>675 void 
                  GUIAPI ExpandMonoBitmap (HDC hdc, int w, int h, const BYTE* 
                  bits, int bits_flow, int pitch,&nbsp;<BR>676 BYTE* bitmap, int 
                  bg, int fg);<BR>677 void GUIAPI Expand16CBitmap (HDC hdc, int 
                  w, int h, const BYTE* bits, int bits_flow, int pitch,<BR>678 
                  BYTE* bitmap, const RGB* pal);<BR>679 void GUIAPI 
                  Expand256CBitmap (HDC hdc, int w, int h, const BYTE* bits, int 
                  bits_flow, int pitch,<BR>680 BYTE* bitmap, const RGB* 
                  pal);<BR>681 void GUIAPI CompileRGBBitmap (HDC hdc, int w, int 
                  h, const BYTE* bits, int bits_flow, int pitch,<BR>682 BYTE* 
                  bitmap, int rgb_order);<BR>683&nbsp;<BR>684 void GUIAPI 
                  ReplaceBitmapColor (HDC hdc, PBITMAP pBitmap, int iOColor, int 
                  iNColor);</TD></TR></TBODY></TABLE></DIV>
            <P>&nbsp;&nbsp;&nbsp; 上面的 Expand 
            函数组,用来将设备无关的位图转化为与指定设备上下文相关的位图对象。<BR><BR>&nbsp;&nbsp;&nbsp; 
            有关位图操作的详细使用方法,可见 mglite-exec 包中的 bitmaptest 示例程序。<BR><BR><B>6 
            逻辑字体和文本输出函数&nbsp;</B><BR>&nbsp;&nbsp;&nbsp; MiniGUI 
            的逻辑字体功能强大,它包括了字符集、字体类型、风格、样式等等丰富的信息,不仅仅可以用来输出文本,而且可以用来分析多语种文本的结构。这在许多文本排版应用中非常有用。在使用 
            MiniGUI 
            的逻辑字体之前,首先要创建逻辑字体,并且将其选择到要使用这种逻辑字体进行文本输出的设备上下文当中。每个设备上下文的默认逻辑字体是系统字体,即用来显示菜单、标题的逻辑字体。你可以调用 
            CreateLogFont 和 CreateLogFontIndirect 两个函数来建立逻辑字体,并利用 SelectFont 
            函数将逻辑字体选择到指定的设备上下文中,在使用结束之后,用 DestroyLogFont 
            函数销毁逻辑字体。注意你不能销毁正被选中的逻辑字体。这几个函数的原型如下(include/gdi.h):&nbsp; 
            <DIV align=center>
            <TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
              <TBODY>
              <TR>
                <TD width="100%" bgColor=#c0c0c0>555 PLOGFONT GUIAPI 
                  CreateLogFont (const char* type, const char* 
                  family,&nbsp;<BR>556 const char* charset, char weight, char 
                  slant, char set_width,&nbsp;<BR>557 char spacing, char 
                  underline, char struckout,&nbsp;<BR>558 int size, int 
                  rotation);<BR>559 PLOGFONT GUIAPI CreateLogFontIndirect 
                  (LOGFONT* logfont);<BR>560 void GUIAPI DestroyLogFont 
                  (PLOGFONT log_font);<BR>561&nbsp;<BR>562 void GUIAPI 
                  GetLogFontInfo (HDC hdc, LOGFONT* 
                  log_font);<BR>563&nbsp;<BR>564 #define SYSLOGFONT_DEFAULT 
                  0<BR>565 PLOGFONT GUIAPI GetSystemFont (int 
                  font_id);<BR>566&nbsp;<BR>567 PLOGFONT GUIAPI GetCurFont (HDC 
                  hdc);<BR>568 PLOGFONT GUIAPI SelectFont (HDC hdc, PLOGFONT 
                  log_font);</TD></TR></TBODY></TABLE></DIV>
            <P>&nbsp;&nbsp;&nbsp; GetSystemFont 函数返回默认的系统逻辑字体,GetCurFont 
            函数返回当前选中的逻辑字体。注意不要删除系统逻辑字体。下面的程序段建立了多个逻辑字体:&nbsp; 
            <DIV align=center>
            <TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
              <TBODY>
              <TR>
                <TD width="100%" bgColor=#c0c0c0>static LOGFONT *logfont, 
                  *logfontgb12, *logfontbig24;<BR><BR>logfont = CreateLogFont 
                  (NULL, "SansSerif", "ISO8859-1",&nbsp;<BR>FONT_WEIGHT_REGULAR, 
                  FONT_SLANT_ITALIC, 
                  FONT_SETWIDTH_NORMAL,<BR>FONT_SPACING_CHARCELL, 
                  FONT_UNDERLINE_NONE, FONT_STRUCKOUT_LINE,&nbsp;<BR>16, 
                  0);<BR>logfontgb12 = CreateLogFont (NULL, "song", 
                  "GB2312",&nbsp;<BR>FONT_WEIGHT_REGULAR, FONT_SLANT_ROMAN, 
                  FONT_SETWIDTH_NORMAL,<BR>FONT_SPACING_CHARCELL, 
                  FONT_UNDERLINE_LINE, FONT_STRUCKOUT_LINE,&nbsp;<BR>12, 
                  0);<BR>logfontbig24 = CreateLogFont (NULL, "ming", 
                  "BIG5",&nbsp;<BR>FONT_WEIGHT_REGULAR, FONT_SLANT_ROMAN, 
                  FONT_SETWIDTH_NORMAL,<BR>FONT_SPACING_CHARCELL, 
                  FONT_UNDERLINE_LINE, FONT_STRUCKOUT_NONE,&nbsp;<BR>24, 
              0);</TD></TR></TBODY></TABLE></DIV>
            <P>&nbsp;&nbsp;&nbsp; 其中,第一个字体,即 logfont 是属于字符集 ISO8859-1 的字体,并且选用 
            SansSerif 体,大小为 16 象素高;logfontgb12 是属于字符集 GB2312 的字体,并选用 song 
            体(宋体),大小为 12 象素高;logfontbig24 是属于字符集 BIG5 的字体,并选用 ming 体(即明体)。 
            <P>&nbsp;&nbsp;&nbsp; 
            在建立了逻辑字体之后,应用程序可以利用逻辑字体进行多语种混和文本的分析。这里的多语种混和文本是指,两个不相交字符集的文本组成的字符串,比如 
            GB2312 和 ISO8859-1,或者 BIG5 和 
            ISO8859-2,通常是多字符集和单字符集之间的混和。利用下面的函数,可以实现多语种混和文本的文本组成分析(include/gdi.h):&nbsp; 

            <DIV align=center>
            <TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
              <TBODY>
              <TR>
                <TD width="100%" bgColor=#c0c0c0>570 // Text parse 
                  support<BR>571 int GUIAPI GetTextMCharInfo (PLOGFONT log_font, 
                  const char* mstr, int len,&nbsp;<BR>572 int* 
                  pos_chars);<BR>573 int GUIAPI GetTextWordInfo (PLOGFONT 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -