实验6--对话框_第1页
实验6--对话框_第2页
实验6--对话框_第3页
免费预览已结束,剩余11页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验6对话框实验目的1、掌握对话框和CDialog类2、掌握对话框的创立、显示和数据校验机制3、掌握模式对话框与无模式对话框的使用方法4、掌握公共对话框的使用实验内容本节主要掌握对话框的根本知识和使用方法。对话框的根本知识包括对话框模板的设计,模板与对话框类的连接,对话框的消息循环。同时还对颜色对话框、字体对话框和文件对话框等常用的公共对话框进行了解。例1.设计画笔宽度选择对话框,通过该对话框可以调整画笔的宽度,范围为110,并使用该画笔在客户区画一个圆。对话框资源创立的步骤如下:(1) 利用AppWizard创立一个基于 MFC的单文档应用程序 ex71。(2) 单击工作区中的 Resour

2、ceView,选中Dialog,右击 Dialog,在弹出的菜单中选择Insert Dialog,这时,在 Dialog目录下新增了一个标识为IDD_DIALOG1 的条目,即添加了一个新对话框资源,同时在对话框编辑器中显示出该对话框资源。新建的对话框具有两个默认的按钮控件即OK和Cancel,如以下图。二|北件四谛5鱼耆也推人虫工愷电竝电115局心丄具电世口血楼助叫窗心 日厘|底倉曽|嶠phiCRUTE耳|匕 | |A II i-jlotal member? Il-lTI : -U ex7l rcsuuirces * _Acicclcralnr-Oilcig 易 IDD_AnOUTBOX 3

3、(1DD_DIIAI ogi O Icon* LJ McfiuF _ String TebkT QToolbarT Vcisifln哼匚I口冬,警:ihce.苣rtic曲崖£期试T存7乎严苣強:左文忡沪巫E 詬卑.割 T:翱龙/'XnBbl口隹噩圈环雇日園三圃 EaklAjlnIF因:二IHlla皿mlc一IJ3p 1吐塩¥ 4ricf如 1H T S IS1副t!就第邻0. 0出0x0在对话框编辑器中,右击该对话框,在弹出的菜单中选择属性,弹出对话属性对话框,用来设计对话框的属性。在General选项卡中设置对话框的ID为IDD PenDlg,对话框的标题为“画笔

4、宽度选择,如以下图。占霍常规1祥式1多祥式|扩展祥式|更多扩展样式ID; IDD PenDIgT标题fl;画笔宽度选择字体名称:System字体大小:10菜单吻字体回位置X |«位置丫 |0冀占越:(3) 向对话框中添加控件。1一个静态文本控件。在对话框编辑器中,选中控件窗口中的静态文本,拖动到对话框中,右键单击已添加的静态文本控件,在弹出 的菜单中选择属性,弹出该控件属性页,设计该控件的标题为“画笔宽度。2一个编辑框控件。用同样的方法添加编辑框控件,并在其属性页中,设计编辑 框的ID为IDC_Width。3一个微调控件。在微调控件的属性页里,General标签也中设置微调控件Spi

5、n的属性,ID为IDC_SPIN,Style标签页中的Alignmeng对齐方式选择为 right;选中Set buddy integer。最后移动对话框上面的0K和Cancel按钮的位置。添加完控件后的对话框资源如以下图。(4) 通过Dialog工具栏调整控件的位置。此外,可以在对话框中用静态文本控件添 加一些简要说明。(5) 单击Dialog工具栏中的Test按钮,测试新建对话框的效果。(6) 创立对话框类:通过点击菜单查看-建立类向导弹出 MFC Classwizard对话框并紧接着弹出 Adding a Class对话框询问是否需要新建一个类,选取Create anew class,确

6、定后弹出新建类对话框。(7) 在新建类对话框中的Name编辑框中输入新建类名CPenDlg ,其基类为CDialog,如以下图,确定后,新建类已添加到工程中。翻开工作区的ClassView,可以看到 新 增 加 了 一 个 类CPe nDlg。(8) 为对话框控件添加变量和对象:添加 IDC_Width控件变量,在建立类向导对话框中选择 Member Variable,在Class name下拉列表中选择 CPenDlg,为其添力口 控件变量和控件对象。 在Controls IDs中选择IDC_Width,单击Add Variable按 钮弹出对话框。该控件变量名为m_nWidthEdit。C

7、ategory下拉列表框中选择Value,表示添加的是控件变量,Control便是添加的是控件对象Variable type 表示的是添加的变量或对象的类型,选择int。单击 0K按钮,界面返回到ClassWizard对话框,为该变量输入最小值1和最大值 10。如以下图所示(9)同理添加IDC_Width控件对象m_ctrlWidthEdit , Category下拉列表框中选择Control项;添加IDC_SPIN控件对象 m_ctrlSpin , Category下拉列表框中选择 Con trol项, Variable type 选 择 为 CSpi nButto nCtrl(10)对话框

8、中控件的初始化。A.在构造函数中主要对所定义的数据成员进行初始化, 通常类向导可以产生它所需要的数据成员的初始化代码,用户不需要做这项工 作。构造CPenDlg类的函数代码如下:CPe nDlg:CPe nDlg(CWnd* pPare nt /*=NULL*/):CDialog(CPe nDlg:IDD, pPare nt)/AFX_DATA_INIT(CPenDlg)m_nWidthEdit = 0;/AFX_DATA_INIT( 11) 在 OnInitDialog() 函数中初始化。在 OnInitDialog() 函数是 WM_INITDIALOG 消 息的响应函数。当对话框接受 W

9、M_INITDIALOG 消息时,对话框框架及控件 已经建立起来,但对话框中的控件还没显示出来。这样就可在 OnInitDialog() 函 数中设置对话框的外观、大小及其他相关内容。本程序中,可在 OnInitDialog() 函数中为微调控件设计伙伴及范围。用类向导为对话框添加 WM_INITDIALOG 消息响应函数 OnInitDialog() : BOOL CPenDlg:OnInitDialog()CDialog:OnInitDialog();m_ctrlSpin.SetBuddy(&m_ctrlWidthEdit); m_ctrlSpin.SetRange(1,10);r

10、eturn 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:

11、OnTestdlg()/需在此文件开始处引用头文件CPenDlg dlg;dlg.DoModal();( 13) 编译、链接并运行程序,单击工具栏的按钮“画后出现新建的对话框。但是, 对话框目前还不能完成设置画笔宽度的功能,因为还没有创立相应的数据传递 和绘图函数。对话框数据交换 DDX 机制用于初始化对话框中的控件或从对话框中获得用户输入 的数据;对话框的验证 DDV 用于验证对话框中数据输入的有效性。为了使对话框的数 据成员能够使用 DDX/DDV ,那么必须使用 ClassWizard 创立成员变量,设置数据类型,并指 定验证规那么。 ClassWizard 通过一套特殊的语法格式来自动

12、维护 DDX/DDV 。在例 1 中,新建对话框包含一个编辑框控件用于设置画笔宽度,和编辑控件相关联的 有两个变量:一个控件Control丨变量和一个值Value变量。如果使用 DDX 机制,那么一般在 OnInitDialog() 处理函数或对话框构造函数中设置成员变 量的初始值。当一个对话框显示之后,所有初始值被传递到控件中。在添加成员变量时,单 击 OK 按钮关闭类向导对话框, 那么类向导自动地在构造函数中参加控件的初始化值。 对话 框数据交换时在对话框类的DoDataExchange() 函数中完成的。 该例程中, 用类向导给对话框添加成员变量后 DoDataExchange() 函数

13、的代码如下:void CPenDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExcha nge(pDX);AFX_DATA_MAP(CPe nDlg)DDX_Co ntrol(pDX, IDC_SPIN, m_ctrlSpi n);DDX_C on trol(pDX, IDC_Width, m_ctrlWidthEdit);DDX_Text(pDX, IDC_Width, m_nWidthEdit);DDV_Mi nM axI nt(pDX, m_n WidthEdit, 1, 10);AFX_DATA_MAP对话框数据验证DDV。编译

14、、运行ex71,单击工具栏中的“画按钮,在出现的“画 笔选择对话框中,输入画笔宽度20,单击OK,观察DDV机制提示的出错信息。修改上例,添加“画笔选择菜单项,在该菜单项下,添加子菜单“模式对话框和“无模式对话框,其ID分别为ID_Modal和ID_NoModal,并分别为这两个子菜单项在 CEx71View 类中添加 WM_COMMAND 消息处理函数 CEx71View:OnModal() 和CEx71View:OnNoModal()。这两个子菜单分别实现模式对话框和无模式对话框的调用。对话框与视图间的数据传递:1、首先,在视图类CEx71View中添加一个int型成员变量 m_nWidt

15、h,用于实现与对话框成员变量 m_nWidthEdit间的数据传递,并在CEx71View类的构造函数中将其初始化为1,即在构造函数中添加代码 m_nWidth=1 ;修改CEx71View:OnDraw()函数,代码如下void CEx71View:O nDraw(CDC* pDC)CEx71Doc* pDoc = GetDocume nt();ASSERT_VALID(pDoc);CPen pen;pe n.CreatePe n(PS_SOLID,m_ nWidth,RGB(255,0,0);pDC->SelectObject(&pe n);pDC->Ellipse(1

16、00,100,300,300);2、修改CEx71View:OnModal()函数,代码如下:void CEx71View:O nM odal()CPe nDlg dlg;dlg.m_ nWidthEdit=m_ nWidth;if(dlg.DoModal()=IDOK)m_n Width=dlg.m_ nWidthEdit;In validate();修改例7.1,增加一个ID为IDD_NPenDlg的新对话框资源如以下图所示。启动类向导,添加名称为CNPenDlg的新类。设置Apply按钮的ID为IDC_Apply , 并给其添加BN_CLICKED 消息响应函数 OnApply()。同时

17、,在 CNPenDlg类中添加相应的 控件变量如图CNPenDlg类与CPenDlg类的控件使用相同的变量:Message Map?Member VariablesAutomationActiveX EventsClass InfoProject:|cx71 Control IDs:TypeMemberClass name;+ |CNRenDlgC工“倬面诫:xCVMFenDIgh谏面谊谟了I'NPenOIg.cpi)IDC i1DC_SPINIDCWidth IDCWidlh ID CAN CEL IDOKCSpinButtonCtrl m_ctrlSpin intm_nWi(ith

18、EditCEditm_ctrlWitlthEtlH继续修改,为CNPe nDlg类添加 WMNITDIALOG消息响应函数 On I ni tDialog(),其代码如下:BOOL CNPe nDlg:O nlni tDialog()CDialog:O nlni tDialog();m_ctrlSpi n.SetBuddy(&m _ctrlWidthEdit); m_ctrlSpi n.SetRa nge(1,10);/将编辑框设置为微调控件的伙伴窗口。return TRUE;在“无模式对话框菜单项的响应函数 CEx71View:OnNoModal() 中添加代码显示无模 式对话框,方

19、法如下:先 在 CEx71View 类 中 添 加 成 员 变 量 CNPenDlg* NpenDlg 其 中 , 变 量 类 型 为 CNPenDlg* ,变量名为 NpenDlg ,访问权限为 public 。void CEx71View:OnNoModal()NpenDlg=new CNPenDlg(this); NpenDlg->m_nWidthEdit=m_nWidth; NpenDlg->Create(CNPenDlg:IDD); NpenDlg->ShowWindow(SW_SHOW);为无模式对话框类 CNPenDlg 中添加重载的 OnOK() 函数:voi

20、d CNPenDlg:OnOK()UpdateData(TRUE); CDialog:OnOK();注意:需要在 ex71View.h 文件中添加语句 class CNPenDlg; 。这是因为成员变量 NpenDlg 的定义放在头文件 ex71View.h 中,因此需要在该头文件开始处声明 CNPenDlg 类的定义。编译、链接并运行程序,比拟模式对话框和无模式对话框的不同点。此时,无模式对 话框的 OK 按钮和 Apply 按钮均不能起到改变画笔宽度的作用。在 CNPenDlg 类的定义中增加一个 CView 类的指针 CView* pView ,重载一个构造函数 CNPenDlg:CNP

21、enDlg(CView* pParent) ,构造函数将接受 CEx71View 的指针,并保存在 pView 中。在 NPenDlg.cpp 中,添加 CNPenDlg(CView* pParent) 构造函数代码如下:CNPenDlg:CNPenDlg(CView* pParent)pView=pParent;为实现 Apply 按钮的功能,现在 NpenDlg.h 文件首部添加自定义消息:#define WM_APPL Y WM_USER+1 然后利用类向导在 CNPenDlg 类中添加 Apply 按钮的消息处理函数 OnApply() ,实现向 视图发送消息,代码如下:void CN

22、PenDlg:OnApply()UpdateData(TRUE); pView->PostMessage(WM_APPL Y);CDialog:OnOK();在视图中添加 WM_APPL Y 消息的处理函数 Apply() 。A.afx_msg void Apply(WPARAM wParam, LPARAM lParam );B.ON_MESSAGE(WM_APPL Y,Apply)C. 在 Ex71View.cpp 文件中添加 Apply() 函数的功能,代码如下: void CEx71View:Apply(WPARAM wParam, LPARAM lParam) m_nWidth

23、=NpenDlg->m_nWidthEdit; /将对话框中 m_nWidthEdit 的值传 给视图的 m_nWidth;Invalidate(); / 重绘图形D. 实现 OK 按钮的功能 当用户单击 OK 按钮时, 在关闭对话框前也需要向视图发送消息, 通知视图进 行重绘图形,发送消息的功能与 Apply 按钮功能相同。void CNPenDlg:OnOK()UpdateData(TRUE); pView->PostMessage(WM_APPL Y); CDialog:OnOK();编译、链接并运行程序,观察模式对话框与无模式对话框之间的区别。例 2. 在应用程序中添加属性

24、页对话框,并通过“对话框菜单中的“属性页对话框 命令项进行显示。步骤如下:(14) 利用 AppWizard 新建一个基于 MFC 【 EXE 】的单文档工程 ex72.(15) 添加属性页对话框资源。 1、通过菜单命令工程 ->添加到工程 ->Components and Controls 翻开 Components and Controls Gallery 对话框。 2、在 Components and Controls Gallery 对话框中的目录列表中双击 Visual C+ Components 条目,目录 列表改变,拖动滚动条,找到 Property Sheet 项并

25、选中。 3、单击 Insert 按钮, 在弹出的 Microsoft Visual C+ 消息对话框中单击“确定按钮后弹出PropertySheet Wizard 对话框。 4、在 Property Sheet Wizard 对话框中选择所要添加的属 性框类型。默认的是一般类型的属性框,及选中的是Property Sheet,单击“下一步。 5、在紧接着弹出的对话框中的 Support previewing 复选框要求确认是否 在属性框中添加预览功能,默认值为不添加预览功能。下面的单项选择按钮时确认将属性框设置为模式还是无模式类型,默认值为模式,选中的是No。保持默认值,单击“下一步 。 6、

26、在接着弹出的对话框中要求选择在哪个类中对属 性对话框进行操作。通过 ComboBox 组合框控件,选中 CEx72View 。单击“下 一步按钮。 7、在随后弹出的对话框中,要求确认属性框中的属性页个数,默 认值为 2,保持默认,单击“下一步 。 8、在接下来弹出的对话框中要求确认 将要添加的 CPropertySheet 类和 CPropertyPage 类的派生类的名称。 可以通过单 击按钮改变。 保存默认值, 单击“完成。 9、关闭 Components and Controls Gallery 对话框。通过上述步骤,在程序中添加了如下一些内容:一个 CPropertySheet 类的派

27、生类 CMyPropertySheet。两个 CPropertyPage 类的派生类 CMyPropertyPagel 和 CMyPropertyPage2。 与CMyPropertyPagel来和CMyPropertyPage2类相关联的对话框资源。在CEx72View.cpp文件的头部添加了一条包含语句:#include "在 CEx72View 类中添加了 CEx72View:OnProperties()函数。内容如下:Void CEx72View:O nProperties()CMyPropertySheet propSheet;propSheet.DoModal();(16

28、) 修改菜单资源,添加“对话框菜单,并添加“属性页对话框子菜单项。其ID为ID_SheetDlg,Caption为属性对话框,在 CEx72View 中添加响应函数代 码如下:Void CEx72View:O nSheetDlg()On Properties();编译、链接并运行程序,选中“对话框菜单中的“属性页对话框项,出现 属性页对话框。例2. 设计“翻开和“保存对话框,实现对文本文件的选择翻开和保存。(1) 利用AppWizard生成基于MFC【EXE】的单文档应用程序ex73。( 2) 添加文件对话框显示代码。文件对话框的现实方法主要有两种:一种是通过重 载已经存在于 MFC 生成框架

29、中的文件对话框; 另一种方法是直接调用代码显示 对话框。 1、利用 ClassWizard 重载“文件菜单下的“翻开子菜单。在 ex73 工程中,翻开 ClassWizard,选择 Message Maps页面,在 Class Name编辑框中 选择 CEx73View ,在 Object IDs 编辑框中选择 ID_FILE_OPEN ,在 Messages编 辑框中选择 COMMAND ,单击 Add Function 按钮,采用系统产生的默认名称 OnFileOpen 。然后,单击 Edit Code 按钮,编辑该函数的实现代码。如下: Void CEx73View:OnFileOpen

30、()CString filter= TXT Files(*.txt)|*.txt| ;CFileDialog mydialog(TRUE,0,0,OFN_OVERWRITEPROMPT|OFN_HIDEREADONL Y,filter);If(mydialog.DoModal()=IDOK)CString str=mydialog.GetPathName();MessageBox(str);2、在响应函数中添加调用代码,在工程ex73中,添加新的菜单“公共对话框并在其下添加新的子菜单项“文件对话框。ID为ID_FileDlg,prompt为文件对话框。相应的 WM_COMMAND 消息处理函数

31、代码同上。 编译、运行程序,当单击“翻开或者“文件对话框 。例3 通过字体对话框来选择所显示文本的字体和颜色。步骤如下:(1) 利用 AppWizard 创立一个基于 MFC 的单文档应用程序 ex74.(2) 在视窗中,用初始化的字体及颜色显示字符串“ Hello, Font dialog test! 。首先 在 CEx74View 类中定义两个成员变量: LOGFONT fnt 和 COLORREF crColor 分别表示字体即颜色,并在 CEx74View 类的构造函数中对量变量进行初始化, 代码如下:CEx74View:CEx74View()crColor=RGB(255,0,0);

32、/字体初始颜色红色,与圆的颜色相同memset(&fnt,0,sizeof(LOGFONT);strcpy(fnt.lfFaceName,"Arial");/初始字体名称fnt.lfHeight=50;/字体初始高度然后修改 OnDraw 函数,用所给字体及颜色来显示字符串。代码如下:void CEx74View:OnDraw(CDC* pDC)CEx74Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);pDC->SetTextColor(crColor);/字体的颜色CFont myfont;myfont.Create

33、FontIndirect(&fnt);/间接创立一字体pDC->SelectObject(&myfont); pDC->TextOut(100,100,"Hello , Font dialog test!");添加“字体选择菜单项,其ID为ID_Font,并为该菜单项添加 WM_COMMAND 消息处理函数 OnFont() ,通过该函数可以显示字体对话框,并使选择的字体及 颜色有效,代码如下:void CEx74View:OnFont()/用构造函数初始化对话框中的字体/初始化对话框中的颜色/获取所选字体/获取所选颜色CFontDialog d

34、lg(&fnt); dlg.m_cf.rgbColors=crColor; if(dlg.DoModal()=IDOK) dlg.GetCurrentFont(&fnt); crColor=dlg.GetColor(); Invalidate();例4 通过颜色对话框来改变在客户区所画圆的颜色。1) 新建一个 MFC AppWizardexe 类型的单文档工程 ex75。(2) 在ex75中,翻开菜单资源编辑器编辑菜单,在File主菜单下增加新的菜单项 “颜色对话框 ,其 ID 实 ID_COLORDIALOG 。(3) 在CEx75View类中增加新的数据成员COLORREF

35、 crColor,代表所画圆采用的颜色。4) 在 CEx75View 类的 OnDraw() 函数中增加绘制椭圆的代码如下:void CEx75View:OnDraw(CDC* pDC)CEx75Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);CPen mypen; mypen.CreatePen(PS_SOLID,3,crColor); pDC->SelectObject(&mypen);pDC->Ellipse(200,100,400,300);5) 利用 ClassWizard 在 CEx75View 类中为菜单项 ID_CO

36、LORDIALOG 添加ON_COMMAND 消息的处理函数。 在处理函数中翻开颜色对话框, 对话框颜色 选定后放在变量 crColor 中,并重新画圆,实现窗口内圆的颜色改变。void CEx75View:OnColordialog()CColorDialog colordialog(crColor);if(colordialog.DoModal()=IDOK)crColor=colordialog.GetColor();Invalidate();(6)编译、链接并运行程序,窗口内画了一个圆;选择菜单命令File-“颜色对话 思考与练习:1、 对话框模版怎么样与对话框类进行连接:答:通过一下

37、这些类来实现: Windows 提供了一组标准对话框。与之相对应, MFC 提 供了相应的类来支持标准对话框主要有: CFileDialog 类 用于文件选择翻开或保 存文件对话框 CFontDialog 类 用于字体选择对话框; CColorDialog 类 用于颜 色选择对话框; CPrintDialog 类 用于打印机设置对话框; CFindReplaceDialog 类 用于字符串查找与替换对话框。另外, MFC 还提供了一些用于 OLE(Object Linking andEmbeddi ng. Database,对象链接嵌入数据库。2、对话框类拥有自己独立的消息循环,它一般处理什么消息?按钮控件发出什么消 息,其消息映射怎么写,为什么采用这种消息映射?答:它一般处理的是 WM_COMMAND 消息,通过添加该功能,在 OnInitDialog() 函数 中初始化。 当对话框接受 WM_INITDIALOG 消息时,对话框框架及控件已经建立起来, 但对话框中的控件还没显示出来。 这样就可在 OnInitDialog() 函数中设置对话框的外观、 大小及其他相关内容。按钮控件发出 ID 为 ID_TESTDLG 的消息。利用类向导,为ID_TESTDLG在

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论