📄 基于 linux 和 minigui 的嵌入式系统软件开发指南(二).htm
字号:
wParam;<BR>RECT* rcResult = (RECT*)
lPraram;<BR><BR>rcResult->left =
rcExpect->left;<BR>rcResult->top =
rcExpect->top;<BR>rcResult->right = rcExpect->left +
_WIDTH;<BR>rcResult->bottom = rcExpect->left +
_HEIGHT;<BR>return 0;<BR>}</TD></TR></TBODY></TABLE></DIV>
<P><B>6.3 MSG_CHANGESIZE <BR></B>
在确立窗口大小之后,该消息被发送到窗口过程,用来通知确定之后的窗口大小。wParam 包含了窗口大小 RECT
的指针。注意应用程序应该将该消息传递给 MiniGUI 进行默认处理。</P>
<P><B>6.4 MSG_SIZECHANGED <BR></B>
该消息用来确定窗口客户区的大小,和 MSG_SIZECHANGING 消息类似。wParam 参数包含窗口大小信息,lParam
参数是用来保存窗口客户区大小的 RECT 指针,并且具有默认值。如果该消息的处理返回非零值,则将采用 lParam
当中包含的大小值作为客户区的大小;否则,将忽略该消息的处理。比如在 SPINBOX
控件中,就处理了该消息,并使客户区占具所有的窗口范围:</P>
<DIV align=center>
<TABLE cellSpacing=1 width="90%" border=0>
<TBODY>
<TR>
<TD width="100%" bgColor=#c0c0c0>case
MSG_SIZECHANGED<BR>{<BR>RECT* rcClient = (RECT*)
lPraram;<BR><BR>rcClient->right = rcClient->left +
_WIDTH;<BR>rcClient->bottom = rcClient->top +
_HEIGHT;<BR>return 0;<BR>}</TD></TR></TBODY></TABLE></DIV>
<P><B>6.5 MSG_CREATE <BR></B> 该消息在建立好的窗口成功添加到
MiniGUI 的窗口管理器之后发送到窗口过程。这时,应用程序可以在其中创建子窗口。如果该消息返回非零值,则将销毁新建的窗口。注意,在
MSG_NCCREATE 消息被发送时,窗口尚未正常建立,所以不能在 MSG_NCCREATE 消息中建立子窗口。</P>
<P><B>6.6 MSG_PAINT<BR></B>
该消息在需要进行窗口重绘时发送到窗口过程。MiniGUI
通过判断窗口是否含有无效区域来确定是否需要重绘。当窗口在初始显示、从隐藏状态变化为显示状态、从部分不可见到可见状态,或者应用程序调用
InvalidateRect 函数使某个矩形区域变成无效时,窗口将具有特定的无效区域。这时,MiniGUI
将在处理完所有的邮寄消息、通知消息之后处理无效区域,并向窗口过程发送 MSG_PAINT
消息。该消息的典型处理如下: </P>
<DIV align=center>
<TABLE cellSpacing=1 width="90%" border=0>
<TBODY>
<TR>
<TD width="100%" bgColor=#c0c0c0>case MSG_PAINT:<BR>{<BR>HDC
hdc;<BR><BR>hdc = BeginPaint (hWnd);<BR><BR>// 使用 hdc
绘制窗口<BR>...<BR><BR>EndPaint (hWnd,
hdc);<BR>break;<BR>}</TD></TR></TBODY></TABLE></DIV>
<P><B>6.7 MSG_DESTROY <BR></B> 该消息在应用程序调用
DestroyMainWindow 或者 DestroyWindow
时发送到窗口过程当中,用来通知系统即将销毁一个窗口。如果该消息的处理返回非零值,则将取消销毁过程。</P>
<P><B>7 Hello, World <BR></B>
在这个小节当中,我们给出一个简单的示例程序,该程序在窗口中打印"Hello, world!": </P>
<DIV align=center>
<TABLE cellSpacing=1 width="90%" border=0>
<TBODY>
<TR>
<TD width="100%" bgColor=#c0c0c0>#include
<stdio.h><BR>#include <stdlib.h><BR>#include
<string.h><BR><BR>#include
<minigui/common.h><BR>#include
<minigui/minigui.h><BR>#include
<minigui/gdi.h><BR>#include
<minigui/window.h><BR><BR>static int HelloWinProc (HWND
hWnd, int message, WPARAM wParam, LPARAM lParam)<BR>{<BR>HDC
hdc;<BR><BR>switch (message) {<BR>case MSG_PAINT:<BR>hdc =
BeginPaint (hWnd);<BR>TexOut (hdc, 0, 0, "Hello,
world!");<BR>EndPaint (hWnd, hdc);<BR>break;<BR><BR>case
MSG_CLOSE:<BR>DestroyMainWindow (hWnd);<BR>PostQuitMessage
(hWnd);<BR>return 0;<BR>}<BR><BR>return
DefaultMainWinProc(hWnd, message, wParam,
lParam);<BR>}<BR><BR>static void InitCreateInfo
(PMAINWINCREATE pCreateInfo)<BR>{<BR>pCreateInfo->dwStyle =
WS_CAPTION | WS_VISIBLE;<BR>pCreateInfo->dwExStyle =
0;<BR>pCreateInfo->spCaption = "Hello, world!"
;<BR>pCreateInfo->hMenu = 0;<BR>pCreateInfo->hCursor =
GetSystemCursor (0);<BR>pCreateInfo->hIcon =
0;<BR>pCreateInfo->MainWindowProc =
HelloWinProc;<BR>pCreateInfo->lx =
0; <BR>pCreateInfo->ty =
0; <BR>pCreateInfo->rx = 320;<BR>pCreateInfo->by =
240;<BR>pCreateInfo->iBkColor =
PIXEL_lightwhite; <BR>pCreateInfo->dwAddData =
0;<BR>pCreateInfo->hHosting = HWND_DESKTOP;<BR>}<BR><BR>int
MiniGUIMain (int args, const char* arg[])<BR>{<BR>MSG
Msg;<BR>MAINWINCREATE CreateInfo;<BR>HWND
hMainWnd;<BR><BR>#ifdef _LITE_VERSION<BR>SetDesktopRect (0, 0,
800, 600);<BR>#endif<BR><BR>InitCreateInfo
(&CreateInfo);<BR><BR>hMainWnd = CreateMainWindow
(&CreateInfo);<BR>if (hMainWnd == HWND_INVALID)<BR>return
-1;<BR><BR>while (GetMessage (&Msg, hMainWnd))
{<BR>DispatchMessage
(&Msg);<BR>}<BR><BR>MainWindowThreadCleanup
(hMainWnd);<BR>return 0;<BR>}</TD></TR></TBODY></TABLE></DIV>
<P> 很显然,这是一个非常简单的程序。该程序使用了 MiniGUI
的默认过程来处理我们前面提到的许多消息,而仅仅处理了 MSG_PAINT 和 MSG_CLOSE
两条消息。当用户单击标题栏上的关闭按钮时,MiniGUI 将发送 MSG_CLOSE
到窗口过程。这时,应用程序就可以销毁窗口,并终止消息循环,最终退出程序。 </P>
<P><B>8 小结<BR></B> 本文描述了 MiniGUI
中与消息相关的几个重要函数,并讲述了 MiniGUI-Threads 和 MiniGUI-Lite
在消息机制实现上的几个不同。本文还讲述了在 MiniGUI
中的窗口建立和销毁过程,并解释了窗口过程的概念以及一些重要消息的处理。最后,本文给出了一个简单的 MiniGUI
的示例程序,该程序建立窗口,并在其中打印"Hello, world!"。 </P></TD></TR></TBODY></TABLE></DIV>
<DIV align=center>
<TABLE height=10 cellSpacing=0 cellPadding=0 width="50%" border=0>
<TBODY>
<TR>
<TD width="100%" height=10></TD></TR></TBODY></TABLE></DIV>
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD width="100%"><FONT size=2>本文出处:<FONT class=txd size=2>【<A
href="http://www.cn.ibm.com/developerWorks/linux/index.shtml"
target=_blank>IBM : developerWorks
中国网站</A></FONT>】</FONT></TD></TR></TBODY></TABLE></DIV>
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD vAlign=bottom align=left width="50%"><INPUT style="COLOR: #000000; BORDER-TOP-STYLE: inset; BORDER-RIGHT-STYLE: inset; BORDER-LEFT-STYLE: inset; BACKGROUND-COLOR: #ffbd00; BORDER-BOTTOM-STYLE: inset" onclick=javascript:window.close() type=button value=关闭窗口>
</TD>
<TD vAlign=bottom align=right width="50%"><A
href="http://www.pocketix.com.cn/" target=_top><IMG height=46
alt=博利思软件有限公司
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(二).files/penguin56a1.gif"
width=40 border=0></A></TD></TR></TBODY></TABLE></DIV>
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD 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 align=middle width="100%"><FONT size=2>版权所有,需要转载请<A
href="mailto:web@pocketix.com">联系通知我们</A>,嵌入式Linux</FONT></TD></TR></TBODY></TABLE></DIV></TD></TR></TBODY></TABLE></CENTER></DIV>
<TABLE height=15 cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="100%" background=""
height=15></TD></TR></TBODY></TABLE></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -