
2022年实验6--对话框.docx
19页精品学习资源试验 6 对话框试验目的1、 把握对话框和 CDialog 类2、 把握对话框的创建、显示和数据校验机制3、 把握模式对话框与无模式对话框的使用方法4、 把握公共对话框的使用试验内容本节主要把握对话框的基本学问和使用方法;对话框的基本学问包括对话框模板的设计,模板与对话框类的连接,对话框的消息循环; 同时仍对颜色对话框、字体对话框和文件对话框等常用的公共对话框进行明白;例1. 设计画笔宽度挑选对话框,通过该对话框可以调整画笔的宽度,范畴为 1~10,并使用该画笔在客户区画一个圆;对话框资源创建的步骤如下:( 1) 利用 AppWizard 创建一个基于 MFC 的单文档应用程序 ex71;( 2) 单击工作区中的 ResourceView ,选中 Dialog ,右击 Dialog ,在弹出的菜单中选 择 Insert Dialog ,这时,在 Dialog 目录下新增了一个标识为 IDD_DIALOG1 的条目,即添加了一个新对话框资源,同时在对话框编辑器中显示出该对话框资源;新建的对话框具有两个默认的按钮控件即 OK 和 Cancel,如以下图;在对话框编辑器中,右击该对话框,在弹出的菜单中挑选属性,弹出对话属性对话框,用来设计对话框的属性;在 General 选项卡中设置对话框的 ID 为IDD_PenDlg ,对话框的标题为“画笔宽度挑选” ,如以下图;欢迎下载精品学习资源向对话框中添加控件; 1〕一个静态文本控件;在对话框编辑器中,选中控件窗口中的静态文本,拖动到对话框中,右键单击已添加的静态文本控件,在弹出的菜单中挑选属性,弹出该控件属性页,设计该控件的标题为“画笔宽度” ;2〕一个编辑框控件;用同样的方法添加编辑框控件,并在其属性页中,设计编辑框的 ID 为 IDC_Width ;3〕一个微调控件;在微调控件的属性页里, General标签也中设置微调控件〔 Spin〕的属性, ID 为 IDC_SPIN , Style 标签页中的Alignmeng 对齐方式挑选为 right ;选中 Set buddy integer ;最终移动对话框上面的 OK 和 Cancel 按钮的位置;添加完控件后的对话框资源如以下图;( 3)( 4) 通过 Dialog 工具栏调整控件的位置;此外,可以在对话框中用静态文本控件添加一些简要说明;( 5) 单击 Dialog 工具栏中的 Test 按钮,测试新建对话框的成效;( 6) 创建对话框类:通过点击菜单查看 ->建立类向导弹出 MFC ClassWizard 对话框并紧接着弹出 Adding a Class 对话框询问是否需要新建一个类,选取 Create a new class,确定后弹出新建类对话框;( 7) 在新建类对话框中的 Name 编辑框中输入新建类名 CPenDlg ,其基类为 CDialog ,如以下图,确定后,新建类已添加到工程中;打开工作区的 ClassView ,可以看到 新 增 加 了 一 个 类 CPenDlg ;欢迎下载精品学习资源( 8) 为对话框控件添加变量和对象:添加 IDC_Width 控件变量,在建立类向导对话 框中挑选 Member Variable ,在 Class name 下拉列表中挑选 CPenDlg,为其添加控件变量和控件对象; 在 Controls IDs 中挑选 IDC_Width ,单击 Add Variable 按钮弹出对话框;该控件变量名为 m_nWidthEdit ;Category 下拉列表框中挑选Value,表示添加的是控件变量, 〔Control 便是添加的是控件对象〕 ,Variable type表示的是添加的变量或对象的类型,挑选 int ;单击 OK 按钮,界面返回到ClassWizard 对话框,为该变量输入最小值 1 和最大值 10;如以下图所示欢迎下载精品学习资源同理添加 IDC_Width 控件对象 m_ctrlWidthEdit , Category 下拉列表框中挑选Control 项;添加 IDC_SPIN 控件对象 m_ctrlSpin , Category 下拉列表框中挑选Control 项 , Variable type 选 择 为 CSpinButtonCtrl ;( 9)( 10) 对话框中控件的初始化; A. 在构造函数中主要对所定义的数据成员进行初始化, 通常类向导可以产生它所需要的数据成员的初始化代码,用户不需要做这项工作;构造 CPenDlg 类的函数代码如下:CPenDlg::CPenDlg〔CWnd* pParent /*=NULL*/〕: CDialog〔CPenDlg::IDD, pParent〕{欢迎下载精品学习资源//{{AFX_DATA_INIT〔CPenDlg〕 m_nWidthEdit = 0;//}}AFX_DATA_INIT}( 11) 在 OnInitDialog〔〕 函数中初始化;在 OnInitDialog〔〕 函数是 WM_INITDIALOG 消息的响应函数;当对话框接受 WM_INITDIALOG 消息时,对话框框架及控件 已经建立起来,但对话框中的控件仍没显示出来;这样就可在 OnInitDialog〔〕 函数中设置对话框的外观、大小及其他相关内容;本程序中,可在 OnInitDialog〔〕 函数中为微调控件设计伙伴及范畴;用类向导为对话框添加 WM_INITDIALOG 消息响应函数 OnInitDialog〔〕 :BOOL CPenDlg::OnInitDialog〔〕{CDialog::OnInitDialog〔〕;m_ctrlSpin.SetBuddy〔&m_ctrlWidthEdit〕; m_ctrlSpin.SetRange〔1,10〕;return TRUE; // return TRUE unless you set the focus to a control// EXCEPTION: OCX Property Pages should return FALSE}( 12) 在应用程序中显示对话框;在应用程序工具栏中,添加新按钮“画” ,表示画笔挑选,在属性页中设置其 ID 为 ID_TESTDLG , Prompt 为“调用画笔挑选对话框\n 画笔挑选” ;利用类向导,为 ID_TESTDLG 在 CEx71view 类中添加WM_COMMAND 消息映射函数 OnTestdlg〔〕,代码如下:void CEx71View::OnTestdlg〔〕 //需在此文件开头处引用头文件 ””{CPenDlg dlg; dlg.DoModal〔〕;}( 13) 编译、链接并运行程序,单击工具栏的按钮“画”后显现新建的对话框;但是, 对话框目前仍不能完成设置画笔宽度的功能,由于仍没有创建相应的数据传递 和绘图函数;对话框数据交换〔 DDX 〕机制用于初始化对话框中的控件或从对话框中获得用户输入的数据;对话框的验证〔 DDV 〕用于验证对话框中数据输入的有效性;为了使对话框的数据成员能够使用 DDX/DDV ,就必需使用 ClassWizard 创建成员变量,设置数据类型,并指定验证规章; ClassWizard 通过一套特别的语法格式来自动保护 DDX/DDV ;在例 1 中,新建对话框包含一个编辑框控件用于设置画笔宽度,和编辑控件相关联的有两个变量:一个控件〔 Control 〕变量和一个值〔 Value〕变量;假如使用 DDX 机制,就一般在 OnInitDialog〔〕 处理函数或对话框构造函数中设置成员变量的初始值;当一个对话框显示之后,全部初始值被传递到控件中;在添加成员变量时,单击 OK 按钮关闭类向导对话框, 那么类向导自动地在构造函数中加入控件的初始化值; 对话框数据交换时在对话框类的 DoDataExchange〔〕 函数中完成的; 该例程中, 用类向导给对话框添加成员变量后 DoDataExchange〔〕 函数的代码如下:void CPenDlg::DoDataExchange〔CDataExchange* pDX〕欢迎下载精品学习资源{CDialog::DoDataExchange〔pDX〕;//{{AFX_DATA_MAP〔CPenDlg〕 DDX_Control〔pDX, IDC_SPIN, m_ctrlSpin〕; DDX_Control〔pDX, IDC_Width, m_ctrlWidthEdit〕; DDX_Text〔pDX, IDC_Width, m_nWidthEdit〕; DDV_MinMaxInt〔pDX, m_nWidthEdit, 1, 10〕;//}}AFX_DATA_MAP}对话框数据验证 〔DDV 〕;编译、运行 ex71,单击工具栏中的 “画” 按钮, 在显现的 “画笔挑选”对话框中,输入画笔宽度 20,单击 OK ,观看 DDV 机制提示的出错信息;修改上例,添加“画笔挑选”菜单项,在该菜单项下,添加子菜单“模式对话框”和“无模式对话框” ,其 IDCEx71View 类 中 添 加分别为 ID_Modal 和 ID_NoModal ,并分别为这两个子菜单项在WM_COMMAND 消 息 处 理 函 数 CEx71View::OnModal〔〕 和CEx71View::OnNoModal〔〕 ;这两个子菜单分别实现模式对话框和无模式对话框的调用;对话框与视图间的数据传递:1、 第一, 在视图类 CEx71View 中添加一个 int 型成员变量 m_nWidth ,用于实现与对话框成员变量 m_nWidthEdit 间的数据传递,并在 CEx71View 类的构造函数中 将 其 初 始 化 为 1 , 即 在 构 造 函 数 中 添 加 代 码 m_nWidth=1 ; 修 改CEx71View::OnDraw〔〕 函数,代码如下void CEx71View::OnDraw〔CDC* pDC〕{CEx71Doc* pDoc = GetDocument〔〕; ASSERT_VALID〔pDoc〕;CPen pen;pen.CreatePen〔PS_SOLID,m_nWidth,RGB〔255,0,0〕〕; pDC->SelectObject〔&pen〕;pDC->Ellipse〔100,100,300,300〕;}2、 修改 CEx71View::OnModal〔〕 函数,代码如下:void CEx71View::OnModal〔〕{CPenDlg dlg; dlg.m_nWidthEdit=m_nWidth; if〔dlg.DoModal〔〕==IDOK〕{m。
