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

📄 teach_road_53.htm

📁 教程资料编程c语言编程教程资料编程c语言编程
💻 HTM
字号:
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb_2312-80">
<meta name="GENERATOR" content="闻怡洋 wyy_cq@21cn.com">
<title>Visual C++/MFC开发指南</title>
<SCRIPT LANGUAGE='JavaScript' SRC='../../submit_navigate_bar.js'></SCRIPT>
<link REL="stylesheet" HREF="../../main.css">


</head>
<SCRIPT LANGUAGE='JavaScript'>write_body();</SCRIPT>
<SCRIPT LANGUAGE='JavaScript'>write_bar();</SCRIPT>

<p align="center"><a
HREF="http://www.0828.com/pay/cgi-bin/random.cgi?job=go&id=820"
target="_blank">
<img SRC="http://www.0828.com/pay/cgi-bin/random.cgi?id=820" BORDER="0"
width="468" height="60"></a><br>
<font size="2"><a href="http://www.0828.com/pay/index.html"><img border="0"
src="http://www.0828.com/pay/code.gif" width="468" height="15"></a><br>
<small>你每点一下上面的广告我就能有更多的上网时间为大家寻找资料</small></font>
</p>

<table width=98% cellspacing="0" cellpadding="0" align=center><!--整体框架-->
<tr><td>

<table border=0 width="100%" cellspacing="0" cellpadding="2"><!--标记放置区域-->
<tr>
	<td width="30%" align="center" bgcolor="#003D84" valign=middle><img src=../../img/brand_200_60.gif width=200 height=60 alt="LOGO1"></td>
	<td width="70%" align="center" bgcolor="#003D84" valign=middle><img src=../../img/logo_400_60.gif width=400 height=60 alt="LOGO2"></td>
</tr>
<tr>
	<td colspan="2" bgcolor="#0080C0" align=center><font color=white>您当前位置</font></font> <a href=../../index.htm><font color=white>首页</font></a> <a href=../index.htm><font color=white>开发教程</font></a> <a href=index.htm><font color=white><font class=engul>Visual C++/MFC</font>入门教程</font></a> <font color=white><font color=white>5.3 创建无模式对话框</font><SCRIPT LANGUAGE='JavaScript'>write_command();</SCRIPT></td>
</tr>
</table><!--标记放置区域 END-->

<table border=0 width=100% cellspacing="0" cellpadding="0">
<tr>
<td><!--begin-->

<br>
<p align=center><big>5.3 创建无模式对话框</big></p>
<table border=0 align=center width=100%>
<tr><td>
<small>
<p>无模式对话框与有模式对话框不同的是在创建后其他窗口都可以继续接收用户输入,因此无模式对话框有些类似一个弹出窗口。创建无模式对话框需要调用<br>
BOOL CDialog::Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );之后还需要调用
<br>BOOL CDialog::ShowWindow( SW_SHOW);进行显示,否则无模式对话框将是不可见的。相关代码如下:
<pre>
void CYourView::OnOpenDlg(void)
{
	/*假设IDD_TEST_DLG为已经定义的对话框资源的ID号*/
	CTestDlg *dlg=new CTestDlg;
	dlg->Create(IDD_TEST_DLG,NULL);
	dlg->ShowWindows(SW_SHOW);
	/*不要调用 delete dlg;*/
}
</pre>
在上面的代码中我们新生成了一个对话框对象,而且在退出函数时并没有销毁该对象。因为如果此时销毁该对象(对象被销毁时窗口同时被销毁),而此时对话框还在显示就会出现错误。那么这就提出了一个问题:什么时候销毁该对象。我时常使用的方法有两个:
<ul>
<li><b>在对话框退出时销毁自己:</b>在对话框中重载OnOK与OnCancel在函数中调用父类的同名函数,然后调用DestroyWindow()强制销毁窗口,在对话框中映射WM_DESTROY消息,在消息处理函数中调用<font color=red>delete this</font>;强行删除自身对象。相关代码如下:
<pre>
void CTestDlg1::OnOK()
{
	CDialog::OnOK();
	DestroyWindow();
}

void CTestDlg1::OnCancel()
{
	CDialog::OnCancel();
	DestroyWindow();
}

void CTestDlg1::OnDestroy() 
{
	CDialog::OnDestroy();
	AfxMessageBox("call delete this");
	delete this;
}
</pre>这种方法的要点是在窗口被销毁的时候,删除自身对象。所以你可以在任何时候调用DestroyWindow()以达到彻底销毁自身对象的作用。(DestroyWindow()的调用会引起OnDestroy()的调用)</li>
<li><b>通过向父亲窗口发送消息,要求其他窗口对其进行销毁:</b>首先需要定义一个消息用于进行通知,然后在对话框中映射WM_DESTROY消息,在消息处理函数中调用消息发送函数通知其他窗口。在接收消息的窗口中利用ON_MESSAGE映射处理消息的函数,并在消息处理函数中删除对话框对象。相关代码如下:
<pre>
/*更改对话框的有关文件*/
CTestDlg2::CTestDlg2(CWnd* pParent /*=NULL*/)
	: CDialog(CTestDlg2::IDD, pParent)
{/*m_pParent为一成员变量,用于保存通知窗口的指针,所以该指针不能是一个临时指针*/
	ASSERT(pParent);
	m_pParent=pParent;
	//{{AFX_DATA_INIT(CTestDlg2)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}
void CTestDlg2::OnOK()
{
	CDialog::OnOK();
	DestroyWindow();
}

void CTestDlg2::OnCancel()
{
	CDialog::OnCancel();
	DestroyWindow();
}

void CTestDlg2::OnDestroy() 
{
	CDialog::OnDestroy();
	/*向其他窗口发送消息,将自身指针作为一个参数发送*/
	m_pParent->PostMessage(WM_DELETE_DLG,<font color=red>(WPARAM)this</font>);
}

/*在消息接收窗口中添加消息映射*/
/*在头文件中添加函数定义*/
	<font color=red>afx_msg LONG OnDelDlgMsg(WPARAM wP,LPARAM lP);</font>
/*添加消息映射代码*/
	<font color=red>ON_MESSAGE(WM_DELETE_DLG,OnDelDlgMsg)</font>
END_MESSAGE_MAP()
/*实现消息处理函数*/
LONG CMy53_s1View::OnDelDlgMsg(WPARAM wP,LPARAM lP)
{
	delete <font color=red>(CTestDlg2*)wP</font>;
	return 0;
}
/*创建对话框*/
void CMy53_s1View::OnTest2() 
{
	CTestDlg2 *dlg=new CTestDlg2(this);
	dlg->Create(IDD_TEST_DLG_2);
	dlg->ShowWindow(SW_SHOW);
}
</pre>
在这种方法中我们利用消息来进行通知,在Window系统中利用消息进行通知和传递数据的用法是很多的。
</li>
</ul>
</p>
<p>同样无模式对话框的另一个作用还可以用来在用户在对话框中的输入改变时可以及时的反映到其他窗口。下面的代码演示了在对话框中输入一段文字,然后将其更新到视图的显示区域中,这同样也是利用了消息进行通知和数据传递。
<pre>
/*在对话框中取出数据,并向其他窗口发送消息和数据,将数据指针作为一个参数发送*/
void CTestDlg2::OnCommBtn() 
{
	char szOut[30];
	GetDlgItemText(IDC_OUT,szOut,30);
	<font color=red>m_pParent->SendMessage(WM_DLG_NOTIFY,(WPARAM)szOut);</font>
}

/*在消息接收窗口中*/
/*映射消息处理函数*/
	<font color=red>ON_MESSAGE(WM_DLG_NOTIFY,OnDlgNotifyMsg)</font>

/*在视图中绘制出字符串 m_szOut*/
void CMy53_s1View::OnDraw(CDC* pDC)
{
	CMy53_s1Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	pDC->TextOut(0,0,"Display String");
	pDC->TextOut(0,20,m_szOut);
}
/*处理通知消息,保存信息并更新显示*/
LONG CMy53_s1View::OnDlgNotifyMsg(WPARAM wP,LPARAM lP)
{
	<font color=red>m_szOut=(char*)wP;</font>
	Invalidate();
	return 0;
}

</pre>
此外这种用法利用消息传递数据的方法对有模式对话框和其他的窗口间通信也一样有效。<a href=53_s1.zip>下载本节例子</a></p>
</small>
</td>
</tr>
<tr><td>
<small>
<p align=center><a href=index.htm#charpter5>返回</a></p>
</small>
</td></tr>
</table>
<p align=center><small>版权所有 闻怡洋 <a href=http://www.vchelp.net/>http://www.vchelp.net/</a></small></p>

</td><!--end-->
</tr>
</table>

</td></tr></table><!--整体框架 END-->



<SCRIPT LANGUAGE='JavaScript'>write_tail();</SCRIPT>

</body></html>

⌨️ 快捷键说明

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