模式对话框和非模式对话框

合集下载

Qt 模态对话框和非模态对话框

Qt 模态对话框和非模态对话框

详解 Qt 模态对话框和非模态对话框2011-07-01 11:33 佚名互联网我要评论(0)字号:T | T如果从线程角度来讲,模态对话框实际上是线程阻塞的,也就是子对话框是一个线程,但是在创建这个子线程之后,父窗口就阻塞了;模态对话框则不是阻塞型的线程模型,父子线程可以并行运行。

AD:Qt 模态对话框和非模态对话框是本文介绍的内容,本文认为本篇是一篇很有意思的文章,不多说,我们先来看内容。

模态对话框就是指在子对话框弹出时,焦点被强行集中于该子对话框,子对话框不关闭,用户将无法操作其他的窗口。

非模态相反,用户仍然可以操作其他的窗口,包括该子对话框的父对话框。

如果从线程角度来讲,模态对话框实际上是线程阻塞的,也就是子对话框是一个线程,但是在创建这个子线程之后,父窗口就阻塞了;模态对话框则不是阻塞型的线程模型,父子线程可以并行运行。

和所有流行的图形类库一样,Qt也提供了创建模态和非模态对话框的机制。

在Qt中创建模态对话框,主要用到了QDialog的exec函数:1.SonDialog dlg(this);2.int res = dlg.exec();3.if (res == QDialog::Accepted)4.{5. QMessageBox::information(this, "INFORMATION", "You clicked OK button!");6.}7.if (res == QDialog::Rejected)8.{9. QMessageBox::information(this, "INFORMATION", "You clicked CANCEL button!");10.}正如上面代码所显示的,可以通过exec函数的返回值来判断用户点击了哪个按钮使得模态对话框退出的,这可以使得我们能够根据用户的不同行为在推出退出模态对话框之后采取不同的处理方法。

VC6.0 显示,关闭,销毁模态与非模态对话框技巧

VC6.0 显示,关闭,销毁模态与非模态对话框技巧

VC6.0 显示,关闭,销毁模态与非模态对话框技巧一、显示对话框:1.显示模式对话框:CDialogDemo dlg;dlg.DoModal();2.显示非模式对话框:CDialogDemo *dlg=new CDialogDemo(this);dlg->Create(IDD_GENERAL_CONTROL);dlg->ShowWindow(SW_SHOW);二、关闭对话框:1.CDialog::OnOK();2.CDialog::DestoryWindow();3.CDialog::EndDialog(0);注:CDialog::CloseWindow(); 仅仅是最小化对话框PostMessage(WM_CLOSE)相关函数详解:CloseWindow函数功能:该函数最小化指定的窗口,但并不销毁该窗口。

函数原型:BOOL CloseWindow(HWND hWnd);参数:hWnd:将要最小化的窗口的句柄。

返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。

若想获得更多错误信息,请调用GetLastError函数。

备注:窗口尺寸被最小化成一个图标,并移动到屏幕的图标区域。

系统显示窗口的图标而不显示窗口,并在图标下显示窗口标题。

应用程序必须使用DestroyWindow函数销毁窗口。

DestroyWindow函数功能:销毁指定的窗口。

这个函数通过发送WM_DESTROY 消息和WM_NCDESTROY 消息使窗口无效并移除其键盘焦点。

这个函数还销毁窗口的菜单,清空线程的消息队列,销毁与窗口过程相关的定时器,解除窗口对剪贴板的拥有权,打断剪贴板器的查看链。

函数原型:BOOL DestroyWindow( HWND hWnd // handle to window to destroy);hWnd :将被销毁的窗口的句柄。

返回值:如果函数成功,返回值为非零:如果函数失败,返回值为零。

VisualBasic工具栏、对话框

VisualBasic工具栏、对话框

VisualBasic工具栏、对话框工具栏可以用工具栏进一步增强应用程序的菜单界面。

工具栏含有工具栏按钮,它提供了对于应用程序中最常用的命令的快速访问。

例如:Visual Basic 的工具栏含有执行常用命令的ToolBarButton,如"打开"(打开已存在的工程)、"保存"(存储当前的工程),等等。

创建工具栏工具栏(也称为发条或者控制栏)已经成为许多基于Windows 的应用程序的标准功能。

工具栏提供了对于应用程序中最常用的菜单命令的快速访问。

使用ToolBar 控件来创建工具栏非常容易且很方便,它在Visual Basic的专业版与企业版中是可用的。

如果使用的是Visual Basic 学习版,则可以像本章后面的"协调菜单与工具栏的外观"所描述的那样用手工来创建工具栏。

下列示例演示为MDI 应用程序创建工具栏的过程;在标准窗体上创建一个工具栏的过程基本上一样。

要手工创建工具栏,请按照以下步骤执行:1. 在MDI 窗体上放置一个图片框。

图片框的宽度会自动伸展,直到填满MDI 窗体工作空间。

工作空间就是窗体边框以内的区域,不包括标题条、菜单栏或所有的工具栏、状态栏或者可能在窗体上的滚动条。

注意只能把那些直接支持Align 属性的控件放置在MDI 窗体上(图片框是支持这一属性的的标准控件)。

2. 在图片框中,可以放置任何想在工具栏上显示的控件。

典型地,用CommandButton 或Image 控件来创建工具栏按钮。

图 6.16表示出了一个含有Image 控件的工具栏。

要在图片框中添加控件,单击工具栏中的控件按钮,然后在图片框中画出它。

注意当MDI 窗体中包含了图片框时,该MDI 窗体的内部区域不包括图片框在内。

例如:MDI 窗体的ScaleHeigh 属性返回MDI 窗体的内部高度,这个高度已不包括图片框的高度。

3. 设置设计时属性。

对话框

对话框

Windows编程基础东软人才实训中心Copyright 2010 By Neusoft Group. All rights reserved1本课程旨在向学员介绍:1)对话框和对话框类2)模式对话框3)无模式对话框4)属性页对话框5)通用对话框时间:学时6教学方法:讲授+课上练习+课下作业第四章对话框23•Windows 应用程序的基本工作流程是从用户那里得到数据,经过相应的处理后,再把计算结果输出到屏幕或打印机。

获取数据的方法会涉及很重要的界面对象-对话框。

•首先学习对话框应用程序的好处:–它比基于文档/视图应用程序更易于理解–涉及的类少,但与文档/视图应用程序有相同的威力。

学习对话框的重要性4•主要有以下两种–模态(Modal)对话框,必须首先响应这个对话框才可以进行其他动作。

–非模态(Modaless)对话框,用户可以操作该程序的其他窗口。

对话框的类型CDialog类•CDialog类从CWnd类派生而来,所以它继承了CWnd类的成员函数,具有CWnd类的基本功能,可以编写代码移动、显示或隐藏对话框,并能根据对话框的特点增加新的成员函数,扩展它的功能。

CObjectCmdTargetCWndCDialog56对话框类相关成员函数用于关闭对话框窗口CDialog::EndDiaolg()响应WM_INITDIALOG 消息CDialog::OnInitDialog()单击取消或Esc 调用该函数,内部调用EndDialog()CDialog::OnCancel()单击OK 按钮调用该函数,内部调用EndDialog()CDialog::OnOK()根据对话框模板资源创建非模态对话框CDialog::Create()激活模态对话框,显示对话框窗口直到该窗口关闭返回CDialog::DoModal()功能描述成员函数7属性页对话框类简介•MFC 中创建对话框的类除了CDialog 类外,还有CPropertySheet 和CPropertyPage ,后两者是创建属性页和向导对话框的基础。

windows4教程

windows4教程

们的作用分别是确认用户通过对话框进行的输入和取消前面的输入 工作。选中按扭后单击右键,可以把它们的相关属性,如标题分别 改为确定和取消等。然后根据需要布置其它的控件。
要使这个对话框真正实现它的功能,必须在程序当中定义一个使用
这个资源的对话框类。
对话框
定义对话框类
利用ClassWizard,程序员可以十分方 便的创建对话框类。操作步骤如下:
对话框

对话框的数据交换机制 :


对话框数据交换(DDX,Dialog Data Exchange) 实现用 户与对话框之间的数据交换。其实现函数如下: DDX_Custom(pDX,nIDC,field) 对话框数据验证 (DDV,Dialog Data Validation)用于验 证对话框输入数据的有效性,其实现函数如下: DDV_Custom(pDX,field,...)
第四章
Windows界面设计
Windows 界面设计
对话框、编辑框、按钮、列表控件、树 形控件等界面设计能使程序支持用户输入的 手段更加丰富。
对话框

对话框用于显示消息和取得用户数据,是Windows应 用程序中最常用的用户界面。 对话框可以作为一个容器,通常包括各种控件,如编 辑框、按钮、组合框和列表框等。 用户通过在编辑框中输入信息,通过对列表框、单选 框等的选择,为应用程序提供必要的数据。 对话框有两种类型:模式对话框和非模式对话框。这 两种形式的对话框在打开和关闭方式上存在区别。 MFC的Dialog 类是对话框类的基类,提供了对话框的 打开、关闭和管理对话框及对话框中的控件等功能。
打开IDD_REGISTER对话框模板,
然后按Ctrl+ClassWizard后,ClassWizard

第3章 WPF文本编辑器

第3章 WPF文本编辑器

3
主要内容
3.1 文档布局 3.2 RichTextBox控件 RichTextBox控件 3.3 Command实现编辑功能 Command实现编辑功能 3.4 存取文件 3.5 About对话框 About对话框 3.6 文本编辑器查找替换功能 3.7 提示用户保存已被修改的文件 3.8 打印和打印预览 3.9 多选项卡页的文本编辑器
9
(2)右击"解决方案管理器"中的项目名称"文本编辑器 )右击"解决方案管理器"中的项目名称" ",在弹出的快捷菜单中选中"添加(D)|新建文件夹(D)" ,在弹出的快捷菜单中选中"添加( )|新建文件夹( 菜单项,新建文件夹"Images"。右击文件夹"Images", 菜单项,新建文件夹"Images"。右击文件夹"Images", 在弹出的快捷菜单中选中"添加( )|现有项( )"菜单项, 在弹出的快捷菜单中选中"添加(D)|现有项(G)"菜单项, 在出现对话框中选择要作为工具条按纽图标的图形文 件,将这些图形文件放到文件夹"Images"中。 件,将这些图形文件放到文件夹"Images"中。 (3)在工具条面板上增加18个按钮,XAML标记如下, )在工具条面板上增加18个按钮,XAML标记如下, ToolTip属性为中文提示。 ToolTip属性为中文提示。 <ToolBar Height="30" Name="toolBar1" DockPanel.Dock="Top" > <Button Width="30" Height="30" Command="ApplicationCommands.Cut" ToolTip="剪贴"> ToolTip="剪贴"> <Image Source="Images\EditCut.png"></Image> Source="Images\ </Button> …<!-- 以下17个按钮标记省略,请读者完成 --> <!-- 以下17个按钮标记省略,请读者完成 --> </ToolBar>

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

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

模式对话框与非模式对话框的区别模式对话框就是不处理它就没法处理父窗口,而非模式对话框就是不用先处理此对话框也可以处理父窗口.例子:在桌面上右击我的电脑,选择属性,弹出系统属性窗口,点击下面的技术支持,弹出技术支持信息,现在再对系统属性窗口进行操作就操作不了,这种叫做模式对话框;关闭技术支持信息,在系统属性里选择硬件,点击设备管理器,弹出设备管理器窗口,现在再对系统属性窗口进行操作仍然可以操作,这种就叫做非模式对话框。

在WIN32中,模式对话框的创建一般是使用DialogBox来进行创建的。

而非模式对话框则是利用CreateWindow来创建的。

在MFC 或是WTL中,模式对话框一般是使用DoModal,而非模式对话框的创建则是使用Create。

一、使用中的区别模式对话框创建后,程序的其他窗口便不能进行操作,必须将该窗口关闭后,其他窗口才能进行操作。

而非模式对话框则无需这样,它不强制要求用户立即反应,而是与其他窗口同时接受用户操作。

二、消息响应的区别在消息响应方面,模式对话框和非模式对话框之间又有着很大的区别。

模式对话框工作的时候,它有内部的消息泵机制,控件之间的交互不用我们人为的去控制,系统会帮助我们去处理。

非模式对话框则像普通窗口一样,则由WinMain中书写的消息循环驱动。

但由于是对话框,它对一些消息有特殊的处理。

因此,在消息循环中,需要先对对话框提供截获消息的机会。

While (GetMessage(&msg, NULL, 0, 0)){if (hDlgModeless == 0 || !IsDialogMessage(hDlgModeless, &msg)){TranslateMessage(&msg);DispatchMessage( &msg);}}如果当前取得的消息是对话框的消息,IsDialogMessage 将它交由对话消息处理函数处理,并返回TRUE。

第8章 MFC对话框

第8章  MFC对话框
DoDataExchange()函数 控件将事件消息发往父窗体(对话框),在对话框类内可以处理它们
谢谢 Thanks for listening.
- 16 -
void CRegDlg::OnBnClickedOk() {
/*1、访问对话框控件*/ char chPhone[30]; memset(chPhone,0,sizeof(chPhone)); GetDlgItem(IDC_ED_PHONE)->GetWindowTextW((LPTSTR)chPhone,20); GetDlgItem(IDC_ED_PHONE2)->SetWindowTextW((LPTSTR)chPhone); }
- 19 -
标准控件与对话框—对话框数据交换与验证
数据交换:
在对话框类中,MFC自动添加了DoDataExchange()函数,在其中实现对 话框控件数据的交换和验证机制。
void CRegDlg::DoDataExchange(CDataExchange* pDX) {
CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_ED_USERNAME, m_edUserName); DDX_Text(pDX, IDC_ED_PHONE, m_edPhone); DDX_Text(pDX, IDC_ED_EMAIL, m_edEmail); }
SetDlgItemText(IDC_ED_PHONE2,(LPTSTR)chPhone);
}
- 17 -
class CRegDlg : public CDialog {
…… char phone[30];//此处是向导添加的变量 }; …… GetDlgItemText(IDC_ED_PHONE,(LPTSTR)phone,20); SetDlgItemText(IDC_ED_PHONE2,(LPTSTR)phone); ……

VC显示关闭销毁模态与非模态对话框技巧

VC显示关闭销毁模态与非模态对话框技巧

VC显示关闭销毁模态与非模态对话框技巧VC++是一种用于Windows平台开发应用程序的集成开发环境,用于构建图形用户界面和控制应用程序的行为。

在VC++中,对话框是一种常用的用户界面元素,可以用于显示和获取用户输入。

在使用对话框时,要注意对话框的显示、关闭和销毁。

1.显示对话框在VC++中,显示一个对话框可以通过以下几种方式实现:a. 使用DoModal函数DoModal函数是CDialog类的一个成员函数,用于显示对话框,并返回对话框的返回值。

例如,可以使用下面的代码显示一个对话框:CMyDialog dlg;dlg.DoModal(;b. 使用Create函数Create函数是CDialog类的另一个成员函数,用于创建对话框,并显示它。

使用Create函数时,需要先调用Create函数创建对话框,然后调用ShowWindow函数显示对话框。

以下是使用Create函数显示对话框的示例代码:CMyDialog dlg;dlg.Create(IDD_MYDIALOG);dlg.ShowWindow(SW_SHOW);c.使用模态对话框模态对话框是一种阻塞式对话框,显示模态对话框时,在对话框关闭之前,用户无法与其他应用程序进行交互。

要显示一个模态对话框,可以通过调用DoModal函数,并传递对话框的资源ID来实现。

以下是使用模态对话框的示例代码:CMyDialog dlg;INT_PTR nResponse = dlg.DoModal(;2.关闭对话框在VC++中,可以使用以下几种方式关闭对话框:a. 使用EndDialog函数EndDialog函数是CDialog类的一个成员函数,用于关闭对话框,并返回对话框的返回值。

以下是使用EndDialog函数关闭对话框的示例代码:OnOKEndDialog(IDOK);b.使用DestroyWindow函数DestroyWindow函数是CWnd类的一个成员函数,用于销毁窗口,并关闭对话框。

QT5自学教程 5

QT5自学教程 5

QT5自学教程(5)——显示窗口在正式给出例子之前,我们首先要介绍几个重要的概念。

这些概念还是蛮重要的,笔者愿与诸君一同进行回顾。

1. Q: 什么是mainwindow?A: mainwindow也就是主窗口。

简单的说主窗口就是进入程序后呈现全面功能的主要界面,其中包括了菜单,工具条,状态栏和其他一些元素。

例如,进入Qt的界面就是一个主窗口。

2. Q:什么是dialog?A:dialog也就是对话框。

在图形用户界面中,对话框是一种特殊的视窗, 用来在用户界面中向用户显示信息,或者在需要的时候获得用户的响应。

之所以称之为“对话框”是因为它们使计算机和用户之间构成了一个对话——或者是通知用户一些信息,或者是请求用户的输入,或者两者皆有。

3. Q:Model对话框和Modeless对话框是指什么?A:严格地讲,只存在一种对话框,但是却存在不同的显示方式。

即Model(模式或称模态)和Modeless(非模式或称非模态)。

非模态对话框指的是:这是一种非强制回应的对话框,用于向用户请求非必须资料。

即可以不理会这种对话框或不向其提供任何信息而继续进行当前工作,所以窗口均可打开并处于活动状态或是获得焦点(人机交互热点)。

一类无模式对话框表现为工具栏,比如设置用于文字颜色的设置。

查找/替换对话框可算是无模式对话框,也可以设计为工具栏。

模态对话框指的是:这种对话框强制要求用户回应,否则用户不能再继续进行操作,直到与该对话框完成交互。

这种对话框设计用于需要一些额外的信息,然后才可以继续进行的操作,或可能只想确认使用者想要进行一项具有潜在危险性的操作。

有模式对话框一般被视为坏的设计方案,因为以一种用户不喜欢看到方式出现,或是被习惯不去注意对话框提示的用户忽略,导致无法避免危险操作。

在了解了上面的一些概念之后我们将给出我们的例子,例子分为两个部分进行讲解。

第一个部分中展示了创建一个主窗口并且在其中对部件进行布局的操作;第二部分则是窗口模态和非模态的展示。

模式对话框和非模式对话框

模式对话框和非模式对话框

(1)根据要求创建对话框模板。
(2)使用ClassWizard创建对话框类并进行各类 事件函数的代码编写。
(3)对视图类进行编辑,以便对话框能够被激 活。在所编写的代码中,首先创建对话框类 的对象,然后通过该对象调用对话框类成员 函数DoModal()。只有当用户退出对话框窗口 时,DoModal函数才能返回。
模式对话框和非模式对话框
对话框主要分为模式对话框和非模式对话框两类,它们 在程序中的应用非常广泛,利用这两种对话框可以方便 地实现信息的交互。
1.1 模式对话框和非模式对话框概述
模式对话框是最常用的一类对话框,用户可 以通过选择菜单选项或单击工具按钮打开一 个对话框,然后进行数据的输入操作。对于 模式对话框的编程可以按以下步骤进行。
(2)通过向父窗口发送消息,要求其他窗口对其进行销毁。 首先需要定义一个消息用于进行通知,然后在对话框中映射 WM_DESTROY消息,在消息处理函数中调用消息发送函数 通知其他窗口。在接收消息的窗口中利用ON_MESSAGE映 射处理消息的函数,并在消息处理函数中删除对话框对象。
1.2 创建模式对话框
创建模式对话框需要调用CDialog类的成员函 数DoModal(),该函数的功能就是创建并 显示一个模式对话框,其返回值将作为 CDialog类的另一个成员函数EndDialog的参 数,后者的功能是关闭模式对话框。
下面通过一个例子来看一下模式对话框的创 建过程。
void CMyboleView::OnDialogTest()
{
CTestDlg dlg
dlg.DoModal();
} 上述代码中首先定义了一个对话框对象dlg,然后调用
DoModal()函数以产生一个模式对话框。 需要注意的是,由于视类中并不知道这个CTestDlg对话框是

QT对话框中show和exec的区别

QT对话框中show和exec的区别

QT对话框中show和exec的区别QDialog的显示有两个函数show()和exec()。

他们的区别在参考文档上的解释如下:show():显示一个非模式对话框。

控制权即刻返回给调用函数。

弹出窗口是否模式对话框,取决于modal属性的值。

(原文:Shows the dialog as a modeless dialog. Control returns immediately to the calling code.The dialog will be modal or modeless according to the value of the modal property. )exec():显示一个模式对话框,并且锁住程序直到用户关闭该对话框为止。

函数返回一个DialogCode结果。

在对话框弹出期间,用户不可以切换同程序下的其它窗口,直到该对话框被关闭。

(原文:Shows the dialog as a modal dialog, blocking until the user closes it. The function returns a DialogCode result.Users cannot interact with any other window in the same application until they close the dialog. )先简单说一下我对模式和非模式对话框的一点点理解:模式对话框,就是在弹出窗口的时候,整个程序就被锁定了,处于等待状态,直到对话框被关闭。

这时往往是需要对话框的返回值进行下面的操作。

如:确认窗口(选择“是”或“否”)。

非模式对话框,在调用弹出窗口之后,调用即刻返回,继续下面的操作。

这里只是一个调用指令的发出,不等待也不做任何处理。

如:查找框。

从字面上看,show()即可以显示非模式也可以显示模式对话框(设置modal值)。

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

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

模态对话框与非模态对话框的区别使用非模态对话框与使用模态对话框相似,但是也有一些重要的区别:首先,非模态对话框通常包含一个标题列和一个系统菜单按钮。

当您在Developer Studio中建立对话框时,这些是内定选项。

用于非模态对话框的对话框模板中的STYLE叙述形如:STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE标题列和系统菜单允许使用者,使用鼠标或者键盘将非模态对话框移动到另一个显示区域。

对于模态对话框,您通常无须提供标题列和系统菜单,因为使用者不能在其下面的窗口中做任何其它的事情。

第二项重要的区别是:注意,在我们的范例STYLE叙述中包含有WS_VISIBLE样式。

在 Developer Studio中,从「Dialog Properties」对话框的「More Styles」页面卷标中选择此选项。

如果省略了WS_VISIBLE,那么您必须在CreateDialog呼叫之后呼叫ShowWindow:(这一个是对于非模态的对话框而言的)hDlgModeless = CreateDialog ( . . . ) ; ShowWindow (hDlgModeless, SW_SHOW) ;如果您既没有包含WS_VISIBLE样式,又没有呼叫ShowWindow,那么非模态对话框将不会被显示。

如果忽略这个事实,那么习惯于模态对话框的程序写作者在第一次试图建立非模态对话框时,经常会出现问题。

第三项区别:与模态对话框和消息框的消息不同,非模态对话框的消息要经过程序式的消息队列。

要将这些消息传送给对话框窗口消息处理程序,则必须改变消息队列。

方法如下:当您使用CreateDialog建立非模态对话框时,应该将从呼叫中传回的对话框句柄储存在一个整体变量(如hDlgModeless)中,并将消息循环改变为:while (GetMessage (&msg, NULL, 0, 0)){if (hDlgModeless == 0 ||!IsDialogMessage (hDlgModeless, &msg)){TranslateMessage (&msg) ;DispatchMessage (&msg) ;}}如果消息是发送给非模态对话框的,那么IsDialogMessage将它发送给对话框中窗口消息处理程序,并传回TRUE(非0);否则,它将传回FALSE(0)。

VC++6.0入门【第六章 创建和使用对话框】

VC++6.0入门【第六章 创建和使用对话框】

第6章创建和使用对话框对话框是一种用户界面,几乎每一个Windows程序都使用对话框与用户进行交互。

对话框可能是一个简单的只含有OK按钮的消息框,也可以是一个复杂的数据输入表单。

对话框上有一些方便用户输入的控件,对话框依靠这些控件与用户进行交互,其实质是一个接收消息的窗口。

在本章节我们主要讲述模式对话框和无模式对话框的原理和使用方法,下一章将详细介绍各种控件的使用。

你将学习创建一个对话框,使用对话框模板编辑一个对话框资源,并在程序中调用对话框的方法。

6.1 对话框的基本原理6.1.1 对话框的工作原理在创建一个对话框之前,我们先来了解一下对话框是如何工作的,对话框的数据来自三方面:对话框资源、对话框对象、和一个文档对象:1.对话框资源对话框资源是一个用户输入或取得数据的图形界面。

这个图形界面是使用Develop Studio的对话框编辑器在对话框模板上创建的,程序员可以在对话框模板上增加并编辑控件,生成对话框资源。

当应用程序运行时,就可以得到一个对话框。

2.对话框对象MFC使用CDialog类来描述对话框,它是CWnd类的派生类。

在CWnd类的基础上增加了数据交换的功能。

当创建一个新的对话框资源后,使用ClassWizard可以创建一个对话框类的派生类。

对话框对象实现了对话框和应用程序之间的通信。

在应用程序中定义一个对话框对象后,在对话框显示前,可以通过访问对话框对象的成员变量为一个对话框的控件初始化,在对话框关闭后,可以通过访问对话框对象的成员变量获得用户的输入数据。

3.文档对象MFC使用文档对象描述应用程序处理的数据,用户输入的数据要进一步的处理,通常要先存贮到文档对象中。

例如:一个学生记录处理的应用程序,用户通过一个对话框输入学生记录并贮存到一个文件中。

应用程序的处理顺序是:用户在对话框中输入信息,通过对话框对象得到输入信息,将输入信息整理到文档对象中,使用序列化函数将文档对象存贮到一个文件中,所以文档对象扮演了一个很重要的数据交换的角色。

Delphi程序设计及实验指导(第二版)-第7章 对话框设计

Delphi程序设计及实验指导(第二版)-第7章  对话框设计
type TFindOption=(frDown,frFindNext,frHideMatchCase,frHideWholeWord,frHideUpD own frMatchCase,frDisableMatchCase,frDisableUpDown,frDisableWholeWord, frReplace,frReplaceAll,frWholeWord,frShowHelp); TFindOptions=set Of TFindOption; 用户可以为Options属性取一个或多个值来设置“查找”对话框的状态,例如取 frMatchCase,则“区分大小写”复选框处于选中状态。其他的属性值请读者参 考Delphi在线帮助。
7.1 通用对话框组件
3.打开图像文件对话框(TOpenPictureDialog)
打开图像文件对话框组件TOpenPictureDialog实际上与打开文件对话框 组件基本相同,只是用于选择以及打开图像文件,该对话框中包含了一 个矩形的预览区域,如果可以读取选中的文件,该文件将在预览区域显 示。该对话框支持的文件类型包括位图(.bmp)、图标文件(.ico)、 Windows图元文件(.wmf)以及增强型Windows图元文件(.emf)。 该对话框具有与TOpenDialog相同的属性集,但是默认情况下,Filter属 性对应于TOpenPictureDialoge组件支持的所有文件类型。
在Delphi 8 for .NET中提供了一些对话框组件,通过它们用户可以
访问Windows内部的通用对话框,例如字体对话框、文件对话框 等。另外,Windows将对话框分为两大类:模式对话框和无模式 对话框。
本章主要介绍一些通用对话框组件和这两类对话框的设用 掌握模式对话框和无模式对话框的概念和使用方法 掌握消息对话框的使用

MFC模态对话框和非模态对话框

MFC模态对话框和非模态对话框

MFC模态对话框和非模态对话框
.
分类: MFC2011-08-31 15:5425518人阅读评论(17)收藏举报
mfcdialogdelete编程
MFC中对话框有两种形式,一个是模态对话框(model dialog box),一个是非模态对话框(modeless dialog box)。
若和上面一样的方式创建一个非模态对话框:
[cpp] view plaincopy
01. CTestDialog td;
02.td.Create(IDD_DIALOG1); //创建一个非模态对话框
03.td.ShowWindow(SW_SHOWNORMAL); //显示非模态对话框
最后在所在类的析构函数中收回pTD所指向的内存:
(2)采用成员变量创建一个非模态对话框
首先在你所要编写的类的头文件中声明一个指针变量:
[cpp] view plaincopy
01.private:
02. CTestDialog *pTD;
然后再在相应的CPP文件,在你要创建对话框的位置添加如下代码:
那么,在运行时,你会发现此对话框无法显示。这是因为你声明的对话框变量td是局部变量,但这个函数返回时,td也被析构了,所以无法显示此对话框。
创建非模态对话框,必须声明一个指向CTestDialog类的指针变量,且需要显示的调用ShowWindow()才能将对话框显示出来。有两种创建方法:
[cpp] view plaincopy
01.//创建一个模态对话框
02.CTestDialog td;
03.td.DoModal();
其中CTestDialog为我自己所新建和一个对话框资源相关联的对话框类。

《Visual C++程序设计教程》第四章对话框设计和Windows常用控件

《Visual C++程序设计教程》第四章对话框设计和Windows常用控件
第4章 对话框设计和Windows常用控件
4.1 对话框应用程序介绍


1.对话框组成 对话框主要由以下两部分组成: (1) 对话框资源:定义了对话框的特性(如大小、位 置和风格等)以及对话框中每个控件的类型、位置等 属性。一般情况下,对话框资源在资源编辑器中静 态地定义,也可以用编程的方法在程序运行时动态 地创建。 (2) 对话框类:对话框类是与对话框资源相关联的, 基于CDialog类的派生类,它提供编程接口来管理对 话框。



1.通过资源编辑器添加控件 打开对话框资源编辑器弹出如图48所示的控 件工具栏之后,就可以方便地在对话框中添加 各种控件了。 (1)单击添加:在控件工具栏上单击要添加 的控件后,将鼠标移动到对话框模板上,此时 鼠标光标变成了“+”形状,在对话框上再次单 击鼠标,控件就添加到对话框模板上了。 (2)拖动添加:拖动要添加的控件到对话框 模板上,然后释放鼠标,也可以添加控件。
(2)单击“新建”按钮可以创建一个资源类型列表中指定类 型的新资源;单击“定制”按钮可以创建资源类型列表中 没有的新类型的资源;单击“导入”按钮可以将外部已有 的位图、图标等资源添加到当前应用程序中。 (3)修改对话框属性。在对话框模板的空白处右击,从弹出 的快捷菜单中选择“属性”命令,弹出如图4-3的“对话属 性”对话框。

4.列表框控件(CListBox) 列表框是一种输入控制,它可以使用户从所列的表 项中进行选择。用户可以在其中选择一个或多个项, 这与单选按钮和复选框的功能有些相近,但不同的 是,列表框中项的数目是灵活变化的,程序运行时 可往列表框中添加或删除某些项。并且,当列表框 中项的数目较多不能一次全部显示时,还可以通过 滚动条来拓展显示范围。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

复习复习和总结总结-关于模式与非模式对话框复习复习和总结总结-关于模式与非模式对话框对话框有两种创建方式:DoModal和Creat。

其中DoModal创建的是模态的对话框,而Creat创建的是非模态的对话框下面总结下他们的不同。

对于模态的对话框,在该对话框被关闭前,用户将不能在同一应用程序的其他地方进行工作(例如open file对话框),而对于非模态的对话框,在它留在屏幕上的同时可以在其他的地方进行工作,(例如find file对话框)Create的Dialog一般是modalless,如果你的程序本身就是只有一个Dialog,就无所谓了,看不出modalless的效果。

modalless本来就是让有机会切换到本程序的其他窗口。

下面摘抄一部分,很基础,很全面非模态对话框的特点与模态对话框不同,非模态对话框不垄断用户的输入,用户打开非模态对话框后,仍然可以与其它界面进行交互。

非模态对话框的设计与模态对话框基本类似,也包括设计对话框模板和设计CDialog类的派生类两部分。

但是,在对话框的创建和删除过程中,非模态对话框与模态对话框相比有下列不同之处:∙非模态对话框的模板必须具有Visible风格,否则对话框将不可见,而模态对话框则无需设置该项风格。

更保险的办法是调用CWnd::ShowWindow(SW_SHOW)来显示对话框,而不管对话框是否具有Visible风格。

∙非模态对话框对象是用new操作符在堆中动态创建的,而不是以成员变量的形式嵌入到别的对象中或以局部变量的形式构建在堆栈上。

通常应在对话框的拥有者窗口类内声明一个指向对话框类的指针成员变量,通过该指针可访问对话框对象。

∙通过调用CDialog::Create函数来启动对话框,而不是CDialog::DoModal,这是模态对话框的关键所在。

由于Create函数不会启动新的消息循环,对话框与应用程序共用同一个消息循环,这样对话框就不会垄断用户的输入。

Create在显示了对话框后就立即返回,而DoModal 是在对话框被关闭后才返回的。

众所周知,在MFC程序中,窗口对象的生存期应长于对应的窗口,也就是说,不能在未关闭屏幕上窗口的情况下先把对应的窗口对象删除掉。

由于在Create返回后,不能确定对话框是否已关闭,这样也就无法确定对话框对象的生存期,因此只好在堆中构建对话框对象,而不能以局部变量的形式来构建之。

∙必须调用CWnd::DestroyWindow而不是CDialog::EndDialog来关闭非模态对话框。

调用CWnd:: DestroyWindow是直接删除窗口的一般方法。

由于缺省的CDialog::OnOK和CDialog::OnCancel 函数均调用EndDialog,故程序员必须编写自己的OnOK和OnCancel函数并且在函数中调用DestroyWindow来关闭对话框。

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

在屏幕上一个窗口被删除后,框架会调用CWnd::PostNcDestroy,这是一个虚拟函数,程序可以在该函数中完成删除窗口对象的工作,具体代码如下void CModelessDialog::PostNcDestroy{delete this; //删除对象本身}这样,在删除屏幕上的对话框后,对话框对象将被自动删除。

拥有者对象就不必显式的调用delete来删除对话框对象了。

∙必须有一个标志表明非模态对话框是否是打开的。

这样做的原因是用户有可能在打开一个模态对话框的情况下,又一次选择打开命令。

程序根据标志来决定是打开一个新的对话框,还是仅仅把原来打开的对话框激活。

通常可以用拥有者窗口中的指向对话框对象的指针作为这种标志,当对话框关闭时,给该指针赋NULL值,以表明对话框对象已不存在了。

根据上面的分析,我们很容易把Register程序中的登录数据对话框改成非模态对话框。

这样做的好处在于如果用户在输入数据时发现编辑视图中有错误的数据,那么不必关闭对话框,就可以在编辑视图中进行修改。

窗口对象的自动清除一个MFC窗口对象包括两方面的内容:一是窗口对象封装的窗口,即存放在m_hWnd成员中的HWND(窗口句柄),二是窗口对象本身是一个C++对象。

要删除一个MFC窗口对象,应该先删除窗口对象封装的窗口,然后删除窗口对象本身。

删除窗口最直接方法是调用CWnd::DestroyWindow或::DestroyWindow,前者封装了后者的功能。

前者不仅会调用后者,而且会使成员m_hWnd保存的HWND 无效(NULL)。

如果DestroyWindow删除的是一个父窗口或拥有者窗口,则该函数会先自动删除所有的子窗口或被拥有者,然后再删除父窗口或拥有者。

在一般情况下,在程序中不必直接调用DestroyWindow来删除窗口,因为MFC会自动调用DestroyWindow来删除窗口。

例如,当用户退出应用程序时,会产生WM_CLOSE 消息,该消息会导致MFC自动调用CWnd:: DestroyWindow来删除主框架窗口,当用户在对话框内按了OK或Cancel按钮时,MFC会自动调用CWnd:: DestroyWindow来删除对话框及其控件。

窗口对象本身的删除则根据对象创建方式的不同,分为两种情况。

在MFC编程中,会使用大量的窗口对象,有些窗口对象以变量的形式嵌入在别的对象内或以局部变量的形式创建在堆栈上,有些则用new操作符创建在堆中。

对于一个以变量形式创建的窗口对象,程序员不必关心它的删除问题,因为该对象的生命期总是有限的,若该对象是某个对象的成员变量,它会随着父对象的消失而消失,若该对象是一个局部变量,那么它会在函数返回时被清除。

对于一个在堆中动态创建的窗口对象,其生命期却是任意长的。

初学者在学习C++编程时,对new操作符的使用往往不太踏实,因为用new在堆中创建对象,就不能忘记用delete删除对象。

读者在学习MFC的例程时,可能会产生这样的疑问,为什么有些程序用 new创建了一个窗口对象,却未显式的用delete来删除它呢?问题的答案就是有些MFC窗口对象具有自动清除的功能。

如前面讲述非模态对话框时所提到的,当调用CWnd::DestroyWindow或:: DestroyWindow删除一个窗口时,被删除窗口的PostNcDestroy成员函数会被调用。

缺省的PostNcDestroy什么也不干,但有些MFC窗口类会覆盖该函数并在新版本的PostNcDestroy中调用delete this来删除对象,从而具有了自动清除的功能。

此类窗口对象通常是用new操作符创建在堆中的,但程序员不必操心用delete 操作符去删除它们,因为一旦调用DestroyWindow删除窗口,对应的窗口对象也会紧接着被删除。

不具有自动清除功能的窗口类如下所示。

这些窗口对象通常是以变量的形式创建的,无需自动清除功能。

所有标准的Windows控件类。

从CWnd类直接派生出来的子窗口对象(如用户定制的控件)。

切分窗口类CSplitterWnd。

缺省的控制条类(包括工具条、状态条和对话条)。

模态对话框类。

具有自动清除功能的窗口类如下所示,这些窗口对象通常是在堆中创建的。

主框架窗口类(直接或间接从CFrameWnd类派生)。

视图类(直接或间接从CView类派生)。

读者在设计自己的派生窗口类时,可根据窗口对象的创建方法来决定是否将窗口类设计成可以自动清除的。

例如,对于一个非模态对话框来说,其对象是创建在堆中的,因此应该具有自动清除功能。

综上所述,对于MFC窗口类及其派生类来说,在程序中一般不必显式删除窗口对象。

也就是说,既不必调用 DestroyWindow来删除窗口对象封装的窗口,也不必显式地用delete操作符来删除窗口对象本身。

只要保证非自动清除的窗口对象是以变量的形式创建的,自动清除的窗口对象是在堆中创建的,MFC的运行机制就可以保证窗口对象的彻底删除。

如果需要手工删除窗口对象,则应该先调用相应的函数(如CWnd::DestroyWindow)删除窗口,然后再删除窗口对象.对于以变量形式创建的窗口对象,窗口对象的删除是框架自动完成的.对于在堆中动态创建了的非自动清除的窗口对象,必须在窗口被删除后,显式地调用delete来删除对象(一般在拥有者或父窗口的析构函数中进行).对于具有自动清除功能的窗口对象,只需调用CWnd:: DestroyWindow即可删除窗口和窗口对象。

注意,对于在堆中创建的窗口对象,不要在窗口还未关闭的情况下就用delete操作符来删除窗口对象.以下是一点资料供参考,非模态对话框的销毁顺序:MFC应用程序中处理消息的顺序1.AfxWndProc() 该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc2.AfxCallWndProc() 该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,然后调用WindowProc()函数3.WindowProc() 该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数4.OnWndMsg() 该函数的功能首先按字节对消息进行排序,对于WM_COMMAND消息,调用OnCommand()消息响应函数,对于WM_NOTIFY消息调用OnNotify()消息响应函数。

任何被遗漏的消息将是一个窗口消息。

OnWndMsg()函数搜索类的消息映像,以找到一个能处理任何窗口消息的处理函数。

如果OnWndMsg()函数不能找到这样的处理函数的话,则把消息返回到WindowProc()函数,由它将消息发送给DefWindowProc()函数5.OnCommand() 该函数查看这是不是一个控件通知(lParam参数不为NULL,如果lParam参数为空的话,说明该消息不是控件通知),如果它是,OnCommand()函数会试图将消息映射到制造通知的控件;如果他不是一个控件通知(或者如果控件拒绝映射的消息)OnCommand()就会调用OnCmdMsg()函数6.OnCmdMsg() 根据接收消息的类,OnCmdMsg()函数将在一个称为命令传递(Command Routing)的过程中潜在的传递命令消息和控件通知。

例如:如果拥有该窗口的类是一个框架类,则命令和通知消息也被传递到视图和文档类,并为该类寻找一个消息处理函数MFC应用程序创建窗口的过程1.PreCreateWindow() 该函数是一个重载函数,在窗口被创建前,可以在该重载函数中改变创建参数(可以设置窗口风格等等)2.PreSubclassWindow() 这也是一个重载函数,允许首先子分类一个窗口3.OnGetMinMaxInfo() 该函数为消息响应函数,响应的是WM_GETMINMAXINFO消息,允许设置窗口的最大或者最小尺寸4.OnNcCreate() 该函数也是一个消息响应函数,响应WM_NCCREATE消息,发送消息以告诉窗口的客户区即将被创建5.OnNcCalcSize() 该函数也是消息响应函数,响应WM_NCCALCSIZE消息,作用是允许改变窗口客户区大小6.OnCreate() 该函数也是一个消息响应函数,响应WM_CREATE消息,发送消息告诉一个窗口已经被创建7.OnSize() 该函数也是一个消息响应函数,响应WM_SIZE消息,发送该消息以告诉该窗口大小已经发生变化8.OnMove() 消息响应函数,响应WM_MOVE消息,发送此消息说明窗口在移动9.OnChildNotify() 该函数为重载函数,作为部分消息映射被调用,告诉父窗口即将被告知一个窗口刚刚被创建MFC应用程序关闭窗口的顺序(非模态窗口)1.OnClose() 消息响应函数,响应窗口的WM_CLOSE消息,当关闭按钮被单击的时候发送此消息2.OnDestroy() 消息响应函数,响应窗口的WM_DESTROY消息,当一个窗口将被销毁时,发送此消息3.OnNcDestroy() 消息响应函数,响应窗口的WM_NCDESTROY消息,当一个窗口被销毁后发送此消息4.PostNcDestroy() 重载函数,作为处理OnNcDestroy()函数的最后动作,被CWnd 调用MFC应用程序中打开模式对话框的函数调用顺序1.DoModal() 重载函数,重载DoModal()成员函数2.PreSubclassWindow() 重载函数,允许首先子分类一个窗口3.OnCreate() 消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被创建4.OnSize() 消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化5.OnMove() 消息响应函数,响应WM_MOVE消息,发送此消息,以告诉窗口正在移动6.OnSetFont() 消息响应函数,响应WM_SETFONT消息,发送此消息,以允许改变对话框中控件的字体7.OnInitDialog() 消息响应函数,响应WM_INITDIALOG消息,发送此消息以允许初始化对话框中的控件,或者是创建新控件8.OnShowWindow() 消息响应函数,响应WM_SHOWWINDOW消息,该函数被ShowWindow()函数调用9.OnCtlColor() 消息响应函数,响应WM_CTLCOLOR消息,被父窗口发送已改变对话框或对话框上面控件的颜色10. OnChildNotify() 重载函数,作为WM_CTLCOLOR消息的结果发送MFC应用程序中关闭模式对话框的顺序1.OnClose() 消息响应函数,响应WM_CLOSE消息,当"关闭"按钮被单击的时候,该函数被调用2.OnKillFocus() 消息响应函数,响应WM_KILLFOCUS消息,当一个窗口即将失去键盘输入焦点以前被发送3.OnDestroy() 消息响应函数,响应WM_DESTROY消息,当一个窗口即将被销毁时,被发送4.OnNcDestroy() 消息响应函数,响应WM_NCDESTROY消息,当一个窗口被销毁以后被发送5.PostNcDestroy() 重载函数,作为处理OnNcDestroy()函数的最后动作被CWnd调用打开无模式对话框的顺序1.PreSubclassWindow() 重载函数,允许用户首先子分类一个窗口2.OnCreate() 消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被创建3.OnSize() 消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化4.OnMove() 消息响应函数,响应WM_MOVE消息,发送此消息以告诉窗口正在移动5.OnSetFont() 消息响应函数,响应WM_SETFONT消息,发送此消息以允许改变对话框中控件的字体以上这些的执行都是按给定的顺序执行!。

相关文档
最新文档