当前位置:文档之家› VC++6.0入门【第六章 创建和使用对话框】

VC++6.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使用文档对象描述应用程序处理的数据,用户输入的数据要进一步的处理,通常要先存贮到文档对象中。例如:一个学生记录处理的应用程序,用户通过一个对话框输入学生记录并贮存到一个文件中。应用程序的处理顺序是:用户在对话框中输入信息,通过对话框对象得到输入信息,将输入信息整理到文档对象中,使用序列化函数将文档对象存贮到一个文件中,所以文档对象扮演了一个很重要的数据交换的角色。

MFC使用以上三者实现用户与应用程序之间数据交换,数据交换流程见图6-1所示,遵循四个步骤。

图6-1 对话框基本原理

6.1.2 对话框的类型

对话框分为模式对话框和无模式对话框两种。

当一个模式对话框打开了,在其关闭之前,用户不能转向其它用户界面对象,只能与该对话框进行交互。我们平时接触到的对话框,大多数都是模式对话框,例如,一个执行菜单命令File->Save 后,Save 对话框被打开后,用户不能再做其它工作,只能保存完文件或取消保存文件,关闭对话框窗口后,才能做其它工作。

无模式对话框恰恰相反,当用户打开一个无模式对话框,对话框停留在屏幕上,仍然允许用户与其它用户界面对象进行交互。无模式对话框最典型的例子是在Word 中使用的查找与替换对话框,打开该对话框后,可以交替地进行文档编辑,和查找替换操作。

从第一节的介绍可以看到对话框的设计任务主要包括对话框资源模板的设计,对话框类的设计和对话框的运行,绝大多数对话框的创建任务,模式对话框和无模式对话框都是相同的,只有在对话框与应用程序代码的交互中,也就是对话框的运行中,两者有明显的区别。

6.2设计对话框资源 6.2.1创建对话框

使用AppWizard 生成的单文档或多文档应用程序,只有一个默认的About 对话框,用于显示应用程序版本信息。需要使用对话框模板创建自己的对话框资源。

Develop Studio 提供的对话框模板创建了一个基本界面,包括一个OK (确定)按钮和一个Cancel (取消)按钮等。你可以移动、修改、删除这些控件,或者是增加新的控件到对话框模板,构成应用程序所需的对话框资源。

创建一个对话框资源到工程的步骤:

(1) 使用AppWizard 生成一个单文档的MFC 应用程序Exam6_1。 (2) 选择Insert->Resource 菜单命令。

(3) 在弹出的Insert Resource 对话框左边的列表中选择Dialog ,单击New 按钮。

(4) 在项目工作区中选择ResourceView 面板,展开Dialog 文件夹,可以看到增加了一个对话框资源

IDD_DIALOG1,如图6-2

所示,双击IDD_DIALOG1,在编辑区出现一个对话框模板。

图6-2 Exam6_1对话框设计_新建对话框资源

6.2.2增加控件

一个控件是能够放置在一个对话框中,提供应用程序与用户交互的某种功能。例如,Edit Box 提供用户文本输入的场所,一组Radio Button 提供用户对某一主题的单项选择。MFC 将控件设计为对话框窗口的子窗口,控件通过事件通知消息与父窗口联系。

在一个对话框资源中增加控件的操作十分方便,只需从图6-2所示的控件工具栏中选中要增加的控件,再将此控件拖拉至对话框模板中的确定位置上,松开鼠标按键即生成一个控件。调整控件的位置和大小的操作与Word 中对文本框的操作完全一样。

在默认情况下,控件工具栏总是打开的,如果没有打开,可以在Develop Studio 工具栏后的空白处,单击鼠标右键,在弹出的快捷菜单中选择Controls ,便可打开控件工具栏。

图6-3中列出了VC ++6.0中支持的标准控件名称,我们可以很方便地从控件工具栏中生成新的控件,但每一种控件都具有不同的特性,需要学习和掌握。

对话框模板

对话框资源ID

控件工具栏

图6-3 标准控件

下面我们试着设计一个可以输入5门功课成绩的输入窗口,在上一节生成的对话框资源IDD_DIALOG1中做以下操作,得到如图6-4所示的对话框:

(1)调整对话框模板窗口大小,将OK和Cancel按钮移到窗口的底部。

(2)控件工具栏中选中Static Text(静态文本)控件,拖到对话框模板中。

(3)通过复制和粘贴操作,生成其它四个Static Text控件。

(4)控件工具栏中选中Edit Box控件(编辑框),拖到对话框模板中。

(5)通过复制和粘贴操作,生成其它四个Edit Box控件

图6-4 EX6对话框设计_增加控件

6.2.3设置控件属性

一个控件相关的属性设置决定了一个控件可操作行为和显示。例如,控件的ID是控件的一个重要属性,MFC内部是以控件ID来标识一个控件,当消息产生后,是哪一个控件需要进行处理,MFC 内部使用的是控件ID。

属性的设置是在与每个控件相对应的属性对话框中进行的,单击鼠标右键,在弹出的快捷菜单中选择Properties,打开属性对话框。每一种控件的属性对话框都有所不同,与其特性相关,在下一章我们将详细介绍一些常用控件的属性含义。

对上一节的对话框IDD_DIALOG1中的控件作属性设置:

(1)鼠标选中第一个Static Text对象,单击鼠标右键,在弹出的快捷菜单中选择Properties,弹出属

性对话框,如图6-5所示。

图6-5 属性对话框设置

(2)修改Caption右边的文本框,输入“高等数学”,单击关闭按钮,关闭属性对话框。

(3)重复步骤(1)(2),将其它四个Static控件的Caption改为“大学物理”,“大学英语”,“哲学”和

“计算机基础”。

(4)同样的操作打开5 个Edit Box控件的属性对话框,修改ID为IDC_SCORE1、IDC_SCORE2、

IDC_SCORE3、IDC_SCORE4、IDC_SCORE5。

(5)打开按钮OK的属性对话框,修改Caption为“确定”。

(6)打开按钮Cancel的属性对话框,修改Caption为“取消”。

操作完毕,对话框如图6-6所示。

图6-6 EX6对话框设计_设置属性

同样,对话框的属性设计也是在对话框的属性对话框中设置,在对话框任意空白处单击鼠标右键,在弹出的快捷菜单中选择Properties,如图6-7所示。在Caption中填写“成绩录入”,将成为对话框的标题,单击Font会弹出字体对话框,能设置对话框中显示的字体格式。其它的几个标签页还提供了选项,可以修改对话框窗口的显示样式,可以自己试一试。

图6-7 对话框属性设置

6.2.4组织和安排控件

当选择了一个对话框资源进入对话框编辑器时,Develop Studio的菜单栏上会增加一个菜单Layout,如图6-8所示。Layout 菜单提供了在对话框模板中合理布置控件的功能菜单项。

Align提供了控件的六种对齐方式:左对齐、右对齐、上对齐、下

对齐、水平居中、垂直居中。

Space Evenly提供了两种等间距方式:垂直方向等间距、水平方

向等间距。

Make Same Size提供了三种等尺寸方式:宽相等、高相等、两者

都相等。

Arrange Button提供了两种组织按键的方式:底部排列、右边排

列。

Center in Dialog提供了两种居中方式:水平居中、垂直居中。

Flip用于水平反方向显示控件及窗口标题。

Size to Content命令根据内容决定控件的大小,例如,按钮的大小

由按钮上的显示文本决定。

图6-8 Layout下拉菜单

通过上面几个菜单项的操作能够很方便地齐整控件的摆放位置。现在我们可以整理一下IDD_DIALOG1中摆放凌乱的控件:

(1)确定第一个和最后一个Static Text控件的位置,同时选中5个Static Text控件,执行菜单命令

Layout->Make Same Size-width

(2)执行菜单命令Layout->Align-Bottom,水平对齐5个控件。

(3)执行菜单命令Layout->Space Evenly-Across,使5个控件水平等间距。

(4)选择“哲学”,执行菜单命令Layout->Size to Content,微调控件位置

(5)确定第一个和最后一个Static Text控件的位置,同时选中5个Static Text控件,执行菜单命令

Layout->Align->Bottom和Layout->Space Evenly->Across。

操作完毕,可以看到控件整齐地排放在对话框模板上,如图6-9所示。

图6-9 EX6对话框设计_整理控件

在Windows环境中通常提供两种操作方法,鼠标操作方式和键盘操作方式,使用鼠标可以直接点击控件进行访问,使用键盘访问控件需要通过Tab键顺次找到某个控件。Tab Order规定了使用Tab键访问

控件的顺序,一般Tab Order是控件生成的顺序,执行菜单命令Layout->Tab Order可以显示并修改Tab Order,对IDD_DIALOG1执行菜单命令Tab Order 如图6-10所示。

图6-10 显示Tab Order

改变Tab Order的方法既简单又直观,执行了Tab Order命令出现了顺序号之后,按你所想要的访问顺序依次点击每一个控件,完成后,点击空白处就可以了。读者可以试练习将上图的Tab顺序变成先访问第一个Edit Box,访问完所有的Edit Box后再访问Button。

6.2.5测试对话框

当构造好一个对话框后,还不能立即在应用程序中运行对话框,MFC提供了Test命令,使程序员在设计阶段就能够测试对话框的运行效果。

测试对话框的方法有:

(1)菜单命令Layout->Test

(2)Dialog工具栏上的Test按钮

(3)快捷键Ctrl+T

测试对话框IDD_DIALOG1,试着使用文本框输入,并使用Tab键是否符合要求。如图6-11所示。

测试对话框窗口

图6-11 Exam6_1对话框设计_测试对话框

6.3设计对话框类

一个对话框资源要加入到一个窗口应用程序中,首先要为它创建一个对话框类,是CDialog类的派生类。应用程序运行时,窗口操作系统使用对话框类为对话框在内存开辟空间。

在Win32 API类型的窗口应用程序中,都是直接通过控件ID来访问对话框上的控件的,而MFC提供了连接变量来标识控件,连接变量是对话框的成员变量,同时对话框类有一套交换和验证数据的方式。

6.3.1 创建对话框类

创建对话框类的步骤如下:

1.保存已创建好的对话框模板。

2.确保新的对话框资源在对话框编辑器中打开状态下,打开ClassWizard窗口。

打开ClassWizard的方式有3种:

(1)窗口菜单命令View->ClassWizard

(2)快捷菜单命令ClassWizard

(3)快捷键:Ctrl+w

3.在弹出的Adding a Class对话框中,如图6-12所示,选择Create a new class单选钮,单击OK按钮。

图6-12 “增加类”对话框

4.在随后弹出的New Class对话框中,如图6-13所示,只需填写类的名称:CScoreDlg,单击OK按钮。

关闭ClassWizard,对话框类的创建就完成了。

图6-13 填写新类名称

在Workspace 窗口的ClassView 面板中,可以看到增加了一个新的类CScoreDlg ,选择FileView 面板,在Header Files 和Source Files 文件夹中,可以看到该类的头文件和实现文件,文件名是类名除去开头的类标志“C ”。

图6-14 新增对话框类及文件

在创建新类的时候,要注意新类的对话框ID 一定要与对话框资源ID 一致,这些ID 告诉对话框类,在对话框窗口创建前,哪一个对话框资源要被检查,初始化控件并显示。尤其在创建好对话框后,不能随意地改动对话框资源ID 和删除对话框资源。

6.3.2 创建对话框成员变量

创建好一个对话框类后,可以增加类的成员变量来操作对话框上的控件。出于不同的操作目的,MFC 提供了两种类型的成员变量,如表6-1所示。

表6-1 对话框类的成员变量类型

例如,创建了CScoreDlg类后,需要为对话框中每一个Edit Box控件创建一个值类型的成员变量,来取得用户在EditBox输入的数据,增加控件成员变量的步骤如下:

(1)打开ClassWizard窗口,选择Member Variables标签页,Class name下拉列表中选择CScoreDlg

类。这时,对话框中可以创建成员变量的控件ID出现在下方的Control IDs列表中,如图6-15所示。

图6-15 增加一个对话框类的成员变量

(2)选择一个IDC_SCORE1,单击Add Variable按钮,弹出Add Member Variable对话框,Member

variable name编辑框中填写变量名为:m_score1,确认Category下拉框中为:V alue,在Variable type下拉框中选择为:int。

(3)单击OK按钮,回到ClassWizard窗口,可以看到新增的成员变量出现在列表中。同样的操作增

加其它四个成员变量。

(4)如果增加成员变量时操作有误,例如变量名错误,变量类型错误,选择该成员变量,单击Delete

Variable按钮删除该变量,再重新创建。

创建好的成员变量如图6-16所示。

变量类型变量名称

图6-16 成员变量列表

创建好成员变量后,我们来检查一下ClassWizard作了哪些工作:

(1)展开项目工作区的ClassView面板中的CScoreDlg类,在树目录上出现了刚创建的成员变量。

(2)双击CScoreDlg的类名,进入该类的头文件ScoreDlg.h,可以找到对话框类定义的代码,如程

序清单6-1中所示。

程序清单6-1:对话框成员变量定义示例

class CScoreDlg : public CDialog

{

// Construction

public:

CScoreDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data

//{{AFX_DATA(CScoreDlg)

enum { IDD = IDD_DIALOG1 };

int m_score1;

int m_scroe2;

int m_score4;

int m_score5;

int m_score3;

//}}AFX_DATA

... ...

}

其中呈灰色显示的,在宏“{{AFX_DA TA(CScoreDlg)......}}AFX_DATA”之间定义的是用ClassWizard 创建的成员变量。需要注意的是,所有ClassWizard 产生的灰色显示的代码,不要在文件中直接修改,而应在ClassWizard工具中进行修改,不然容易引起错误。

(3)打开该类的构造函数,可以看到ClassWizard自动加入了成员变量的初始化代码,如程序清单

6-2所示。

程序清单6-2:对话框类的构造函数

CScoreDlg::CScoreDlg(CWnd* pParent /*=NULL*/)

: CDialog(CScoreDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CScoreDlg)

m_score1 = 0;

m_scroe2 = 0;

m_score4 = 0;

m_score5 = 0;

m_score3 = 0;

//}}AFX_DATA_INIT

}

6.3.3 对话框数据交换和校验

对话框的值类型的成员变量存储了与控件相对应的数据,对框话打开时,用户可以修改控件的数据,有时需要应用程序对用户的输入进行及时反馈,这时数据成员变量需要与控件交换数据,以完成输入输出功能。对于这种功能MFC是靠CDataExchange类提供的数据交换(DDX:Dialog Data Exchange)机制来完成的,该类提供了数据有效机制(DDV:Dialog Data Validation)

当在对话框类中增加一个数据成员变量,有时需要规定数据的有效性校验规则,例如,成绩录入对话框中,应设置各门课的成绩应在0-100的范围内。在应用程序运行的时候,当用户输入数据拷贝到数据成员变量时,DDV机制被调用,如果有效性校验失败,即用户输入一个不合理的数据时,将出现一个错误信息对话框,并返回到出现错误输入的控件。

有效性校验的设置也是在ClassWizard中完成的。我们再回到成绩录入的Member Variables标签页,选择表示成绩输入框的m_score1,在标签页的下方会出最大值和最小值的输入框,如图6-17所示,填入0和100。如果一个CString型的数据成员变量对应的通常是字符串的长度。

图6-17 添加数据成员变量的有效范围

对话框类调用DoDataExchange函数来实现DDV和DDX,对应图6-17的CScoreDlg类的DoDataExchange代码如程序清单6-3所示。

程序清单6-3:对话框类的DoDataExchange函数

void CScoreDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CScoreDlg)

DDX_Control(pDX, IDOK, m_OK); //控件对象数据交换

DDX_Control(pDX, IDC_SCORE5, m_Score5Edit); //文本框数据交换

DDX_Control(pDX, IDC_SCORE4, m_Score4Edit);

DDX_Control(pDX, IDC_SCORE3, m_Score3Edit);

DDX_Control(pDX, IDC_SCORE2, m_Score2Edit);

DDX_Control(pDX, IDC_SCORE1, m_Score1Edit);

DDX_Text(pDX, IDC_SCORE2, m_score2);

DDX_Text(pDX, IDC_SCORE3, m_score3);

DDX_Text(pDX, IDC_SCORE4, m_score4);

DDX_Text(pDX, IDC_SCORE5, m_score5);

DDX_Text(pDX, IDC_SCORE1, m_score1);

DDV_MinMaxInt(pDX, m_score1, 0, 100); //最大最小值检查

//}}AFX_DATA_MAP

}

pDX指针指向一个CDataExchange对象,DDX函数来完成控件和数据成员变量之间的数据交换,DDV完成数据有效性检查。DDX和DDV适用于文本框、复选框、单选按钮、列表框和组合框。

当程序需要交换数据时,不需要编写代码调用DoDataExchange函数,而应该调用CWnd::UpdateData()函数,UpdateData()函数内部调用了DoDataExchange函数。UpdateData()函数只有一个BOOL类型的参

数,决定数据交换的方向:

(1) UpdateData (false )

将对话框对象的数据成员变量的值拷贝到对话框中的控件。 (2) UpdateData (true )

将对话框中控件的值拷贝到对话框对象的数据成员变量。

你可以随时在需要进行数据交换时调用相应的UpdateData()函数,例如,在成绩录入的对话框中增加两个控件,一个是Edit Box 用于显示总分,另一个是Button 用于计算总分,则在Button 的Click 事件处理函数中,就需要先调用UpdateData(true)获取用户录入的5门功课的成绩,在计算总分后,调用UpdateData(false),将总分显示在Edit Box 中。

在默认的CDialog::OnInitDialog()函数中调用了UpdateData(false),这样在对话框创建的时候,数据成员的初值就会反映到相应的控件上。若用户单击OK (确定)按钮关闭对话框,CDialog::OnOK()函数会调用UpdateData(true),将控件中的数据传给数据成员变量,如图6-18所示。图中说明了对话框的控件与对话框对象之间的数据交换是由框架自动完成的,而对话框对象与文档对象之间的数据交换则需要编写代码。

图6-18 数据交换和验证在应用程序中的实现

6.4 运行对话框

创建好一个对话框资源和对话框类,要在应用程序中运行对话框,通常要在一个菜单命令下打开一个对话框。所以,首先要定义一个菜单项和相应的菜单命令处理函数,在函数中编写代码运行对话框。

运行模式对话框和无模式对话框有所不同,下面结合实例详细介绍两种对话框运行的方法。

6.4.1模式对话框

在应用程序中使用得更多的还是模式对话框,模式对话框的运行分两个步骤: (1) 创建一个对话框对象

(2) 调用CDialog::DoModal()函数打开对话框

DoModal()函数负责模式对话框的创建和撤消。在创建对话框时,DoModal()的任务包括:装载对话框资源、调用OnInitDialog()初始化对话框和将对话框显示在屏幕上。完成对话框的创建后,DoModal()启动一个消息循环,以响应用户的输入。这时,用户只能与对话框进行交互,其它用户界面对象收不到输入信息,只有终止模式对话框后才能进行其它工作。

若用户在对话框内单击了系统默认的OK (确定)按钮,则CDialog::OnOK()函数将被调用,OnOK()首先调用UpdateData(true)函数,将数据从对话框中的控件拷贝到数据成员变量,再调用

CDialog::EndDialog()关闭对话框,并返回值IDOK。

若用户在对话框单击了系统默认的Cancel(取消)按钮,则CDialog::OnCancel()函数将被调用,该函数只调用CDialog::EndDialog()关闭对话框,并返回值IDCANCEL。程序可以根据返回值是IDOK还是IDCANCEL来判断用户关闭对话框按的哪一个键。

下面我们将运行成绩录入对话框,当按“确定”按钮返回时,将其显示在主窗口视图上。为此,要定义对应的文档对象。步骤如下:

1.增加文档类公有变量并设置初值

int型成员变量数组score[5],存放5门课程成绩;int型成员变量TScore,用来存放总分。

在构造函数中设置数组score和TScore的初值都为0。

2.在视图类OnDraw函数中添加代码实现成绩的输出

具体代码见程序清单6-4所示粗体部分。

程序清单6-4:OnDraw函数输出int型文档类成员变量的值

void CExam6_1View::OnDraw(CDC* pDC)

{

CExam6_1Doc* pDoc = GetDocument();

ASSERT_V ALID(pDoc);

// TODO: add draw code for native data here

pDC->TextOut(0,0,"高等数学大学物理大学英语哲学计算机基础总分") ;//输出表头

CString str;//将int型数据转换为格式字符串

str.Format("%10d%16d%16d%16d%16d%18d",pDoc->score[0],pDoc->score[1],

pDoc->score[2],pDoc->score[3],pDoc->score[4],pDoc->TScore );

pDC->TextOut(0,20,str); //输出成绩

}

3.增加一个菜单项

在“编辑”菜单的最下面增加一个菜单项,Caption 为“成绩录入”,菜单ID为ID_SCOREFILLING。4.为新增菜单在文档类定义消息处理函数

用ClassWizard在文档类生成菜单命令处理函数OnScorefilling()。

5.编辑代码完成下面的功能

(1)创建对话框对象。

(2)运行成绩录入对话框,并把对话框数据成员的值拷贝到文档类成员变量score数组中。

(3)计算总分。

(4)更新视图。

具体代码见程序清单6-5所示粗体部分。

程序清单6-5:调用模式对话框示例

void CExam6_1Doc::OnScorefilling()

{

// TODO: Add your command handler code here

CScoreDlg dlg; //创建对话框对象

if(dlg.DoModal()==IDOK )//调用对话框并判断返回值为IDOK

{ //使用对话框对象的成员变量的值修改文档对象的成员变量

score[0]=dlg.m_score1 ;

score[1]=dlg.m_score2 ;

score[2]=dlg.m_score3 ;

score[3]=dlg.m_score4 ;

score[4]=dlg.m_score5 ;

for(int i=0;i<5;i++) //计算总分

TScore+=score[i];

this->UpdateAllViews(NULL); //更新视图

}

}

6.加入头文件

在Exam6_1Doc.cpp文件的头部的所有的include语句之后加入语句:#include “ScoreDlg.h”

7.编辑运行程序

执行菜单命令“编辑”->“成绩录入”,弹出“成绩录入”对话框,输入各门课的成绩后,按“确定”退出对话框,应用程序主窗口中显示刚刚输入的各课成绩和总分。

6.4.2对话框初始化

对话框的初始化工作包括:为控件赋初始值(如:文本框的显示值,单选按钮,复选框的选中状态等),或者设置控件的初始状态(如:控件是否可用、是否显示,下拉框中的选择项等)。

为控件赋初始值也就是为对话框对象的数据成员变量赋初值,可在两个位置进行:

1.对话框类的构造函数

系统一般在对话框类的构造函数中,为数据成员变量赋初值。

2.对话框对象创建后

对话框对象一般在一个菜单命令处理函数中创建,创建后在对话框调用之前,也就是在DoModal ()函数调用之前,可以通过对象调用数据成员变量为其赋初值。

修改程序清单6-5中的OnScorefilling()函数,实现每次调用成绩录入对话框时,以文档对象score 数组中现有的成绩为初始值,作为对当前视图的修改。增加的代码见程序清单6-6所示粗体部分。

程序清单6-6:模式对话框数据成员赋初值

void CExam6_1Doc::OnScorefilling()

{

// TODO: Add your command handler code here

CScoreDlg dlg;//创建对话框对象

dlg.m_score1=score[0]; //初始化对话框数据成员

dlg.m_score2=score[1];

dlg.m_score3=score[2];

dlg.m_score4=score[3];

dlg.m_score5=score[4];

if(dlg.DoModal()==IDOK )

{score[0]=dlg.m_score1 ;

score[1]=dlg.m_score2 ;

score[2]=dlg.m_score3 ;

score[3]=dlg.m_score4 ;

score[4]=dlg.m_score5 ;

for(int i=0;i<5;i++)

TScore+=score[i];

this->UpdateAllViews(NULL);

}

}

修改后再次编译运行程序,可以看到每次对话框打开时,控件的初值都能反应当前视图的显示。程序清单6-6也给出的调用对话框的一个范例,一般遵循四个基本步骤:

(1)创建对话框对象

(2)初始化对话框

(3)调用对话框

(4)确定返回后的处理

图6-18中文档对象和对话框对象之间交换数据通常是在第(2)、(4)步编写代码完成的。

设置控件的初始状态,可以直接在对话框资源中各控件的属性对话框中进行,更灵活地方式是在对话框类的OnInitDialog()函数中进行控件的设置。默认情况下,OnInitDialog()函数不出现在对话框类中,需要映射对话框类的WM_INITDIALOG窗口消息。

下面继续修改应用程序Exam6_1,实现功能:打开成绩录入对话框时,“确定”按钮不可用,当任意一个Edit Box 的内容修改后,“确定”按钮可以使用。实现步骤如下:

(1)打开ClassWizard的Member Variables标签页,增加数据成员变量如表6-2所示。

表6-2 EX6数据成员变量设置

(2)打开ClassWizard的Message Maps标签页,Class name中选择CScoreDlg类,Objects IDs中选

择CScoreDlg,Messages中选择WM_INITDIALOG窗口消息,单击Add Function按钮。在对话框类CScoreDlg中增加了成员函数OnInitDialog()。

(3)增加代码如程序清单6-7所示粗体部分。使对话框显示时,“确定”按钮灰色显示不能使用。

程序清单6-7:初始化对话框函数示例

BOOL CScoreDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// TODO: Add extra initialization here

m_OK.EnableWindow (false);//禁止“确定”按钮使用,灰色显示

return TRUE; // return TRUE unless you set the focus to a control

// EXCEPTION: OCX Property Pages should return FALSE

}

(4)打开ClassWizard 的Message Maps标签页,Class name中选择CScoreDlg,Object IDs中选择

IDC_SCORE1,Messages中选择EN_CHANGE事件消息,单击Add Function按钮。对话框类CScoreDlg增加对Edit Box进行修改事件的处理函数OnChangeScore1()。

(5)在OnChangeScore1()函数中添加代码如程序清单6-8所示粗体部分,使“确定”按钮可用。

程序清单6-8:EditBox响应EN_CHANGE事件处理函数示例

void CScoreDlg::OnChangeScore1()

{ // TODO: Add your control notification handler code here

m_OK.EnableWindow (true);

}

(6)重复(4)、(5)两步,为每一个Edit Box控件映射EN_CHANGE事件处理函数,并添加代码,使

“确定”按钮可用。

(7)编译运行程序。

6.4.3无模式对话框

无模式对话框与模式对话框的不同在于,用户打开无模式对话框后,仍然可以与其它用户界面交互。创建无模式对话框的过程与模式对话框基本相同,都包括对话框资源的创建和对话框的创建,但在运行对话框的设计上存在着差异:

(1)Visible 属性

在对话框的属性对话框More Styles标签页中,有Visible属性的设置,默认情况下,对话框模板是不选择Visible属性。模式对话框不需要设置该属性,而无模式对话框没有选择该属性,窗口创建后,对话框是不显示的,需要调用CWnd::ShowWindow(SW_SHOW)来显示对话框。

(2)创建方式

由于无模式对话框对象在程序运行时可以一直存在,所以不能以局部变量的形式创建,只能用new 操作符动态创建,并且在调用对话框类的窗口类内声明一个指向对话框类的指针变量,通过指针访问对话框对象。

(3)窗口创建方式

无模式对话框的创建与普通窗口的创建是一样的,通过调用CWnd::Create()函数来创建对话框。由于Create()函数不会启动新的消息循环,对话框与应用程序共用一个消息循环,这样对话框就不会屏蔽用户对其它界面对象的访问。Create()函数与DoModal()函数不同之处是:Create()创建了对话框后立即返回,而DoModal()函数要在对话框关闭后返回。

(4)窗口删除函数

无模式对话框必须调用CWnd::DestoryWindow()来关闭对话框。模式对话框是调用CDialog::EndDialog()关闭对话框。由于默认的对话框函数OnOK()和OnCancel()都是调用EndDialog()关闭对话框的,所以无模式对话框类要用自己的OnOK()和OnCancel()函数,调用DestoryWindow()来关闭对话框。

(5)清理对话框对象的方式

与创建对象的方式new操作相对应,使用delete操作删除一个无模式对话框对象。当屏幕上一个窗口被删除后,框架会自动调用CWnd::PostNcDestroy(),这是一个函数,可以编写程序在这个函数中清理无模式对话框对象。

(6)无模式对话框不能重入

因为在无模式对话框打开的情况下,用户有可能再次选择菜单命令执行打开对话框的操作,这是不能再创建一个新的无模式对话框。所以程序在用户选择菜单命令后,应该能够判断是打开一个新的对话框还是激活一个已打开的对话框。通常可以使用对话框对象指针来判断。对话框对象指针始终指向一个对话框对象,当关闭对话框时,设置指针的值为NULL。

下面我们在工程Exam6_1中增加一个可以画圆的无模式对话框:

1.增加一个对话框模板

使用菜单命令Insert->Resource,增加一个新的对话框模板IDD_DIALOG2,如图6-19所示,增加相应控件并设置属性。

表6-3 数据成员变量

2.创建对话框类

打开ClassWizard,创建一个新的对话框类CModelessDlg,并按表6-3创建对话框类的数据成员变量。

3.定义消息处理函数,重载虚函数

使用ClassWizard按表6-4为CModelessDlg创建成员函数。

表6-4 定义消息处理函数

4.定义对话框指针

(1)在CExam6_1View视图类中增加CModelessDlg指针类型的公有成员变量m_pDlg。

(2)在Exam6_1View.h文件的头部增加类的前向声明语句:

class CModelessDlg;

class CExam6_1Doc;

类的向前声明语句的作用:由于在CExam6_1View类中有一个CModelessDlg类的指针和一个返回值为CExam6_1Doc指针的GetDocument()函数,因此必须保证CModelessDlg类和CExam6_1Doc类的声明出现在CExam6_1View之前,否则会产生编译错误。

5.增加调用对话框的菜单命令

(1)在“查看”菜单的最下面增加一个菜单项:ID为ID_CIRCLE,Caption为“画圆”。

(2)使用ClassWizard为菜单项在CExam6_1View视图类中映射命令处理函数

CExam6_1View::OnCircle()。

6.增加对话框类成员变量接收视图指针

(1)在CModelessDlg类增加CExam6_1View类指针类型的公有成员变量m_parent。

“设置”对话框打开时,只要单击“画圆”按钮,就可以在主窗口视图上画一个圆,所以在对话框“画圆”按键事件的消息处理函数中要能获得主窗口视图的指针,并创建一个指向主窗口视图的CClientDc对象实现画圆。

(2)在ModelessDlg.h文件的头部预编译命令之前增加类的前向声明语句:

class CExam6_1View;

7.定义头文件

在Exam6_1View.cpp文件的头部所有的include语句之后添加include 语句,将对话框类的头文件包含进来。

#include "ModelessDlg.h"

在ModelessDialog.cpp文件的头部所有的include语句之后添加include 语句将视图类的头文件包含进来。

#include "CExam6_1View.h"

8.实现视图类中的成员函数

(1)在构造函数中设置m_pDlg的初值为NULL。

(2)在菜单命令处理函数OnCircle()中判断对话框是否打开,若已打开则激活对话框,否则创建一个

新的对话框。

代码见程序清单6-9粗体部分所示。

程序清单6-9:修改视图类的函数

CExam6_1View::CExam6_1View()

{

// TODO: add construction code here

m_pDlg=NULL;

}

void CExam6_1View::OnCircle()

{

// TODO: Add your command handler code here

if (m_pDlg)

m_pDlg->SetActiveWindow();//激活对话框

else

{// 创建对话框

m_pDlg=new CModelessDlg(this); //创建对话框对象

m_pDlg->m_parent=this; //对话框对象获取主窗口视图指针

m_pDlg->Create (IDD_DIALOG2,this); //创建对话框窗口

m_pDlg->ShowWindow(SW_SHOW);//显示对话框

}

}

9.实现对话框类中的成员函数

(1)OnOK()函数对应“画圆”按钮的按键事件,实现画圆。

(2)OnCancel()函数对应“取消”按钮的按键事件,实现删除对话框窗口。

MFC知识点(自己整理的,只供参考)

知识点:不是很全面,只供参考 第一章 Windows应用程序使用的界面是由各种图形元素组成的图形界面(GUI)。 Windows提供了大量预定义的用C语言编写的函数,这些函数就叫做API(Application Programming Interface)函数。 在Windows应用程序中,存在着许多与DOS应用程序不同的复杂对象,例如窗口、按钮、滚动条等等。Windows把为这种复杂对象所定义的标识叫做句柄。 常用的句柄类型:HWND 窗口句柄,HDC 图形设备环境句柄,HINSTANCE 当前程序应用实例句柄,HBITMAP 位图句柄,HICON 图标句柄,HCURSOR 光标句柄,HBRUSH 画刷句柄,HPEN 画笔句柄,HFONT 字体句柄,HMENU 菜单句柄,HFILE 文件句柄 事件的描述是一个消息 消息的结构: typedef struct tagMSG { HWND hwnd; //产生消息的窗口句柄 UINT message;//消息的标识码 WPARAM wParam;//消息的附加信息1 LPARAM lParam;//消息的附加信息2 DWORD time; //消息进入消息队列的时刻 POINT pt; //表示发送该消息时鼠标的位置 }MSG; 消息循环: while(GetMessage(&msg,NULL,NULL,NULL))//系统处理了消息后返回 { TranslateMessage(&msg);//把键盘消息翻译成字符消息 DispatchMessage(&msg);//把消息派发给Windows系统 创建窗口的三个步骤: 注册窗口类: RegisterClass(&wc); 创建窗口: hwnd=CreateWindow( lpszClassName, "Windows", WS_OVERLAPPEDWINDOW, 120,50,800,600, NULL, NULL, hInstance, NULL); 显示窗口: ShowWindow(hwnd,nCmdShow); UpdateWindow(hwnd); 大题:用函数封装Windows程序(P16) 第二章

中文版word基础教程

W o r d 2003基础教程 编 撰 花 椒 文 刀 版权归属:中国盲文出版社信息无障碍中心盲人挚友聊天室 前 言 结合阳光读屏软件强大的Word 朗读功能, 由信息无障碍中心开办的于2008年11月至 2009年3 月,推出在线《Word2003基础讲座》。同期,我们将讲座内容编纂成册,免费提供给 阳光软件的广大用户,以便查阅。 本教程用Word2003编写, 您可以通过单击目录快速跳转到需要查阅的文本,具体操作方法是:用上下光标逐行朗读目录,听到您想查阅的条目后,按下 Ctrl+小键盘的斜杠键,这样,光标会自动跳转到目录对应的文本,以方便您的查阅,同时,在阅读过程中,教程所提及的所有操作,您均可在当前窗口尝试,当然,为了保持教程的完整,建议您在关闭本 教程时选择不保存修改。 本教程由阳光软件免费提供,版权归属中国盲文出版社信息无障碍中心盲人挚友聊天室, 请勿用于商业用途,违者必究。

目录 第一章 初识中文版Word2003 中文版word2003是微软公司推出的中文版office2003软件套装中的重要组成部分,它具有 强大的文本编辑和文件处理功能,是实现无纸化办公和网络办公不可或缺的应用软件之一。 第一节安装、启动和退出程序 一、安装程序 安装word2003和安装其它软件并无二致,需要说明一下的是光盘版的安装。当您将中文版 office2003光盘放入光驱后,请不要自动播放,因为自动播放会弹出图形化的安装界面,读 屏软件无法操作。您可以在插入光盘后,打开“我的电脑”找到CD驱动器,application键 弹出快捷菜单,通过“打开(O)菜单”来打开光盘,然后在列表中选中office文件夹,打开 以后,列表中出现几个文件夹,由于版本不同,文件夹数量和名称可能会略有区别,不过没 关系,在这些文件夹中寻找setup.exe并回车执行,您就能顺利地用键盘完成安装操作了。 二、启动程序 按下Windows键弹出“「开始」菜单”,展开“所有程序(P)菜单”后。上下光标到 “MicrosoftOffice子菜单”,右光标展开该子菜单后,上下光标找到 “MicrosoftOfficeWord2003菜单”回车即可启动Word程序。另外,当您在资源管理器中选 择任意一个后缀名为.doc的文档回车时,计算机也会为您启动word程序,同时打开您选中 的文档。 三、退出程序 在程序窗口按下快捷键:“Alt+F4”是退出程序最简便的方法。当然您还可以在程序窗口按下 Alt键激活菜单栏,下光标展开“文件(F)子菜单”并找到到“退出(X)菜单”回车,或在程 序窗口按下“Alt+空格”弹出控件菜单,上下光标找到“关闭(c)菜单”回车即可退出程序。

MFC入门--对话框实例

MFC入门--对话框实例 实例1 目的:设计一个基于对话框的程序,界面上有一个“延迟6秒”的按钮,点击后,程序主窗口在6秒内无法拖动。 关键点:MFC程序入门、线程与进程、消息机制 操作过程: 1-新建项目,选择MFC AppWizard (exe),命名项目为“SingleThread”。如图: (注:关于各项目类型的说明,请参见文件“VC功能简介.ppt”的第8页) 2-选择“Dialog based”,点击Finish,仔细观察项目信息。

3-在资源视图内对主对话框添加静态文本:“我的第一个MFC程序”和“演示耗时的单线程”,继而添加一个按钮,按钮现实文字“延迟6秒”,如图: 4-在资源视图内,双击“延时6秒”按钮,为其添加BN_CLICKED消息(按下按钮时发出的消息)的响应函数OnButton1()。在其中添加代码: Sleep(6000); 请根据老师对程序的讲解,思考如下问题: 1.类的继承:三个的类(CAboutDlg、CSingleThreadApp、CStringThreadDlg) 的继承轨迹是怎样的? 2.程序的入口在哪里?有没有类似Win32 Application中对于WM_CREATE的 处理? 3.三个类的对象的关系。 4.消息如何映射?

设计一个基于对话框的程序,开始运行后,每两秒弹出一个消息框。 关键点:MFC程序入门;定时器的建立、使用与删除;消息映射 操作过程: 1-新建项目,选择MFC AppWizard (exe),命名项目为“Test”。 2-选择“Dialog based”。 3-在BOOL CTestDlg::OnInitDialog()函数中添加 SetTimer(1,2000,NULL); // 启动定时器 4-通过ClassWizard给对话框添加WM_DESTROY的响应函数。如图: 在其中添加代码: KillTimer(1); 5-通过ClassWizard给对话框添加WM_TIMER的响应函数。在其中添加代码: if(nIDEvent==1) { ::MessageBox(0,"嘿嘿","你点啊!!",MB_OK); } 请根据老师对程序的讲解,思考如下问题: 1.MFC下与Win32 Application下定时器的使用有什么不同,又有什么相同之 处?

(适合初学者)MFC基础教程

Visual C++/MFC初学教程 目录 +-- 第一章VC入门 |------ 1.1 如何学好VC |------ 1.2 理解Windows消息机制 |------ 1.3 利用Visual C++/MFC开发Windows程序的优势|------ 1.4 利用MFC进行开发的通用方法介绍 |------ 1.5 MFC中常用类,宏,函数介绍 +-- 第二章图形输出 |------ 2.1 和GUI有关的各种对象 |------ 2.2 在窗口中输出文字 |------ 2.3 使用点,刷子,笔进行绘图 |------ 2.4 在窗口中绘制设备相关位图,图标,设备无关位图|------ 2.5 使用各种映射方式 |------ 2.6 多边形和剪贴区域 +-- 第三章文档视结构 |------ 3.1 文档视图框架窗口间的关系和消息传送规律 |------ 3.2 接收用户输入 |------ 3.3 使用菜单

|------ 3.4 文档,视,框架之间相互作用 |------ 3.5 利用序列化进行文件读写 |------ 3.6 MFC中所提供的各种视类介绍 +-- 第四章窗口控件 |------ 4.1 Button |------ 4.2 Static Box |------ 4.3 Edit Box |------ 4.4 Scroll Bar |------ 4.5 List Box/Check List Box |------ 4.6 Combo Box/Combo Box Ex |------ 4.7 Tree Ctrl |------ 4.8 List Ctrl |------ 4.9 Tab Ctrl |------ 4.A Tool Bar |------ 4.B Status Bar |------ 4.C Dialog Bar |------ 4.D 利用AppWizard创建并使用ToolBar StatusBar Dialog Bar |------ 4.E General Window |------ 4.F 关于WM_NOTIFY的使用方法 +-- 第五章对话框 |------ 5.1 使用资源编辑器编辑对话框 |------ 5.2 创建有模式对话框

Scratch2.0入门中文使用教程

儿童编程 SCRATCH2.0入门中文使用教程 目录: 1. Scratch的简介 第1课下载与安装 第2课初识Scratch 2.Scratch基础课程 第3课让角色动一动 第4课键盘控制 第5课迷宫程序 第6课会飞的巫婆 第7课三角形的面积 第8课造型切换---人物走动 第9课移动人物教师进阶使用 第10课判断人物位置 3. Scratch进阶课程--打蝙蝠 3-1 第一节课 3-2 第二节课 3-3 第三节课

4. scratch进阶课程2-打地鼠 4-1 设计背景、铁锤及地鼠 4-2 撰写地鼠的程序 4-3 撰写铁锤程序 4-4 分数的计算 5. 接球游戏 5-1 设计球部份的程序 5-2 人物部份的程序 5-3 程序计分 5-4 扣分的构想 6.如何分享SCRATCH作品 7.如何把sb2文件转化成swf格式的flash文件

SCRATCH2.0入门中文使用教程 1. Scratch的简介 Scratch是 MIT (麻省理工学院) 发展的一套新的程序语言,可以用来创造交互式故事、动画、游戏、音乐和艺术。很适合8岁以上儿童使用,目前1.4版已经完全支持中文界面,更方便使用,完全不用背指令,使用积木组合式的程序语言,让学习变得更轻松,并充满乐趣。 官方网站:https://www.doczj.com/doc/d29097197.html,/ 目前已经推出2.0版本,支持在线和离线模式。 由于国外网站速度较慢,gateface门面,已经集成了scratch的程序,所以只要安装了伽卡他卡电子教室(15.5以上版本)或这个gateface5.5以上版本,都有scratch,不用另外安装。(伽卡他卡电子教室集成了gateface,scratch在gateface的门面编辑器里,点击相应按钮,就可以启动scratch) Gateface门面中,集成的是离线程序,可以不用登录scratch网站,在本机使用。搜索伽卡他卡电子教室或者gateface都可以到官网或者华军下载。 分享SCRATCH作品的方法: 方法1:放到网站共享。SCRATCH网站,可以上传sb2格式的文件,这样,别人通过访问SCRATCH网站来访问你的作品,需要在SCRATCH

MFC编程基础教程

第1章基于对话框的Windows应用程序 1.简介Windows编程的两种方法,即Windows API编程和MFC编程。 2.基于对话框的应用程序的创建过程: ?建立基于对话框的MFC 应用程序框架; ?放置控件; ?设置控件属性; ?为控件连接变量,即为控件命名; ?添加并且编写消息处理函数。 3.常用基本控件: ?静态文本框:主要用来显示文本信息,不能接受用户输入 ?命令按钮:是最常见的、应用最广泛的一种控件。在程序执行期间,当单击某个命令按钮后就会执行相应的消息处理函数。 ?编辑框:是一个文本编辑区域,用户可以在该区域输入、编辑和显示正文内容。 ?框架:将一组相关的控件框起来,达到标识一组控件的作用。 ?单选按钮:用户在一组单选按钮中最多只能选择一项。当某一项被选定后,其他选项自动变成未选状态。 ?复选框:列出了可供选择的项,用户可根据需要选择其中的一项或多项,各选项之间的状态互不相关。 ?列表框:通过显示多个选项,供用户选择,达到与用户对话的目的。 ?组合框:组合了编辑框和列表框的特性而形成的一种控件。在列表框中列出可供用户选择的项,当用户选定某项后,该项内容自动装入编辑框中。 ?滚动条:通常附在对话框上用来协助观察数据或确定位置,也可以用来作为数据输入的工具。 1.1 Windows编程基础 Windows 应用程序的主要特点是: ?具有标准的图形用户界面。 ?具有与硬件无关的特性。 ?采用“消息传递,事件驱动”的运行机制。 用Visual C++ 编写Windows 应用程序主要有两种方法:一是使用Windows 提供的应用程序接口(Application Programming Interface ,API )函数;二是使用Microsoft 提供的微软基础类(Microsoft Foundation Class ,MFC )。

ArchiCAD入门中文教程

ArchiCAD中文教程 带领您进入ArchiCAD的世界,一步一步地创建一个虚拟建筑。 步骤 00 –介绍 (1) 步骤 01 –建立布局 (4) 步骤 02 –利用楼层 (18) 步骤 03 –完成建筑封顶 (23) 步骤 04 –发展设计 (28) 步骤 05 –添加门窗 (38) 步骤 06 –增加楼梯 (52) 步骤 07 –定义房间用途和空间 (57) 步骤 08 –增加最终细节 (61) 步骤 09 –测量和估算建筑成本 (65) 步骤 10 –向客户演示 (69) 步骤 00 –介绍 我们将向您展示使用一个物体模型是多么容易的一件事,30分钟内您将完成所有的建筑系统,为您的客户和项目合作伙伴递送高质量的设计和图纸,ArchiCAD 虚拟建筑使用的概念都是您司空见惯的,如如墙、门、楼板和屋顶等,我们的演示过程是符合您传统的设计方式的,不过不是二维中的绘图,而是使用了三维几何和其他属性的智能物体。 “The ArchiCAD in 30 minutes”光盘包含的是一个提供仅限制了保存和打印功能的该软件的演示版。安装好后,我们将带来您完成10个步骤,每个步骤的ArchiCAD 项目文件都可以在ArchiCAD 8.0 Demo/ArchiCAD in 30 minutes目录下找到,您

必须在一次完成一个步骤,因为您不能保存,您只需要打开对应步骤的文件,该步骤之前的所有步骤完成的内容都有。 您将学习创建一个小展览室,底楼是展览空间,二楼为画廊,以及其他一些员工和参观者所需要的日常设施。 建筑平面图如下,不同的用户界面元素将帮您完成建筑该项目。

AVL_FIRE中文入门教程

流场分析的基本流程(FIRE软件) ID:qxlqixinliang 一、网格自动生成 (2) 二、网格划分工具的使用 (5) 1、Mesh tools (5) 2、surface tools (7) 3、edge tools (7) 三、网格和几何信息工具 (8) 1、网格check (8) 2、Geo info (9) 四、流场求解求解器的设置 (9)

一、网格自动生成 根据电池包内部流场的特点,我们一般使用fame的网格自动生成和手动划分网格,两者相结合基本上能完成网格划分。对于电池数量较少的模型(如下图)完全可以用网格自动生成功能来实现网格划分。 下面介绍网格自动生成的流程: 1)准备面surface mesh和线edge mesh:要求:面必须是封闭曲面,一般FIRE中可以应用的是.stl的文件,在PRO/E,CATIA 等三维的造型软件中都可以生成;与面的处理相似的还要准备边界的线数据 2)Hybrid assistant,选择start new meshing,分别定义表面网格define surface mesh和线网格define edge mesh 3)然后进入高级选项fame advanced hybrid,在这里定义最大网格尺寸和最小网格尺寸,最大网格尺寸是最小网格尺寸的2^n倍 4)选择connecting edge,一般在计算域的进出口表面建立face selection,这样可保证edge 处的网格贴体,否则网格在几何的边角会被圆滑掉,另外还可以保证进出口面的网格方向与气流方向正交,有利于计算的精确性和收敛性。通过add添加上进出口的selection 即可。

创建基于对话框的MFC工程(详细图示)

实例001 如何创建基于对话框的MFC工程 《Visual C++开发实战1200例(第I卷)》本书以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Visual C++进行程序开发各个方面的知识和技巧,主要包括编程基础、界面设计、应用程序控制和图形图像。本节为大家介绍实例001 如何创建基于对话框的MFC工程。 AD: 第1章开发环境 工程创建 开发环境设置与使用 程序调试 1.1 工程创建 实例001 如何创建基于对话框的MFC工程 要使用Visual C++开发软件,首先要创建一个工程,而基于对话框的MFC工程则是用户广泛使用的工程。图1.1将是一个新创建的基于对话框的MFC工程。本实例将介绍如何创建基于对话框的MFC工程。

( New窗口的Projects选项卡中选择MFC AppWizard[exe](MFC应用程序向导)选项,在Project name文本框中输入创建的工程名"Hello",在Location文本

(2)单击OK按钮,弹出MFC AppWizard-Step 1窗口,如图1.3所示。 在MFC AppWizard-Step1窗口中可以指定生成框架的类型。 Single document:生成单文档应用程序框架。 Multiple documents:生成多文档应用程序框架。 Dialog based:生成基于对话框的应用程序框架。 Document/View architecture support:选中该复选框,允许生成文档/视图和非文档/视图结构程序。 (3)本实例选中Dialog based单选按钮,创建一个生成基于对话框的应用程序。单击Next按钮,弹出MFC AppWizard-Step 2 of 4窗口,如图1.4所示。

简易MFC对话框程序设计教程

简易MFC对话框程序设计教程 天津大学仁爱学院信息系杨晓龙 我们之前所学习的C语言是一种面向过程的语言,重点在于程序或算法执行过程,提供那些过程才能实现程序,每一个操作都由我们自己完成。C++是一种面向对象的语言。对象是一个封装体,是一个实例,它里面不仅封装了程序运行时所需变量,更重要的是它还封装了程序运行所需操作即函数,其实真正定义它们的是一种叫“类”的数据结构,不过要引用里面的数据和操作必须通过类所定义的对象。这样做的好处是可以把经常使用的,属于同一类型的数据和操作包含在类当中,在编程时通过该类所实例化的对象调用它们(对象避免了重复,而且对象可以代表一种变量、一个实例或某个控件),简化了代码,提高了代码的复用性,增强了程序的可移植性,降低了错误发生率,摆脱了每次编写程序都要编写大量代码的麻烦。MFC(Microsoft Foundation Class)是微软提供给编程者的基础类库,它里面包含了创建对话框程序所需的各种类,在向导的帮助下,它会自动生成一些代码,我们只需调用它里面的少量成员函数便可完成对话框的创建和对话框程序的编程,如果让我们自己编写将是浩大而艰难的工程。MFC将常用的几乎所有的有关对话框的函数和变量封装起来,使我们避免了编写复杂而且重复的代码。 用C语言所编写的程序是DOS程序,只能在黑乎乎的DOS界面下运行,但C语言是C++的基础,而C++又是MFC的基础,用MFC编写的是windows应用程序有对话框,所以要回MFC 编程得先学C语言和C++才能学MFC。以下将以编写求三角形面积的程序为例说明简单MFC 程序的制作方法。 打开vc6.0,文件—新建—选择MFC AppWizard(exe),工程名称“三角形面积计算器”—确定—选择“基本对话框”,此时即可点“完成”,也可点下一步,直到出现询问“您希望使用MFC库吗?”若选择“作为共享的DLL”,则程序在未安装vc6.0的电脑上无法运行;若选择“作为静态的DLL”,则程序在未安装vc6.0的电脑上也能运行。此后一直点确定即可。 点击“完成”后出现由向导创建的基本对话框,在对话框上点右键—属性,可更改对话框标题和字体。在右侧选择组件,先插入三个编辑框作为三角形三边长,在插入一按钮发出计算命令,然后再插入一编辑框作为面积输出。在每一个编辑框旁配上静态文本说明,修改按钮标题。在vc6.0左侧的资源视图中选中关于对话框,可修改版本信息。至此对话框主体设计完成。 以下是程序最关键的部分。我们拥有C语言的基础,用C语言编写三角形面积代码(算法)不是问题,问题在于如何将编辑框中输入的数据传给算法中的变量以及如何使计算完成的结果输出到编辑框。实现这一数据交换(传输)有七中方法,其中最简单、最直观、最实用的方法是将编辑框与算法中的变量其的关联。步骤如下:选中对应编辑框,右键选择建立类向导,选择“Member Variables(成员变量)”选项卡,选择要关联变量的控件ID号,再点击“Add Variable(添加变量)”,设定变量名如“m_sizeA”,在Variable Type(变量类型)中选择float(不同程序视所需变量类型确定),OK。同样方法,将其他两边和面积分别关联变量。这样就使编辑框分别与各变量取得了关联,以后可认为编辑框和变量是一样的,对变量的任何操作都会反映到编辑框中,接下来我们就可以像编C程序一样编写代码了。可是代码应该写在什么地方呢,程序在什么时候执行呢?我们的目的是在按下计算按钮后程序执行,所以还需对按钮进行设定,让按钮被按下后执行程序。这个过程被称作消息捕获,操作系统捕获到“点击”的消息后将信息传给应用程序,应用程序便转入执行算法。在按钮上点击右键,选择“建立类向导”,选择“Message Maps(消息地图)”选项卡,选中按钮ID号,在“Messages(消息)”中选中“BN_CLICKED(按钮单击)”消息响应方式(因为按钮可以有单击、双击、移动等多种操作,所以对应有多种消息响应方式,即选择:当对按钮执行怎样的操作后执行消息响应函数),然后点击“Add Function(添加消息响应函数)”添加响应消息的函数或操作,也就是指当按钮被按下后要做什么,在弹出的对话框中可以更改函数名,确定后点击“Edit Code(编辑代码)”便自动转入消息响应函数中,我们就可以在这里写我们的算法代码了。代码如下:

MathType6.9中文基础教程之一

MathType6.9 中文入门教程 (一) MathType 实现“所见即所得”的工作模式,是一个强大的数学公式编辑器。它可以将编辑好的公式保存成多种图片格式或透明图片模式,可以很方便的添加或移除符号、表达式等模板(只需要简单地用鼠标拖进拖出即可),也可以很方便地修改模板。MathType 与常见的文字处理软件和演示程序配合使用,能够在各种文档中加入复杂的数学公式和符号,可用在编辑数学试卷、书籍、报刊、论文、幻灯演示等方面,是编辑数学资料的得力工具。 本教程为中文基础教程系列之一——手把手教你快速入门

练习一:分式与根式 (6) 打开MathType (6) 创建等式 (6) 1.输入y= (7) 2. 输入根式符号了 (7) 3.输入分式模板 (7) 4.输入数字 (8) 5.移动光标 (8) 6.输入数字 (8) 7.增加sinx (8) 8.插入点光标 (9) 9. 输入-c (9) 10.加上角标 (9) 11.输入数字2 (10) 12.点按±键 (10) 13.选择m (10) 14.输入tan x (10) 练习二:总和,上标和下标 (11) 1.打开一个Word文档 (11) 2.选择插入 (11) 3.输入 (11) 4.创建一个上标的位置 (12)

5.输入上标数字 (12) 6.移动插入点 (12) 7.输入= (12) 8.构建分式 (12) 9.插入点定位 (13) 10.使用Tab键 (13) 11.输入总和模板 (13) 12.插入一组圆括号 (13) 13.输入字母x (13) 14.给x附加下标 (13) 15.输入-x (13) 16.给x上增加一横线 (13) 17.按下Tab键 (13) 18.输入上标数字2 (14) 19.按下Tab键 (14) 20.按下Tab键 (14) 练习三:编辑修改练习二的等式 (15) 1.打开文档 (16) 2.选中项目 (16) 3.删除项目 (16) 4.输入字母 (16) 5.全选所有部分 (16)

MFC对话框几个对话框程序例子建立对话框与相应程序相关联

MFC对话框和对话框类几个对话框程序例子建立对话框与相应的程序相关联如何建立对话框与相应的程序相关联: 在MFC中,对资源的操作都是建立相关的类来完成的; 所以我门先NEW 一个对话框资源然后建立他的类与相应的应用程序相关联就可以; 步骤: 1 NEW 一个对话框资源 2 在资源上选择 Classwarrzd上创建一个新的类(或在资源上双击左键) 3 起名字!(注意文件名将会去掉C 例如我门的名字叫 CDaiDlg那么文件名是 DaiDlg); 对话框的俩种类型: 1 模态对话框(特性:当建立模态对话框时,将不允许用户点击对话框以外的控件后应用程序本身,也就是说当模态对话框建立时应用程序停止运行而只运行对话框,所以模态对话框是可以使用局部变量的定义方法的!) 模态对话框是比较方便的一种对话框~建立函数: int CDialog::DoMadol() //注意他是CDialog类成员也就是说想使用先建立一个 CDialog 对象吧 如果我门想要在View类中建立一个 CDialog对象不要忘了要在View的Cpp 文件中包含 CDialog.h 2 非模态对话框(特性与模态的相反) 使用成员函数 BOOL CDialog::Create( UINT nIDTemplate, CWnd* pParentWnd = NULL ); nIDTemplate 为对话框的ID号 pParentWnd 拥有这个对话框的对象指针,如果是NULL 为默认的主应用窗口也就是 Frame应用窗口 注意如果我门在使用Create创建非模态对话框时要调用一个函数来显示这个对话框 CWnd::ShowWindow(SW_SHOW);不仅这样非模态对话框时不能是局部变量!

mfc单文档插入对话框

2012/7/18 1.新建一个mfc单文档工程Test. 2.在资源视图中,dialog处右键insert dialog. 3.在新建的dialog上右击,属性-style-child,对话框上双击,新建类 name CCdialod,选择base class为cformview. 4.在cmainframe类上添加变量CSplitterWnd m_wndSplitter选为 protected. 5.classwizard在cmainframe中重载OnCreateClient函数 BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { m_wndSplitter.CreateStatic(this,1,2); m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CTestView), CSize(1100, 0), pContext); //CMy039View是视图类 m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CCdialod), CSize(0, 0), pContext); //LDLG是对话框类 SetActiveView((CTestView*)m_wndSplitter.GetPane(0, 0)); //指定类视图 return true; } 6.在TestView.h中添加头文件 #include "TestDoc.h" 7.在mainframe.h中添加 #include "TestView.h" #include "Cdialod.h"

MFC开发常用知识点总结

开辟空间 cmd_zone=newchar[CMD_LENGH];//指令空间 data_zone=newchar[DATA_LENGH];//数据空间 ax=newchar[4]; bx=newchar[4]; cx=newchar[4]; sp=newchar[SP_LENGH];//堆栈空间 pc=newchar[4]; memset(cmd_zone,0,CMD_LENGH);//设置大小 memset(data_zone,0,DATA_LENGH); memset(ax,0,4); memset(bx,0,4); memset(cx,0,4); memset(sp,0,SP_LENGH); memset(pc,0,4); srand((unsignedint)(time(0)));//随机数起始 分配地址(16位:2,2,4,4,4) cmd_code=*((unsignedshort*)cmd_zone); cmd_nouse=*((unsignedshort*)cmd_zone+2); cmd_arg1=*(unsignedint *)(cmd_zone+4); cmd_arg2=*(unsignedint *)(cmd_zone+8); cmd_arg3=*(unsignedint*)(cmd_zone+12); 输出数据(EDITCONTROL) CString bbb; bbb.Format(_T("%d %d %d %d %d"),X,X,X,X,X); UpdateData(true); myedit += bbb + _T("\r\n"); UpdateData(false); 动态创建按钮 static CButton *btn =new CButton();

PCSchematic中文入门教程

创建一个自动化方案 本章节将示范如何完成您的第一个自动化方案。它包括五个步骤,每一个步骤都有些范例, 将示范您如何完成设计方案中的各个部分。 本章内容简介 第一步:创建一个控制回路图,在设计方案和页面中输入数据,布置导线符 号,使用数据库及保存设计方案…………………………………………(第1页)第二步:创建一个主回路图,布置绘图模板,恰当地排列符号文本,移动电 路号,打印页面……………………………………………………………(第13页)第三步:自动导线编号………………………………………………………………(第21页) 第四步:布置元件……………………………………………………………………(第22页) 第五步:制作信息清单,并更新清单………………………………………………(第25页) 在PROJECT文件夹里,您会发现五个文件,其中的内容对应方案的各个部分。因此,您 既可以从头开始学习整个章节的内容,也可以选择一个主题,学习您感兴趣的部分。通过上 面的摘要,您可以选择想要学习的主题。 如果您想很快地完成这一章的学习,可以跳过文本框。 接下来,在位于第86页的“创建一个PLC方案”一节中,将详细介绍更多的功能。 一些预置的功能,例如设计方案章节和区域内的参考符号,没有在这部分阐述。在 演示方案.PRO这一设计方案中将应用其中一些功能。 如果您对“Windows”不熟悉,应在学习后面的课程前阅读“Windows”内容。 1.画控制回路图 打开一个已有的设计方案 点击位于程序工具栏的打开文件按钮(快捷键[Ctrl+o])。打开PROJECT文件夹,然后双 击设计方案文件开始2.pro。现在会打开这个设计方案文件。 ——如果您不熟悉如何使用“Windows”打开文件/方案,可以阅读位于26页的“Windows” 内容。 设计方案内容 设计方案开始2.pro中包含一些已经生成的页面: 1)页面F1是扉页。 2)页面I1是目录表。 3)页面1是画控制回路图页面。 4)页面2是零部件清单模板。 5)页面3是元器件清单模板。 6)页面4是接线端子清单模板。 比思 (香港,深圳,上海,北京) 电子有限公司 https://www.doczj.com/doc/d29097197.html, kgs@https://www.doczj.com/doc/d29097197.html, Page 1

Scratch20入门中文使用教程

SCRATCH2.0入门中文使用教程 目录: 1. Scratch的简介 第1课下载与安装 第2课初识Scratch 2.Scratch基础课程 第3课让角色动一动 第4课键盘控制 第5课迷宫程序 第6课会飞的巫婆 第7课三角形的面积 第8课造型切换---人物走动 第9课移动人物教师进阶使用 第10课判断人物位置 3. Scratch进阶课程--打蝙蝠 3-1 第一节课 3-2 第二节课 3-3 第三节课

4. scratch进阶课程2-打地鼠 4-1 设计背景、铁锤及地鼠 4-2 撰写地鼠的程序 4-3 撰写铁锤程序 4-4 分数的计算 5. 接球游戏 5-1 设计球部份的程序 5-2 人物部份的程序 5-3 程序计分 5-4 扣分的构想 6.如何分享SCRATCH作品 7.如何把sb2文件转化成swf格式的flash文件

SCRATCH2.0入门中文使用教程 1. Scratch的简介 Scratch是 MIT (麻省理工学院) 发展的一套新的程序语言,可以用来创造交互式故事、动画、游戏、音乐和艺术。很适合8岁以上儿童使用,目前1.4版已经完全支持中文界面,更方便使用,完全不用背指令,使用积木组合式的程序语言,让学习变得更轻松,并充满乐趣。 官方网站:https://www.doczj.com/doc/d29097197.html,/ 目前已经推出2.0版本,支持在线和离线模式。 由于国外网站速度较慢,gateface门面,已经集成了scratch的程序,所以只要安装了伽卡他卡电子教室(15.5以上版本)或这个gateface5.5以上版本,都有scratch,不用另外安装。(伽卡他卡电子教室集成了gateface,scratch在gateface的门面编辑器里,点击相应按钮,就可以启动scratch) Gateface门面中,集成的是离线程序,可以不用登录scratch网站,在本机使用。搜索伽卡他卡电子教室或者gateface都可以到官网或者华军下载。 分享SCRATCH作品的方法: 方法1:放到网站共享。SCRATCH网站,可以上传sb2格式的文件,这样,别人通过访问SCRATCH网站来访问你的作品,需要在SCRATCH

简单的MFC多对话框演示程序

简单的MFC多对话框演示程序 “MultiDialog” 演示如何在工程中拥有多个对话框,及如何在一个对话框中调用另一个对话框。 重点:1、多个对话框类的建立;2、对话框的模式(Modal)调用方法;3、Spin控件的使用。 新建一个基于对话框的MFC工程, 通过菜单"Insert>>Resource"打开添加资源对话框, 在其中选择Dialog后点击New创建一个新的对话框 按Ctrl+W打开ClassWizard,系统会提示刚才创建了一个新的对话框资源,是否建立对应的类, 选择建立,然后在New Class窗口中Class Name栏输入它的名称:CSubClass1, 确定后系统会自动生成SubClass1.h和SubClass1.cpp并加入工程中,其中有已经创建好的CSubClass1的类的基本代码。 把这个对话框的Caption属性改为“难度选择”,在它上面画三个Radio“简单”、“标准”、“困难”, 并建立相关联的变量m_Option1。(要注意的是在ClassWizard中注意Class Name中应该选CSubClass1而不是之前的主对话框类) 按照相同方法建立第二个新对话框,类名“CSubClass2”,Caption为“关卡选择”。 在上面画一个Edit和一个Spin,注意先画Edit后画Spin,将Spin的Auto buddy和Set buddy integer勾上。 按Ctrl+W打开ClassWizard,为Edit建立关联变量,不过注意是int型而不是CString型,也为Spin建立关联变量m_Spin1,注意这次是Control型变量CSpinButtonCtrl。

ArcGIS中文基础教程

第一章GIS 的概念和需求 理解GIS的三种角度: GIS是一个用于管理、分析和显示地理信息的系统。地理信息可以通过一系列地理数据集来表达。而地理数据集则通过使用简单的,普通数据结构来为地理信息建模。GIS包含了一套用以处理地理数据的综合工具。 我们可以从多个角度来理解地理信息系统是如何工作于地理信息的: 1.从空间数据库的角度看:GIS是一个包含了用于表达通用GIS数据模型(要素、栅格、拓扑、网络等等)的数据集的空间数据库。 2.从空间可视化的角度看:GIS是一套智能地图,同时也是用于显示地表上的要素和要素间关系的视图。底层的地理信息可以用各种地图的方式进行表达,而这些表现方式可以被构建成“数据库的窗口”,来支持查询、分析和信息编辑。 3.从空间处理的角度看:GIS是一套用来从现有的数据集获取新数据集的信息转换工具。这些空间处理功能从已有数据集提取信息,然后进行分析,最终将结果导入到数据集中。 这三种观点在ESRI ArcGIS中分别用ArcCatalog(GIS是一套地理数据集的观点)、ArcMap(GIS是一幅智能的地图)和ArcToolbox(GIS是一套空间处理工具)来表达。这三部分是组成一个完整GIS的关键内容,并被用于所有GIS 应用中的各个层面。 从空间数据库的角度: GIS是世界上独一无二的一种数据库――空间数据库(Geodatabase)。它是一个“用于地理的信息系统”。从根本上说,GIS是基于一种使用地理术语来描述世界的结构化数据库 这里我们来回顾一些在空间数据库中重要的基本原理。 地理表现形式 作为GIS空间数据库设计工作的一部分,用户要指定要素该如何合理的表现。例如,地块通常用多边形来表达,街道在地图中是中心线(centerline)的形式,水井表现为点等等。这些要素会组成要素类,每个要素类都有共同的地理表现形式。 每个GIS数据集都提供了对世界某一方面的空间表达,包括: 基于矢量的要素(点、线和多边形)的有序集合

MFC分析对话框的运行机制心得体会

VC++ MFC属性表对话框的运行机制 2012-07-01 19:09 属性表对话框的初始化包括框架对话框的初始化和页的初始化。页的初始化工作可在OnInitDialog函数中进行,而框架对话框的初始化应该在OnCreate函数中完成。 根据CPropertySheet::DoModal返回的是IDOK还是IDCANCEL,程序可以判断出关闭对话框时按的是OK还是Cancel按钮,这与普通对话框是一样的。 如果属性表对话框是模态对话框,在其底部会有3个按钮,依次为OK、Cancel和Apply (应用)按钮,如果对话框是非模态的,则没有这些按钮。OK与Cancel按钮的意义与普通按钮没什么两样,Apply按钮则是属性

表对话框所特有的。普通的模态对话框只有在用户按下了OK按钮返回后,对话框的设置才能生效,而设计Apply的意图是让用户能在不关闭对话框的情况下使对话框的设置立即生效。由此可见,Apply按钮的作用是使用户在设置完数据后,不必退出对话框,就可以反复进行设置,这在许多应用场合下是很有用的。 为了对上述3个按钮作出响应,CPropertyPage类提供了OnOK,OnCancel 和OnApply函数,用户可覆盖这3个函数以完成所需的工作。需要指出的是这3个函数并不是直接响应按钮的BN_CLICKED消息的,但在按钮按下后它们是被间接调用。这些函数的说明如下: 1.Virtual void OnOK( ):在按下OK或Apply按钮后,该函数被调用。默认的OnOK

函数几乎什么也不干,像数据交换和关闭对话框这样的工作是在别的地方完成的,这与普通对话框的OnOK函数是不同的: 2.Virtual void OnCancel( ):在按下Cancel 按钮后,该函数将被调用。默认的OnCancel 函数也是几乎什么也不干; 3.Virtual BOOL OnApply( ):在按下OK 或Apply按钮后,该函数将被调用。默认的OnApply 会调用OnOK函数。函数的返回值如果是TRUE,则对话框中的设置将生效,否则无效。 令人不解的是,MFC并未考虑CPropertySheet类的按钮响应问题,不要指望能通过ClassWizard来自动创建按钮的BN_CLICKED消息处理函数,通常的按钮

CHEMCAD中文入门教程

Chemcad在化工课程设计中的应用 指导教师:葛明兰 学生:高00-4班应伟斌 摘要:介绍了化工流程模拟软件Chemcad的特点、作用,以精馏过程的工艺设计为实例说明其应用。 关键词:Chemcad软件,设计,应用 化工课程设计是学习化工设计基础知识、培养学生化工设计能力的重要教学环节。计算机辅助化工过程设计以成为化工设计的基本手段,有效地利用化工模拟设计软件进行化工设计工作可以极大地提高工作效率。将模拟软件用于过程设计或过程模拟,对于当代的化工过程工程师已是一件很普通的工作。基于此,本院购进美国Chemstations公司化工流程模拟软件Chemcad。本文主要介绍该软件特点、模块功能作用,并以精馏过程的工艺设计实例较详细地对该软件的应用进行说明。 1.CHEMCAD软件概述: CHEMCAD系列软件是美国Chemstations公司开发的化工流程模拟软件。使用它,可以在计算机上建立与现场装置吻合的数据模型,并通过运算模拟装置的稳态或动态运行,为工艺开发、工程设计、优化操作和技术改造提供理论指导。 1.1使用CHEMCAD可以做的工作主要有以下几项: A.设计更有效的新工艺和设备使效益最大化 B.通过优化/脱瓶颈改造减少费用和资金消耗 C.评估新建/旧装置对环境的影响 D.通过维护物性和实验室数据的中心数据库支持公司信息系统 1.2CHEMCAD中的单元操作: CHEMCAD提供了大量的操作单元供用户选择,使用这些操作单元,基本能够满足一般化工厂的需要。对反应器和分离塔,提供了多种计算方法。ChemCAD可以模拟以下单元操作: 蒸馏、汽提、吸收、萃取、共沸、三相共沸、共沸蒸馏、三相蒸馏、电解质蒸馏、反应蒸馏、反应器、热交换器、压缩机、泵、加热炉、控制器、透平、膨胀机等50多个单元操作。 1.3热力学物性计算方法: CHEMCAD提供了大量的最新的热平衡和相平衡的计算方法,包含39种K值计算方法,和13种焓计算方法。K值方法主要分为活度系数法和状态方程法等四类,其中活度系数法包含有UNIFAC 、UPLM (UNIFAC for Polymers)、Wilson 、T. K. Wilson 、HRNM Modified Wilson 、Van Laar 、Non-Random Two Liquid (NRTL) 、Margules 、GMAC (Chien-Null) 、Scatchard-Hildebrand (Regular Solution)等。焓计算方法包括Redlich-Kwong 、 Soave-Redlich-Kwong 、Peng-Robinson 、API Soave-Redlich-Kwong 、Lee-Kesler 、 Benedict-Webb-Rubin-Starling 、Latent Heat 、Electrolyte 、Heat of Mixing by Gamma 等。 1.4使用CHEMCAD主要有以下步骤: A.画出您的流程图

相关主题
文本预览
相关文档 最新文档