?? 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 + -