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

📄 基于 linux 和 minigui 的嵌入式系统软件开发指南(二).htm

📁 Programming Embedded Systems in C and C
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<!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>&nbsp;&nbsp;&nbsp; 在利用 
            MiniGUI 开发应用程序之前,首先要理解的两个概念就是消息循环和窗口过程。消息循环是事件驱动的 GUI 
            编程之基础。而窗口则是图形用户界面的最基本交互元素。本文描述了 MiniGUI 中与消息相关的几个重要函数,也描述了 
            MiniGUI-Threads 和 MiniGUI-Lite 在消息循环实现上的几个不同。本文还讲述了在 MiniGUI 
            中的窗口建立和销毁过程,并解释了窗口过程的概念以及对一些重要消息的处理。 
            <P><B>引言&nbsp;<BR></B>&nbsp;&nbsp;&nbsp; 我们知道,流行的 GUI 
            编程都有一个重要的概念与之相关,即"事件驱动编程"。事件驱动的含义就是,程序的流程不再是只有一个入口和若干个出口的串行执行线路;相反,程序会一直处于一个循环状态,在这个循环当中,程序从外部输入设备获取某些事件,比如用户的按键或者鼠标的移动,然后根据这些事件作出某种的响应,并完成一定的功能,这个循环直到程序接受到某个消息为止。"事件驱动"的底层设施,就是常说的"消息队列"和"消息循环"。本文将具体描述 
            MiniGUI 中用来处理消息的几个重要函数,并描述 MiniGUI-Threads 和 MiniGUI-Lite 
            在消息循环实现上的一些不同。</P>
            <P>&nbsp;&nbsp;&nbsp; 窗口是 MiniGUI 当中最基本的 GUI 
            元素,一旦窗口建立之后,窗口就会从消息队列当中获取属于自己的消息,然后交由它的窗口过程进行处理。这些消息当中,有一些是基本的输入设备事件,而有一些则是与窗口管理相关的逻辑消息。本文将讲述 
            MiniGUI 中的窗口建立和销毁过程,并解释了窗口过程的概念以及对一些重要消息的处理。<BR><BR><B>2 
            消息和消息循环&nbsp;<BR></B>&nbsp;&nbsp;&nbsp; 在 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>&nbsp;&nbsp;&nbsp; 一个消息由该消息所属的窗口(hwnd)、消息编号(message)、消息的 WPARAM 
            型参数(wParam)以及消息的 LPARAM 
            型参数(lParam)组成。消息的两个参数中包含了重要的内容。比如,对鼠标消息而言,lParam 中一般包含鼠标的位置信息,而 
            wParam 参数中则包含发生该消息时,对应的 SHIFT 键的状态信息等。对其他不同的消息类型来讲,wParam 和 lParam 
            也具有明确的定义。当然,用户也可以自定义消息,并定义消息的 wParam 和 lParam 意义。为了用户能够自定义消息,MiniGUI 
            定义了 MSG_USER 宏,可如下定义自己的消息:&nbsp;</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>&nbsp;&nbsp;&nbsp; 用户可以在自己的程序中使用自定义消息,并利用自定义消息传递数据。</P>
            <P>&nbsp;&nbsp;&nbsp; 在理解消息之后,我们看消息循环。简而言之,消息循环就是一个循环体,在这个循环体中,程序利用 
            GetMessage 函数不停地从消息队列中获得消息,然后利用 DispatchMessage 
            函数将消息发送到指定的窗口,也就是调用指定窗口的窗口过程,并传递消息及其参数。典型的消息循环如下所示:&nbsp;</P>
            <DIV align=center>
            <TABLE cellSpacing=1 width="90%" border=0>
              <TBODY>
              <TR>
                <TD width="100%" bgColor=#c0c0c0>while (GetMessage (&amp;Msg, 
                  hMainWnd)) {<BR>TranslateMessage 
                  (&amp;Msg);<BR>DispatchMessage 
            (&amp;Msg);<BR>}</TD></TR></TBODY></TABLE></DIV>
            <P>&nbsp;&nbsp;&nbsp; 如上所示,GetMessage 函数从 hMainWnd 
            窗口所属的消息队列当中获得消息,然后调用 TranslateMessage 函数将 MSG_KEYDOWN 和 MSG_KEYUP 
            消息翻译成 MSG_CHAR 消息,最后调用 DispatchMessage 函数将消息发送到指定的窗口。</P>
            <P>&nbsp;&nbsp;&nbsp; 在 MiniGUI-Threads 版本中,每个建立有窗口的 GUI 
            线程有自己的消息队列,而且,所有属于同一线程的窗口共享同一个消息队列。因此,GetMessage 函数将获得所有与 hMainWnd 
            窗口在同一线程中的窗口的消息。</P>
            <P>&nbsp;&nbsp;&nbsp; 而在 MiniGUI-Lite 版本中,只有一个消息队列,GetMessage 
            将从该消息队列当中获得所有的消息,而忽略 hMainWnd 参数。</P>
            <P><B>3 几个重要的消息处理函数&nbsp;<BR></B>&nbsp;&nbsp;&nbsp; 除了上面提到的 
            GetMessage 和 TranslateMessage、DispatchMessage 函数以外,MiniGUI 
            支持如下几个消息处理函数。&nbsp;</P>
            <P>&nbsp;&nbsp;&nbsp; 
            <B>PostMessage:</B>该函数将消息放到指定窗口的消息队列后立即返回。这种发送方式称为"邮寄"消息。如果消息队列中的邮寄消息缓冲区已满,则该函数返回错误值。在下一个消息循环中,由 
            GetMessage 函数获得这个消息之后,窗口才会处理该消息。PostMessage 一般用于发送一些非关键性的消息。比如在 
            MiniGUI 中,鼠标和键盘消息就是通过 PostMessage 函数发送的。</P>
            <P>&nbsp;&nbsp;&nbsp; <B>SendMessage:</B>该函数和 PostMessage 
            函数不同,它在发送一条消息给指定窗口时,将等待该消息被处理之后才会返回。当需要知道某个消息的处理结果时,使用该函数发送消息,然后根据其返回值进行处理。在 

⌨️ 快捷键说明

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