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

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

📁 Programming Embedded Systems in C and C
💻 HTM
📖 第 1 页 / 共 4 页
字号:
                  log_font, const char* mstr, int len,&nbsp;<BR>574 int* 
                  pos_words, WORDINFO* info_words);<BR>575 int GUIAPI 
                  GetFirstMCharLen (PLOGFONT log_font, const char* mstr, int 
                  len);<BR>576 int GUIAPI GetFirstWord (PLOGFONT log_font, const 
                  char* mstr, int len,<BR>577 WORDINFO* 
            word_info);</TD></TR></TBODY></TABLE></DIV>
            <P>&nbsp;&nbsp;&nbsp; GetTextMCharInfo 
            函数返回多语种混和文本中每个字符的字节位置。比如对"ABC汉语"字符串,该函数将在 pos_chars 中返回{0, 1, 2, 3, 
            5} 5 个值。GetTextWordInfo 函数则将分析多语种混和文本中每个单词的位置。对单字节字符集文本,单词以空格、TAB 
            键为分界,对多字节字符集文本,单词以单个字符为界。GetFirstMCharLen 
            函数返回第一个混和文本字符的字节长度。GetFirstWord 
            函数返回第一个混和文本单词的单词信息。<BR><BR>&nbsp;&nbsp;&nbsp; 
            以下函数可以用来计算逻辑字体的输出长度和高度信息(include/gdi.h):&nbsp; 
            <DIV align=center>
            <TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
              <TBODY>
              <TR>
                <TD width="100%" bgColor=#c0c0c0>580 int GUIAPI 
                  GetTextExtentPoint (HDC hdc, const char* text, int len, int 
                  max_extent,&nbsp;<BR>581 int* fit_chars, int* pos_chars, int* 
                  dx_chars, SIZE* size);<BR>582&nbsp;<BR>583 // Text output 
                  support<BR>584 int GUIAPI GetFontHeight (HDC hdc);<BR>585 int 
                  GUIAPI GetMaxFontWidth (HDC hdc);<BR>586 void GUIAPI 
                  GetTextExtent (HDC hdc, const char* spText, int len, SIZE* 
                  pSize);<BR>587 void GUIAPI GetTabbedTextExtent (HDC hdc, const 
                  char* spText, int len, SIZE* pSize);</TD></TR></TBODY></TABLE></DIV>
            <P>&nbsp;&nbsp;&nbsp; GetTextExtentPoint 
            函数计算在给定的输出宽度内输出多字节文本时(即输出的字符限制在一定的宽度当中),可输出的最大字符个数、每个字符所在的字节位置、每个字符的输出位置,以及实际的输出高度和宽度。GetFontHeight 
            和 GetMaxFontWidth 则返回逻辑字体的高度和最大字符宽度。GetTextExtent 
            计算文本的输出高度和宽度。GetTabbedTextExtent 
            函数返回格式化字符串的输出高度和宽度。<BR><BR>&nbsp;&nbsp;&nbsp; 
            以下函数用来输出文本(include/gdi.h):&nbsp; 
            <DIV align=center>
            <TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
              <TBODY>
              <TR>
                <TD width="100%" bgColor=#c0c0c0><BR>596 int GUIAPI TextOutLen 
                  (HDC hdc, int x, int y, const char* spText, int len);<BR>597 
                  int GUIAPI TabbedTextOutLen (HDC hdc, int x, int y, const 
                  char* spText, int len);&nbsp;<BR>598 int GUIAPI 
                  TabbedTextOutEx (HDC hdc, int x, int y, const char* spText, 
                  int nCount,<BR>599 int nTabPositions, int *pTabPositions, int 
                  nTabOrigin);<BR>600 void GUIAPI GetLastTextOutPos (HDC hdc, 
                  POINT* pt);<BR>601&nbsp;<BR>602 // Compatiblity 
                  definitions<BR>603 #define TextOut(hdc, x, y, text) TextOutLen 
                  (hdc, x, y, text, -1)<BR>604 #define TabbedTextOut(hdc, x, y, 
                  text) TabbedTextOutLen (hdc, x, y, text, 
                  -1)<BR><BR>...<BR><BR>621 int GUIAPI DrawTextEx (HDC hdc, 
                  const char* pText, int nCount,&nbsp;<BR>622 RECT* pRect, int 
                  nIndent, UINT nFormat);<BR></TD></TR></TBODY></TABLE></DIV>
            <P>&nbsp;&nbsp;&nbsp; TextOutLen 函数用来在给定位置输出指定长度的字符串,若长度为 
            -1,则字符串必须是以 '\0' 结尾的。TabbedTextOutLen 函数用来输出格式化字符串。TabbedTextOutEx 
            函数用来输出格式化字符串,但可以指定字符串中每个 TAB 键的位置。DrawText 
            是功能最复杂的输出函数,可以以不同的对齐方式在指定矩形内部输出文本。下面的程序段,就根据字符串所描述的那样,调用 DrawText 
            函数进行对齐文本输出:&nbsp; 
            <DIV align=center>
            <TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
              <TBODY>
              <TR>
                <TD width="100%" bgColor=#c0c0c0>void OnModeDrawText (HDC 
                  hdc)<BR>{<BR>RECT rc1, rc2, rc3, rc4;<BR>const char* szBuff1 = 
                  "This is a good day. \n"<BR>"这是利用 DrawText 绘制的文本, 使用字体 GB2312 
                  Song 12. "<BR>"文本垂直靠上, 水平居中";<BR>const char* szBuff2 = "This 
                  is a good day. \n"<BR>"这是利用 DrawText 绘制的文本, 使用字体 GB2312 Song 
                  16. "<BR>"文本垂直靠上, 水平靠右";<BR>const char* szBuff3 = "单行文本垂直居中, 
                  水平居中";<BR>const char* szBuff4 =&nbsp;<BR>"这是利用 DrawTextEx 
                  绘制的文本, 使用字体 GB2312 Song 16. "<BR>"首行缩进值为 32. 文本垂直靠上, 
                  水平靠左";<BR><BR>rc1.left = 1; rc1.top = 1; rc1.right = 401; 
                  rc1.bottom = 101;<BR>rc2.left = 0; rc2.top = 110; rc2.right = 
                  401; rc2.bottom = 351;<BR>rc3.left = 0; rc3.top = 361; 
                  rc3.right = 401; rc3.bottom = 451;<BR>rc4.left = 0; rc4.top = 
                  461; rc4.right = 401; rc4.bottom = 551;<BR><BR>SetBkColor 
                  (hdc, COLOR_lightwhite);<BR><BR>Rectangle (hdc, rc1.left, 
                  rc1.top, rc1.right, rc1.bottom);<BR>Rectangle (hdc, rc2.left, 
                  rc2.top, rc2.right, rc2.bottom);<BR>Rectangle (hdc, rc3.left, 
                  rc3.top, rc3.right, rc3.bottom);<BR>Rectangle (hdc, rc4.left, 
                  rc4.top, rc4.right, rc4.bottom);<BR><BR>InflateRect (&amp;rc1, 
                  -1, -1);<BR>InflateRect (&amp;rc2, -1, -1);<BR>InflateRect 
                  (&amp;rc3, -1, -1);<BR>InflateRect (&amp;rc4, -1, 
                  -1);<BR><BR>SelectFont (hdc, logfontgb12);<BR>DrawText (hdc, 
                  szBuff1, -1, &amp;rc1, DT_NOCLIP | DT_CENTER | 
                  DT_WORDBREAK);<BR><BR>SelectFont (hdc, 
                  logfontgb16);<BR>DrawText (hdc, szBuff2, -1, &amp;rc2, 
                  DT_NOCLIP | DT_RIGHT | DT_WORDBREAK);<BR><BR>SelectFont (hdc, 
                  logfontgb24);<BR>DrawText (hdc, szBuff3, -1, &amp;rc3, 
                  DT_NOCLIP | DT_SINGLELINE | DT_CENTER | 
                  DT_VCENTER);<BR><BR>SelectFont (hdc, 
                  logfontgb16);<BR>DrawTextEx (hdc, szBuff4, -1, &amp;rc4, 32, 
                  DT_NOCLIP | DT_LEFT | 
            DT_WORDBREAK);<BR>}</TD></TR></TBODY></TABLE></DIV>
            <P>&nbsp;&nbsp;&nbsp; 有关逻辑字体和文本输出的函数详细使用方法,可见 mglite-exec 包中的 
            fontest 示例程序。<BR><BR><B>7 小结&nbsp;</B><BR>&nbsp;&nbsp;&nbsp; 本文讲述了 
            MiniGUI 中接口最多也最复杂的 GDI 
            函数及其使用方法。其中包括:设备上下文的概念、获取和释放;矩形操作和区域操作;基本绘图函数;位图操作函数;逻辑字体操作函数等等。目前版本的 
            GDI 接口还有许多功能上的缺陷,我们将在下一个版本开发中着重进行改善。关于 MiniGUI 
            下一版本的开发计划,请参见本文附录。<BR><BR>&nbsp;&nbsp;&nbsp; 附录:MiniGUI 
            的最新开发计划&nbsp;<BR>&nbsp;&nbsp;&nbsp; MiniGUI 
            发展到今天,得到了许多用户的认可,使用它的人也越来越多了。目前,用户已经从国内发展到了国外。这说明 MiniGUI 
            当中的许多设计思想得到了认可,也大大激励了我们的开发热情。<BR><BR>&nbsp;&nbsp;&nbsp; 
            作为一个面向实时嵌入式系统的 GUI,MiniGUI 的 1.0.xx 
            版本基本能够满足许多嵌入式系统的应用需求。但这还远远不够,我们仍然需要进一步的开发,以便让 MiniGUI 在嵌入式 GUI 
            系统中达到领先地位。<BR><BR>&nbsp;&nbsp;&nbsp; MiniGUI 
            发展到今天,得到了许多用户的认可,使用它的人也越来越多了。目前,用户已经从国内发展到了国外。这说明 MiniGUI 
            当中的许多设计思想得到了认可,也大大激励了我们的开发热情。<BR><BR>&nbsp;&nbsp;&nbsp; 
            作为一个面向实时嵌入式系统的 GUI,MiniGUI 的 1.0.xx 
            版本基本能够满足许多嵌入式系统的应用需求。但这还远远不够,我们仍然需要进一步的开发,以便让 MiniGUI 在嵌入式 GUI 
            系统中达到领先地位。<BR><BR>&nbsp;&nbsp;&nbsp; 我们已经开始了 MiniGUI 新版本开发(即 
            1.1.xx),对这个版本,有如下新的设想:&nbsp; 
            <OL>
              <LI>
              <P>MiniGUI-Lite 的全局鼠标支持。目前的 MiniGUI-Lite 
              版本,鼠标的位置刷新是由鼠标所在客户或者服务器管理的。新版本中,将考虑由服务器统一管理。这个工作目前已经基本完成。&nbsp; 
              </P>
              <LI>
              <P>在 MiniGUI-Lite 中添加层(Layer)的概念和处理。在一次 MiniGUI-Lite 
              会话中,可以建立多个层。每个层中可以包含能够同时向屏幕输出的多个客户,而每一时刻,能够在屏幕上显示的层只有一个。对层而言,我们可以进行层的激活处理。激活的层,将显示在屏幕上,而其他层的绘图将被屏蔽。对层中客户的绘图屏蔽算法,将考虑使用不同于当前 
              MiniGUI-Lite 通过信号和信号量结合的方法,因为这种方法在多线程应用中,可能出现问题。&nbsp; </P>
              <LI>
              <P>层中客户可以互相剪切。后建立的客户,将剪切先建立的客户矩形。为此,要为每个层建立一个共享内存的 IPC 
              对象,客户通过该对象访问当前层客户之间的重叠和覆盖情况,而且要建立一个面向层的信号量和 age 
              值,用来协调客户剪切矩形的变化。层的客户剪切矩形的变化,将影响各个客户所建立窗口的全局剪切区域,从而影响 DC 的可见区域。 
</P>
              <LI>
              <P>一个层中客户之间形成的 Z 序是固定的。不过,如果按照 3 所描述的方法,其实 Z 
              序也是可以变化的。考虑到性能因素,客户在层中所占的显示矩形不能变化,也就是说,既不能改变大小,也不能移动。但能够改变 Z 
              序,即改变客户之间的互相层叠关系。&nbsp;<BR>BTW:为什么要如此考虑?<BR>通过上面的方法,可以将一组具有共同目标的客户放置在同一个层上。比如,层中可以有一个 
              vcongui 程序,用它可以调试其他的 MiniGUI 程序。再比如,在 VOD 等程序中,实时播放 VCD 
              的客户就可以嵌入到主控界面当中。而服务器将具有较少的 GUI 能力,仅仅提供一个任务栏,用来激活某个层,或者改变客户在一个层中的 Z 
              序。<BR><BR>当然,这样安排对某些小屏幕的嵌入式应用来讲,比如 PDA,并不是非常适合,但对 
              STB、或者其他具有大屏幕的实时嵌入式系统来讲,将具有非常高的应用价值。 </P>
              <LI>
              <P>底层图形引擎将进行非常重大的修改,这将影响到 MiniGUI-Threads 和 MiniGUI-Lite 两个版本。目前的 
              MiniGUI 图形引擎,因为受到历史原因的影响,有许多弊端。在新的版本中,我们将考虑类似 SDL 
              那样的设计方法,将底层图形设备抽象为一个内存对象,并考虑加速功能的实现。同时,我们还要实现许多尚未实现的图形功能,包括光栅操作、Alpha 
              混和、多边形支持、椭圆和弧线支持等等。&nbsp;<BR>BTW:当前 GAL 的设计弊端<BR>当前 GAL 
              的设计弊端主要是抽象层次太高,而且并没有在底层实现剪切域的直接支持。这是要在新版本中着重考虑改进的。新的剪切域算法,将考虑生成 
              x-y-banned 的剪切域,以便底层绘图函数能够直接利用剪切域进行设计绘图算法。 </P>
              <LI>
              <P>将考虑在 MiniGUI-Lite 版本中实现对矢量字体的支持,同时增加 Cache 
              处理能力,以便提高矢量字体的渲染效率。&nbsp; </P>
              <LI>
              <P>对窗口管理,在这次开发中将不作大的修改,主要将进行一些代码的清理工作。 </P></LI></OL>
            <P>&nbsp;&nbsp;&nbsp; 
            以上是我们对新版本的一些想法,希望大家能够讨论,并请多提建议和意见。我们将考虑首先实现层,然后实现图形引擎的改进,最后实现矢量字体在 
            MiniGUI-Lite 当中的支持及优化。如果您对 MiniGUI 
            新版本的开发有兴趣,可以加入我们的邮件列表,详细信息请参见http://www.minigui.org/ctalk.shtml。<BR><BR>关于作者&nbsp;<BR>魏永明(ymwei@minigui.org),男,27 
            岁,工学硕士。国内最有影响的自由软件项目之一--MiniGUI 的创始人及主要开发人员。著有《Linux 实用教程》与《学用 Linux 
            与 Windows NT》,并主持翻译了《Red Hat Linux 奥秘》、《Linux 编程宝典》 等大量优秀的 Linux 
            技术著作。是清华大学 AKA Linux 
        编程技术系列讲座的主讲人。&nbsp;<BR><BR><BR></P></TD></TR></TBODY></TABLE></DIV>
      <DIV align=center>
      <TABLE height=10 cellSpacing=0 cellPadding=0 width="50%" border=0>
        <TBODY>
        <TR>
          <TD width="100%" height=10></TD></TR></TBODY></TABLE></DIV>
      <DIV align=center>
      <TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
        <TBODY>
        <TR>
          <TD width="100%"><FONT size=2>本文出处:<FONT class=txd size=2>【<A 
            href="http://www.cn.ibm.com/developerWorks/linux/embed/minigui/guide/part4/index.shtml" 
            target=_blank>IBM : developerWorks 
        中国网站</A></FONT>】</FONT></TD></TR></TBODY></TABLE></DIV>
      <DIV align=center>
      <TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
        <TBODY>
        <TR>
          <TD vAlign=bottom align=left width="50%"><INPUT style="COLOR: #000000; BORDER-TOP-STYLE: inset; BORDER-RIGHT-STYLE: inset; BORDER-LEFT-STYLE: inset; BACKGROUND-COLOR: #ffbd00; BORDER-BOTTOM-STYLE: inset" onclick=javascript:window.close() type=button value=关闭窗口> 
          </TD>
          <TD vAlign=bottom align=right width="50%"><A 
            href="http://www.pocketix.com.cn/" target=_top><IMG height=46 
            alt=博利思软件有限公司 
            src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(四).files/penguin56a1.gif" 
            width=40 border=0></A></TD></TR></TBODY></TABLE></DIV>
      <DIV align=center>
      <TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
        <TBODY>
        <TR>
          <TD width="100%">
            <HR SIZE=1>
          </TD></TR></TBODY></TABLE></DIV>
      <DIV align=center>
      <TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
        <TBODY>
        <TR>
          <TD align=middle width="100%"><FONT size=2>版权所有,需要转载请<A 
            href="mailto:web@pocketix.com">联系通知我们</A>,嵌入式Linux</FONT></TD></TR></TBODY></TABLE></DIV></TD></TR></TBODY></TABLE></CENTER></DIV>
<TABLE height=15 cellSpacing=0 cellPadding=0 width="100%" border=0>
  <TBODY>
  <TR>
    <TD width="100%" background="" 
height=15></TD></TR></TBODY></TABLE></BODY></HTML>

⌨️ 快捷键说明

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