非模态窗口的创建方法

粘贴一些关键代码(IN  FILE_MYBOLE):

CMyboleView窗口类中

void CMyboleView::OnMenuDialog()
{
    // TODO: 在此添加命令处理程序代码
    //非模态对话框的使用,要更改 OnOK 这个虚函数
    if(m_pDlg)
    {
        m_pDlg->SetActiveWindow();
    }
    else
    {
        m_pDlg = new CTestDlg(this);
        m_pDlg->Create(IDD_ONE_DLG, this);
        m_pDlg->ShowWindow(SW_SHOW);
    }
}

初始化指针CTestDlg类的对象指针为NULL

CMyboleView::CMyboleView()
{
    // TODO: 在此处添加构造代码
    m_pDlg = NULL;
}

然后处理OK或者Cancel按钮

Cancel

void CTestDlg::OnCancel()
{
    // TODO: 在此添加专用代码和/或调用基类
    //CWnd *p1 = GetParent();
    //CWnd *p2 = m_pParentWnd;
    //CWnd *p3 = GetParentFrame();
    //CWnd *p4 = GetParentOwner();
    //CWnd *p5 = GetOwner();

    //获取CTestDlg的指针有两种方法,都可以用,但是必须用m_pParentWnd,不能用GetParent
    //方法一:
    /*CMyboleView *pFather = (CMyboleView *)m_pParentWnd;
    pFather->m_pDlg = NULL;*/

    //方法二:
    ((CMyboleView *)m_pParentWnd)->m_pDlg = NULL;

    DestroyWindow(); //删除对话框,但没有删除对话框对象
}

OK

void CTestDlg::OnOK()
{
    // TODO: 在此添加专用代码和/或调用基类

    ((CMyboleView *)m_pParentWnd)->m_pDlg = NULL;
    DestroyWindow(); //删除对话框,但没有删除对话框对象
}

最后重写PostNcDestroy用来真正的销毁CTestDialog对象

void CTestDlg::PostNcDestroy()
{
    // TODO: 在此添加专用代码和/或调用基类
    delete this;
    CDialogEx::PostNcDestroy();
}
时间: 2024-11-03 13:23:05

非模态窗口的创建方法的相关文章

统计图钻取的明细报表在非模态窗口中显示

润乾报表的统计图可以在图例 / 图形上设置超链接,从而实现钻取到明细报表的操作,钻取得到的报表可以在新窗口或者当前窗口中打开.关于如何在统计图的图形 / 图例上设置超链接,在用户手册中有常用示例的介绍.今天小编要给大家介绍的是如何在非模态窗口中打开图形超链接钻取得到的报表.首先创建一张带有统计图的报表,报表文件名为 planWorkView2.rpx.增加数据集 ds1, 下面是 ds1 的数据: 在 A2 单元格中增加一个柱形图,统计图的分类和系列值数据分别来源于数据集 ds1 的 ORG_N

模态窗口和非模态窗口

对话框一般分为两种类型:模态类型(modal)与非模态类型(modeless).所谓模态对话框,就是指除非采取有效的关闭手段,用户的鼠标焦点或者输入光标将一直停留在其上的对话框.非模态对话框则不会强制此种特性,用户可以在当前对话框以及其他窗口间进行切换.本文介绍如何使用JavaScript语言来创建这两种类型的对话框.控制其大小和位置.改变其外观以及在对话框间的数据传递.(引用) 一.创建模态和非模态对话框 创建模态对话框:(会缓存最近一次页面的值,通过一些设置可绕过系统的判断) vReturn

MFC 模态、非模态窗口引发的系列事件及函数

标题一:创建模态窗口 CAdditionDlg dlg; // 定义对话框类CAdditionDlg的对象dlg INT_PTR nResponse = dlg.DoModal();//获取子窗口的结束方式 switch(nResponse) { case IDOK: case IDCANCEL: case IDDESTROY: } 标题二:创建非模态子窗口(完美解决非模态窗口单例问题) 步骤一:创建子窗口指针类型的公有成员 public: CMyTip* m_mytip; 步骤二:父类通过按钮

VS2010/MFC对话框:非模态对话框的创建及显示

非模态对话框的创建及显示 上一节讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示. 已经说过,非模态对话框显示后,程序其他窗口仍能正常运行,可以响应用户输入,还可以相互切换.鸡啄米会将上一讲中创建的Tip模态对话框改为非模态对话框,让大家看下效果. 非模态对话框的对话框资源和对话框类 实际上,模态对话框和非模态对话框在创建对话框资源和生成对话框类上是没有区别的,所以上一讲中创建的IDD_TIP_DIALOG对话框资源和CTipDlg类都不需要修改. 创建及显示非模态

模态对话框与非模态窗口

模态对话框就是在没有关闭它之前,不能再与同一个应用程序的其他窗口进行交互,比如新建项目时弹出的对话框. #include "dialog.h" #include "ui_dialog.h" Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(this); QDialog dialog; dialog.setWindowTitle("模态

非模态对话框的创建及使用

在开始本文之前,假设我已经派生了一个对话框类CMyDlg. 对于模态对话框,使用非常简单,通常会像以下这样使用: void Fun() { ............... CMyDlg mydlg; mydlg.DoModal(); ................ } 而对于非模态对话框,通常会像以下这样使用 void Fun() { ............... CMyDlg*  pMydlg = new CMyDlg; pMydlg->Create( IDC_MY_DLG ); pMyd

MFC非模态窗口gdi+自绘图片

新建 Dialog based MFC项目DrawImage 在资源中新添加一个Dialog,IDD_PICBOXDLG 在此dialog上添加Pictre Contrl shift+ctrl+x 添加对应的类:CPicBoxDlg DrawImage.cpp中加入: CPicBoxDlg* g_Dlg=NULL; DrawImageDlg.cpp中: extern CPicBoxDlg* g_Dlg; 在资源面板找到DrawImage窗口添加按钮,双击添加事件 void CDrawImgDlg

MFC非模态添加进程控件方法一(线程方法)

由于非模态对话框的自己没有消息循环,创建后无法进行消息处理.需要和父窗口共用消息循环.如果单独在子窗口进行控件由于自己没有单独的消息循环,更新是无法进行的. 如果在父窗口更新控件会造成程序假死.如以下代码在主窗口更新子窗口消息,界面进入假死状态.因为主界面对主进程进行了sleep(100),如下代码所示 void CModelessDlg::OnBnClickedOk() { DLGModeLess *pDlg = new DLGModeLess(); pDlg->Create(IDD_DG_M

显示模态模态对话框和非模态对话框

模态对话框类和非模态对话框类的创建是一样的,也就是说当有一个对话框类(假设名称为CMyDialog),既可以用它来创建模态对话框实例并显示, 也可以用它来创建非模态对话框实例显示. 1.创建模态对话框实例并显示 CMyDialog   Dlg : Dlg.DoModal(): 也就是说只需要调用对话框类的DoModal()即可实现创建并显示模态对话框. 2.创建非模态对话框实例并显示 方法一:设使用CMyDialog类的CUser,定义和实现CUser的文件分别是 User.h和User.cpp