无模式对话框
上一篇 / 下一篇 2007-04-27 18:10:15 / 个人分类:编程与其它
今天学了一个新概念,无模式对话框:例如,单击窗口中某链接弹出一个小的对话框,然后可以在父窗口继续对地图进行操作,而上面的子窗口不会消失.51Testing软件测试网?2cH]%bN Y
一般在网页中实现是采用javascrīpt,而在c/s则采用面向对象的语言开发.51Testing软件测试网5tnW{|Hf
下面是vc++代码的实现:
8\h;XDX x$D7wg6b0创建无模式对话框需要调用BOOL CDialog::Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );之后还需要调用BOOL CDialog::ShowWindow( SW_SHOW);进行显示,否则无模式对话框将是不可见的。相关代码如下:
void CYourView::OnOpenDlg(void)
V+x)h,Qf(ZN7n0{
t\2NvQ3V0/*假设IDD_TEST_DLG为已经定义的对话框资源的ID号*/
tWq;_N?:}M3C!F0CTestDlg *dlg=new CTestDlg;
5{:W+gMSF6]0@u0dlg->Create(IDD_TEST_DLG,NULL);
mwg _#wNu0dlg->ShowWindows(SW_SHOW);51Testing软件测试网Yh6_5UO2w"rv3R
/*不要调用delete dlg;*/51Testing软件测试网N9~4t(`5Xa@!B5V$h7\
}
8Y|x*lS z0在上面的代码中我们新生成了一个对话框对象,而且在退出函数时并没有销毁该对象。因为如果此时销毁该对象(对象被销毁时窗口同时被销毁),而此时对话框还在显示就会出现错误。那么这就提出了一个问题:什么时候销毁该对象。我时常使用的方法有两个:51Testing软件测试网't{&z?C
一、在对话框退出时销毁自己:在对话框中重载OnOK与OnCancel在函数中调用父类的同名函数,然后调用DestroyWindow()强制销毁窗口,在对话框中映射WM_DESTROY消息,在消息处理函数中调用delete this;强行删除自身对象。相关代码如下:51Testing软件测试网|$Xt%Mc p6wj6K7SG9y
void CTestDlg1::OnOK()51Testing软件测试网+L3y'VO'?
{51Testing软件测试网q ~WP'I)b
CDialog::OnOK();
(K g;JXl;j%@0DestroyWindow();
B5~T-c)A7~G3j ~0}51Testing软件测试网 m4M0d#N LSX
void CTestDlg1::OnCancel()
?6}"M ^j[8F]1ic0{
M\ V"OZ L0CDialog::OnCancel();51Testing软件测试网 C%b~5dkkA N
DestroyWindow();51Testing软件测试网/W#IBgy6o9Z?v
}
;?-LA9@6y3Kp3x1\k0void CTestDlg1::OnDestroy()51Testing软件测试网-e#j%YCj0F V7P
{51Testing软件测试网VK5F3f1I+Tbs
CDialog::OnDestroy();
c#U[#o \ AX"}0AfxMessageBox("call delete this");51Testing软件测试网t$I^eNm&S)Q3q
delete this;51Testing软件测试网$YWZ,^s)Uqa
}51Testing软件测试网"V)y{!p4C k#s1qJiQ
这种方法的要点是在窗口被销毁的时候,删除自身对象。所以你可以在任何时候调用DestroyWindow()以达到彻底销毁自身对象的作用。(DestroyWindow()的调用会引起OnDestroy()的调用)
2Z P)B+e'hU/uJ0b4pJ R,kq0
二、通过向父亲窗口发送消息,要求其他窗口对其进行销毁:首先需要定义一个消息用于进行通知,然后在对话框中映射WM_DESTROY消息,在消息处理函数中调用消息发送函数通知其他窗口。在接收消息的窗口中利用ON_MESSAGE映射处理消息的函数,并在消息处理函数中删除对话框对象。相关代码如下:51Testing软件测试网 t*k I b3|5W"p mH$x'}:\
/*更改对话框的有关文件*/
!h4\zU)q)z*s0CTestDlg2::CTestDlg2(CWnd* pParent /*=NULL*/)51Testing软件测试网`;opn*ID$CNq
: CDialog(CTestDlg2::IDD, pParent)
;lVDJg,Au0{/*m_pParent为一成员变量,用于保存通知窗口的指针,所以该指针不能是一个临时指针*/
3F2~P){\9d0ASSERT(pParent);51Testing软件测试网4|.Yq"e\
m_pParent=pParent;51Testing软件测试网Gcj0mxA e
//{{AFX_DATA_INIT(CTestDlg2)51Testing软件测试网 V]d*H~$ckB
// NOTE: the ClassWizard will add member initialization here
3JeGR8T0//}}AFX_DATA_INIT
,sFa])[p0}
t@A-tn6p$X0void CTestDlg2::OnOK()51Testing软件测试网Q:~4l?.H ]/\+w
{51Testing软件测试网W._?C6a1@0@'`
CDialog::OnOK();51Testing软件测试网{j$n}0D8u
DestroyWindow();
|p1Hn)E H|6Y c0}51Testing软件测试网HAH8o,w+[n
void CTestDlg2::OnCancel()51Testing软件测试网O}s:{A)FW f
{51Testing软件测试网dy)Boyluqe
CDialog::OnCancel();
S}n!X-lIBUA0DestroyWindow();51Testing软件测试网n8\'Y'vP+Jy
}
0x c0Bq.ef0void CTestDlg2::OnDestroy()51Testing软件测试网 nv#d|1B0u
{51Testing软件测试网C4C#? A!{L2S@u
CDialog::OnDestroy();
L$]4d8qK3B3mg:e0/*向其他窗口发送消息,将自身指针作为一个参数发送*/51Testing软件测试网(v9q&[/n5bAj?
m_pParent->PostMessage(WM_DELETE_DLG,(WPARAM)this);
k%[vO7dH3eF0}51Testing软件测试网#u`_4we@!|
/*在消息接收窗口中添加消息映射*/
K,W1E,IZPj C0/*在头文件中添加函数定义*/51Testing软件测试网2v+E'J J'E*D0loy j
afx_msg LONG OnDelDlgMsg(WPARAM wP,LPARAM lP);
g,M0NjI@2S0/*添加消息映射代码*/
(oy K)v8F(VIg;e6E0ON_MESSAGE(WM_DELETE_DLG,OnDelDlgMsg)
'Xc"x#W4S2u!I:K0END_MESSAGE_MAP()