建立无模式对话框

原创 2011年01月14日 17:58:00

 

  无模式对话框与有模式对话框不同的是在创建后其他窗口都可以继续接收用户输入,因此无模式对话框有些类似一个弹出窗口。创建无模式对话框需要调用

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_ T(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)
    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);
    }

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


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

/*在对话框中取出数据,并向其他窗口发送消息和数据,将数据指针作为一个参数发送*/
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;
}


此外这种用法利用消息传递数据的方法对有模式对话框和其他的窗口间通信也一样有效。

模式对话框和无模式对话框 区别

按工作方式不同,可将对话框分成两类:  ??模式对话框(modal dialog box模态对话框):在关闭模式对话框之前,程序不能进行其他工作(如一般的“打开文件”对话框)  ??无模式对话框(...
  • wangzhen0331
  • wangzhen0331
  • 2014年04月21日 15:33
  • 652

创建无模式对话框

在MFC的对话框程序中,对于初学者来说我们经常调用的是无模式对话框,因为它比较常见,而且简单,那么如何创建无模式对话框呢?首先我们通过资源编辑器生成对话框资源,具体过程为:menu->insert->...
  • jia_xiaoxin
  • jia_xiaoxin
  • 2008年09月04日 10:19
  • 3550

在ATL中实现窗口(精)

                                在ATL中实现窗口     ATL提供了一些工具类以实现窗口,这样在ATL组件里就可以不依赖MFC而很方便的创建窗口。     一、实现...
  • wangweixing2000
  • wangweixing2000
  • 2006年06月26日 12:30
  • 1849

模式对话框与无模式对话框

//显示子窗体 1、ShowDialog()无模式对话框 BabyWindow.ShowDialog();  //  //显示子窗体 ;,.ShowDialog()无模式对话框 “无模式...
  • alisa525
  • alisa525
  • 2012年03月22日 12:43
  • 1151

MFC程序员的WTL指南: Part IV - 对话框与控件

MFC程序员的WTL指南: Part IV - 对话框与控件原作 :Michael Dunn [英文原文]翻译 :Orbit(桔皮干了) [www.winmsg.com]下载演示程序代码本章内容 介绍...
  • lithe
  • lithe
  • 2005年01月16日 13:12
  • 1316

VC++模式对话框和非模式对话框的步骤

VC3 1.面向对象:封装、继承、多态2.类与对象3.strcpy("a","b");4.析构函数5.抛出异常:throws6.文本控件---只支持应用的输出,不接受用户的输入Static Text ...
  • loveheronly
  • loveheronly
  • 2010年10月14日 00:41
  • 2204

无模式对话框

无模式对话框的创建:1. 添加对话框资源,假设其资源名为IDD_DIALOG12. 为对话框创建类,假设其类名为CTestDlg3. 在stdafx.h文件中加入对CTestDlg类的头文件引用, #...
  • sandlu
  • sandlu
  • 2007年04月24日 11:43
  • 1264

有模式对话框和无模式对话框

原 作者:loose_went 原 出 处:VC在线 有模式对话框   使用有模式对话框时在对话框弹出后调用函数不会立即返回,而是等到对话框销毁后才会返回(请注意在对话框弹出后其他窗口的消息...
  • m372897500
  • m372897500
  • 2011年07月29日 17:35
  • 246

模式对话框与非模式对话框 消息处理顺序

对话框有两种创建方式:DoModal和Creat。 其中DoModal创建的是模态的对话框,而Creat创建的是非模态的对话框下面总结下他们的不同。对于模态的对话框,在该对话框被关闭前,用户将不能在同...
  • kl222
  • kl222
  • 2006年12月18日 17:11
  • 2437

设置对话框光标

新建对话框应用程序
  • bingdianlanxin
  • bingdianlanxin
  • 2015年12月24日 09:24
  • 630
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:建立无模式对话框
举报原因:
原因补充:

(最多只允许输入30个字)