建立无模式对话框

原创 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;
}


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

相关文章推荐

非模式对话框.rar

  • 2007年06月11日 19:48
  • 34KB
  • 下载

模式对话框和js操作gridview (Datagrid)

设计网站交互时,尽量不要有太多的弹出框,这样对用户来说很突兀,打开多个弹出窗口后,都不知道哪一个是哪一个,有的是模式对话框,弹出一个后,主窗口不能正常操作,浏览器也不能关闭,必须关掉该对话框;技术上要...

线程+无模式对话框进度条

  • 2009年06月06日 18:29
  • 47KB
  • 下载

模式对话框传值实例

  • 2008年07月28日 11:49
  • 793B
  • 下载

将模式对话框的返回值回送(PostBack)到服务端

在一些应用中,希望将模式对话框的值回送(PostBack)到服务端,也就是执行一个服务端操作,从而刷新页面。 举个例子:比方说新建一个订单,此时希望能在模式对话框中选择产品,并将产品的ID返回,...

JS打开模式对话框

  • 2012年05月14日 17:34
  • 14KB
  • 下载

模式对话框和通用控件示例程序

  • 2011年10月17日 15:45
  • 1.85MB
  • 下载

详解用CSS来实现网页"模式对话框"效果

用CSS来控制DIV的属性,辅以JavaScript响应事件,就可以实现类似于桌面UI的对话框效果。 1. 基本原理 基本原理就是在网页里添加2个浮动的层,一个叫dialog,用于包含对话框的内容...

模式对话框

  • 2007年09月09日 00:26
  • 998B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:建立无模式对话框
举报原因:
原因补充:

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