无模式对话框的创建与使用

2016-01-29 11:53 8 1 收藏

无模式对话框的创建与使用,无模式对话框的创建与使用

【 tulaoshi.com - C语言心得技巧 】

无模式对话框的创建与使用
作者:张连成

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)

在编程过程中,对话框经常用到,但对无模式和模式对话框的创建和销毁过程,经常有误解,下面提供一个无模式对话框的例子来剖析无模式对话框的形成:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)

无模式对话框与有模式对话框不同的是在创建后其他窗口都可以继续接收用户输入,因此无模式对话框有些类似一个弹出窗口。创建无模式对话框需要调用BOOL CDialog::Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );之后还需要调用BOOL CDialog::ShowWindow( SW_SHOW);进行显示,否则无模式对话框将是不可见的。相关代码如下:

void CYourView::OnOpenDlg(void){ /*假设IDD_TEST_DLG为已经定义的对话框资源的ID号*/  CTestDlg *dlg=new CTestDlg; dlg->Create(IDD_TEST_DLG,NULL); dlg->ShowWindows(SW_SHOW);  /*不要调用 delete dlg;*/}
在上面的代码中我们新生成了一个对话框对象,而且在退出函数时并没有销毁该对象。因为如果此时销毁该对象(对象被销毁时窗口同时被销毁),而此时对话框还在显示就会出现错误。那么这就提出了一个问题:什么时候销毁该对象。我时常使用的方法有两个:
在对话框退出时销毁自己:在对话框中重载OnOK与OnCancel在函数中调用父类的同名函数,然后调用DestroyWindow()强制销毁窗口,在对话框中映射WM_DESTROY消息,在消息处理函数中调用delete this;强行删除自身对象。相关代码如下:
void CTestDlg1::OnOK(){ CDialog::OnOK(); DestroyWindow();}void CTestDlg1::OnCancel(){ CDialog::OnCancel(); DestroyWindow();}void CTestDlg1::OnDestroy() { CDialog::OnDestroy(); AfxMessageBox("call delete this"); delete this;}
这种方法的要点是在窗口被销毁的时候,删除自身对象。所以你可以在任何时候调用DestroyWindow()以达到彻底销毁自身对象的作用。(DestroyWindow()的调用会引起OnDestroy()的调用) 通过向父亲窗口发送消息,要求其他窗口对其进行销毁:首先需要定义一个消息用于进行通知,然后在对话框中映射WM_DESTROY消息,在消息处理函数中调用消息发送函数通知其他窗口。在接收消息的窗口中利用ON_MESSAGE映射处理消息的函数,并在消息处理函数中删除对话框对象。相关代码如下:
/*更改对话框的有关文件*/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,(WPARAM)this);}
在头文件中添加函数定义
afx_msg LONG OnDelDlgMsg(WPARAM wP,LPARAM lP);
添加消息映射代码
ON_MESSAGE(WM_DELETE_DLG,OnDelDlgMsg)
/*实现消息处理函数*/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);}
在这种方法中我们利用消息来进行通知,在Windows系统中利用消息进行通知和传递数据的用法是很多的。 同样无模式对话框的另一个作用还可以用来在用户在对话框中的输入改变时可以及时的反映到其他窗口。下面的代码演示了在对话框中输入一段文字,然后将其更新到视图的显示区域中,这同样也是利用了消息进行通知和数据传递。
/*在对话框中取出数据,并向其他窗口发送消息和数据,将数据指针作为一个参数发送*/void CTestDlg2::OnCommBtn() { char szOut[30]; GetDlgItemText(IDC_OUT,szOut,30); m_pParent->SendMessage(WM_DLG_NOTIFY,(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;}
希望通过以上的讲解,理解无模式对话框的创建和使用过程.

来源:http://www.tulaoshi.com/n/20160129/1483767.html

延伸阅读
Windows SDK笔记(四):模式对话框 作者:冯明德 一、概述 对话框是一种特殊的窗口,它依据对话框模板资源而建立。 它与一般的窗口有些不同,很多过程由系统完成了,虽然用户还是要提供一个消息处理函数,但在此消息处理函数中,不需要将不关心的消息交由缺省消息处理函数。 实际...
标签: Web开发
对话框可以分为模式对话框和无模式对话框两种,两者区别是在对话框被关闭之前用户能否在同一应用程序的其他地方进行工作。举例说明:打开文件对话框便是典型的模式对话框,在你选择好要打开的文件按下确定后,或者取消打开文件操作后,才可以在同一应用程序进行其他操作。而常见的查找和替换对话框便是无模式对话框的典型,在该对话框打开的同时...
获取静态控件文本的方法:GetDlgItem函数获得对话框中控件的指针,然后调用GetWindowText获得文本。注意:静态控件的属性必须将Notify选为可能。同理:SetWindowText可以指定文本。 获取编辑框内容:GetDlgItem(ID)-GetWindowText(); 字符内容转换为数值:atoi()把字符串转换为数值;同理:数字到字符串itoa(); GetDlgItemText(ID)可以完成...
1、意图 有时候我们希望将非模态窗口显示为模态窗口。比如在IE的“文件”菜单下选择“打印”,弹出的“打印”对话框就是非模态的(也许我们不太清楚Microsoft的设计意图,一般来说这里的“打印”对话框应该是模态的)。这种情况下如何将“打印”对话框显示为模态的呢(这个对话框对我们来说是Black Box)? 2、简单实现 简单...
标签: autocad教程
在执行AutoCAD命令的过程中,用户与AutoCAD之间主要是通过文本窗口和对话框来进行人机交互。 2.3.1使用文本窗口 AutoCAD的文本窗口与AutoCAD窗口相对独立,用户可通过如下方式来显示该窗口: (1)在AutoCAD中按F2键 (2)选择菜单【View(视图)】→【Display(显示)】→【TextWindow(文本窗口)】 (3)在命令行调用“textscr”命令 该窗口...

经验教程

132

收藏

84
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部