📄 minigui 体系结构之二 多窗口管理和控件及控件类.htm
字号:
*/
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&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 + -