📄 基于 linux 和 minigui 的嵌入式系统软件开发指南(三).htm
字号:
{
WS_BORDER | WS_CAPTION,
WS_EX_NONE,
120, 150, 400, 130,
"VAM-CNC 正在进行初始化,
0, 0,
3, NULL,
0
};
CTRLDATA CtrlInitProgress [] =
{
{
"static",
WS_VISIBLE | SS_SIMPLE,
10, 10, 380, 16,
IDC_PROMPTINFO,
"正在...",
0
},
{
"progressbar",
WS_VISIBLE,
10, 40, 380, 20,
IDC_PROGRESS,
NULL,
0
},
{
"button",
WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON,
170, 70, 60, 25,
IDOK,
"确定",
0
}
};
</FONT></CODE></PRE></TD></TR></TBODY></TABLE>
<P><FONT face=宋体>
在定义了对话框模板数据之后,需要定义对话框的回调函数,并调用DialogBoxIndirectParam 函数建立对话框,如清单 5
所示,所建立的对话框如图 1 所示。</FONT></P>
<P><FONT face=宋体> 清单 5 定义对话框回调函数,并建立对话框</FONT>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1>
<TBODY>
<TR>
<TD><PRE><CODE><FONT face=宋体>
/* 定义对话框回调函数 */
static int InitDialogBoxProc (HWND hDlg, int message, WPARAM wParam, LPARAM lParam)
{
switch (message) {
case MSG_INITDIALOG:
return 1;
case MSG_COMMAND:
switch (wParam) {
case IDOK:
case IDCANCEL:
EndDialog (hDlg, wParam);
break;
}
break;
}
return DefaultDialogProc (hDlg, message, wParam, lParam);
}
static void InitDialogBox (HWND hWnd)
{
/* 将对话框和控件数组关联起来 */
DlgInitProgress.controls = CtrlInitProgress;
DialogBoxIndirectParam (&DlgInitProgress, hWnd, InitDialogBoxProc, 0L);
}
</FONT></CODE></PRE></TD></TR></TBODY></TABLE>
<P align=center><FONT face=宋体><BR><IMG height=136 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(三).files/2001081001image.gif"
width=406 border=0></FONT>
<P><FONT face=宋体><BR> 图 1 清单 5 程序建立的对话框</FONT></P>
<P><FONT face=宋体> DialogBoxIndirectParam
以及相关函数的原型如下:</FONT>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1>
<TBODY>
<TR>
<TD><PRE><CODE><FONT face=宋体>
1203 int GUIAPI DialogBoxIndirectParam (PDLGTEMPLATE pDlgTemplate,
1204 HWND hOwner, WNDPROC DlgProc, LPARAM lParam);
1205 BOOL GUIAPI EndDialog (HWND hDlg, int endCode);
1206 void GUIAPI DestroyAllControls (HWND hDlg);
</FONT></CODE></PRE></TD></TR></TBODY></TABLE>
<P><FONT face=宋体> 在 DialogBoxIndirectParam
中,需要指定对话框模板(pDlgTemplate)、对话框的托管主窗口句柄(hOwner)、对话框回调函数地址(DlgProc),以及要传递到对话框过程的参数值(lParam)。EndDialog
用来结束对话框过程。DestroyAllControls 用来销毁对话框(包括主窗口)中的所有子控件。</FONT> </P>
<P><FONT face=宋体> 在清单 5
中,对话框回调函数并没有进行任何实质性的工作,当用户按下"确定"按钮时,调用 EndDialog 函数直接返回。</FONT> </P>
<P><FONT face=宋体><SPAN class=atitle2> </SPAN><A
name=5><SPAN class=atitle2>5 MSG_INITDIALOG 消息</SPAN></A></FONT>
<P><FONT face=宋体>
对话框回调函数是一类特殊的主窗口回调函数。用户在定义自己的对话框回调函数时,需要处理 MSG_INITDIALOG 消息。该消息是在
MiniGUI 建立根据对话框模板建立对话框以及控件之后,发送到对话框回调函数的。该消息的 lParam 参数包含了由
DialogBoxIndirectParam
函数的第四个参数传递到对话框回调函数的值。用户可以利用该值进行对话框的初始化,或者保存起来以备后用。例如,清单 7 中的程序将
MSG_INITDIALOG 消息的 lParam
参数保存到了对话框窗口句柄的附加数据中,这样可以确保在任何需要的时候,方便地从对话框窗口的附加数据中获取这一数据。</FONT>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1>
<TBODY>
<TR>
<TD><PRE><CODE><FONT face=宋体>
static int DepInfoBoxProc (HWND hDlg, int message, WPARAM wParam, LPARAM lParam)
{
struct _DepInfo *info;
switch(message) {
case MSG_INITDIALOG:
{
/* 将对话框参数 lParam 保存为窗口的附加数据,以备后用*/
info = (struct _DepInfo*)lParam;
SetWindowAdditionalData2 (hDlg, (DWORD)lParam);
break;
}
case MSG_COMMAND:
{
/* 从窗口的附加数据中取出保存的对话框参数 */
info = (struct _DepInfo*) GetWindowAdditionalData2 (hDlg);
switch(wParam) {
case IDOK:
/* 使用 info 结构中的数据 */
......
case IDCANCEL:
EndDialog(hDlg,wParam);
break;
}
}
}
return DefaultDialogProc (hDlg, message, wParam, lParam);
}
</FONT></CODE></PRE></TD></TR></TBODY></TABLE>
<P><FONT face=宋体>
通常而言,传递到对话框回调函数中的参数是一个结构的指针,该结构包含一些初始化对话框的数据,同时也可以将对话框的输入数据保存下来并传递到对话框之外使用。</FONT></P>
<P><FONT face=宋体><SPAN class=atitle2> </SPAN><A
name=6><SPAN class=atitle2>6 模态和非模态对话框</SPAN></A></FONT></P>
<P><FONT face=宋体>
简单而言,模态对话框就是显示之后,用户不能再切换到其他主窗口进行工作的对话框,而只能在关闭之后,才能使用其他的主窗口。MiniGUI
中,使用 DialogBoxIndirectParam
函数建立的对话框就是模态对话框。实际上,该对话框首先根据模板建立对话框,然后禁止其托管主窗口,并在主窗口的 MSG_CREATE
消息中创建控件,并发送 MSG_INITDIALOG 消息给回调函数,最终建立一个新的消息循环,并进入该消息循环,直到程序调用
EndDialog 函数为止。</FONT></P>
<P><FONT face=宋体> 实际上,我们也可以在 MiniGUI
中利用对话框模板建立普通的主窗口,即非模态对话框。这时,我们使用 CreateMainWindowIndirect
函数。该函数以及相关函数的原型如下(src/window.h):</FONT>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1>
<TBODY>
<TR>
<TD><PRE><CODE><FONT face=宋体>
1199 HWND GUIAPI CreateMainWindowIndirect (PDLGTEMPLATE pDlgTemplate,
1200 HWND hOwner, WNDPROC WndProc);
1201 BOOL GUIAPI DestroyMainWindowIndirect (HWND hMainWin);
</FONT></CODE></PRE></TD></TR></TBODY></TABLE><FONT
face=宋体> 使用 CreateMainWindowIndirect
根据对话框模板建立的主窗口和其他类型的普通主窗口没有任何区别。</FONT>
<P><FONT face=宋体><SPAN class=atitle2> </SPAN><A
name=7><SPAN class=atitle2>7 小结</SPAN></A></FONT></P>
<P><FONT face=宋体> 对话框编程是 MiniGUI
应用开发中使用最为常见的一种技术。通过定义一个对话框模板,就可以自动创建一个具有复杂输入输出界面的对话框。本文讲述了 MiniGUI
中的控件类和控件实例的关系,并举例说明控件子类化的概念及应用;然后讲解了 MiniGUI
对话框的编程技术,包括对话框模板的定义和对话框回调函数的编程;最后说明了模态对话框和非模态对话框之间的区别。</FONT></P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><FONT face=宋体><A name=author1><SPAN
class=atitle2>关于作者</SPAN></A> <BR>魏永明(<A
href="mailto:ymwei@minigui.org">ymwei@minigui.org</A>),男,27
岁,工学硕士。国内最有影响的自由软件项目之一--MiniGUI 的创始人及主要开发人员。著有《Linux 实用教程》与《学用
Linux 与 Windows NT》,并主持翻译了《Red Hat Linux 奥秘》、《Linux 编程宝典》
等大量优秀的 Linux 技术著作。是清华大学 AKA Linux
编程技术系列讲座的主讲人</FONT></TD></TR></TBODY></TABLE></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 + -