第一个MFC实例:计算圆周长和圆面积

2023-10-25 17:40

本文主要是介绍第一个MFC实例:计算圆周长和圆面积,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、基于Microsoft MFC的编程方法

MFC是微软基础类库(Microsoft Foundation Class)的缩写。与API不同,MFC不是Windows操作系统的组成部分,而是微软公司专为VC++开发的配套软件包。与VC6配套的是MFC6.0。MFC充分使用了面向对象方法中的继承和多态性技术,以类的方式封装了Windows应用程序所涉及的几乎所有的标准部件,如Windows应用程序的架构、各种标准的图形界面元素、其核心是它以C++的形式封装了Windows API的大部分函数。

  

MFC是一个很大的类层次体系(MFC6.0中包含了200多个类),它由一个称为CObject的类作为根基类,其他类大部分从该类派生而来,其整个类体系可大致划分为:

  ■基类

  ■应用程序框架类。 包括:应用程序类、命令类、文档/视窗类、框架窗口类、文档模板类等

  ■可视对象类。 包括:窗口类、对话框类、控件类等

  ■绘图类。 包括:绘图工具类、设备描述表类等。

  ■简单数据类型类

  ■通用类  包括:数组类、类表类、映像类

  ■文件和数据库类 包括:文件I/O类、ODBC类、ADO类

  ■Internet和网络工作类  包括:Win32 Internet类、Windows Socket类等

  ■对象链接和嵌入(OLE, Object Lingking and Embedding)类

  ■调试和异常类

 

事实上,MFC封装了一个Windows应用程序操作的每一方面,因此使用MFC编程,编程者可以把注意力集中于自己程序所特有的部分,不需要事事亲自动手。与直接调用API函数相比,这将大大减少编程者编写的代码数量,使编程工作变得更容易;同时,程序标准部分由MFC的类来提供,可使程序变得更规范,更具可读性,效率也更高。

 

二、实例讲解

闲话不多扯,下面说下这个实例怎么用VC++实现。我用的编译器是vc++6.0。

首先知道步骤:

开发一个MFC项目通常有四个步骤:

 Step.1 建立项目架构

 Step.2 设计图形用户界面

 Step.3 设计对象的事件驱动程序

 Step.4 项目的编译、链接和运行

第一步呢,建立项目架构,如图:

后面一系列默认步骤,最后出现:

下面便到了第二步,设计用户图形界面,就是玩玩控件。

可在对话框上建立(拖拽)如下控件:

 ■1个编辑框:用于用户输入半径值;

 ■5个静态文本框(静态文本框只能显示文本而不能输入文本),其中:2个静态文本框分别用于显示圆周长和圆面积,其余3个静态文本框分别用于对上述三个文本框进行文字说明。

 ■2个命令按钮,“确定”和“退出”: 前者用于确定输入值,计算圆周长和圆面积,然后把结果显示在对应的输出框上;后者用于结束程序的执行。

如下图:

进行控件属性设置(即鼠标选中控件右键单击,点属性):

1.主窗口:将标题值设置为“计算圆周长和圆面积”,其他默认。

2.编辑框:ID默认为:IDC_EDIT1。在“样式”(Styles)选项卡中设置相关属性值为:“靠左”(Left)。其余属性采用默认值。

3.静态文本框:

     ID            标题    其他属性

 ---------------------------------------------------------------------------------

 IDC_STATIC1      输入半径     居中,垂直居中

 IDC_STATIC2  圆周长      居中,垂直居中

 IDC_STATIC3  圆面积      居中,垂直居中

 IDC_STATIC4  默认       靠左,垂直居中,Client edge

 IDC_STATIC5  默认          靠左,垂直居中,Client edge

4.按钮:

ID                   标题

---------------------------------------

IDC_BUTTON1    确定

IDC_BUTTON2  退出

现在便到了第三步,设计对象的事件驱动程序。

这里说点知识。对象的事件驱动程序在VC++中称为消息处理成员函数。

在实际应用中,读取或更新控件上的数据是对话框的非常重要的工作。MFC为此提供了一套标准方法:DDX(Data Exchange,数据交换)和DDV(Data Validation,数据校验)技术。DDX通过成员变量(member variable)的方式实现对话框与控件之间的数据传递。如果要在对话框的消息处理函数中访问控件上的数据,就必须先在对话框类(CCase1Dlg类)中分别为这些控件添加(声明)一个成员变量,每一个成员变量绑定一个控件。在消息处理函数中是通过成员变量访问控件的。

成员变量是对话框的public数据成员。有两类成员变量:

 ■Value类成员变量:表示该变量的值为控件的数据。

 ■Control类成员变量:表示该成员变量就代表控件本身,即它是控件的一个对象,其值实际上就是控件的句柄。

句柄是什么?

Visual Studio系统给每个对象分配一个句柄(handle),它是一个4字节长的整数值,是对象的唯一内部编号。应用程序通过句柄访问相应的对象。每个对象除了句柄外,还有一个对象标识符ID,可看作是对象的外部名。ID与句柄的区别主要在于:ID可以是用户自行设定的;而句柄是系统内定的,对用户是透明的,这能防止应用程序直接访问对象的内部信息。

DDV用于数据的校验,例如自动校验字符串的长度和取值范围。

 

使用MFC DDX/DDV的流程是:

 ①首先定义用于接收控件数据的成员变量。例如,为编辑框IDC_EDIT1定义一个Value类的double型的成员变量,用于接收用户输入的半径值。定义变量的同时可以设定数据取值范围,提供校验。

 ②然后,在对应的消息处理成员函数中调用MFC函数传递数据。最简单的相关MFC函数有:

 UpdateData()    //更新成员变量,将控件上的数据传递给成员变量

 UpdateData(FALSE)   //更新控件,将成员变量的值传递给控件

 

对于本实例,可设计如下成员变量和消息处理函数:

 ■为编辑框IDC_EDIT1定义一个double型的成员变量m_r,用于接收用户在编辑框中输入的半径值;

 ■为静态文本框IDC_STATIC4和IDC_STATIC5分别定义一个Cstring型成员变量m_girth和m_area用于向静态文本框传递计算结果。静态文本框只能处理Cstring(字符串)型数据

 注意:成员变量名的前缀“m_”是MFC的风格。MFC也有自己的数据类型,不过与C++很相似,容易理解。

 ■为“确定”按钮建立一个“单击”(BN_CLICKED)消息处理函数,用于计算圆周长和圆面积,并显示计算结果。

 ■为“退出”按钮建立一个“单击”消息处理函数,用于结束程序的运行。

 ■建立一个对话框的初始化函数,对成员变量m_r、m_girth、m_area进行初始化。

 

操作步骤:

(1)添加成员变量

打开“MFC Class Wizard”(类向导)对话框。方法可以是:从VC6窗口的菜单栏上的“查看”菜单中选择“建立类向导”选项,或者用鼠标右击窗体,从弹出的快捷菜单中选择“建立类向导”,或者按快捷键Ctrl+W。选择“Member Variables”(成员变量)选项卡。从“Control IDs”(控件ID)列表框中,可以看到已经建立的各控件对象的ID。

为编辑框添加成员变量:选择IDC_EDIT1,单击右边的“Add Variable…”(添加变量)按钮,弹出“添加成员变量”对话框。

在第一个文本框(Member variable name)中输入成员变量名,如m_r;在第二个下拉框(Category)中选择成员变量的种类,Value;在第三个下拉框(Variable Type)中选择成员变量的数据类型,double。单击OK按钮。回到“Member Variables”选项卡,设置变量m_r的取值范围,如最小值为0,最大值为1000.0。用同样的方法为静态文本框IDC_STATIC4和IDC_STATIC5添加Cstring型成员变量m_girth和m_area,最大字符个数为10。

看下图:

(2)编写消息处理成员函数

①主窗口的初始化函数

切换到类向导的“Message Map”(消息映射)选项卡。在“Object IDs”(对象名)列表框中选择主窗口的对象名CCase1Dlg;在“Messages”(消息)列表框中选择消息WM_INITDIALOG;此时在“Member functions”(成员函数)列表框中会自动指出相应的MFC已定义的虚函数OnInitDialog(主窗口对象是由MFC默认生成的)。

单击“Edit Code”(编辑代码)按钮,弹出Case1Dlg.cpp文件的编辑窗口,并显示OnInitDialog()函数的代码清单,找到注释提示处:

 // TODO: Add extra initialization here
(在此下边添加你初始化的代码)

对于本实例,可添加如下代码:

m_r =0.0;
m_girth=m_area="0.000";
UpdateData(FALSE); //将数据传给控件并显示

即:

BOOL CCase1Dlg::OnInitDialog()
{CDialog::OnInitDialog();……………// TODO: Add extra initialization herem_r =0.0;m_girth=m_area="0.000";UpdateData(FALSE); //将数据传给控件并显示return TRUE;// return TRUE  unless you set the focus to a control
}

②“确定”按钮的消息处理函数

类似上述方法,在“Object IDs”列表框中选择IDC_BUTTON1;在“Messages”列表框中选择消息BN_CLICKED;单击“Add Function”(添加函数)按钮,此时在“Member functions”列表框中会出现一个新的函数名OnButton1,表示系统为该对话框生成了一个新成员函数(图21);单击“Edit Code”(编辑代码)按钮,弹出Case1Dlg.cpp文件的编辑窗口,并显示OnButton1()函数的代码清单,找到注释提示处:

// TODO: Add your control notification handler code here
(在此下边添加控件消息的处理代码)

对于本实例,可添加如下代码:

UpdateData();  //将编辑框的数据传递给成员变量
double girth=2*3.1416*m_r; //计算圆周长
double area=3.1416*m_r*m_r; //计算圆面积
m_girth.Format(“%10.3f”,girth); //按格式写入成员变量
m_area.Format("%10.3f",area);
UpdateDtata(FALSE); //将数据传给控件并显示

注:函数Fornat()是CString类的成员函数,用来把数据转换成CString类型的字符串。

③“退出”按钮的消息处理函数

按上述方法,建立IDC_Button2的BN_CLICKED消息处理函数,并在注释提示处输入代码:

void CCase1Dlg::OnButton2() 
{// TODO: Add your control notification handler code here
    EndDialog(1);   //关闭对话框
}

下面进入最后一步,项目的编译、链接和运行。

转载于:https://www.cnblogs.com/jiu0821/p/4620041.html

这篇关于第一个MFC实例:计算圆周长和圆面积的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/284159

相关文章

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

XTU 1237 计算几何

题面: Magic Triangle Problem Description: Huangriq is a respectful acmer in ACM team of XTU because he brought the best place in regional contest in history of XTU. Huangriq works in a big compa

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

Java Websocket实例【服务端与客户端实现全双工通讯】

Java Websocket实例【服务端与客户端实现全双工通讯】 现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏 览器需要不断的向服务器发出请求,然而HTTP