欢迎来到Introzo百科
Introzo百科
当前位置:网站首页 > 技术 > vs2010编辑一个mfc_基于VS2010平台的MFC入门编程——简易加法计算器

vs2010编辑一个mfc_基于VS2010平台的MFC入门编程——简易加法计算器

日期:2023-09-24 11:38

http://www.introzo.com/software/149.html

? 鸡啄米在上一讲中介绍了MFC的消息映射机制,属于原理方面的知识。对于VC++编程入门学习者来说可能有些抽象,鸡啄米会把消息映射的知识渗透到后面的教程中。本节开始为大家讲解偏应用的知识-创建对话框。

?????? 对话框,大家应该很熟悉了,在我们常用的软件中大多都有对话框界面,例如,360安全卫士的主界面其实就是个对话框,只是它做了很多美工方面的工作,将其大大美化了。

???????创建对话框主要分两大步,第一,创建对话框资源,主要包括创建新的对话框模板、设置对话框属性和为对话框添加各种控件;第二,生成对话框类,主要包括新建对话框类、添加控件变量和控件的消息处理函数等。鸡啄米在本节中先讲讲怎样创建对话框模板和设置对话框属性。

???????创建基于对话框的应用程序框架

?????? 之前鸡啄米创建的HelloWorld程序是单文档应用程序,生成了多种窗口,如果用它来将讲创建对话框的话可能有些复杂,对大家单纯理解对话框有点影响,所以这里鸡啄米就再创建一个基于对话框的应用程序,用来实现加法运算的功能。创建步骤同单文档应用程序大同小异,简单步骤如下:

?????? 1.选择菜单项File->New->Project,弹出“New Project”对话框。

???????2.左侧面板中Installed Templated的Visual C++下选择MFC,中间窗口中选择MFC Application,然后在下面的Name编辑框中键入工程名称,本例取名“Addition”,在Location编辑框中设置工程的保存路径。点“OK”。

?????? 3.点“Next”到“Application Type”对话框,在Application type下选择Dialog based,其他使用默认设置,点“Finish”。

?????? 我们可以在Solution Explorer视图中看到,此工程的文件要比单文档应用程序少的多,在Class View中主要有三个类:CAboutDlg、CAdditionApp和CAdditionDlg。CAboutDlg是应用程序的“关于”对话框类,CAdditionApp是由CWinApp派生的类,CAdditionDlg是主对话框类,主对话框也就是此应用程序运行后显示的主要界面。

???????注:如果在VS2010中找不到Solution Explorer或Class View等视图,可以在菜单项View下找到对应视图选项选择即可。在VS2010的使用介绍中已经有讲解。

?????? 在Resource View视图中可以看到工程Addition的资源树,展开Addition.rc,下面有四个子项:Dialog(对话框)、Icon(图标)、String Table(字符串表)和Version(版本)。然后展开Dialog项,下面有两个对话框模板,其ID分别为:IDD_ABOUTBOX和IDD_ADDITION_DIALOG,前者是“关于”对话框的模板,后者是主对话框的模板。ID是资源的唯一标识,本质上是一个无符号整数,一般ID代表的整数值由系统定义,我们无需干涉。

???????对话框模板

?????? 可见对于主对话框来说,创建对话框第一步中的创建新的对话框模板已经由系统自动完成了。而如果是再添加对话框需要创建新的对话框模板时,需要在Resource View的“Dialog”节点上点右键,在右键菜单中选择“Insert Dialog”,就会生成新的对话框模板,并且会自动分配ID。

?????? 在Resource View的资源树中双击某个ID,可在中间区域内显示相应的资源界面。双击IDD_ADDITION_DIALOG时,中间区域就会显示Addition对话框模板。如下图:

???????设置对话框属性

?????? 在Addition对话框模板上点右键,然后在右键菜单中选择Properties,则在右侧面板中会显示对话框的属性列表。如下图:

?????? 鸡啄米在这里对经常使用的几个属性作简单说明,并对Addition对话框进行属性设置说明。

?????? www.introzo.com:对话框ID,唯一标识对话框资源,可以修改。此处为IDD_ADDITION_DIALOG,我们不修改它。

?????? 2.Caption:对话框标题。此处默认为Addition,我们将其修改为“加法计算器”。

?????? 3.Border:边框类型。有四种类型:None、Thin、Resizing和Dialog Frame。我们使用默认的Dialog Frame。

?????? 4.Maximize:是否使用最大化按钮。我们使用默认的False。

?????? 5.Minimize:是否使用最小化按钮。同样我们使用默认的False。

?????? www.introzo.com:对话框类型。有三种类型:Overlapped(重叠窗口)、Popup(弹出式窗口)和Child(子窗口)。弹出式窗口比较常见。我们使用默认的Popup类型。

?????? 7.System Menu:是否带有标题栏左上角的系统菜单,包括移动、关闭等菜单项。我们使用默认的True。

?????? 8.Title Bar:是否带有标题栏。我们使用默认的True。

?????? 9.Font(Size):字体类型和字体大小。如果将其修改为非系统字体,则Use System自动改为False。而如果Use System原来为False,将其修改为True,则Font(Size)自动设置为系统字体。这里我们使用默认的系统字体。

???????根据以上说明,其实我们只修改了标题属性。这时我们运行此程序后的界面如下:

?????? 这一讲就先讲到这里了,对于创建对话框第一步中的为对话框添加各种控件下一讲为大家演示。欢迎来鸡啄米博客交流学习。

本文简要讲解在VS2010中怎样实现自定义MFC控件的知识,以下是分步骤说明。

???????一、自定义一个空白控件

???????1、先创建一个MFC工程

?????? NEW Project-->MFC-->MFC Application-->name:? “CustomCtr”-->Application Type选择“Dialog based”。

???????2、在窗口中添加一个自定义控件

?????? Toolbox-->“Custom Control”-->属性-->class随便填写一个控件类名“CMyWin”, 这个名字用于以后注册控件用的,注册函数为RegisterWindowClass()。

???????3、创建一个类

?????? 在窗口中,右击custom control 控件-->ClassWizard-->ClassWizard-->Add Class-->类名CMyTest(以C开头)-->Base class:CWnd。

????????4、注册自定义控件MyWin

?????? 在MyTest类.h文件中声明注册函数BOOL???RegisterWindowClass(HINSTANCE hInstance = NULL)。

C++代码

BOOL?CMyTest::RegisterWindowClass(HINSTANCE?hInstance) ??{ ????????LPCWSTR?className?=?L"CMyWin";//"CMyWin"控件类的名字??????????WNDCLASS?windowclass;?????? ??? ?????????if(hInstance) ????????????????hInstance?=?AfxGetInstanceHandle(); ????????? ?????????if?(!(::GetClassInfo(hInstance,?className,?&windowclass))) ?????????{????????????? ????????????????www.introzo.com?=?CS_DBLCLKS; ????????????????windowclass.lpfnWndProc?=?::DefWindowProc; ????????????????windowclass.cbClsExtra?=?windowclass.cbWndExtra?=?0; ????????????????windowclass.hInstance?=?hInstance; ????????????????windowclass.hIcon?=?NULL; ????????????????windowclass.hCursor?=?AfxGetApp()->LoadStandardCursor(IDC_ARROW); ????????????????windowclass.hbrBackground=\'#\'"?> ????????????????windowclass.lpszMenuName?=?NULL; ????????????????windowclass.lpszClassName?=?className; ??? ????????????????if?(!AfxRegisterClass(&windowclass)) ????????????????{ ???????????????????????AfxThrowResourceException(); ???????????????????????return?FALSE; ????????????????} ?????????} ??? ?????????return?TRUE; ??}??

???????5、在MyTest类的构造器中调用 RegisterWindowClass()。

C++代码

CMyTest::CMyTest() ??{ ?????????RegisterWindowClass(); ??}??

???????6、控件与对话框数据交换

?????? 在CustomCtrDlg.h中定义一个变量:

???????CMyTest??? m_draw;

?????? 在对话框类的CustomCtrDlg.cpp的DoDataExchange函数中添加DDX_Control(pDX,IDC_CUSTOM1,m_draw)。

C++代码

void?CCustomCtrDlg::DoDataExchange(CDataExchange*?pDX) ??{ ?????????CDialogEx::DoDataExchange(pDX); ?????????DDX_Control(pDX,IDC_CUSTOM1,m_draw); ??}??

?????? 以上是自定义一个空白控件。 ? ???????二、在控件上绘图

???????1、在CMyTest类中添加一个绘图消息

?????? 在VS2010最左侧Class View中右击CMyTest类-->ClassWizard-->Messages-->WM_PAINT-->双击,开发环境自动添加OnPaint()函数及消息队列。

???????2、编写OnPaint()函数

???????例如:画一条直线

C++代码

void?CMykk::OnPaint() ??{ ?????????CPaintDC?dc(this);?//?device?context?for?painting??????????//?TODO:?Add?your?message?handler?code?here??????????//?Do?not?call?CWnd::OnPaint()?for?painting?messages??????????CRect?rect; ?????????this->GetClientRect(rect); ??????? ?????????dc.MoveTo(0,0); ?????????dc.LineTo(rect.right,rect.bottom); ??}??

来自:http://www.introzo.com/6198051/1058634

转自:http://www.introzo.com/software/181.html

平台/工具:VS2010 目的:利用VS2010平台创建一个MFC工程,实现加法运算器的程序编写和界面设计 项目分析:实现加法计算有几个必要的因素——被加数、加数、和。被加数和加数需要输入,和需要输出显示。这几个因素都需要相应的控件来输入或显示,建立基于对话框的MFC应用程序后,需要分别添加相应的控件,配合一定的代码来实现简易加法计算器界面的编程设计 方法步骤: Step1:打开VS2010->文件->新建->项目->单击“MFC应用程序”,给项目命名为“Addition”,选择合适的存储路径->确定-> “MFC应用程序向导”对话框 单击下一步,出现如下对话框 选择“基于对话框”,其他默认,单击下一步,出现以下对话框 直接单击下一步,出现如下对话框 直接单击下一步,出现如下对话框 在“生成的类”对话框选择后面字母为Dlg的类->单击“完成” 至此,完成一个名为“Addition”的MFC应用程序工程的创建。

Step 2:建立好基于对话框的工程后,会看到如下Addition对话框界面: 打开“解决方案资源管理器”,会看到如下的信息:包含一些说明以及cpp文件、头文件,“资源视图”中会看到上面这个Dialog,即“IDD_ADDITION_DIALOG” 对Addition对话框进行如下操作: (1)删除对话框原有的“TODO:在此放置对话框控件”以及“确定”按钮,选中“取消”按钮->右键->属性,在界面右侧出现的属性页面中将其Caption对应的名称改为“退出”,ID改为“IDC_QUIT_BUTTON”,双击该按钮进入主程序,添加如下代码,以便在运行窗口单击“退出”时,窗口消失。 (2)将工具箱中的“Static Text”拖到Addition对话框中适当的位置,为对话框添加三个静态文本框(Static Text),用于显示字符串——被加数、加数、和。在属性栏上将被加数、加数、和的Caption属性修改为“被加数”“加数”“和”,ID改为IDC_SUMMAND_STATIC 、IDC_ADDEND_STATIC 、IDC_SUM_STATIC。 (3)将工具箱中的“Edit Control”拖到Addition对话框中适当的位置,为对话框添加三个编辑框(Edit Control),用来输入被加数、加数以及显示它们的和。将被加数、加数、和对应的编辑框的ID号改为IDC_SUMMAND_EDI、IDC_ADDEND_EDIT、IDC_SUM_EDIT。 (4)将工具箱中的“Button”拖到Addition对话框中与“退出”按钮平齐的位置,用于在被点击后触发加法计算。修改其Caption属性为“计算”,ID改为IDC_ADD_BUTTON。 (5)工具箱部分视图以及做完之后的Addtion对话框是这样的: (6)在“示例编辑框”上单击右键,在右键菜单中选择“添加变量”(Add Variable)。弹出添加成员变量的向导对话框。勾选“控件变量(Control Variable)” 在对话框“类别(Category)”下拉列表中选择Value; 在“变量类型(Variable type)”下拉列表中选择double; 在“变量名(Variable name)”中写入自定义的变量名。将被加数、加数、和的名字分别命名为m_editSummand 、m_editAddend 、 m_editSum 。 (7)添加代码:上述工作做完后,双击“计算”按钮,进入AdditionDlg.cpp程序,其中void CAdditionDlg::DoDataExchange(CDataExchange* pDX)函数体中一般就会自动生成如下代码,只要将对应的注释补充进去即可,没有的话手动添加: // 处理MFC默认的数据交换 CDialogEx::DoDataExchange(pDX); // 处理控件IDC_SUMMAND_EDIT和变量m_editSummand之间的数据交换 DDX_Text(pDX, IDC_SUMMAND_EDIT, m_editSummand); // 处理控件IDC_ADDEND_EDIT和变量m_editAddend之间的数据交换 DDX_Text(pDX, IDC_ADDEND_EDIT, m_editAddend); // 处理控件IDC_SUM_EDIT和变量m_editSum之间的数据交换 DDX_Text(pDX, IDC_SUM_EDIT, m_editSum);

此外,在主程序中的void CAdditionDlg::OnBnClickedAddButton()函数体中添加如下代码: //将各种控件中的数据保存到相应的变量 UpdateData(TRUE); //将被加数和加数的和赋值给m_editSum m_editSum=m_editSummand+m_editAddend; //根据各变量的值更新相应的控件,和的编辑框会显示m_editSum的值 UpdateData(FALSE);

Step 3:查看及设置控件Tab顺序 运行程序,显示对话框后不进行任何操作,而直接按回车键,则看到对话框退出了,这是因为“退出”按钮是Tab顺序为1的控件,也就是第一个接受用户输入的控件。但是按照我们的输入习惯,应该是被加数的编辑框首先接受用户输入,然后是加数编辑框,再接下来是“计算”按钮,最后才是“退出”按钮。因此需要修改Tab顺序。方法如下: 按快捷键Ctrl+D,对话框模板上就会显示各个控件的Tab顺序。它是按照对该对话框添加控件的先后来自动排序的,由于先对默认的“取消”按钮操作,改为“退出”,其次添加三个“Static Text”框用于编辑“被加数”、“加数”、“和”等字眼,然后添加三个“Edit Control”编辑框用于显示用户输入的数字(顺序是“被加数”右侧的编辑框->“加数”右侧的编辑框“和”右侧的编辑框),最后添加“计算”按钮,因此Tab响应顺序如下左图所示: 要修改顺序,只需从自己认为Tab顺序应该为1的控件开始依次单击,随着单击的完成,各控件的Tab响应顺序也按我们的想法设置好了,设置好的Tab顺序如上面右图。 注:经检验,这个修改并没有太大意义,因为运行程序后不做任何操作直接按“Enter”键,对话框还是会退出。

Step 4: 模态对话框及其弹出过程 完善对话框设计,希望在相应编辑框输入“被加数”的值、“加数”的值后,单击“计算”按钮时首先跳出一个询问对话框,然后再进行计算。步骤如下: (1)在“资源视图(ResourceView)”中的“Dialog”上点右键选择“插入Dialog(InsertDialog)”,创建一个新的对话框模板,修改其ID为IDD_TIP_DIALOG,Caption改为“提示”。 (2)在对话框模板上添加一个静态文本框(static text),Caption改为“您确定要进行加法计算吗?”,完成后的对话框如下: (3)在对话框模板上点右键选择“添加类(Add Class… )”,弹出添加类的对话框,设置“类名(Class name)”为CTipDlg,点“完成”。在“解决方案资源管理器 (Solution Explorer)”中可以看到生成了CTipDlg类的头文件TipDlg.h和源文件TipDlg.cpp。 (4)在AdditionDlg.cpp中包含CTipDlg的头文件:#include”TipDlg.h”。(Addition为你创建的项目名,不同项目可能不同) (5)单击“计算”按钮,跳转到该按钮对应的程序,将下面的代码加进来: //———添加的“提示对话框”所需的代码———– INT_PTR nRes; // 用于保存DoModal函数的返回值 CTipDlg tipDlg; // 构造对话框类CTipDlg的实例 nRes = tipDlg.DoModal(); // 弹出对话框 if (IDCANCEL == nRes) // 判断对话框退出后返回值是否为IDCANCEL,如果是则return,否则继续向下执行 return; //————————————————– 效果如图(后面的UpdateData代码在之前的操作中已经添加过):

Step 5:添加属性页,创建向导 属性页对话框想必大家并不陌生,windows系统中桌面右键->属性,弹出的就是属性页对话框,它通过标签切换各个页面。另外,我们在创建MFC工程时使用的向导对话框也属于属性页对话框,它通过点击“下一步”等按钮来切换页面。下面就具体将如何创建和配置对话框,创建属性表类以及显示向导对话框。 (1)创建和配置对话框(创建属性页对话框资源) 在“资源视图(Resource View)”的“Dialog”节点上单击右键,然后在右键菜单中选择“插入Dialog(Insert Dialog)”,连续创建三个对话框模板,分别对应被加数,加数,和。将这三个对话框的ID分别设置为IDD_SUMMAND_PAGE 、 IDD_ADDEND_PAGE 、 IDD_ADD_PAGE ,对应的Caption分别为“被加数页”“加数页”“计算页”。Style属性在下拉列表中都选择“Child”,Border属性在下拉列表中都选择“Thin”。删除对话框中默认的“确定”和“取消”按钮。 在“被加数页”对话框模板上单击右键,在右键菜单中选择“添加类(Add Class)”,弹出类向导对话框,在“类名(Class name)”编辑框中输入类名“CSummandPage”,与之前不同的是,因为属性页类都应继承于CPropertyPage类,所以要修改下面“基类(Base class)”选项,在下拉列表中选择“CPropertyPage”。 如上面右侧图所示。 注意:不要选成COlePropertyPage,否则属性中将没有“OnSetActive”选项 在“类视图(Class View)”中找到“CSummandPage”节点,选中它,右键->属性,然后VS2010右侧面板上出现其属性列表,属性列表的工具栏上有个tip信息为“重写(Overrides)”的按钮,按下它,找到“OnSetActive”,点其右侧空白列表项出现向下箭头,再选“OnSetActive”,如下面右侧图。 在SummandPage.cpp的OnSetActive函数体中添加如下代码实现添加“下一步”按钮的效果: //——————–添加的代码——————- // 获得父窗口,即属性表CPropertySheet类 CPropertySheet* psheet = (CPropertySheet*) GetParent(); // 设置属性表只有“下一步”按钮 psheet->SetWizardButtons(PSWIZB_NEXT); //————————————————- 在“被加数页”对话框中添加一个静态文本框“Static Text”,其Caption属性改为“请输入double型加数”(注意将该框拉大,大于文字实际框,否则运行时会文字显示不全),ID默认。 “加数页”以及“计算页”对话框也做类似操作,添加的类分别命名为“CAddendPage”、“CAddPage”,其他同“被加数页”操作,需要注意的是“加数页”对话框只需要添加类就可以,不需要OnSetActive的相关操作,“计算页”除OnSetActive函数体中的代码与“被加数页”不同之外,其他均同,其代码如下: //——添加代码———– // 获得父窗口,即属性表CPropertySheet类 CPropertySheet* psheet = (CPropertySheet*) GetParent(); //设置属性表只有“完成”按钮 psheet->SetFinishText(_T(“完成”)); //————————- 注意:字符串“完成”前加了个_T,这是因为本工程创建的时候用的是默认的Unicode字符集(详见Step1中第二幅图“应用程序类型”向导对话框),而如果“完成”前不加_T就是ASCII字符串。_T实际上是一个宏,工程的字符集选择为Unicode时字符串就转为Unicode字符串,选择为Muli-Byte时就转为ASCII字符串。我们可以在“解决方案管理器”的Addition根节点上单击右键,在右键菜单上选择“属性”,弹出工程的属性对话框,常规->右侧列表中的“项目默认值(Character Set)”就显示选择的字符集。 同理,在“加数页”对话框中添加一个静态文本框“Static Text”,其Caption属性改为“请继续输入double型加数”,在“计算页”对话框中添加一个静态文本框“Static Text”,其Caption属性改为“最后请按下“计算”按钮”,ID均默认。 (2)创建属性表类 在“解决方案资源管理器(Solution Explorer)”视图中的根节点“Addition”上单击右键,在右键菜单中选择“添加(Add)”->“类(Class)”,弹出“添加类”对话框,然后在中间区域中选择“MFC 类”,点“添加”按钮,弹出另一个类向导对话框,设置“类名(Class name)”为CAddSheet,“基类(Base class)”选择“CPropertySheet”,单击“完成”。 在新生成的AddSheet.h中包含三个属性页类的头文件: ,#include “SummandPage.h” ,#include “AddendPage.h” ,#include “AddPage.h” 并在AddSheet.h中添加private变量: private: CSummandPage m_summandPage; CAddendPage m_addendPage; CAddPage m_addPage; 在AddSheet.cpp文件中修改CAddSheet的两个构造函数: ①在CAddSheet::CAddSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage) :CPropertySheet(nIDCaption, pParentWnd, iSelectPage)函数体中添加如下代码: //——-添加的代码———- // 添加三个属性页到属性表 AddPage(&m_summandPage); AddPage(&m_addendPage); AddPage(&m_addPage); //————————— ②在CAddSheet::CAddSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage) :CPropertySheet(pszCaption, pParentWnd, iSelectPage)函数体中添加如下代码: //——-添加的代码———- // 添加三个属性页到属性表 AddPage(&m_summandPage); AddPage(&m_addendPage); AddPage(&m_addPage); //————————— (3)显示向导对话框 ①在Addition对话框上添加一个按钮,功能是当单击它时就打开向导对话框。将此按钮的ID设为IDC_INSTRUCT_BUTTON,Caption属性设为“使用说明”。 ②双击该按钮进入AdditionDlg.cpp,在该文件中包含CAddSheet的头文件:#include “AddSheet.h” ③添加如下代码到OnBnClickedInstructButton函数体中: //———添加的代码———- // 创建属性表对象 CAddSheet sheet(_T(“”)); // 设置属性对话框为向导对话框 sheet.SetWizardMode(); // 打开模态向导对话框 sheet.DoModal(); //—————————– 至此,简单加法计算器“Addition”程序以及界面已经编辑设计完毕,运行该程序,出现以下对话框: 单击“使用说明”,出现如下对话框: 单击“下一步”,出现如下对话框: 单击“下一步”,出现如下对话框: 单击“完成”,退出向导。在“被加数”、“加数”编辑框中分别输入“1”、“2”,单击“计算”按钮,出现如下提示框: 单击“确定”,显示运算结果: 单击“退出”,界面消失。

注意事项:对话框本身的属性(在对话框空白处单击右键->属性,右侧出现的页面就是对话框本身的属性)ID一般是IDD打头,可不改,改的目的是为了方便识别。对话框中控件(如静态文本框,编辑框,按钮等)的属性ID一般是IDC打头,同样也可以不改,改的目的是为了识别其功能。改ID的原则是:头不变,在后面根据功能命名,以类型结尾(如是按钮控件则ID以BUTTON结尾,是静态文本框以STATIC结尾)

关灯