实验6对话框Word格式文档下载.docx

上传人:b****6 文档编号:17680846 上传时间:2022-12-08 格式:DOCX 页数:17 大小:178.96KB
下载 相关 举报
实验6对话框Word格式文档下载.docx_第1页
第1页 / 共17页
实验6对话框Word格式文档下载.docx_第2页
第2页 / 共17页
实验6对话框Word格式文档下载.docx_第3页
第3页 / 共17页
实验6对话框Word格式文档下载.docx_第4页
第4页 / 共17页
实验6对话框Word格式文档下载.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

实验6对话框Word格式文档下载.docx

《实验6对话框Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《实验6对话框Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。

实验6对话框Word格式文档下载.docx

(6)创建对话框类:

通过点击菜单查看->

建立类向导弹出MFCClassWizard对话框并紧接着弹出AddingaClass对话框询问是否需要新建一个类,选取Createanewclass,确定后弹出新建类对话框。

(7)在新建类对话框中的Name编辑框中输入新建类名CPenDlg,其基类为CDialog,如下图,确定后,新建类已添加到工程中。

打开工作区的ClassView,可以看到新增加了一个类CPenDlg。

(8)为对话框控件添加变量和对象:

添加IDC_Width控件变量,在建立类向导对话框中选择MemberVariable,在Classname下拉列表中选择CPenDlg,为其添加控件变量和控件对象。

在ControlsIDs中选择IDC_Width,单击AddVariable按钮弹出对话框。

该控件变量名为m_nWidthEdit。

Category下拉列表框中选择Value,表示添加的是控件变量,(Control便是添加的是控件对象),Variabletype表示的是添加的变量或对象的类型,选择int。

单击OK按钮,界面返回到ClassWizard对话框,为该变量输入最小值1和最大值10。

如下图所示

(9)同理添加IDC_Width控件对象m_ctrlWidthEdit,Category下拉列表框中选择Control项;

添加IDC_SPIN控件对象m_ctrlSpin,Category下拉列表框中选择Control项,Variabletype选择为CSpinButtonCtrl。

(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():

BOOLCPenDlg:

OnInitDialog()

CDialog:

OnInitDialog();

m_ctrlSpin.SetBuddy(&

m_ctrlWidthEdit);

m_ctrlSpin.SetRange(1,10);

returnTRUE;

//returnTRUEunlessyousetthefocustoacontrol

//EXCEPTION:

OCXPropertyPagesshouldreturnFALSE

(12)在应用程序中显示对话框。

在应用程序工具栏中,添加新按钮“画”,表示画笔选择,在属性页中设置其ID为ID_TESTDLG,Prompt为“调用画笔选择对话框\n画笔选择”。

利用类向导,为ID_TESTDLG在CEx71view类中添加WM_COMMAND消息映射函数OnTestdlg(),代码如下:

voidCEx71View:

OnTestdlg()//需在此文件开始处引用头文件”PenDlg.h”

CPenDlgdlg;

dlg.DoModal();

(13)编译、链接并运行程序,单击工具栏的按钮“画”后出现新建的对话框。

但是,对话框目前还不能完成设置画笔宽度的功能,因为还没有创建相应的数据传递和绘图函数。

对话框数据交换(DDX)机制用于初始化对话框中的控件或从对话框中获得用户输入的数据;

对话框的验证(DDV)用于验证对话框中数据输入的有效性。

为了使对话框的数据成员能够使用DDX/DDV,则必须使用ClassWizard创建成员变量,设置数据类型,并指定验证规则。

ClassWizard通过一套特殊的语法格式来自动维护DDX/DDV。

在例1中,新建对话框包含一个编辑框控件用于设置画笔宽度,和编辑控件相关联的有两个变量:

一个控件(Control)变量和一个值(Value)变量。

如果使用DDX机制,则一般在OnInitDialog()处理函数或对话框构造函数中设置成员变量的初始值。

当一个对话框显示之后,所有初始值被传递到控件中。

在添加成员变量时,单击OK按钮关闭类向导对话框,那么类向导自动地在构造函数中加入控件的初始化值。

对话框数据交换时在对话框类的DoDataExchange()函数中完成的。

该例程中,用类向导给对话框添加成员变量后DoDataExchange()函数的代码如下:

voidCPenDlg:

DoDataExchange(CDataExchange*pDX)

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机制提示的出错信息。

修改上例,添加“画笔选择”菜单项,在该菜单项下,添加子菜单“模式对话框”和“无模式对话框”,其ID分别为ID_Modal和ID_NoModal,并分别为这两个子菜单项在CEx71View类中添加WM_COMMAND消息处理函数CEx71View:

OnModal()和CEx71View:

OnNoModal()。

这两个子菜单分别实现模式对话框和无模式对话框的调用。

对话框与视图间的数据传递:

1、首先,在视图类CEx71View中添加一个int型成员变量m_nWidth,用于实现与对话框成员变量m_nWidthEdit间的数据传递,并在CEx71View类的构造函数中将其初始化为1,即在构造函数中添加代码m_nWidth=1;

修改CEx71View:

OnDraw()函数,代码如下

OnDraw(CDC*pDC)

CEx71Doc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

CPenpen;

pen.CreatePen(PS_SOLID,m_nWidth,RGB(255,0,0));

pDC->

SelectObject(&

pen);

Ellipse(100,100,300,300);

}

2、修改CEx71View:

OnModal()函数,代码如下:

OnModal()

dlg.m_nWidthEdit=m_nWidth;

if(dlg.DoModal()==IDOK)

{

m_nWidth=dlg.m_nWidthEdit;

Invalidate();

修改例7.1,增加一个ID为IDD_NPenDlg的新对话框资源如下图所示。

启动类向导,添加名称为CNPenDlg的新类。

设置Apply按钮的ID为IDC_Apply,并给其添加BN_CLICKED消息响应函数OnApply()。

同时,在CNPenDlg类中添加相应的控件变量如图(CNPenDlg类与CPenDlg类的控件使用相同的变量):

继续修改,为CNPenDlg类添加WM_INITDIALOG消息响应函数OnInitDialog(),其代码如下:

BOOLCNPenDlg:

//将编辑框设置为微调控件的伙伴窗口。

在“无模式对话框”菜单项的响应函数CEx71View:

OnNoModal()中添加代码显示无模式对话框,方法如下:

先在CEx71View类中添加成员变量CNPenDlg*NpenDlg(其中,变量类型为CNPenDlg*,变量名为NpenDlg,访问权限为public)。

voidCEx71View:

OnNoModal()

NpenDlg=newCNPenDlg(this);

NpenDlg->

m_nWidthEdit=m_nWidth;

Create(CNPenDlg:

IDD);

ShowWindow(SW_SHOW);

为无模式对话框类CNPenDlg中添加重载的OnOK()函数:

voidCNPenDlg:

OnOK()

UpdateData(TRUE);

CDialog:

OnOK();

注意:

需要在ex71View.h文件中添加语句classCNPenDlg;

这是因为成员变量NpenDlg的定义放在头文件ex71View.h中,因此需要在该头文件开始处声明CNPenDlg类的定义。

编译、链接并运行程序,比较模式对话框和无模式对话框的不同点。

此时,无模式对话框的OK按钮和Apply按钮均不能起到改变画笔宽度的作用。

在CNPenDlg类的定义中增加一个CView类的指针CView*pView,重载一个构造函数CNPenDlg:

CNPenDlg(CView*pParent),构造函数将接受CEx71View的指针,并保存在pView中。

在NPenDlg.cpp中,添加CNPenDlg(CView*pParent)构造函数代码如下:

CNPenDlg:

CNPenDlg(CView*pParent)

pView=pParent;

为实现Apply按钮的功能,现在NpenDlg.h文件首部添加自定义消息:

#defineWM_APPLYWM_USER+1

然后利用类向导在CNPenDlg类中添加Apply按钮的消息处理函数OnApply(),实现向视图发送消息,代码如下:

OnApply()

pView->

PostMessage(WM_APPLY);

在视图中添加WM_APPLY消息的处理函数Apply()。

A.在Ex71View.h文件中添加WM_APPLY消息处理函数原型

afx_msgvoidApply(WPARAMwParam,LPARAMlParam);

B.在Ex71View.cpp中添加WM_APPLY消息的消息映射

ON_MESSAGE(WM_APPLY,Apply)

C.在Ex71View.cpp文件中添加Apply()函数的功能,代码如下:

Apply(WPARAMwParam,LPARAMlParam)

m_nWidth=NpenDlg->

m_nWidthEdit;

//将对话框中m_nWidthEdit的值传给视图的m_nWidth;

//重绘图形

D.实现OK按钮的功能

当用户单击OK按钮时,在关闭对话框前也需要向视图发送消息,通知视图进行重绘图形,发送消息的功能与Apply按钮功能相同。

编译、链接并运行程序,观察模式对话框与无模式对话框之间的区别。

例2.在应用程序中添加属性页对话框,并通过“对话框”菜单中的“属性页对话框”命令项进行显示。

步骤如下:

(14)利用AppWizard新建一个基于MFC【EXE】的单文档工程ex72.

(15)添加属性页对话框资源。

1、通过菜单命令工程->

添加到工程->

ComponentsandControls打开ComponentsandControlsGallery对话框。

2、在ComponentsandControlsGallery对话框中的目录列表中双击VisualC++Components条目,目录列表改变,拖动滚动条,找到PropertySheet项并选中。

3、单击Insert按钮,在弹出的MicrosoftVisualC++消息对话框中单击“确定”按钮后弹出PropertySheetWizard对话框。

4、在PropertySheetWizard对话框中选择所要添加的属性框类型。

默认的是一般类型的属性框,及选中的是PropertySheet,单击“下一步”。

5、在紧接着弹出的对话框中的Supportpreviewing复选框要求确认是否在属性框中添加预览功能,默认值为不添加预览功能。

下面的单选按钮时确认将属性框设置为模式还是无模式类型,默认值为模式,选中的是No。

保持默认值,单击“下一步”。

6、在接着弹出的对话框中要求选择在哪个类中对属性对话框进行操作。

通过ComboBox组合框控件,选中CEx72View。

单击“下一步”按钮。

7、在随后弹出的对话框中,要求确认属性框中的属性页个数,默认值为2,保持默认,单击“下一步”。

8、在接下来弹出的对话框中要求确认将要添加的CPropertySheet类和CPropertyPage类的派生类的名称。

可以通过单击按钮改变。

保留默认值,单击“完成”。

9、关闭ComponentsandControlsGallery对话框。

通过上述步骤,在程序中添加了如下一些内容:

●一个CPropertySheet类的派生类CMyPropertySheet。

●两个CPropertyPage类的派生类CMyPropertyPage1和CMyPropertyPage2。

●与CMyPropertyPage1来和CMyPropertyPage2类相关联的对话框资源。

●在CEx72View.cpp文件的头部添加了一条包含语句:

#include“MyPropertySheet.h”

在CEx72View类中添加了CEx72View:

OnProperties()函数。

内容如下:

VoidCEx72View:

OnProperties()

CMyPropertySheetpropSheet;

propSheet.DoModal();

(16)修改菜单资源,添加“对话框”菜单,并添加“属性页对话框”子菜单项。

其ID为ID_SheetDlg,Caption为属性对话框,在CEx72View中添加响应函数代码如下:

OnSheetDlg()

OnProperties();

编译、链接并运行程序,选中“对话框”菜单中的“属性页对话框”项,出现属性页对话框。

例2.设计“打开”和“保存”对话框,实现对文本文件的选择打开和保存。

(1)利用AppWizard生成基于MFC【EXE】的单文档应用程序ex73。

(2)添加文件对话框显示代码。

文件对话框的现实方法主要有两种:

一种是通过重载已经存在于MFC生成框架中的文件对话框;

另一种方法是直接调用代码显示对话框。

1、利用ClassWizard重载“文件”菜单下的“打开”子菜单。

在ex73工程中,打开ClassWizard,选择MessageMaps页面,在ClassName编辑框中选择CEx73View,在ObjectIDs编辑框中选择ID_FILE_OPEN,在Messages编辑框中选择COMMAND,单击AddFunction按钮,采用系统产生的默认名称OnFileOpen。

然后,单击EditCode按钮,编辑该函数的实现代码。

如下:

VoidCEx73View:

OnFileOpen()

CStringfilter=”TXTFiles(*.txt)|*.txt||”;

CFileDialogmydialog(TRUE,0,0,OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY,filter);

If(mydialog.DoModal()==IDOK){

CStringstr=mydialog.GetPathName();

MessageBox(str);

2、在响应函数中添加调用代码,在工程ex73中,添加新的菜单“公共对话框”并在其下添加新的子菜单项“文件对话框”。

ID为ID_FileDlg,prompt为文件对话框。

相应的WM_COMMAND消息处理函数代码同上。

编译、运行程序,当单击“打开”或者“文件对话框”。

例3.通过字体对话框来选择所显示文本的字体和颜色。

(1)利用AppWizard创建一个基于MFC的单文档应用程序ex74.

(2)在视窗中,用初始化的字体及颜色显示字符串“Hello,Fontdialogtest!

”。

首先在CEx74View类中定义两个成员变量:

LOGFONTfnt和COLORREFcrColor分别表示字体即颜色,并在CEx74View类的构造函数中对量变量进行初始化,代码如下:

CEx74View:

CEx74View()

crColor=RGB(255,0,0);

//字体初始颜色红色,与圆的颜色相同

memset(&

fnt,0,sizeof(LOGFONT));

strcpy(fnt.lfFaceName,"

Arial"

);

//初始字体名称

fnt.lfHeight=50;

//字体初始高度

然后修改OnDraw函数,用所给字体及颜色来显示字符串。

代码如下:

voidCEx74View:

CEx74Doc*pDoc=GetDocument();

SetTextColor(crColor);

/字体的颜色

CFontmyfont;

myfont.CreateFontIndirect(&

fnt);

//间接创建一字体

pDC->

myfont);

TextOut(100,100,"

Hello,Fontdialogtest!

"

添加“字体选择”菜单项,其ID为ID_Font,并为该菜单项添加WM_COMMAND消息处理函数OnFont(),通过该函数可以显示字体对话框,并使选择的字体及颜色有效,代码如下:

OnFont()

CFontDialogdlg(&

//用构造函数初始化对话框中的字体

dlg.m_cf.rgbColors=crColor;

//初始化对话框中的颜色

dlg.GetCurrentFont(&

//获取所选字体

crColor=dlg.GetColor();

//获取所选颜色

}

例4.通过颜色对话框来改变在客户区所画圆的颜色。

(1)新建一个MFCAppWizard[exe]类型的单文档工程ex75。

(2)在ex75中,打开菜单资源编辑器编辑菜单,在File主菜单下增加新的菜单项“颜色对话框”,其ID实ID_COLORDIALOG。

(3)在CEx75View类中增加新的数据成员COLORREFcrColor,代表所画圆采用的颜色。

(4)在CEx75View类的OnDraw()函数中增加绘制椭圆的代码如下:

voidCEx75View:

CEx75Doc*pDoc=GetDocument();

CPenmypen;

mypen.CreatePen(PS_SOLID,3,crColor);

SelectOb

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 动态背景

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1