如何创建无模式对话框

上传人:wm****3 文档编号:43438021 上传时间:2018-06-06 格式:DOC 页数:4 大小:30.50KB
返回 下载 相关 举报
如何创建无模式对话框_第1页
第1页 / 共4页
如何创建无模式对话框_第2页
第2页 / 共4页
如何创建无模式对话框_第3页
第3页 / 共4页
如何创建无模式对话框_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《如何创建无模式对话框》由会员分享,可在线阅读,更多相关《如何创建无模式对话框(4页珍藏版)》请在金锄头文库上搜索。

1、如何创建无模式对话框如何创建无模式对话框在编程过程中,对话框经常用到,但对无模式和模式对话框的创建和销毁过程,经常有误解,下面提高一个无模式对话框的例子来剖析无模式对话框的形成:无模式对话框与有模式对话框不同的是在创建后其他窗口都可以继续接收用户输入,因此无模式对话框有些类似一个弹出窗口。创建无模式对话框需要调用 BOOL CDialog:Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );之后还需要调用 BOOL CDialog:ShowWindow( SW_SHOW);进行显示,否则无模式对话框将是不可见的。相关代码如下: void CY

2、ourView:OnOpenDlg(void) /*假设 IDD_TEST_DLG 为已经定义的对话框资源的 ID 号*/ CTestDlg *dlg=new CTestDlg; dlg-Create(IDD_TEST_DLG,NULL); dlg-ShowWindows(SW_SHOW); /*不要调用 delete dlg;*/ 在上面的代码中我们新生成了一个对话框对象,而且在退出函数时并没有销毁该对象。因为如果此时销毁该对象(对象被销毁时窗口同时被销毁) ,而此时对话框还在显示就会出现错误。那么这就提出了一个问题:什么时候销毁该对象。我时常使用的方法有两个: 在对话框退出时销毁自己:在对

3、话框中重载 OnOK 与 OnCancel 在函数中调用父类的同名函数,然后调用DestroyWindow()强制销毁窗口,在对话框中映射 WM_DESTROY 消息,在消息处理函数中调用 delete this;强行删除自身对象。相关代码如下: void CTestDlg1:OnOK() CDialog:OnOK(); DestroyWindow(); void CTestDlg1:OnCancel() CDialog:OnCancel(); DestroyWindow(); void CTestDlg1:OnDestroy() CDialog:OnDestroy(); AfxMessage

4、Box(“call delete this“); delete this; 这种方法的要点是在窗口被销毁的时候,删除自身对象。所以你可以在任何时候调用 DestroyWindow()以达到彻底销毁自身对象的作用。 (DestroyWindow()的调用会引起 OnDestroy()的调用) 通过向父亲窗口发送消息,要求其他窗口对其进行销毁:首先需要定义一个消息用于进行通知,然后在对话框中映射 WM_DESTROY 消息,在消息处理函数中调用消息发送函数通知其他窗口。在接收消息的窗口中利用 ON_MESSAGE 映射处理消息的函数,并在消息处理函数中删除对话框对象。相关代码如下: /*更改对话框

5、的有关文件*/ 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() CDial

6、og:OnOK(); DestroyWindow(); void CTestDlg2:OnCancel() CDialog:OnCancel(); DestroyWindow(); void CTestDlg2:OnDestroy() CDialog:OnDestroy(); /*向其他窗口发送消息,将自身指针作为一个参数发送*/ m_pParent-PostMessage(WM_DELETE_DLG,(WPARAM)this); /*在消息接收窗口中添加消息映射*/ /*在头文件中添加函数定义*/ afx_msg LONG OnDelDlgMsg(WPARAM wP,LPARAM lP);

7、/*添加消息映射代码*/ ON_MESSAGE(WM_DELETE_DLG,OnDelDlgMsg) END_MESSAGE_MAP() /*实现消息处理函数*/ LONG CMy53_s1View:OnDelDlgMsg(WPARAM wP,LPARAM lP) delete (CTestDlg2*)wP; return 0; /*创建对话框*/ void CMy53_s1View:OnTest2() CTestDlg2 *dlg=new CTestDlg2(this); dlg-Create(IDD_TEST_DLG_2); dlg-ShowWindow(SW_SHOW); 在这种方法中我

8、们利用消息来进行通知,在 Window 系统中利用消息进行通知和传递数据的用法是很多的。同样无模式对话框的另一个作用还可以用来在用户在对话框中的输入改变时可以及时的反映到其他窗口。下面的代码演示了在对话框中输入一段文字,然后将其更新到视图的显示区域中,这同样也是利用了消息进行通知和数据传递。 /*在对话框中取出数据,并向其他窗口发送消息和数据,将数据指针作为一个参数发送*/ void CTestDlg2:OnCommBtn() char szOut30; GetDlgItemText(IDC_OUT,szOut,30); m_pParent-SendMessage(WM_DLG_NOTIFY,

9、(WPARAM)szOut); /*在消息接收窗口中*/ /*映射消息处理函数*/ ON_MESSAGE(WM_DLG_NOTIFY,OnDlgNotifyMsg) /*在视图中绘制出字符串 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) m_szOut=(char*)wP; Invalidate(); return 0; 此外这种用法利用消息传递数据的方法对有模式对话框和其他的窗口间通信也一样有效。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号