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

📄 minigui 体系结构之二 多窗口管理和控件及控件类.htm

📁 minigui--面向实时嵌入式系统的图形用户界面。此文档介绍了miniguide体系结构。
💻 HTM
📖 第 1 页 / 共 4 页
字号:
     */
    struct _CONTROL* next;   // 下一个兄弟控件
    struct _CONTROL* prev;   // 前一个兄弟控件

    PCTRLCLASSINFO pcci;     // 指向控件所属控件类结构的指针

} CONTROL;
typedef CONTROL* PCONTROL;
</PRE></TD></TR></TBODY></TABLE>
      <P>很显然,只要将控件的回调函数地址进行替换,就可以非常方便地对控件进行子类化操作。值得一提的是,主窗口的结构定义和控件数据结构定义基本上是相同的,只是在某些成员上有一些小小的差别。</P><A 
      id=5 name=5></A>
      <P><STRONG class=subhead>5 输入法模块的设计</STRONG></P>
      <P>输入法提供了将标准键盘输入翻译为适当语种的文字的能力。MiniGUI 
      中也包含有标准的中文简体输入法,包括全拼、五笔和智能拼音等等。MiniGUI 的输入法是一个相对独立的模块(称为 
      IME),它实际是一个特殊的主窗口。该主窗口将在启动之后,首先将自己注册为输入法窗口。这样,MiniGUI 的 desktop 
      就知道首先要将按键信息发送到这个主窗口之中,而不是当前的活动主窗口。当活动主窗口发生变化时,desktop 
      会通知输入法窗口当前的活动窗口。这样,当输入法窗口接收到按键消息并且翻译为适当的字符之后,就可以将其发送到当前的活动窗口。</P>
      <P>为了实现 desktop 和 IME 窗口之间的交互,MiniGUI 为输入法窗口定义了如下消息,当活动窗口发生变化时,MiniGUI 会向 
      IME 窗口发送这些消息:</P>
      <UL class=noindent>
        <LI>MSG_IME_SETTARGET:发送该消息设置输入法的目标活动窗口; 
        <LI>MSG_IME_OPEN:发送该消息告诉输入法窗口,当前活动窗口是具有 WS_EX_IMECOMPOSE 
        扩展风格的窗口,所以应该显示输入法窗口。 
        <LI>MSG_IME_CLOSE:发送该消息告诉输入法窗口,当前活动窗口不具有 WS_EX_IMECOMPOSE 
        扩展风格,所以应该隐藏输入法窗口。 </LI></UL>
      <P>如果一个窗口要成为输入法窗口,则必须完成如下工作:</P>
      <OL>
        <LI>注册成为当前输入法; 
        <LI>处理 MSG_IME_SETTARGE 消息,并记录当前活动目标窗口; 
        <LI>翻译按键并将翻译后的结构通过 MSG_CHAR 消息发送到当前活动的目标窗口; 
        <LI>处理 MSG_IME_OPEN 和 MSG_IME_CLOSE 消息,在切换到需要输入法的活动窗口时自动显示输入法窗口。 
      </LI></OL><A id=6 name=6></A>
      <P><STRONG class=subhead>6 小结</STRONG></P>
      <P>本文重点讲述了 MiniGUI 中的窗口剪切处理算法。这是任何一个多窗口系统首先要解决的问题。然后,本文介绍了 MiniGUI 
      中控件类和控件的实现。最后介绍了 MiniGUI 中输入法窗口的设计思路。</P><A id=7 name=7></A>
      <P><STRONG class=subhead>附:MiniGUI 的最新进展</STRONG></P>
      <P>2001 年元月 03 日,MiniGUI 的 0.9.98 版本发布。该版本包括一个我们专门针对 PDA 等嵌入式系统设计的 MiniGUI 
      版本,该版本称为 MiniGUI-Lite。下面是对 MiniGUI-Lite 简单介绍,将来我们还要撰文详细介绍 
MiniGUI-Lite。</P>
      <P>大家都知道,MiniGUI 
      采用了基于线程的体系结构,并且建立了基于线程的消息传递和窗口管理功能。但是,在许多系统中,这种基于线程的结构并不是很好。这是因为一些众所周知的原因造成的--Linux 
      线程,尽管可以提供最大程度上的数据共享,但却造成了系统体系结构的脆弱。如果某个线程因为非法的数据访问而终止运行,则整个进程都将受到影响。与线程结构相反的是采用传统的 
      UNIX IPC 机制建立窗口系统,即类似 X Window 的客户/服务器体系。这种体系结构有它的先天不足,主要是通常的 IPC 
      机制无法提供高效的数据复制,大量的 CPU 资源用于在各进程之间复制数据。在 PDA 等设备中,这种 CPU 
      资源的浪费将最终导致系统性能的降低以及设备耗电量的增加。</P>
      <P>为了解决 MiniGUI 版本因为线程而引入的一些问题,同时也为了让 MiniGUI更加适合于嵌入式系统,我们决定开发一个 MiniGUI 
      Lite 版本。这个版本的开发目的是:</P>1. 保持与原先 MiniGUI 版本在源代码级 98% 以上的兼容。 2. 不再使用 
      LinuxThreads。 3. 可以同时运行多个基于 MiniGUI Lite 的应用程序,即多个进程,并且提供前后台进程的切换。 
      <P>显然,要同时满足上述三个目的,如果采用传统的 C/S 结构对现有 MiniGUI 进行改造,应该不难实现。但前面提到的传统 C/S 
      结构的缺陷却无法避免。经过对 PDA 等嵌入式系统的分析,我们发现,某些 PDA 
      产品具有运行多个任务的能力,但同一时刻在屏幕上进行绘制的程序,一般不会超过两个。因此,只要确保将这两个进程的绘制相互隔离,就不需要采用复杂的 C/S 
      结构处理多个进程窗口之间的互相剪切。也就是说,在这种产品中,如果采用基于传统 C/S 结构的多窗口系统,实际是一种浪费。</P>
      <P>有了上述认识,我们对 MiniGUI-Lite 版本进行了如下简化设计:</P>1. 每个进程维护自己的主窗口 Z 
      序,同一进程创建的主窗口之间互相剪切。也就是说,除这个进程只有一个线程,只有一个消息循环之外,它与原有的 MiniGUI 
      版本之间没有任何区别。每个进程在进行屏幕绘制时,不需要考虑其他进程。 2. 
      建立一个简单的客户/服务器体系,但确保最小化进程间的数据复制功能。因此,在服务器和客户之间传递的数据仅限于输入设备的输入数据,以及客户和服务器之间的某些请求和响应数据。 
      3. 有一个服务器进程(mginit),它负责初始化一些输入设备,并且通过 UNIX Domain 套接字将输入设备的消息发送到前台的 
      MiniGUI Lite 客户进程。 4. 
      服务器和客户被分别限定在屏幕的某两个不相交矩形内进行绘制,同一时刻,只能有一个客户及服务器进行屏幕绘制。其他客户可继续运行,但屏幕输入被屏蔽。服务器可以利用 
      API 接口将某个客户切换到前台。同时,服务器和客户之间采用信号和 System V 信号量进行同步。 5. 服务器还采用 System V IPC 
      机制提供一些资源的共享,包括位图、图标、鼠标、字体等等,以便减少实际内存的消耗。 
      <P>现在你可以使用 MiniGUI-Lite 一次运行不止一个 MiniGUI 应用程序。我们可以从一个称为 “mginit” 的程序中启动其他 
      MiniGUI 程序。如果因为某种原因客户终止,服务器可以继续运行。在我们的发布版本中,有一个称为 mglite-exec 的软件包, 
      这个软件包里有一个 mginit 程序, 该程序建立了一个虚拟控制台窗口。我们可以从这个虚拟控制台的命令行启动该软件包中其他的程序,甚至可以通过 
      gdb 调试这些程序。</P>
      <P>我们可以在 MiniGUI-Lite 程序中创建多个窗口,但不能启动新的线程建立窗口。这是 MiniGUI-Lite 区别于 MiniGUI 
      原有版本的最大不同。除此之外,其他几乎所有的 API 都和 MiniGUI 原有版本是兼容的。因此。从 MiniGUI 原有版本向 
      MiniGUI-Lite 版本的移植是非常简单的。不信,请看 mglite-exec 包中的程序,其中所有的程序均来自 miniguiexec 
      包,而每个源文件的改动不超过 5 行。</P><A id=resources name=resources></A>
      <P><STRONG class=subhead>相关资源</STRONG></P>
      <UL>
        <LI><B>MiniGUI 资源</B> </LI></UL>
      <UL>
        <LI><A href="http://www.minigui.org/">MiniGUI 主页</A> 
        <LI><A href="ftp://ftp.minigui.org/pub/minigui">MiniGUI FTP 站点</A> 
      </LI></UL>
      <UL class=noindent>
        <LI><B>MiniGUI 邮件列表</B> </LI></UL>
      <UL>
        <LI>发信:<A 
        href="mailto:minigui-devel@egroups.com">minigui-devel@egroups.com</A> 
        <LI>订阅:<A 
        href="mailto:minigui-devel-subscribe@egroups.com">minigui-devel-subscribe@egroups.com</A> 

        <LI>解除订阅:<A 
        href="mailto:minigui-devel-unsubscribe@egroups.com">minigui-devel-unsubscribe@egroups.com</A> 
        </LI></UL><A id=author name=author></A>
      <P><STRONG class=subhead>关于作者</STRONG><BR>魏永明(ymwei@minigui.org),男,27 
      岁,工学硕士,现任蓝点软件(深圳)有限公司北京研发中心技术主管。国内最有影响的自由软件项目之一-- MiniGUI 
      的创始人以及主要开发人员。著有《Linux 实用教程》与《学用 Linux 与 Windows NT》,并主持翻译了《Red Hat Linux 
      奥秘》、《Linux 编程宝典》 等大量优秀的 Linux 技术著作。是清华大学 AKA Linux 编程技术系列讲座的主讲人。</P><!-- table border="1" cellspacing="1" cellpadding="3">    <tr><td><font face="helvetica,helv,arial" size="-1">trademark or attribution statements (possibly with image) that are required for publishing or reprinting</font> </td></tr>    </table>--><!-- End paper --><BR></TD>
    <TD vAlign=top width=8><IMG height=1 alt="" 
      src="MiniGUI 体系结构之二 多窗口管理和控件及控件类.files/c.gif" width=8></TD></TR>
  <TR vAlign=top height=8>
    <TD vAlign=top colSpan=3></TD></TR>
  <TR vAlign=top height=8>
    <TD vAlign=top width=8><!-- gutter --></TD>
    <TD vAlign=top width=8><!-- comments #7: rate article form -->
      <TABLE cellSpacing=0 cellPadding=0 width=150 border=0>
        <TBODY>
        <TR>
          <TD width="100%" bgColor=#cc6633 height=3><IMG height=3 alt="" 
            src="MiniGUI 体系结构之二 多窗口管理和控件及控件类.files/c.gif" width=150 
        border=0></TD></TR>
        <TR>
          <TD width="100%" bgColor=#333333 height=1><IMG height=1 alt="" 
            src="MiniGUI 体系结构之二 多窗口管理和控件及控件类.files/c.gif" width=150 
        border=0></TD></TR>
        <TR>
          <TD width="100%" bgColor=#000000 height=1><IMG height=1 alt="" 
            src="MiniGUI 体系结构之二 多窗口管理和控件及控件类.files/c.gif" width=150 
        border=0></TD></TR>
        <TR>
          <TD width="100%" bgColor=#ffffff height=5><IMG height=5 alt="" 
            src="MiniGUI 体系结构之二 多窗口管理和控件及控件类.files/c.gif" width=150 
        border=0></TD></TR>
        <TR vAlign=top>
          <TD>
            <FORM 
            action=/developerWorks/cn/cnratings.nsf/RateArticle?CreateDocument 
            method=post><!-- comments #7: paste title here --><INPUT type=hidden 
            value="MiniGUI 体系结构之二 多窗口管理和控件及控件类" name=ArticleTitle> <!-- comments #7: paste zone here --><INPUT type=hidden value=Linux 
            name=Zone> <INPUT type=hidden value=简体中文 name=region> <INPUT 
            type=hidden value=/developerWorks/cn/thankyou/feedback-linux.html 
            name=RedirectURL> <FONT face=helvetica,helv,arial 
            size=-1><B>您对这篇文章的看法如何?</B></FONT> 
            <P></P>
            <TABLE cellSpacing=0 cellPadding=0 width=570 border=0>
              <TBODY>
              <TR vAlign=top>
                <TD><INPUT type=radio value=5 name=Rating><FONT 
                  face=helvetica,helv,arial size=-1>真棒!</FONT></TD>
                <TD><INPUT type=radio value=4 name=Rating><FONT 
                  face=helvetica,helv,arial size=-1>好文章</FONT></TD>
                <TD><INPUT type=radio value=3 name=Rating><FONT 
                  face=helvetica,helv,arial size=-1>一般,尚可</FONT></TD>
                <TD><INPUT type=radio value=2 name=Rating><FONT 
                  face=helvetica,helv,arial size=-1>需提高</FONT></TD>
                <TD><INPUT type=radio value=1 name=Rating><FONT 
                  face=helvetica,helv,arial 
            size=-1>太差!</FONT></TD></TR></TBODY></TABLE><BR><FONT 
            face=helvetica,helv,arial size=-1><B>评价</B></FONT><BR><TEXTAREA name=Comments rows=3 wrap=virtual cols=52></TEXTAREA><BR><BR><INPUT type=submit value=提交反馈意见></FORM></TD></TR></TBODY></TABLE><!-- end rate article form --></TD>
    <TD vAlign=top width=8></TD></TR>
  <TR vAlign=top height=8>
    <TD vAlign=top 
colSpan=3></TD></TR></TBODY></TABLE><!-- end content --></TD></TR></TABLE><!-- ---------------footer------------------- -->
<TABLE cellSpacing=0 cellPadding=0 border=0>
  <TBODY>
  <TR>
    <TD align=right width="100%" colSpan=2 height=30>(c) Copyright IBM Corp. 
      2001, (c) Copyright IBM China 2001, All Right Reserved</TD></TR>
  <TR>
    <TD width=150>
      <TABLE cellSpacing=0 cellPadding=0 width=150 border=0>
        <TBODY>
        <TR bgColor=#000000>
          <TD align=middle width=49><A class=nav style="COLOR: #ffffff" 
            href="http://www.ibm.com/privacy/"><FONT face="Arial, sans-serif" 
            color=#ffffff size=-1>隐私</FONT></A></TD>
          <TD width=1 bgColor=#959595><IMG height=20 alt="" 
            src="MiniGUI 体系结构之二 多窗口管理和控件及控件类.files/c.gif" width=1 border=0></TD>
          <TD align=middle width=49><A class=nav style="COLOR: #ffffff" 
            href="http://www.ibm.com/legal/"><FONT face="Arial, sans-serif" 
            color=#ffffff size=-1>法律</FONT></A></TD>
          <TD width=1 bgColor=#959595><IMG height=20 alt="" 
            src="MiniGUI 体系结构之二 多窗口管理和控件及控件类.files/c.gif" width=1 border=0></TD>
          <TD align=middle width=49><A class=nav style="COLOR: #ffffff" 
            href="http://www.cn.ibm.com/Main.nsf/HTMLS/aboutibm&amp;contactus"><FONT 
            face="Arial, sans-serif" color=#ffffff size=-1>联系</FONT></A></TD>
          <TD width=1 bgColor=#959595><IMG height=21 alt="" 
            src="MiniGUI 体系结构之二 多窗口管理和控件及控件类.files/c.gif" width=1 
        border=0></TD></TR></TBODY></TABLE></TD>
    <TD width="100%" bgColor=#000000><IMG height=1 alt="" 
      src="MiniGUI 体系结构之二 多窗口管理和控件及控件类.files/c.gif" width=1 
  border=0></TD></TR></TBODY></TABLE>
<SCRIPT language=JavaScript1.2 src="MiniGUI 体系结构之二 多窗口管理和控件及控件类.files/stats.js" 
type=text/javascript></SCRIPT>
<NOSCRIPT><IMG height=1 alt="" 
src="D:\新建文件夹\MiniGUI 体系结构之二 多窗口管理和控件及控件类.files\c(2).gif" width=1 
border=0></NOSCRIPT> </BODY></HTML>

⌨️ 快捷键说明

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