?? 基于 linux 和 minigui 的嵌入式系統(tǒng)軟件開發(fā)指南(二).htm
字號(hào):
<TBODY>
<TR><!-- Sidebar Gutter -->
<TD width=8><IMG height=21 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系統(tǒng)軟件開發(fā)指南(二).files/c.gif" width=5></TD>
<TD width=160><!-- Start TOC -->
<TABLE cellSpacing=0 cellPadding=0 width=160 border=0>
<TBODY>
<TR>
<TD width=160 bgColor=#000000 height=1><IMG height=1 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系統(tǒng)軟件開發(fā)指南(二).files/c.gif"
width=160></TD></TR>
<TR>
<TD align=middle
background="基于 Linux 和 MiniGUI 的嵌入式系統(tǒng)軟件開發(fā)指南(二).files/bg-gold.gif"
height=5><B>內(nèi)容:</B></TD></TR>
<TR>
<TD width=160 bgColor=#666666 height=1><IMG height=1 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系統(tǒng)軟件開發(fā)指南(二).files/c.gif"
width=160></TD></TR>
<TR>
<TD align=right>
<TABLE cellSpacing=0 cellPadding=3 width="98%" border=0>
<TBODY>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part2/index.shtml#1">引言</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part2/index.shtml#2">消息和消息循環(huán)</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part2/index.shtml#3">幾個(gè)重要的消息處理函數(shù)</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part2/index.shtml#4">MiniGUI-Threads
和 MiniGUI-Lite 在消息處理上的不同</A> </TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part2/index.shtml#5">窗口的建立和銷毀</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part2/index.shtml#6">幾個(gè)重要消息</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part2/index.shtml#7">Hello,
World</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part2/index.shtml#8">小結(jié)</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part2/index.shtml#author1">關(guān)于作者</A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><!-- End TOC --><!-- Start Related Content Area -->
<TABLE cellSpacing=0 cellPadding=0 width=160 border=0>
<TBODY>
<TR>
<TD width=160 bgColor=#000000 height=1><IMG height=1 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系統(tǒng)軟件開發(fā)指南(二).files/c.gif"
width=160></TD></TR>
<TR>
<TD align=middle
background="基于 Linux 和 MiniGUI 的嵌入式系統(tǒng)軟件開發(fā)指南(二).files/bg-gold.gif"
height=5><B>相關(guān)內(nèi)容:</B></TD></TR>
<TR>
<TD width=160 bgColor=#666666 height=1><IMG height=1 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系統(tǒng)軟件開發(fā)指南(二).files/c.gif"
width=160></TD></TR>
<TR>
<TD align=right>
<TABLE cellSpacing=0 cellPadding=3 width="98%" border=0>
<TBODY>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part1/index.shtml">主題一:選擇MiniGUI-Threads
或者 MiniGUI-Lite</A>
</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><!-- End Related dW Content Area -->
<TABLE cellSpacing=0 cellPadding=0 width=160 border=0>
<TBODY>
<TR>
<TD width=150 bgColor=#000000 colSpan=2 height=2><IMG height=2
alt="" src="基于 Linux 和 MiniGUI 的嵌入式系統(tǒng)軟件開發(fā)指南(二).files/c.gif"
width=160></TD></TR>
<TR>
<TD width=150 bgColor=#ffffff colSpan=2 height=2><IMG height=2
alt="" src="基于 Linux 和 MiniGUI 的嵌入式系統(tǒng)軟件開發(fā)指南(二).files/c.gif"
width=160></TD></TR></TBODY></TABLE><!-- END STANDARD SIDEBAR AREA --></TD></TR></TBODY></TABLE><!-- START SUBTITLE AND CONTENT --><SPAN
class=atitle2>主題二:理解消息循環(huán)和窗口過程</SPAN>
<P><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part2/index.shtml#author1">魏永明</A>
(<A
href="mailto:ymwei@minigui.org">ymwei@minigui.org</A>)<BR>自由撰稿人<BR>2001 年
7 月</P>
<BLOCKQUOTE>在利用 MiniGUI 開發(fā)應(yīng)用程序之前,首先要理解的兩個(gè)概念就是消息循環(huán)和窗口過程。消息循環(huán)是事件驅(qū)動(dòng)的 GUI
編程之基礎(chǔ)。而窗口則是圖形用戶界面的最基本交互元素。本文描述了 MiniGUI 中與消息相關(guān)的幾個(gè)重要函數(shù),也描述了
MiniGUI-Threads 和 MiniGUI-Lite 在消息循環(huán)實(shí)現(xiàn)上的幾個(gè)不同。本文還講述了在 MiniGUI
中的窗口建立和銷毀過程,并解釋了窗口過程的概念以及對(duì)一些重要消息的處理。</BLOCKQUOTE>
<P><A id=1 name=1><SPAN class=atitle2>引言</SPAN></A><BR>我們知道,流行的 GUI
編程都有一個(gè)重要的概念與之相關(guān),即"事件驅(qū)動(dòng)編程"。事件驅(qū)動(dòng)的含義就是,程序的流程不再是只有一個(gè)入口和若干個(gè)出口的串行執(zhí)行線路;相反,程序會(huì)一直處于一個(gè)循環(huán)狀態(tài),在這個(gè)循環(huán)當(dāng)中,程序從外部輸入設(shè)備獲取某些事件,比如用戶的按鍵或者鼠標(biāo)的移動(dòng),然后根據(jù)這些事件作出某種的響應(yīng),并完成一定的功能,這個(gè)循環(huán)直到程序接受到某個(gè)消息為止。"事件驅(qū)動(dòng)"的底層設(shè)施,就是常說的"消息隊(duì)列"和"消息循環(huán)"。本文將具體描述
MiniGUI 中用來處理消息的幾個(gè)重要函數(shù),并描述 MiniGUI-Threads 和 MiniGUI-Lite
在消息循環(huán)實(shí)現(xiàn)上的一些不同。</P>
<P>窗口是 MiniGUI 當(dāng)中最基本的 GUI
元素,一旦窗口建立之后,窗口就會(huì)從消息隊(duì)列當(dāng)中獲取屬于自己的消息,然后交由它的窗口過程進(jìn)行處理。這些消息當(dāng)中,有一些是基本的輸入設(shè)備事件,而有一些則是與窗口管理相關(guān)的邏輯消息。本文將講述
MiniGUI 中的窗口建立和銷毀過程,并解釋了窗口過程的概念以及對(duì)一些重要消息的處理。</P>
<P><A id=2 name=2><SPAN class=atitle2>2 消息和消息循環(huán)</SPAN></A><BR>在 MiniGUI
中,消息被如下定義(include/window.h):</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1><TBODY>
<TR>
<TD><PRE><CODE>352 typedef struct _MSG
353 {
354 HWND hwnd;
355 int message;
356 WPARAM wParam;
357 LPARAM lParam;
358 #ifdef _LITE_VERSION
359 unsigned int time;
360 #else
361 struct timeval time;
362 #endif
363 POINT pt;
364 #ifndef _LITE_VERSION
365 void* pAdd;
366 #endif
367 }MSG;
368 typedef MSG* PMSG;
</CODE>
</PRE></TD></TR></TBODY></TABLE><BR><BR>
<P>一個(gè)消息由該消息所屬的窗口(hwnd)、消息編號(hào)(message)、消息的 WPARAM 型參數(shù)(wParam)以及消息的 LPARAM
型參數(shù)(lParam)組成。消息的兩個(gè)參數(shù)中包含了重要的內(nèi)容。比如,對(duì)鼠標(biāo)消息而言,lParam 中一般包含鼠標(biāo)的位置信息,而 wParam
參數(shù)中則包含發(fā)生該消息時(shí),對(duì)應(yīng)的 SHIFT 鍵的狀態(tài)信息等。對(duì)其他不同的消息類型來講,wParam 和 lParam
也具有明確的定義。當(dāng)然,用戶也可以自定義消息,并定義消息的 wParam 和 lParam 意義。為了用戶能夠自定義消息,MiniGUI 定義了
MSG_USER 宏,可如下定義自己的消息:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1><TBODY>
<TR>
<TD><PRE><CODE>#define MSG_MYMESSAGE1 (MSG_USER + 1)
#define MSG_MYMESSAGE2 (MSG_USER + 2)
</CODE>
</PRE></TD></TR></TBODY></TABLE>用戶可以在自己的程序中使用自定義消息,并利用自定義消息傳遞數(shù)據(jù)。<BR><BR>
<P>在理解消息之后,我們看消息循環(huán)。簡而言之,消息循環(huán)就是一個(gè)循環(huán)體,在這個(gè)循環(huán)體中,程序利用 GetMessage
函數(shù)不停地從消息隊(duì)列中獲得消息,然后利用 DispatchMessage
函數(shù)將消息發(fā)送到指定的窗口,也就是調(diào)用指定窗口的窗口過程,并傳遞消息及其參數(shù)。典型的消息循環(huán)如下所示:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1><TBODY>
<TR>
<TD><PRE><CODE>while (GetMessage (&Msg, hMainWnd)) {
TranslateMessage (&Msg);
DispatchMessage (&Msg);
}
</CODE>
</PRE></TD></TR></TBODY></TABLE>如上所示,GetMessage 函數(shù)從 hMainWnd
窗口所屬的消息隊(duì)列當(dāng)中獲得消息,然后調(diào)用 TranslateMessage 函數(shù)將 MSG_KEYDOWN 和 MSG_KEYUP 消息翻譯成
MSG_CHAR 消息,最后調(diào)用 DispatchMessage 函數(shù)將消息發(fā)送到指定的窗口。<BR><BR>
<P>在 MiniGUI-Threads 版本中,每個(gè)建立有窗口的 GUI
線程有自己的消息隊(duì)列,而且,所有屬于同一線程的窗口共享同一個(gè)消息隊(duì)列。因此,GetMessage 函數(shù)將獲得所有與 hMainWnd
窗口在同一線程中的窗口的消息。</P>
<P>而在 MiniGUI-Lite 版本中,只有一個(gè)消息隊(duì)列,GetMessage 將從該消息隊(duì)列當(dāng)中獲得所有的消息,而忽略 hMainWnd
參數(shù)。</P>
<P><A id=3 name=3><SPAN class=atitle2>3 幾個(gè)重要的消息處理函數(shù)</SPAN></A><BR>除了上面提到的
GetMessage 和 TranslateMessage、DispatchMessage 函數(shù)以外,MiniGUI
支持如下幾個(gè)消息處理函數(shù)。</P>
<P><B>PostMessage:</B>該函數(shù)將消息放到指定窗口的消息隊(duì)列后立即返回。這種發(fā)送方式稱為"郵寄"消息。如果消息隊(duì)列中的郵寄消息緩沖區(qū)已滿,則該函數(shù)返回錯(cuò)誤值。在下一個(gè)消息循環(huán)中,由
GetMessage 函數(shù)獲得這個(gè)消息之后,窗口才會(huì)處理該消息。PostMessage 一般用于發(fā)送一些非關(guān)鍵性的消息。比如在 MiniGUI
中,鼠標(biāo)和鍵盤消息就是通過 PostMessage 函數(shù)發(fā)送的。</P>
<P><B>SendMessage:</B>該函數(shù)和 PostMessage
函數(shù)不同,它在發(fā)送一條消息給指定窗口時(shí),將等待該消息被處理之后才會(huì)返回。當(dāng)需要知道某個(gè)消息的處理結(jié)果時(shí),使用該函數(shù)發(fā)送消息,然后根據(jù)其返回值進(jìn)行處理。在
MiniGUI-Threads
當(dāng)中,如果發(fā)送消息的線程和接收消息的線程不是同一個(gè)線程,發(fā)送消息的線程將阻塞并等待另一個(gè)線程的處理結(jié)果,然后繼續(xù)運(yùn)行;否則,SendMessage
函數(shù)將直接調(diào)用接收消息窗口的窗口過程函數(shù)。MiniGUI-Lite 則和上面的第二種情況一樣,直接調(diào)用接收消息窗口的窗口過程函數(shù)。</P>
<P><B>SendNotifyMessage:</B>該函數(shù)和 PostMessage 消息類似,也是不等待消息被處理即返回。但和
PostMessage
消息不同,通過該函數(shù)發(fā)送的消息不會(huì)因?yàn)榫彌_區(qū)滿而丟失,因?yàn)橄到y(tǒng)采用鏈表的形式處理這種消息。通過該函數(shù)發(fā)送的消息一般稱為"通知消息",一般用來從控件向其父窗口發(fā)送通知消息。</P>
<P><B>PostQuitMessage:</B>該消息在消息隊(duì)列中設(shè)置一個(gè) QS_QUIT 標(biāo)志。GetMessage
在從指定消息隊(duì)列中獲取消息時(shí),會(huì)檢查該標(biāo)志,如果有 QS_QUIT 標(biāo)志,GetMessage 消息將返回
FALSE,從而可以利用該返回值終止消息循環(huán)。</P>
<P><A id=4 name=4><SPAN class=atitle2>4 MiniGUI-Threads 和 MiniGUI-Lite
在消息處理上的不同</SPAN></A><BR>表 1 總結(jié)了 MiniGUI-Threads 和 MiniGUI-Lite
在消息處理上的不同</P>
<P>表 1 MiniGUI-Threads 和 MiniGUI-Lite 在消息處理上的不同</P>
<TABLE cellSpacing=0 cellPadding=5 border=1>
<TBODY>
<TR>
<TD></TD>
<TD>MiniGUI-Threads</TD>
<TD>MiniGUI-Lite</TD></TR>
<TR>
<TD>多消息隊(duì)列</TD>
<TD>每個(gè)創(chuàng)建窗口的線程擁有獨(dú)立的消息隊(duì)列</TD>
<TD>只有一個(gè)消息隊(duì)列。所有窗口共享一個(gè)消息隊(duì)列。除非嵌套消息循環(huán),否則一個(gè)程序中只有一個(gè)消息循環(huán)。</TD></TR>
<TR>
<TD>內(nèi)建多線程處理</TD>
<TD>是。可以自動(dòng)處理跨線程的消息傳遞</TD>
<TD>不能。從一個(gè)線程向另外一個(gè)線程發(fā)送或者郵寄消息時(shí),必須通過互斥處理保護(hù)消息隊(duì)列。</TD></TR>
<TR>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -