精华内容
下载资源
问答
  • 弹出子对话框,在子对话框特定位置,显示非模态对话框,对话框之间的数据传递
  • 模态窗口 javascript 技巧汇总(传值、打开、刷新) 1、要弹出的页面中,一定要保证<head></head>标签间有<base target=“_self”>,否则会弹出的模态窗口上,点击按钮时,会再次弹出一个新页面。...
  • 在MFC中对话框有两种形式,一个是模态对话框(model dialog box),一个是非模态对话框(modeless dialog box)。本文对此分别简述其创建方法。 一、模态对话框(model dialog box) 在程序运行的过程中,若出现了...
  • NULL 博文链接:https://eagle0824.iteye.com/blog/1432968
  • Qt主界面获取非模态对话框数据的方法。
  • VC 创建一个非模态对话框,比较一下模态对话框,与其有何异同。以下是创建对话框的代码:  void CNonModeDlgDlg::Finish()  {   m_pChoice = NULL;   GetDlgItem(IDOK)->EnableWindow();  }  void ...
  • 基于MFC向导实现的模态对话框非模态对话框的代码,程序是基于vs2013写的,可以完美运行,适合新手学习,大佬请忽略!
  • 模态对话框非模态对话框的区别 记录博文 一、模态对话框 应用程序模态对话框:一旦调用该对话框,它就会成为应用程序唯一能够与用户进行交互的部件。在关闭该对话框之前,用户都不能使用应用程序的其他部件。当然...

    模态对话框与非模态对话框的区别

    记录博文

    一、模态对话框

    1. 应用程序模态对话框:一旦调用该对话框,它就会成为应用程序唯一能够与用户进行交互的部件。在关闭该对话框之前,用户都不能使用应用程序的其他部件。当然,用户还可以自由使用其他的应用程序。比如,通过单机其他应用程序而使其获得光标。
    2. 窗口模态对话框:与应用程序模态对话框工作方式相似,除了它会阻止与其父窗口、父窗口的父窗口并直至顶层窗口等的交互,当然也会阻止与父窗口同层各兄弟窗口的交互。对于只有一个顶层窗口的那些应用程序老说,在实践上不会存在应用程序模态与窗口模态的区别。

    二、非模态对话框

    当调用非模态对话框的时候,用户可以与该对话框以及应用程序的其它部分交互。这会对如何设计代码产生影响,因为用户可以既从主窗口又从非模态对话框两边同时修改程序的状态,这就可能造成两者相互影响。

    三、show() 与 exec_()的区别

    exec() 有返回值,show() 没有返回值。其次这两个方法的作用也不同。调用 show() 的作用仅仅是将 Widget 及其上的内容都显示出来。而调用 exec() 后,调用线程将会被阻塞,直到 Dialog 关闭。

    实际的小例子:

        def setPenProperties(self):
            dialog = PenPropertiesDlg(self)
            dialog.widthSpinBox.setValue(self.width)
            dialog.beveledCheckBox.setChecked(self.beveled)
            dialog.styleComboBox.setCurrentIndex(dialog.styleComboBox.findText(self.style))
            if dialog.exec_():
                self.width = dialog.widthSpinBox.value()
                self.beveled = dialog.beveledCheckBox.isChecked()
                self.style = dialog.styleComboBox.currentText()
                self.updateData()
    

    当对话框窗口关闭之后,获取对话框的宽度微调框(widthSpinBox)的值,获取复选框(beveledCheckBox)的选择状态,获取组合框(styleComboBox)的文本字符串,并刷新主窗口。

    四、完整的实例代码

    import sys
    from PyQt5.QtWidgets import *
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    
    
    class PenPropertiesDlg(QDialog):
    
        def __init__(self, parent=None):
            super(PenPropertiesDlg, self).__init__(parent)
    
            widthLabel = QLabel("&Width:")
            self.widthSpinBox = QSpinBox()
            widthLabel.setBuddy(self.widthSpinBox)
            self.widthSpinBox.setAlignment(Qt.AlignRight|Qt.AlignVCenter)
            self.widthSpinBox.setRange(0, 24)
            self.beveledCheckBox = QCheckBox("&Beveled edges")
            styleLabel = QLabel("&Style:")
            self.styleComboBox = QComboBox()
            styleLabel.setBuddy(self.styleComboBox)
            self.styleComboBox.addItems(["Solid", "Dashed", "Dotted",
                                         "DashDotted", "DashDotDotted"])
            okButton = QPushButton("&OK")
            cancelButton = QPushButton("Cancel")
    
            buttonLayout = QHBoxLayout()
            buttonLayout.addStretch()
            buttonLayout.addWidget(okButton)
            buttonLayout.addWidget(cancelButton)
            layout = QGridLayout()
            layout.addWidget(widthLabel, 0, 0)
            layout.addWidget(self.widthSpinBox, 0, 1)
            layout.addWidget(self.beveledCheckBox, 0, 2)
            layout.addWidget(styleLabel, 1, 0)
            layout.addWidget(self.styleComboBox, 1, 1, 1, 2)
            layout.addLayout(buttonLayout, 2, 0, 1, 3)
            self.setLayout(layout)
    
            okButton.clicked.connect(self.accept)
            cancelButton.clicked.connect(self.reject)
            self.setWindowTitle("Pen Properties")
    
    
    class Form(QDialog):
    
        def __init__(self, parent=None):
            super(Form, self).__init__(parent)
    
            self.width = 1
            self.beveled = False
            self.style = "Solid"
    
            penButtonInline = QPushButton("Set Pen... (Dumb &inline)")
            penButton = QPushButton("Set Pen... (Dumb &class)")
            self.label = QLabel("The Pen has not been set")
            self.label.setTextFormat(Qt.RichText)
    
            layout = QVBoxLayout()
            layout.addWidget(penButtonInline)
            layout.addWidget(penButton)
            layout.addWidget(self.label)
            self.setLayout(layout)
    
            penButtonInline.clicked.connect(self.setPenInline)
            penButton.clicked.connect(self.setPenProperties)
            self.setWindowTitle("Pen")
            self.updateData()
    
    
    
        def updateData(self):
            bevel = ""
            if self.beveled:
                bevel = "<br>Beveled"
            self.label.setText("Width = {}<br>Style = {}{}".format(
                               self.width, self.style, bevel))
    
    
        def setPenInline(self):
            widthLabel = QLabel("&Width:")
            widthSpinBox = QSpinBox()
            widthLabel.setBuddy(widthSpinBox)
            widthSpinBox.setAlignment(Qt.AlignRight)
            widthSpinBox.setRange(0, 24)
            widthSpinBox.setValue(self.width)
            beveledCheckBox = QCheckBox("&Beveled edges")
            beveledCheckBox.setChecked(self.beveled)
            styleLabel = QLabel("&Style:")
            styleComboBox = QComboBox()
            styleLabel.setBuddy(styleComboBox)
            styleComboBox.addItems(["Solid", "Dashed", "Dotted",
                                    "DashDotted", "DashDotDotted"])
            styleComboBox.setCurrentIndex(styleComboBox.findText(self.style))
            okButton = QPushButton("&OK")
            cancelButton = QPushButton("Cancel")
    
            buttonLayout = QHBoxLayout()
            buttonLayout.addStretch()
            buttonLayout.addWidget(okButton)
            buttonLayout.addWidget(cancelButton)
            layout = QGridLayout()
            layout.addWidget(widthLabel, 0, 0)
            layout.addWidget(widthSpinBox, 0, 1)
            layout.addWidget(beveledCheckBox, 0, 2)
            layout.addWidget(styleLabel, 1, 0)
            layout.addWidget(styleComboBox, 1, 1, 1, 2)
            layout.addLayout(buttonLayout, 2, 0, 1, 3)
    
            form = QDialog()
            form.setLayout(layout)
            okButton.clicked.connect(form.accept)
            cancelButton.clicked.connect(form.reject)
            form.setWindowTitle("Pen Properties")
    
            if form.exec_():
                self.width = widthSpinBox.value()
                self.beveled = beveledCheckBox.isChecked()
                self.style = styleComboBox.currentText()
                self.updateData()
    
    
        def setPenProperties(self):
            dialog = PenPropertiesDlg(self)
            dialog.widthSpinBox.setValue(self.width)
            dialog.beveledCheckBox.setChecked(self.beveled)
            dialog.styleComboBox.setCurrentIndex(dialog.styleComboBox.findText(self.style))
            if dialog.exec_():
                self.width = dialog.widthSpinBox.value()
                self.beveled = dialog.beveledCheckBox.isChecked()
                self.style = dialog.styleComboBox.currentText()
                self.updateData()
            
            
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        form = Form()
        form.resize(200, 200)
        form.show()
        app.exec_()
    

    代码转自 《Python Qt Gui 快速编程 —— PyQt 编程指南》

    点我回顶部

     
     
     
     
     
     
     
    Fin.

    展开全文
  • 1.特点:模态对话框不能操作主对话框,非模态对话框可以 2.步骤 2.1插入对话框资源模板 资源视图→rc→dialog(右键)→Insert Dialog 2.2相关类的绑定 新建的对话框(右键)→Add class →class name

    相关知识:MFC中的每一个框都绑定了一个类
    按钮:cbutton 编辑框:cedit 对话框:cdialog(class cdialog : public CWnd // 类 cdialog 派生于 CWnd)

    1.特点:模态对话框不能操作主对话框,非模态对话框可以

    2.步骤

    2.1插入对话框资源模板

    资源视图→rc→dialog(右键)→Insert Dialog

    2.2相关类的绑定

    新建的对话框(右键)→Add class →class name(CMyDialog),Base class(CDialog),.h和.cpp文件已经自动创建好→完成

    3.对话框的建立

    3.1模态对话框的建立

    在主对话框.cpp文件中加 #include"MyDialog.h" → 在某个按钮的响应函数里

    void CMFCApplication2Dlg::OnBnClickedButton1()
    {
    	cmydialog dig;
    	dig.DoModal();
    }
    
    

    3.2非模态对话框的建立

    3.2.1以全局变量的方式建立

    cmydialog2 dig2;                   //放到按钮响应函数的外面
    void CMFCApplication2Dlg::OnBnClickedButton2()
    {
    	dig2.Create(非模态对话框ID);
    	dig2.ShowWindow(SW_SHOW);
    }
    

    如何在对话框关闭时消去内存

    点Cancel 和点x关闭对话框

    类视图→CMyDialog→属性→重载→OnCancel
    非模态不需要CDialog::OnCancel();
    加上DestroyWindow();

    点OK关闭对话框

    双击“OK”按钮,在它的响应函数里
    不需要OnOK();
    加上DestroyWindow();

    3.2.2以new的方式建立

    在主对话框.h文件中, 添加头文件 #include “cmydialog3.h” ,以及 cmydialog3 * pdlg;
    在主对话框.cpp文件中加 #include"MyDialog.h" ,以及按钮的响应函数中

    void CMFCApplication2Dlg::OnBnClickedButton3()
    {
    	pdlg = new cmydialog3();
    	pdlg->Create(IDD_DIALOG3);
    	pdlg->ShowWindow(SW_SHOW);
    }
    

    如何在对话框关闭时消去内存
    类视图→CMyDialog3→属性→重载→PostNcDestroy
    直接加 Delete this;

    4.对话框的初始化

    类视图→CMyDialog→属性→重载→OnInitDialog

    展开全文
  • MFC中对话框有两种形式,一个是模态对话框(model dialog box),一个是非模态对话框(modeless dialog box)。二者的区别在于当对话框打开时,是否允许用户进行其他对象的操作。 一、模态对话框(model dialog box...

    MFC中对话框有两种形式,一个是模态对话框(model dialog box),一个是非模态对话框(modeless dialog box)。二者的区别在于当对话框打开时,是否允许用户进行其他对象的操作。

    一、模态对话框(model dialog box)

    在程序运行的过程中,若出现了模态对话框,那么主窗口将无法发送消息,直到模态对话框退出才可以发送。点击模态对话框中的OK按钮,模态对话框会被销毁。

    创建一个模态对话框的代码:

    //创建一个模态对话框  
    CTestDialog td;  
    td.DoModal();   
    

    其中CTestDialog为我自己所新建和一个对话框资源相关联的对话框类。

    可以创建一个布局模态对话框类变量,不用担心它会随着所在函数返回而被销毁。因为DoModal()函数的一个功能是,当前只能运行此模态对话框,且停止主窗口的运行,直到模态对话框退出,才允许主窗口运行。

    DoModal()函数也有显示对话框的功能,所以也无需调用其他函数来显示对话框。

    二、非模态对话框(modaless dialog box)

    在程序运行的过程中,若出现了非模态对话框,主窗口还可以发送消息。

    点击非模态对话框中的OK按钮,非模态对话框没有销毁,只是隐藏了。若想点击OK按钮时,非模态对话框也销毁,那么CTestDialog类必须重载其基类CDialog的虚函数OnOK(),在此函数里调用DestroyWindow()来销毁此对话框。

    要建立非模态对话框需要调用两个函数Create()ShowWindow()

    若和上面一样的方式创建一个非模态对话框:

    CTestDialog td;  
    td.Create(IDD_DIALOG1); //创建一个非模态对话框  
    td.ShowWindow(SW_SHOWNORMAL); //显示非模态对话框  
    

    那么,在运行时,你会发现此对话框无法显示。这是因为你声明的对话框变量td是局部变量,但这个函数返回时,td也被析构了,所以无法显示此对话框。

    创建非模态对话框,必须声明一个指向CTestDialog类的指针变量,且需要显示的调用ShowWindow()才能将对话框显示出来。有两种创建方法:

    1. 采用局部变量创建一个非模态对话框

       //采用局部变量创建一个非模态对话框  
       CTestDialog *pTD = new CTestDialog();  
       pTD->Create(IDD_DIALOG1); //创建一个非模态对话框  
       pTD->ShowWindow(SW_SHOWNORMAL); //显示非模态对话框  
      

      因为指针在声明的时候是被放在堆栈中,只有整个应用程序关闭后才会被销毁,所以可以正常显示对话框。这种方法虽然不影响程序的运行,可是指针pTD所指向的内存却导致不可用,这样的编程很不好。

    2. 采用成员变量创建一个非模态对话框

      首先在你所要编写的类的头文件中声明一个指针变量:

       private:  
       	CTestDialog *pTD;  
      

      然后再在相应的CPP文件,在你要创建对话框的位置添加如下代码:

       //采用成员变量创建一个非模态对话框  
       pTD = new CTestDialog(); //给指针分配内存  
       pTD->Create(IDD_DIALOG1); //创建一个非模态对话框  
       pTD->ShowWindow(SW_SHOWNORMAL); //显示非模态对话框  
      

      最后在所在类的析构函数中收回pTD所指向的内存:

       delete pTD;  
      

    三、销毁的区别

    模态对话框的销毁是使用EndDialog,而非模态对话框的销毁是使用DestroyWindow。所以我们在销毁对话框的时候,也要对其进行区别。

    非模态对话框,用户关闭对话框时,对话框消息处理函数将收到WM_CLOSE消息,接到后调用DestroyWindow以销毁非模态对话框。

    模态对话框,则一般响应IDOKIDCANCEL。在PPC上,我们对于OK键和X键的处理要注意这点。

    四、注意事项

    非模态对话框对象是用new操作符在堆中动态创建的,而不是以成员变量的形式嵌入到别的对象中或以局部变量的形式构建在堆栈上。通常应在对话框的拥有者窗口类内声明一个指向对话框类的指针成员变量,通过该指针可访问对话框对象。

    通过调用Create函数来启动对话框,而不是DoModal,这是非模态对话框的关键所在。由于Create函数不会启动新的消息循环,对话框与应用程序共用同一个消息循环,这样对话框就不会垄断用户的输入。Create在显示了对话框后就立即返回,而DoModal(模态对话框)是在对话框被关闭后才返回的。众所周知,在MFC程序中,窗口对象的生存期应长于对应的窗口,也就是说,不能在未关闭屏幕上窗口的情况下先把对应的窗口对象删除掉。由于在Create返回后,不能确定对话框是否已关闭,这样也就无法确定对话框对象的生存期,因此只好在堆中构建非模态对话框对象,而不能以局部变量的形式来构建之。

    因为是用new操作符构建非模态对话框对象,因此必须在对话框关闭后,用delete操作符删除对话框对象。

    必须有一个标志表明非模态对话框是否是打开的。这样做的原因是用户有可能在打开一个模态对话框的情况下,又一次选择打开命令。程序根据 标志来决定是打开一个新的对话框,还是仅仅把原来打开的对话框激活。通常可以用拥有者窗口中的指向对话框对象的指针作为这种标志,当对话框关闭时,给该指 针赋NULL值,以表明对话框对象已不存在了。

    展开全文
  • 实际上,模态对话框非模态对话框在创建对话框资源和生成对话框类上是没有区别的,因此,在创建模态对话框时所创建的IDD_TIP_DIALOG对话框资源和CTipDlg类都不需要修改。 二、创建及显示非模态对话框的步骤 需要...
  • 对话框单击事件里使用多线程创建对话框B,正常情况见B对话框都是闪现一次,无法长期停留。本代码利用MSG防止了此现象的发生,适合初学多线程的新手。
  • Windows应用程序工作的基本流程是从用户那里得到数据,经过相应的处理之后,再把...对话框基本认识常用控件介绍对话框的种类模态对话框非模态对话框对话框的新建和显示模态对话框的创建非模态对话框的创建 对话框...

    Windows应用程序工作的基本流程是从用户那里得到数据,经过相应的处理之后,再把处理结果输出到屏幕、打印机或者其他的输出设备上。那么,应用程序是如何从用户那里得到数据,并且再将修改后的数据显示给用户的呢?这就需要用到 Windows应用程序中一个很重要的用户接口 ——对话框


    对话框其实就是一个窗口,不仅可以接收消息,而且还可以被移动和关闭,甚至可以在它的客户区中进行绘图。我们也可以将对话框看成是一个大容器,在它上面能够放置各种各样的标准控件和扩展控件,使程序支持用户输入的手段更加丰富。

    常用控件介绍

    控件功能控件类
    静态文本框(Static Text)显示文本, 一般不能接受输入信息CStatic
    图像控件(Picture)显式位图、 图标、 方框和图元文件, 一般不能接受输入信息CStatic
    编辑框(Edit Box)输入并编辑正文,支持单行和多行编辑CEdit
    按钮(Button)响应用户的输入,触发相应的事件CButton
    单选按钮(Radio Button)用来从两个或多个选项中选中一项CButton
    复选框(Check Box)用作选择标记,可以有选中、未选中和不确定三种状态CButton
    组框(Group Box)显示正文和方框,主要用来将相关的一些控件(用千共同的目的)组织 在一起CButton
    列表框(List Box)显示一个列表,用户可以从该列表中选择一项或多项CListBox
    组合框(Combo Box)是一个编辑框和一个列表框的组合。分为简易式、下拉式和下拉列表式CComboBox
    滚动条(Scroll Bar)主要用来从一个预定义范围值中迅速而有效地选取一个整数值CScrollBar

    对话框的种类

    对话框分为两类: 模态(Modal)对话框和非模态(Modeless)对话框。

    模态对话框

    模态对话框是指当其显示时,程序会暂停执行,直到关闭这个模态对话框后,才能继续执行程序中其他任务。例如, 在Word中利用【文件/打开】菜单命令显示一个 “打开 ”对话框后,再用鼠标去选择其他菜单,或者进行该对话框以外的任何操作时,就会听到那个声音(大家都懂),这是因为 “打开 “ 对话框是一个模态对话框。
    模态对话框垄断了用户的输入,当一个模态对话框打开时,用户只能与该对话框进行交互,而其他用户界面对象接收不到输入信息。
    我们平时所遇到的大部分对话框都是模态对话框。

    非模态对话框

    非模态对话框显示时,允许转而执行程序中其他任务,而不用关闭这个对话框。 典型的例子是Windows提供的记事本程序中的 “查找”对话框,该对话框不会垄断用户的输入,打开“查找”对话框后,仍可以与其他用户界面对象进行交互,用户可以一边查找,一边修改文章,这样,就大大方便了我们的使用,提高了效率。

    对话框的新建和显示

    首先我们用VS2017新建一个基于对话框的MFC工程,并命名为Dialog.建好项目之后,进行测试运行,会见到如下图所示结果:
    新建工程运行结果
    如果想在程序中创建自己的对话框, 可以通过插入一个对话框资源来完成。 具体方法是:视图->其他窗口->资源视图(Ctrl + Shift+E)
    在这里插入图片描述
    结果如图所示: VS2017自动将其标识设IDD_DIALOG1, 并添加到资源视图选项卡中的 Dialog 项下,同时在资源编辑窗口中打开了这个新对话框资源,
    在这里插入图片描述
    可以看到,这个新建的 IDD_DIALOG1对话框中有两个按钮:确定取消, 并通过它们的属性对话框可以发现 它们的ID分别为IDOK和IDCANCEL。VS2017已经为这两个按钮提供了默认的消息响应函数OnOK 和 OnCancel, 它们实现的主要功能都是样的,就是关闭对话框,因此,当程序运行时,单击这两个按钮中的仔何一个都可以关闭对话框。但是,单击这两个按钮关闭对话框后,返回的结果值是不一样的, 在程序中,通常根据该返回值来判断用户单击的是哪个按钮,从而确定用户的行为:是确定还是取消当前操作。
    我们选中IDD_DIALOG1这个对话框资源本身,打开其属性对话框,将其Caption属性修改为 “测试 ”, 以下统称这个对话框为测试对话框。
    在MFC中,对资源的操作通常都是通过一个与资源相关的类来完成的。 对话框资源也有一个相应的基类:CDialogEx。由于CDialogEx类派生于CWnd类,所以它是一个与窗口相关的类,主要用来在屏幕上显示一个对话框。由此可知,实际上,对话框本身也是 一个窗口界面。
    既然在MFC中,对资源的操作是通过一个类来完成的,那么就需要创建一个类与这个新建的对话框资源相关联。为此,我们双击刚刚新建的测试对话框将出现如图所示的对话框,利用这个对话框就可以为新建的测试对话框资源创建—个关联的类。
    在这里插入图片描述
    我们将类名命名为CTestDlg,其.h、.cpp文件名称默认和类名一样。如下图所示:
    在这里插入图片描述
    点击确定,这时,在 Dialog程序的类视图选项卡中就可以看到这个新类。可以看到,这个CTestDlg 新类有两个重要成员函数,其中一个就是它的构造函数,其定义代码如下:

    CTestDlg::CTestDlg(CWnd* pParent /*=nullptr*/)
    	: CDialogEx(IDD_DIALOG1, pParent)
    {
    
    }   
    

    可以看到,CTestDlg 类的构造函数首先调用其基类:CDialogEx的构造函数,并传递两个参数:一个是CTestDlg 类的IDD成员,一个是父窗口指针。打开 CTestDlg 类的头文件,就可以发现这个 IDD 就是这个对话框资源的ID, 代码如下:

    // 对话框数据
    #ifdef AFX_DESIGN_TIME
    	enum { IDD = IDD_DIALOG1 };
    #endif
    
    

    CTestDlg 类的另一个函数是:DoDataExchange, 主要用来完成对话框数据的交换和校验,其定义代码如下所示:

    void CTestDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialogEx::DoDataExchange(pDX);
    }
    
    

    现在,我们就有了一个类 (CTestDlg) 与IDD_DIALOG1这个对话框资源相关联了,就像程序中 CAboutDlg 类与lDD_ABOUTBOX 这个对话框资源相关联一样。接下来,我们希望在程序中显示这个对话框窗口,为此,可以为Dialog程序主界面下的确定按钮添加一个事件,当用户单击这个按钮时就显示这个测试对话框窗口。接下来如何显示这个测试对话框就要看看我们自己的设置了,是模态对话框还是非模态呢?如何实现呢?我们一一进行展示。

    模态对话框的创建

    首先实现模态对话框的创建。创建模态对话框需要调用CDialog 类的成员函数:DoModal, (如下图所示:)该函数的功能就是创建并显示一个模态对话框,其返回值将作为CDialog类的另一个成员函数:EndDialog 的参数,后者的功能就是关闭模态对话框。
    图1
    在正式显示模态对话框之前我们先为主窗口的确定按钮添加一个事件,来实现模态对话框的显示。我们双击确定按钮,在DialogDlg.cpp文件看到如下代码:

    void CDialogDlg::OnBnClickedOk()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	CDialogEx::OnOK();
    }
    
    

    我们在这个按钮触发事件下添加代码,实现显示模态对话框,代码如下:

    void CDialogDlg::OnBnClickedOk()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	CDialogEx::OnOK();
    	CTestDlg dlg;
    	dlg.DoModal();
    }
    
    

    上述代码中,首先定义一个对话框对象:dlg, 然后利用这个对象调用DoModal函数以产生一个模态对话框。另外,在视类中并不知道这个CTestDlg 对话框是什么样的数据类型,所以还必须在视类的源文件中包含这个CTestDlg类的头文件,结果如下图所示,其中红色箭头所指的那行代码就是需要添加的内容。
    在这里插入图片描述
    然后我们编译运行,首先弹出主界面,如下图所示:
    在这里插入图片描述
    然后点击确定,结果如图所示:
    在这里插入图片描述
    当前只能运行此模态对话框,且停止主窗口的运行,直到模态对话框退出,才允许主窗口运行。

    非模态对话框的创建

    如果要创建非模态对话框,则需要利用CDialog类的Create成员函数。该函数具有以下两种形式的声明:

    virtual BOOL Create(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL);
    virtual BOOL Create(UINT nIDTemplate, CWnd* pParentWnd = NULL);
    

    也就是说,Create函数的第一个参数可以是对话框资源的ID(nIDTemplate参数,或者也可以是对话框模板的名称(lps zTemplateName参数)。这个函数的第二个参数指定了对话框的父窗口,如果其值是NULL,对话框的父窗口就是主应用程序窗口。对本例来说,如果这个父窗口参数值是NULL, 对话框的父窗口就是Dialog窗口。这里,我们仍在主窗口的确定按钮事件下实现创建非模态对话框的功能,则首先需要将上面创建模态对话框的代码注释起来,然后在其后面添加创建非模态对话框的代码,结果如下:

    void CDialogDlg::OnBnClickedOk()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	CDialogEx::OnOK();
    	/*CTestDlg dlg;
    	dlg.DoModal();*/
    	CTestDlg dlg;
    	dlg.Create(IDD_DIALOG1,this);
    }
    
    

    编译运行程序, 单击确定,发现并未出现测试对话框窗口。这里,我们一定要注意,当利用Create函数创建非模态对话框时,还需要调用ShowWindow函数将这个对话框显示出来。那为什么上面利用DoModal函数创建对话框时不需要呢?这是因为DoModal函数本身就有显示模态对话框的作用,所以对模态对话框来说,不需要再调用 ShowWindow函数来显示对话框了,但非模态对话框需要调用此函数。因此,我们在上述所示代码的最后再加上下而这行代码:

    dlg.ShowWindow(SW_SHOW);
    

    编译并运行程序,单击确定,发现仍没有出现测试对话框。噫~~问题出在哪里了呢?我们回头看看上面的代码,发现这里创建的非模态对话框对象 dlg 是一个局部对象,当程序执行时,会依次执行各条代码,当OnBnClickedOk函数执行结束时,dlg这个对象的生命周期也就结束了,它就会销毁与之相关联的对话框资源。那为什么上面创建模态对话框时就可以使用局部对象呢?上面也已经说过了,在创建模态对话框时,当执行到调用 DoModal函数以显示这个对话框时,程序就会暂停执行,直到模态对话框关闭之后,程序才继续向下执行。也就是说,当模态对话框显示时,程序中创建的dlg这个对象的生命周期并未结束。因此,在创建非模态对话框时,不能把对话框对象定义为局部对象。查阅资料发现对于这个问题,有两种解决办法:一是把这个对话框对象定义为视类的成员变量; 另一种方式是将它定义为指针,在堆上分配内存。 因为,在堆上分配的内存,与程序的整个生命周期是一致的,当然这里是指程序中不主动销毁的情况。那我们就试一下吧(不理解的就去查阅一下资料,我也是查了大量资料才知道的)
    这里,我们采用后一种方式,修改已有代码,结果如下代码所示:

    
    void CDialogDlg::OnBnClickedOk()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	//CDialogEx::OnOK();
    	/*CTestDlg dlg;
    	dlg.DoModal();*/
    
    	/*CTestDlg dlg;
    	dlg.Create(IDD_DIALOG1,this);
    	dlg.ShowWindow(SW_SHOW);*/
    	CTestDlg *pDlg = new CTestDlg;
    	pDlg->Create(IDD_DIALOG1, this);
    	pDlg->ShowWindow(SW_SHOW);
    }
    
    

    编译运行,见证奇迹的时刻,如图所示:
    在这里插入图片描述
    然而这中方法又引入了新的问题:我们必须释放pDlg占用的资源,否则会造成内存泄漏! 况且这里pDlg还是一个局部指针变量,当它的生命周期结束时,在程序中就无法再引用它所指向的那块内存了。
    解决方法同样有两个:一是在主对话框类的定义中添加私有成员变量,然后在主对话框类的析构函数中调用delete函数释放它指向的内存;二是在主对话框类中重载PostNcDestroy虚函数,释放this指针指向的内存。
    我们先用第一种方法具体操作如下:

    1. 先在DialogDlg.h文件中加入下面一行代码
      在这里插入图片描述
    2. 添加私有成员变量和析构函数
      在这里插入图片描述
      在这里插入图片描述
    3. 在按钮事件下编写代码:
    void CDialogDlg::OnBnClickedOk()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	//CDialogEx::OnOK();
    	/*CTestDlg dlg;
    	dlg.DoModal();*/
    
    	/*CTestDlg dlg;
    	dlg.Create(IDD_DIALOG1,this);
    	dlg.ShowWindow(SW_SHOW);*/
    	//CTestDlg *pDlg = new CTestDlg;
    	if (NULL == pDlg) {
    		pDlg = new CTestDlg();
    		pDlg->Create(IDD_DIALOG1);
    	}
    	pDlg->ShowWindow(SW_SHOW);
    }
    
    CDialogDlg::~CDialogDlg() {
    	if (NULL != pDlg) {
    		delete pDlg;
    	}
    }
    
    
    • 运行结果:
      在这里插入图片描述

    我们再用第二种方法释放内存,具体操作如下:

    • 先将第一种方法的代码注释掉,如下图所示:
      在这里插入图片描述
      在这里插入图片描述

    • 为主对话框重载PostNcDestroy虚函数
      在这里插入图片描述

    • 编写代码:

    void CDialogDlg::OnBnClickedOk()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	//CDialogEx::OnOK();
    	/*CTestDlg dlg;
    	dlg.DoModal();*/
    
    	/*CTestDlg dlg;
    	dlg.Create(IDD_DIALOG1,this);
    	dlg.ShowWindow(SW_SHOW);*/
    	//CTestDlg *pDlg = new CTestDlg;
    	if (NULL == pDlg) {
    		pDlg = new CTestDlg();
    		pDlg->Create(IDD_DIALOG1);
    	}
    	pDlg->ShowWindow(SW_SHOW);
    }
    void CDialogDlg::PostNcDestroy()
    {
    	// TODO: 在此添加专用代码和/或调用基类
    
    	CDialogEx::PostNcDestroy();
    	delete pDlg;
    }
    
    
    • 运行结果:
      在这里插入图片描述

    至此,我们的模态对话框和非模态对话框就创建完成了!!

    如果这篇文章对你的学习起到一定的帮助,记得点个赞哦!!

    展开全文
  • 模态对话框VS非模态对话框

    千次阅读 2018-09-28 16:46:53
    模态对话框VS非模态对话框 模态对话框:此对话框关闭后,它的上一级对话框才可操作 非模态对话框:两个对话框可同时操作 代码实现 例如:在MainWindow中,利用pushButton打开新的对话框 void MainWindow::on_...
  • 点击运行弹出一个对话框,点击DIALOG1按钮弹出一个模态对话框,在该对话框的编辑框输入文本点击确定该对话框消失且输入的文本被显示到主对话框MainDialog中,点击DAILOG2按钮弹出一个非模态对话框,操作现象和模态...
  • VC中模态对话框非模态对话框的编程
  • 在Qt中的对话框依旧分为模态对话框非模态对话框两种。接下来我们将依次介绍下它们的使用方法。
  • 模态对话框是指当其显示时,程序会暂停执行,直到关闭这个模态对话框后,才能继续执行程序中其他任务。例如,在Word中利用【文件打开】菜单命令显示一个“打开”对话框后,再用鼠标去选择其他菜单,或者进行该对话框...
  • 因为工作中出现的问题,来记录一下涉及到的模态和非模态对话框 简要介绍一下两个的区别: 非模态对话框 模态对话框 调用窗口方式 窗体实例化对象.show() 窗体实例化对象.showdialog() 弹出后 ...
  • MFC模态对话框非模态对话框

    千次阅读 多人点赞 2018-09-11 15:30:54
    下面是一个我的手写的模态对话框非模态对话框图: 模态对话框是指当其显示时,程序会暂停执行,直到关闭这个模态对话框后,才能继续执行程序中其他任务。非模态对话框是指当其显示时,允许转而执行程序中其他...
  • 模态对话框的两种方式 1.窗口模态对话框:只能阻止与对话框关联(它的父窗口、所有祖父窗口,以及父窗口和父窗口的所有兄弟姐妹)的窗口的访问,允许用户在应用程序中继续使用其他窗口。 2.应用模态对话框:阻止应用...
  • 模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是Qt所独有的,在各种不同的平台下都存在。又有叫法是称为模式对话框,无模式对话框等。所谓模态对话框就是在其没有被关闭之前,用户不能与同...
  • 本程序是C++编写的 自动建立非模态对话框 并对对话框内的数据自动保存
  • 主要为大家详细介绍了微信小程序自定义模态对话框实例的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 第一个了解的就是模态对话框非模态对话框 定义的话: 1.模态对话框工作状态:当它获得焦点时,将垄断用户的输入,在完成本对话框之前,用户无法对本程序的其他部分进行操作。 2.非模态对话框类似于WORD里的查找...
  • 非模态对话框

    2015-04-30 15:57:59
    基于Bootstrap是实现的,可以同时打开多个非模态对话框,并且窗口可以任意拖动,在对话框中可以任意添加组件,并且可以定义对话框的按钮以及按钮的响应事件,实现了动态表单的展示,以及人员和部门的几个例子。
  • QT模态对话框非模态对话框学习  http://blog.sina.com.cn/s/blog_6143523a0100rxvl.html QT模态对话框非模态对话框 模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是Qt所独有的,在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,587
精华内容 9,834
关键字:

属于非模态对话框