📄 基于 linux 和 minigui 的嵌入式系统软件开发指南(二).htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0053)http://www.pocketix.com/documents/tech/2001073002.htm -->
<HTML><HEAD><TITLE>基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(二)</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META http-equiv=Content-Language content=en-us>
<META content="MSHTML 6.00.2719.2200" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId><!--使鼠标指向链接显示红色和加上下划线-->
<STYLE type=text/css>TD {
FONT-SIZE: 10pt; LINE-HEIGHT: 19px; FONT-FAMILY: 宋体
}
P {
FONT-SIZE: 10pt; FONT-FAMILY: 宋体
}
A:visited {
FONT-SIZE: 10pt; FONT-FAMILY: 宋体; TEXT-DECORATION: none
}
A:link {
FONT-SIZE: 10pt; FONT-FAMILY: 宋体; TEXT-DECORATION: none
}
A:hover {
FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: "宋体"; TEXT-DECORATION: underline
}
</STYLE>
</HEAD>
<BODY leftMargin=6 topMargin=5>
<DIV align=center>
<CENTER>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width=690
borderColorLight=#000000 border=0>
<TBODY>
<TR>
<TD vAlign=top align=left><IMG height=60 alt=logo
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(二).files/pocketix_com_logo.gif"
width=220 border=0></TD>
<TD vAlign=center align=middle width=468>
<SCRIPT language=JavaScript
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(二).files/demo_1_banner.js"></SCRIPT>
</TD></TR></TBODY></TABLE></CENTER></DIV>
<DIV align=center>
<CENTER>
<TABLE height=15 cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="100%" background=""
height=15></TD></TR></TBODY></TABLE></CENTER></DIV>
<DIV align=left>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR height=20>
<TD width="100%"></TD></TR></TBODY></TABLE></DIV>
<DIV align=center>
<CENTER>
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD vAlign=top width="100%">
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD align=middle width="100%"><FONT size=3>基于 Linux 和 MiniGUI
的嵌入式系统软件开发指南(二)<BR></FONT><FONT color=#999999>2001-07-30 嵌入式Linux
报道</FONT></TD></TR>
<TR>
<TD vAlign=top align=middle 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 width="100%"><B>主题二:理解消息循环和窗口过程</B><BR> 在利用
MiniGUI 开发应用程序之前,首先要理解的两个概念就是消息循环和窗口过程。消息循环是事件驱动的 GUI
编程之基础。而窗口则是图形用户界面的最基本交互元素。本文描述了 MiniGUI 中与消息相关的几个重要函数,也描述了
MiniGUI-Threads 和 MiniGUI-Lite 在消息循环实现上的几个不同。本文还讲述了在 MiniGUI
中的窗口建立和销毁过程,并解释了窗口过程的概念以及对一些重要消息的处理。
<P><B>引言 <BR></B> 我们知道,流行的 GUI
编程都有一个重要的概念与之相关,即"事件驱动编程"。事件驱动的含义就是,程序的流程不再是只有一个入口和若干个出口的串行执行线路;相反,程序会一直处于一个循环状态,在这个循环当中,程序从外部输入设备获取某些事件,比如用户的按键或者鼠标的移动,然后根据这些事件作出某种的响应,并完成一定的功能,这个循环直到程序接受到某个消息为止。"事件驱动"的底层设施,就是常说的"消息队列"和"消息循环"。本文将具体描述
MiniGUI 中用来处理消息的几个重要函数,并描述 MiniGUI-Threads 和 MiniGUI-Lite
在消息循环实现上的一些不同。</P>
<P> 窗口是 MiniGUI 当中最基本的 GUI
元素,一旦窗口建立之后,窗口就会从消息队列当中获取属于自己的消息,然后交由它的窗口过程进行处理。这些消息当中,有一些是基本的输入设备事件,而有一些则是与窗口管理相关的逻辑消息。本文将讲述
MiniGUI 中的窗口建立和销毁过程,并解释了窗口过程的概念以及对一些重要消息的处理。<BR><BR><B>2
消息和消息循环 <BR></B> 在 MiniGUI
中,消息被如下定义(include/window.h):</P>
<DIV align=center>
<TABLE cellSpacing=1 width="90%" border=0>
<TBODY>
<TR>
<TD width="100%" bgColor=#c0c0c0>352 typedef struct
_MSG<BR>353 {<BR>354 HWND hwnd;<BR>355 int message;<BR>356
WPARAM wParam;<BR>357 LPARAM lParam;<BR>358 #ifdef
_LITE_VERSION<BR>359 unsigned int time;<BR>360 #else<BR>361
struct timeval time;<BR>362 #endif<BR>363 POINT pt;<BR>364
#ifndef _LITE_VERSION<BR>365 void* pAdd;<BR>366 #endif<BR>367
}MSG;<BR>368 typedef MSG* PMSG;</TD></TR></TBODY></TABLE></DIV>
<P> 一个消息由该消息所属的窗口(hwnd)、消息编号(message)、消息的 WPARAM
型参数(wParam)以及消息的 LPARAM
型参数(lParam)组成。消息的两个参数中包含了重要的内容。比如,对鼠标消息而言,lParam 中一般包含鼠标的位置信息,而
wParam 参数中则包含发生该消息时,对应的 SHIFT 键的状态信息等。对其他不同的消息类型来讲,wParam 和 lParam
也具有明确的定义。当然,用户也可以自定义消息,并定义消息的 wParam 和 lParam 意义。为了用户能够自定义消息,MiniGUI
定义了 MSG_USER 宏,可如下定义自己的消息: </P>
<DIV align=center>
<TABLE cellSpacing=1 width="90%" border=0>
<TBODY>
<TR>
<TD width="100%" bgColor=#c0c0c0>#define MSG_MYMESSAGE1
(MSG_USER + 1)<BR>#define MSG_MYMESSAGE2 (MSG_USER +
2)</TD></TR></TBODY></TABLE></DIV>
<P> 用户可以在自己的程序中使用自定义消息,并利用自定义消息传递数据。</P>
<P> 在理解消息之后,我们看消息循环。简而言之,消息循环就是一个循环体,在这个循环体中,程序利用
GetMessage 函数不停地从消息队列中获得消息,然后利用 DispatchMessage
函数将消息发送到指定的窗口,也就是调用指定窗口的窗口过程,并传递消息及其参数。典型的消息循环如下所示: </P>
<DIV align=center>
<TABLE cellSpacing=1 width="90%" border=0>
<TBODY>
<TR>
<TD width="100%" bgColor=#c0c0c0>while (GetMessage (&Msg,
hMainWnd)) {<BR>TranslateMessage
(&Msg);<BR>DispatchMessage
(&Msg);<BR>}</TD></TR></TBODY></TABLE></DIV>
<P> 如上所示,GetMessage 函数从 hMainWnd
窗口所属的消息队列当中获得消息,然后调用 TranslateMessage 函数将 MSG_KEYDOWN 和 MSG_KEYUP
消息翻译成 MSG_CHAR 消息,最后调用 DispatchMessage 函数将消息发送到指定的窗口。</P>
<P> 在 MiniGUI-Threads 版本中,每个建立有窗口的 GUI
线程有自己的消息队列,而且,所有属于同一线程的窗口共享同一个消息队列。因此,GetMessage 函数将获得所有与 hMainWnd
窗口在同一线程中的窗口的消息。</P>
<P> 而在 MiniGUI-Lite 版本中,只有一个消息队列,GetMessage
将从该消息队列当中获得所有的消息,而忽略 hMainWnd 参数。</P>
<P><B>3 几个重要的消息处理函数 <BR></B> 除了上面提到的
GetMessage 和 TranslateMessage、DispatchMessage 函数以外,MiniGUI
支持如下几个消息处理函数。 </P>
<P>
<B>PostMessage:</B>该函数将消息放到指定窗口的消息队列后立即返回。这种发送方式称为"邮寄"消息。如果消息队列中的邮寄消息缓冲区已满,则该函数返回错误值。在下一个消息循环中,由
GetMessage 函数获得这个消息之后,窗口才会处理该消息。PostMessage 一般用于发送一些非关键性的消息。比如在
MiniGUI 中,鼠标和键盘消息就是通过 PostMessage 函数发送的。</P>
<P> <B>SendMessage:</B>该函数和 PostMessage
函数不同,它在发送一条消息给指定窗口时,将等待该消息被处理之后才会返回。当需要知道某个消息的处理结果时,使用该函数发送消息,然后根据其返回值进行处理。在
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -