MFC 编程基础.docx

上传人:b****6 文档编号:5988312 上传时间:2023-01-02 格式:DOCX 页数:31 大小:217.24KB
下载 相关 举报
MFC 编程基础.docx_第1页
第1页 / 共31页
MFC 编程基础.docx_第2页
第2页 / 共31页
MFC 编程基础.docx_第3页
第3页 / 共31页
MFC 编程基础.docx_第4页
第4页 / 共31页
MFC 编程基础.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

MFC 编程基础.docx

《MFC 编程基础.docx》由会员分享,可在线阅读,更多相关《MFC 编程基础.docx(31页珍藏版)》请在冰豆网上搜索。

MFC 编程基础.docx

MFC编程基础

第1章基于对话框的Windows应用程序

1.简介Windows编程的两种方法,即WindowsAPI编程和MFC编程。

2.基于对话框的应用程序的创建过程:

• 建立基于对话框的MFC应用程序框架;

• 放置控件;

• 设置控件属性;

• 为控件连接变量,即为控件命名;

• 添加并且编写消息处理函数。

3.常用基本控件:

• 静态文本框:

主要用来显示文本信息,不能接受用户输入

• 命令按钮:

是最常见的、应用最广泛的一种控件。

在程序执行期间,当单击某个命令按钮后就会执行相应的消息处理函数。

• 编辑框:

是一个文本编辑区域,用户可以在该区域输入、编辑和显示正文内容。

• 框架:

将一组相关的控件框起来,达到标识一组控件的作用。

• 单选按钮:

用户在一组单选按钮中最多只能选择一项。

当某一项被选定后,其他选项自动变成未选状态。

• 复选框:

列出了可供选择的项,用户可根据需要选择其中的一项或多项,各选项之间的状态互不相关。

• 列表框:

通过显示多个选项,供用户选择,达到与用户对话的目的。

• 组合框:

组合了编辑框和列表框的特性而形成的一种控件。

在列表框中列出可供用户选择的项,当用户选定某项后,该项内容自动装入编辑框中。

• 滚动条:

通常附在对话框上用来协助观察数据或确定位置,也可以用来作为数据输入的工具。

1.1Windows编程基础

Windows应用程序的主要特点是:

•具有标准的图形用户界面。

•具有与硬件无关的特性。

•采用“消息传递,事件驱动”的运行机制。

用VisualC++编写Windows应用程序主要有两种方法:

一是使用Windows提供的应用程序接口(ApplicationProgrammingInterface,API)函数;二是使用Microsoft提供的微软基础类(MicrosoftFoundationClass,MFC)。

1.1.1WindowsAPI编程

从本质上来说,API是Windows系统支持的函数定义、参数定义和消息格式的集合,共有上千个标准的API函数可供应用程序调用。

调用WindowsAPI函数的方法与调用C语言库函数的方法基本相同。

下面通过一个简单的实例来说明WindowsAPI编程是如何调用API函数的。

…………………………………………………………

 #include"windows.h"

 intAPIENTRYWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,

 LPSTRlpCmdLine,intnCmdShow)

 {

MessageBox(NULL,"这是一个简单的Windows应用程序!

","API函数调用示例",MB_OK);

  return0;

 }

…………………………………………………………

这是一个简单的Windows应用程序。

Windows应用程序的主函数是WinMain(),不是main()函数。

函数体中调用了WindowsAPI函数MessageBox(),弹出如图所示的对话框。

在直接使用API函数进行Windows编程时,程序员不仅需要熟记一大堆常用的API函数,而且还要对Windows操作系统有深入的了解,编写大量的代码。

用这种方式即使是开发一个很简单的应用程序也需要大量的工作,直接用API函数进行编程是需要极大的耐心和丰富的编程经验的。

1.1.2MFC编程

MFC是VisualC++的核心。

虽然在Windows应用程序中可以直接调用API函数,但是一般不经常直接调用,而是从MFC类创建对象并调用属于这些对象的成员函数。

MFC是Microsoft公司提供的用来编写Windows应用程序的C++类库,MFC大约有200多个类,可以分成两种:

一是Cobject类的派生类,它们以层次结构的形式组织起来,几乎每个子层次结构都与一个具体的Windows实体对应;二是非Cobject派生类,这些都是独立的类,如表示点的Cpoint类,表示矩形的Crect类。

在VisualC++中,可以创建以下3类典型的Windows应用程序,它们都是通过MFCAppWizard(exe)(以下简称AppWizard)应用向导创建的:

(1)基于对话框的应用程序:

这类程序适合于文档较少而交互操作较多的应用场合,如Windows自带的计算器程序。

(2)单文档界面(SDI)应用程序:

这类程序一次只能打开一个文档,如Windows自带的Notepad程序。

(3)多文档界面(MDI)应用程序:

这类程序可以同时打开多个文档并进行处理,处理的过程中很容易地进行切换,如MicrosoftWord。

1.2基于对话框的Windows应用程序

对话框是一种特殊类型的窗口,绝大多数Windows程序都通过对话框与用户进行交互。

在VisualC++中,对话框既可以单独组成一个简单的应用程序,又可以成为文档/视图结构程序的资源。

1.2.1简单应用程序实例

创建对话框程序的步骤:

(1)建立基于对话框的MFC应用程序框架;

(2)放置控件;

(3)设置控件属性;

(4)为控件连接变量,即为控件命名;

(5)添加并且编写消息处理函数。

【例1.1】编写一个如图所示的应用程序。

若单击“复制”按钮(Button),则把上面的编辑框(EditBox)中的内容复制到下面的编辑框中;若单击“结束”按钮,则退出程序的运行。

程序的创建过程:

(1)建立基于对话框的MFC应用程序框架。

①选择“文件|新建”命令;

②在“工程”选项卡中,选定“MFCAppWizard(exe)”,输入工程名称,选择“确定”。

③选定“D基本对话”,即创建基于对话框的应用程序,选择“完成”。

(2)放置控件

•删除原有的控件。

•放置所需的控件:

两个编辑框和两个命令按钮。

方法是:

先单击控件工具栏上的控件图标选择所需的控件,然后在对话框设计界面上按住鼠标左键拖拉出所需要的大小后释放。

(3)设置控件属性

选定控件,在其快捷菜单中选择“属性”命令,在弹出如图所示的对话框中进行设置。

上面编辑框的属性设置如下:

•选定“Multiline”复选框,编辑框中可以输入多行文本。

•选定“Verticalscroll”和“AutoVscroll”,编辑框将有垂直滚动条。

•选定“Wantreturn”。

(否则运行时敲回车键就退出程序)

下面编辑框属性的设置与上面编辑框基本一样,只是可以不选定“Wantreturn”。

从图中可以看到编辑框的ID为IDC_EDIT1,这是该控件的标识。

任何一个控件都有一个ID,某些函数需要通过ID对控件进行操作。

(4)连接变量

为控件连接变量就是为控件起一个名称,以便在程序中使用这个名称来操作对应的控件。

每一个控件都是一个对象。

为IDC_EDIT1连接变量m_e1的步骤如下:

①在IDC_EDIT1编辑框的快捷菜单中选“建立类向导”,弹出“MFCClassWizard”对话框。

②在“MemberVariables”成员变量选项卡的“ControlsIDs”控件列表中,选定“IDC_EDIT1”,再选择“AddVariable”命令。

③在“AddMemberVariable”对话框中输入以下的数据:

MemberVariablename(内存变量名):

m_e1;

Category(类别):

Control;

Variabletype(类型):

Cedit

用同样的方法再为IDC_EDIT2连接一个变量m_e2。

(5)添加并且编写消息处理函数。

本例要求单击“复制”按钮后上面编辑框中的内容复制到下面的编辑框中。

也就是说,在程序运行时,在“复制”按钮上发生单击事件后,Windows向对话框发出了一个BN_CLICKED消息,CTESTDlg类应有一个处理该消息的函数。

添加和编写这个消息处理函数的过程是:

①双击“复制”按钮,弹出的“AddMemberFunction”添加成员函数对话框,输入函数名(缺省函数名为OnButton1),选择“确定”按钮后,添加了一个空函数。

另一个方法是在“MFCClassWiard”对话框“MessageMaps”选项卡中,选定IDC_BUTTON1列表(位于ObjectIds对象列表)和BN_CLICKED消息(位于Messageds消息列表),然后选择“AddFunction”按钮即可。

添加的空函数如下:

    voidCTESTDlg:

:

OnButton1()

    {

     //TODO:

Addyourcontrolnotificationhandlercodehere

    }

②为voidCTESTDlg:

:

OnButton1()添加代码

    voidCTESTDlg:

:

OnButton1()

    {

     //TODO:

Addyourcontrolnotificationhandlercodehere

     m_e1.SetSel(0,-1);//选定编辑框m_e1中的所有内容

m_e1.Copy();//把编辑框m_e1中选定的内容复制到剪贴板

m_e2.SetSel(0,-1);//选定编辑框m_e2中的所有内容

m_e2.Paste();//将剪贴板中内容粘贴到编辑框m_e2中,替换所有选定的内容

    }

用同样的方法为“结束”按钮添加、编写如下的消息处理函数:

    voidCTESTDlg:

:

OnButton2()

    {

     //TODO:

Addyourcontrolnotificationhandlercodehere

     CDialog:

:

OnOK();//退出对话框程序

    }

1.2.2对话框应用程序框架

用AppWizard创建基于对话框的应用程序框架(假定工程名为TEST)后,项目工作区上增加了一个“ResourceView”选项卡,中间是对话框设计界面,右边是控件工具栏。

1.ResourceView

在VisualC++中,与用户进行交互的对话框界面被认为是一种资源。

展开“Dialog”,可以看到有一个ID为IDD_TEST_DIALOG的资源,对应中间的对话框设计界面。

不管在何时,只要双击对话框资源的ID,对话框设计界面就会显示在中间。

2.ClassView

在ClassView中,如图所示,可以看到生成了3个类:

CAboutDlg、CTESTApp和CTESTDlg。

(1)CAboutDlg:

对应生成的版本信息对话框。

(2)CTESTDlg:

对话框类,从Cdialog继承过来的,在程序运行时看到的对话框就是它的一个具体对象。

(3)CTESTApp:

应用程序类,从CWinApp继承过来,封装了初始化、运行、终止该程序的代码。

3.对话框设计界面

对话框设计界面是进行对话框设计的地方,可以将各种控件放置在这里。

4.控件工具栏

控件工具栏上有26个控件图标,可以通过这些图标在对话框上设计出所需的控件。

1.3静态文本框、命令按钮和编辑框

静态文本框、命令按钮和编辑框是Windows应用程序中最基本的控件。

静态文本框是CStatic类的对象,命令按钮是CButton类的对象,编辑框是CEdit类的对象。

这三个类都是从CWnd类直接派生来的,具有CWnd类的全部功能。

1.3.1静态文本框

静态文本框是最简单的控件。

它主要用来显示文本信息,不能接受用户输入,一般不需要连接变量,也不需要处理消息。

静态文本框的重要属性有:

(1)ID:

所有静态文本框的缺省ID都是IDC_STATIC,一般不需要重新设置。

(2)标题:

需要显示的文本信息是在这里设置的。

(3)边框:

边框属性在Styles选项卡中,决定是否带有边框。

1.3.2命令按钮

命令按钮是最常见的、应用最广泛的一种控件。

在程序执行期间,当单击某个命令按钮后就会执行相应的消息处理函数。

命令按钮的主要属性是标题属性,该属性用来设置在命令按钮上显示的文本。

命令按钮一般不需要连接变量。

命令按钮能处理的消息是BN_CLICKED。

1.3.3编辑框

1.属性设置

编辑框的属性主要在Styles选项卡中设置。

重要属性有:

(1)Multiline:

定义该编辑框为多行文本框。

(2)Number:

限定输入的字符只能是数字字符。

(3)Border:

为控件创建边界。

(4)Read-only:

编辑框成为只读的,禁止用户编辑。

2.成员函数

编辑框常用的成员函数见表。

此外编辑框还可以使用CWnd类的成员函数。

CWnd类的重要成员函数有:

(1)获取编辑中的内容

形式1:

voidGetWindowText(CString&rString)const;

说明:

将编辑框中的内容复制到CString类对象rString中。

示例:

将编辑框m_e中的内容复制到CString类对象ch中。

    CStringch;

    m_e.GetWindowText(ch);

形式2:

intGetWindowText(LPTSTRlpszStringBuf,intnMaxCount)const;

说明:

将编辑框中的内容复制到lpszStringBuf中,最多复制nMaxCount个字符。

lpszStringBuf是字符数组或字符指针。

示例:

将编辑框m_e中的内容复制到字符数组ch中。

    charch[80];

    m_e.GetWindowText(ch,80);

(2)设置编辑框中的内容

形式:

voidSetWindowText(LPCTSTRlpszString);

说明:

将lpszString中的内容替换编辑框中原有内容,lpszString是字符数组或字符指针。

示例:

设置编辑框中的内容为“abcdefg”

    charch[20]="abcdefg";

    m_e.SetWindowText(ch);

3.连接变量

编辑框在连接变量时,除了要指定变量名之外,还要确定变量类别。

变量类别有两个可选择:

一是Control(控件),意味着该变量作控件使用,对应的变量类型只能是Cedit,可以使用该控件类的成员函数;二是Value(值),意味着该变量当作C/C++中普通的变量使用,对应的变量类型有CString、int、double等,可以使用这些数据类型的函数,但是不能使用控件的成员函数。

若一个编辑框连接了一个Value类别的变量,则该变量就表示这个编辑框,编辑框中显示的内容就是变量的值。

但是,改变了编辑框的内容并不会自动更新对应的变量的值,同样,改变了变量的值也不会自动刷新编辑框的内容。

若要保持一致,需要使用UpdateData()函数更新,如图所示。

若编辑框的内容改变了,则应使用语句UpdateData(TRUE);更新对应的变量的值;若变量的值改变了,则应使用语句UpdateData(FALSE);刷新编辑框的内容。

4.消息处理函数

在编辑框能处理的消息中是最重要的是EN_CHANGE,这是编辑框中的文本被修改后发出的消息。

【例1.2】输入一元二次方程ax2+bx+c=0的系数a、b、c,计算并输出两个根x1、x2,如图所示。

求方程的根

对话框上有5个静态文本框、5个编辑框和2个命令按钮。

编辑框按表连接变量,其余控件不需要连接变量。

为了要计算b2-4ac的平方根,需要使用sqrt()函数,因此在TESTDlg.cpp文件的开始添加了文件包含命令:

    #include"math.h"//"计算"按钮的函数

    …………………………………………………………

    voidCTESTDlg:

:

OnCalc()

    {

     //TODO:

Addyourcontrolnotificationhandlercodehere

     UpdateData(TRUE);//CDialog:

:

UpdateData(TRUE);

doublea=m_a;

doubleb=m_b;

doublec=m_c;

m_x1=(-b+sqrt(b*b-4*a*c))/(2*a);

m_x2=(-b-sqrt(b*b-4*a*c))/(2*a);

UpdateData(FALSE);

    }

     //“结束”按钮的函数

    …………………………………………………………

    voidCTESTDlg:

:

OnOk()//覆盖基类Cdialog中的OnOk()

    {

     //TODO:

Addyourcontrolnotificationhandlercodehere

     CDialog:

:

OnOK();//此处不能写成OnOK();

    }

    …………………………………………………………

【例1.3】字符串转换程序

转换规则为:

大写字母转换成小写;

将小写字母转换成大写;

换行符和回车符不变;

其余字符转换为“*”

要求:

每输入一个字符立即转换

第1个编辑框连接变量m_e1(Control)

属性选定:

Multiline

Verticalscroll

AutoVScroll(在多行控件中,当用户在最后一行按下ENTER键时自动向上滚动文本)

Wantreturn(使多行编辑器接收回车键,表示换行。

如果不指定,按回车键会选择缺省的命令按钮,这往往会导致对话框的关闭)

第2个编辑框连接变量m_e2(Control)

属性选定:

Multiline

Verticalscroll

AutoVScroll

Read-only

对第1个编辑框添加EN_CHANGE消息处理函数

voidCTESTDlg:

:

OnChangeEdit1()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

chars[80];

m_e1.GetWindowText(s,80);

for(inti=0;s[i]!

='\0';i++)

if(s[i]>='A'&&s[i]<='Z')

s[i]=s[i]+'a'-'A';

else

if(s[i]>='a'&&s[i]<='z')

s[i]=s[i]+'A'-'a';

else

if(s[i]=='\n'||s[i]=='\r')

s[i]=s[i];

else

s[i]='*';

m_e2.SetWindowText(s);

}

1.4框架、单选按钮和复选框

框架、单选按钮和复选框都是对话框的常见控件。

静态文本框是CStatic类的对象,框架、单选按钮、复选框与命令按钮一样都是CButton类的对象。

1.4.1框架

当对话框上控件较多时,可以使用框架将一组相关的控件框起来,达到标识一组控件的作用。

框架不需要连接变量,也不需要处理消息。

框架的重要属性有:

(1)ID:

所有框架的缺省ID都是IDC_STATIC,不需要重新设置。

(2)标题:

该属性决定框架上的标题文本。

1.4.2单选按钮

1.设计要求

同一组中的按钮必须一个接一个地放进对话框中,中间不能插入其他控件,并且一个组的第一个按扭要选中“Group”属性,表示一组控件的开始。

2.重要属性

(1)ID:

每个命令按钮都有一个缺省ID,如IDC_RADIO1,可以重新设置。

(2)标题:

该属性值就是单选按钮右边显示的文本标题。

(3)Group:

一组中第一个按钮选中该属性,表示它是一组的开始。

3.消息

单选按钮能处理的消息是BN_CLICKED。

4.重要函数

(1)设定单选按钮选中状态

初始时,可使用CWnd类的成员函数CheckRadioButton()设定一组单选按钮中选中的按钮。

原型:

voidCWnd:

:

CheckRadioButton(intnIDFirstButton,intnIDLastButton,intnIDCheckButton);

  说明:

①nIDFirstButton是一组中第一个单选按钮的ID;

②nIDLastButton是一组中最后一个单选按钮的ID;

③nIDCheckButton为初始时设置为选中的那个单选按钮的ID。

(2)判定单选按钮是否被选定

形式:

UINTIsDlgButtonChecked(intnIDButton)const;//CWnd类的常成员函数

说明:

如果ID为nIDButton的按钮被选定,则该函数的返回值为true,否则为false。

【例1.4】设计一个如图所示的程序。

当单击“确定”后,用AfxMessageBox函数显示一个如图所示的消息框。

(1)界面设计

首先创建一个对话框程序框架,然后放置各控件,进行属性设置,将编辑框连接到Cstring类型的m_e变量,其余控件不需要连接变量。

将“男”和“教授”对应的单选钮的Group属性勾上。

(2)初始化

单选按钮的初始化工作在对话框的初始化函数实现。

    BOOLCTESTDlg:

:

OnInitDialog()

    {

      ┆

     CheckRadioButton(IDC_RADIO1,IDC_RADIO2,IDC_RADIO1);

     CheckRadioButton(IDC_RADIO3,IDC_RADIO5,IDC_RADIO3);

      ┆

    };

(3)消息处理函数

    voidCTESTDlg:

:

OnButton1()

    {

     //TODO:

Addyourcontrolnotif

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

当前位置:首页 > 自然科学

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

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