无模式对话框

上一篇 / 下一篇  2007-04-27 18:10:15 / 个人分类:编程与其它

    今天学了一个新概念,无模式对话框:例如,单击窗口中某链接弹出一个小的对话框,然后可以在父窗口继续对地图进行操作,而上面的子窗口不会消失.51Testing软件测试网?2cH]%bNY

一般在网页中实现是采用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);进行显示,否则无模式对话框将是不可见的。相关代码如下:  51Testing软件测试网c8H L'L(vp?(U ?

void CYourView::OnOpenDlg(void)

V+x)h,Qf(ZN7n0

{

t\2NvQ3V0

      /*假设IDD_TEST_DLG为已经定义的对话框资源的ID*/

tWq;_N?:}M3C!F0

      CTestDlg *dlg=new CTestDlg;

5{:W+gMSF6]0@u0

      dlg->Create(IDD_TEST_DLG,NULL);

mwg _#wNu0

      dlg->ShowWindows(SW_SHOW);51Testing软件测试网Y h6_5UO2w"rv3R

      /*不要调用delete dlg;*/51Testing软件测试网N9~4t(`5Xa@!B5V$h7\

}

8Y|x*lS z0

!IqK_4[0

    在上面的代码中我们新生成了一个对话框对象,而且在退出函数时并没有销毁该对象。因为如果此时销毁该对象(对象被销毁时窗口同时被销毁),而此时对话框还在显示就会出现错误。那么这就提出了一个问题:什么时候销毁该对象。我时常使用的方法有两个:51Testing软件测试网't{&z?C

一、在对话框退出时销毁自己:在对话框中重载OnOKOnCancel在函数中调用父类的同名函数,然后调用DestroyWindow()强制销毁窗口,在对话框中映射WM_DESTROY消息,在消息处理函数中调用delete this;强行删除自身对象。相关代码如下:51Testing软件测试网|$Xt%Mc p6wj6K7SG9y

void CTestDlg1::OnOK()51Testing软件测试网+L3y'VO'?

{51Testing软件测试网 q ~ W P'I)b

      CDialog::OnOK();

(K g;JXl;j%@0

      DestroyWindow();

B5~T-c)A7~G3j ~0

}51Testing软件测试网 m4M0d#N LSX

 51Testing软件测试网\g)x9z)r8]V

void CTestDlg1::OnCancel()

?6}"M ^j[8F ]1ic0

{

M\ V"OZ L0

      CDialog::OnCancel();51Testing软件测试网 C%b~5dkkAN

      DestroyWindow();51Testing软件测试网/W#IBgy6o9Z?v

}

;?-LA9@6y3Kp3x1\k0

 51Testing软件测试网z.M3a g]#o)xB4M

void CTestDlg1::OnDestroy()51Testing软件测试网-e#j%YCj0FV7P

{51Testing软件测试网VK5F3f1I+Tbs

      CDialog::OnDestroy();

c#U[#o \ AX"}0

      AfxMessageBox("call delete this");51Testing软件测试网t$I^eNm&S)Q3q

      delete this;51Testing软件测试网$YWZ,^s)Uqa

}51Testing软件测试网"V)y{!p4C k#s1qJiQ

 51Testing软件测试网"S-DY*EaxZ w

这种方法的要点是在窗口被销毁的时候,删除自身对象。所以你可以在任何时候调用DestroyWindow()以达到彻底销毁自身对象的作用。(DestroyWindow()的调用会引起OnDestroy()的调用)

2ZP)B+e'hU/uJ0

 

b4pJ R,kq0

二、通过向父亲窗口发送消息,要求其他窗口对其进行销毁:首先需要定义一个消息用于进行通知,然后在对话框中映射WM_DESTROY消息,在消息处理函数中调用消息发送函数通知其他窗口。在接收消息的窗口中利用ON_MESSAGE映射处理消息的函数,并在消息处理函数中删除对话框对象。相关代码如下:51Testing软件测试网 t*k I b3|5W"p mH$x'}:\

/*更改对话框的有关文件*/

!h4\zU)q)z*s0

CTestDlg2::CTestDlg2(CWnd* pParent /*=NULL*/)51Testing软件测试网`;opn*ID$C Nq

      : CDialog(CTestDlg2::IDD, pParent)

;lVDJg,Au0

{/*m_pParent为一成员变量,用于保存通知窗口的指针,所以该指针不能是一个临时指针*/

3F2~P){\9d0

      ASSERT(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$X0

void CTestDlg2::OnOK()51Testing软件测试网Q:~4l?.H ]/\+w

{51Testing软件测试网W._?C6a1@0@'`

      CDialog::OnOK();51Testing软件测试网{j$n}0D8u

      DestroyWindow();

|p1H n)E H|6Yc0

}51Testing软件测试网HAH8o,w+[n

 51Testing软件测试网6~:{ v'lS-CP h

void CTestDlg2::OnCancel()51Testing软件测试网O}s:{A)FW f

{51Testing软件测试网dy)Boyluqe

      CDialog::OnCancel();

S}n!X-lIBUA0

      DestroyWindow();51Testing软件测试网n8\'Y'vP+J y

}

0x c0Bq.ef0

 51Testing软件测试网K#AW"R9P4I3J

void 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%[vO7d H3eF0

}51Testing软件测试网#u`_4we@!|

 

K'L/?!]/|t&}&Kk0

/*在消息接收窗口中添加消息映射*/

K,W1E,IZPj C0

/*在头文件中添加函数定义*/51Testing软件测试网2v+E'J J'E*D0loyj

      afx_msg LONG OnDelDlgMsg(WPARAM wP,LPARAM lP);

g,M0NjI@2S0

/*添加消息映射代码*/

(oy K)v8F(VIg;e6E0

      ON_MESSAGE(WM_DELETE_DLG,OnDelDlgMsg)

'Xc"x#W4S2u!I:K0

END_MESSAGE_MAP()

RJg)Cbx0

/*实现消息处理函数*/

gIYu5Xi4q:kQL5E0

LONG CMy53_s1View::OnDelDlgMsg(WPARAM wP,LPARAM lP)51Testing软件测试网g&{&A2\ \J

{51Testing软件测试网-rZy?@"c+x,^

      delete (CTestDlg2*)wP;51Testing软件测试网;zQ$Y'E'X[!@U8@

      return 0;51Testing软件测试网!I1^zr}8R

}

]])i `xK6K;a*oAP5q.g0

/*创建对话框*/

o-gcX{t7f9z!jM0

void CMy53_s1View::OnTest2()

5R#K8S9T@EIzFP~Z0

{

8zK:x'r#_ f jbd.~"E0

      CTestDlg2 *dlg=new CTestDlg2(this);

-c ?R:I@0

      dlg->Create(IDD_TEST_DLG_2);

xG.h_ c0

      dlg->ShowWindow(SW_SHOW);51Testing软件测试网Om,l jWA+A

}

o;|Q(Gn f0

 

2v P wHxIs!F0

在这种方法中我们利用消息来进行通知,在Window系统中利用消息进行通知和传递数据的用法是很多的。

1W#L4ubic"L0

同样无模式对话框的另一个作用还可以用来在用户在对话框中的输入改变时可以及时的反映到其他窗口。下面的代码演示了在对话框中输入一段文字,然后将其更新到视图的显示区域中,这同样也是利用了消息进行通知和数据传递。51Testing软件测试网o2?I7HI GC S K;W

 51Testing软件测试网 ~8ffs#t$cZ+D

/*在对话框中取出数据,并向其他窗口发送消息和数据,将数据指针作为一个参数发送*/

t%U.dJ2f3[0

void CTestDlg2::OnCommBtn()

d i s_n}0`h0

{51Testing软件测试网@@J[&RL$Z

      char szOut[30];51Testing软件测试网A.E'fQS:V[

      GetDlgItemText(IDC_OUT,szOut,30);

f'\P A7acgG0

      m_pParent->SendMessage(WM_DLG_NOTIFY,(WPARAM)szOut);51Testing软件测试网Kw&TG!ik0s"kkqO

}51Testing软件测试网9P}Su8FHp!wq:P

 51Testing软件测试网$E]$H%G0k6q&^

/*在消息接收窗口中*/

3X,\AcX0

/*映射消息处理函数*/

1ur;g&m,m/R0

      ON_MESSAGE(WM_DLG_NOTIFY,OnDlgNotifyMsg)51Testing软件测试网 B@ hD?7^q

 

g4?-igb4i-R1lhB0

/*在视图中绘制出字符串m_szOut*/

5H&uK"K oE#y0y0

void CMy53_s1View::OnDraw(CDC* pDC)

3E;zF Ed0y9{o0

{

h'd/f9e2^Y9~.c5P I0

      CMy53_s1Doc* pDoc = GetDocument();51Testing软件测试网+PRB9EpYj)T

      ASSERT_VALID(pDoc);

7@f/|#|ls&hW0

      // TODO: add draw code for native data here51Testing软件测试网/n0\T0U&P8y8PFE/b0B

      pDC->TextOut(0,0,"Display String");51Testing软件测试网%ty4S.f#e v F4_

      pDC->TextOut(0,20,m_szOut);

"z!MF&\;O;?0

}

S$\}Fr/Y7~0

/*处理通知消息,保存信息并更新显示*/

)P1p Jm)l[?0

LONG CMy53_s1View::OnDlgNotifyMsg(WPARAM wP,LPARAM lP)

\LT7|0h/}s0

{

m*z^h$t I \%^ZD0

      m_szOut=(char*)wP;51Testing软件测试网:W8[E3s:TR

      Invalidate();51Testing软件测试网$PU(kww9E*M!l[-A o

      return 0;51Testing软件测试网F4~q`"XK&ko

}51Testing软件测试网*V]DV\

 51Testing软件测试网a~0i\ rqH(SY


TAG: 编程知识 编码知识

 

评分:0

我来说两句

Open Toolbar