MFC编程实例
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(4) EnableWindow:设置窗口的禁止/使能状态,参 数为true表示使能。
第10章 Visual C++编程实例
4) 定时器函数
(1) SetTimer:开始一个系统定时器。定时器的作 用是每隔指定时间发一次WM_TIMER消息。 (2) KillTimer:结束一个指定的系统定时器。 5) 提示函数
第10章 Visual C++编程实例
程序开始
生成CwinApp 的一个实例, 初始化全局对象 AfxWinMain() 的函数体 初始化句柄
退出句柄 WindMain () 的函数体 消息循环
退出句柄
程序结束
图 10-1
第10章 Visual C++编程实例
一个MFC程序运行的一般过程如下:
(1) 生成CwinApp的一个实例(调用CwinApp的构造函数), 初始化全局对象; (2) Win32入口程序函数WinMain调用函数AfxWinMain; (3) AfxWinMain调用函数CwinApp的成员函数InitInstance;
void CMyWnd::OnLButtonDown(UINT nFlags,CPoint point) { if(m_nBubbleCount<MAX_BUBBLE) {
int r=rand()%50+10;
CRect rect(point.x-r,point.y-r,point.x+r,point.y+r); m_rectBubble[m_nBubbleCount]=rect; m_nBubbleCount++; InvalidateRect(rect,FALSE);
第10章 Visual C++编程实例
OnPaint()函数根据数组m_rectBubble的内容画出一
个泡泡。其中语句。 dc.SelectStockObject(LTGRAY_BRUSH); 用于选择一个库存画刷,画刷决定了所画图形(如 椭圆、矩形和多边形等)内部的颜色。 在处理鼠标消息的ONLButtonDown()函数中,语句 int r=rand()%50+10; 随机确定了要画出的泡泡的半径(范围为10~50像 素点),其中全局函数rand()可产生一个随机整数。
}
第10章 Visual C++编程实例
}
void CMyWnd::OnPaint() {
CPaintDC dc(this);
CBrush brushNew; CPen penNew; brushNew.CreateSolidBrush(RGB(rand()%255,rand()%25 5,rand()%255));
第10章 Visual C++编程实例
3) 窗口的状态
(1) ShowWindow:显示或隐藏一个窗口,显示可以 有多种方式:最大化、最小化、正常显示等。 (2) IsWindowEnabled:判断一个窗口是否可见。 (3) IsWindowEnabled:判断窗口的禁止/使能状态,
禁止状态的窗口不能响应用户的键盘和鼠标的输入。
{
public: BOOL InitInstance(); }; BOOL CMyApp::InitInstance()
第10章 Visual C++编程实例
{
CMyWnd *pFrame=new CMyWnd; pFrame->Create(0,_T("吹彩色泡泡")); pFrame->ShowWindow(m_nCmdShow); this->m_pMainWnd=pFrame;
第10章 Visual C++编程实例
图 10-2
第10章 Visual C++编程实例
在CmyWnd类中声明了一个数组成员m_rectBubble,
用于存放泡泡的数据;另外,还声明了一个整型数据 成员m_nBubbleCount, 用来存放数组中泡泡的实际数量。 在框架窗口类的构造函数中该成员变量被初始化为0, 由于构造函数非常简单,因此使用了内联函数的形式。
第10章 Visual C++编程实例
OnPaint()函数用于绘制客户区的内容。要完成这 项任各,需要先建立一个设备环境(Device Context),这 可以通过声明一个CpaintDC类的对象dc实现。在声明 语句中,应将当前窗口对象指针this 传给CpaintDC类的 构造函数,把绘图区域确定为当前窗口的客户区。 Windows在窗口更新、移动、改变尺寸或移去覆盖在 其上的其它窗口对象时均会向该窗口发送WM_PAINT 消息,从而触发应用程序调用OnPaint()函数重绘窗口 客户区。
return TRUE;
} CMyApp ThisApp; //全局应用程序对象 按【Ctrl+F5】运行程序,运行结果如图10-2所示。
第10章 Visual C++编程实例
说明:
该程序声明了两个类,一个是由应用程序类 CwinApp派生出来的CmyApp类,一个是由框架窗口 CframeWnd类派生出来的CmyWnd类。MFC的基本类 名均以字母C打头,习惯上在为使用MFC编写的应用 程序中的类起名时也这样做。在程序中还声明了一个 CmyWnd类的全局对象ThisApp。
DECLARE_MESSAGE_MAP() }; //消息映射 BEGIN_MESSAGE_MAP(CMyWnd,CFrameWnd) ON_WM_LBUTTONDOWN() ON_WM_PAINT() END_MESSAGE_MAP()
第10章 Visual C++编程实例
//框架窗口类的成员函数
第10章 Visual C++编程实例
另外,也可以选择应用程序静态链接到MFC。静
态链接意味着,应用程序不依赖于MFC库文件的存在 (但仍然可能需要Msvcrt.dll文件)。静态链接的代价是
可执行文件更大,而且MFC内存的利用可能不够充分。
在菜单中选择“工程”中的“设置”对话框,在 对话框右方的“General”选项卡中通过组合框 “Microsoft Foundation Classes”选择使用MFC类库的 方法。可选项有三种,分别为“Not Using MFC(不使 用MFC)","Use MFC in a Shared DLL(以动态链接库方式 使用MFC)”和“Use MFC in a Static Library(以静态库 方式使用MFC)”。
int m_nBubbleCount;
public: CMyWnd() {m_nBubbleCount=0;}
第10章 Visual C++编程实例
protected:
afx_msg point); void OnLButtonDown(UINT nFlags,CPoint
afx_msg void OnPaint();
第10章 Visual C++编程实例
用系统资源。
然而,动态链接到MFC时要求提供Mfcnn.dll库文 件,文件名中的nn代表MFC的版本号。该文件通常在 Windows System或System32文件夹下。如果一个应用 程序动态链接到了MFC,但该应用程序通常用在那些 可能没有Mfcnn.dll库的计算机系统上,则应把这个库 文件作为应用程序包的一部分提供给用户。Microsoft 允许程序员自由地把这些库文件附在应用程序中。
(4) AfxWinMain调用函数CwinApp的成员函数Run;
(5) AfxWinMain函数返回到WinMain,WimMain结束,程 序结束。
第10章Hale Waihona Puke BaiduVisual C++编程实例
例10-1
吹泡泡程序。每当用户在窗口客户区中按
下鼠标左键时即可产生一个泡泡(彩色圆形)。 设计思路:显示一个泡泡所需的数据包括其位置
(1) FlashWindow:闪烁窗口。
(2) MessageBox:弹出一个标准消息框。
第10章 Visual C++编程实例
例如:开始一个系统定时器每0.5秒发一次
WM_TIMER消息,代码为: SetTimer(1,500,NULL): 其中,第一个参数表示定时器的标识,第二个参 数表示发送WM_TIMER的间隔时间,第三个参数是一 个回调函数,一般设为NULL。可以在WM_TIMER消 息的处理函数OnTimer(通过ClassWizard添加)中加入处 理代码来响应定时器消息。结束定时器的方法是调用
penNew.CreatePen(PS_SOLID,1,RGB(255,0,0));
dc.SelectObject(&brushNew); dc.SelectObject(&penNew);
第10章 Visual C++编程实例
for(int i=0;i<m_nBubbleCount;i++)
dc.Ellipse(m_rectBubble[i]); } //应用程序类 class CMyApp:public CWinApp
和大小,在MFC中可用其包含矩形表示。可设置一数
组,每当用户按下鼠标左键时,就产生一个泡泡的数 据并存入数组中。最后,由框架窗口类的OnPaint()函 数显示所有的泡泡。
第10章 Visual C++编程实例
#include<afxwin.h>
#define MAX_BUBBLE 250 class CMyWnd:public CFrameWnd { CRect m_rectBubble[MAX_BUBBLE];
(3) 窗口句柄的销毁:调用CWnd::DestroyWindow。
第10章 Visual C++编程实例
2) 窗口的大小和位置
(1) IsIconic:窗口是否处在最小化状态。 (2) IsZoomed:判断窗口是否在最大化状态。 (3) MoveWindow:改变窗口的大小、位置和Z轴顺序。 Z轴顺序指本窗口和其他窗口的覆盖关系。
第10章 Visual C++编程实例
10.2 常用MFC类和消息处理
10.2.1 常用MFC类 MFC的类构成了一个完整的体系,该体系由一个 被称为Cobject的类作为基类,其它类大部分由该类派 生而来,如CWnd(窗口类)、Cdocument(文档类)、 Cfile(文件类)等。也有一部分类如字符串类,Cstring和
构函数销毁,而一个Windows 窗口则通过CWnd的
Create函数创建,被DestroyWindow函数销毁。
第10章 Visual C++编程实例
1) 窗口句柄
(1) 窗口句柄的创建:当CWnd::Create被调用时, Windows窗口被创建,窗口句柄存放在CWnd的成员变 量m_hWnd中。 (2) 程序中窗口句柄的取得:可以直接利用成员变 量m_hWnd,但安全的方法是调用函数CWnd::Get(), 它返回与窗口对象相关联的句柄,并且当窗口对象没 有关联句柄时或当前CWnd指针为NULL时返回空指针。
时间类Ctime等则不从Cobject继承。
第10章 Visual C++编程实例
1. 窗口公共基类CWnd
类CWnd对所有Windows窗口提供功能支持,它是 所有窗口类的直接或间接父类。 一个CWnd对象和一个Windows窗口是有本质区别 的,尽管它们有密切的联系。CWnd对象是一个C++ 概念,即类的实例,而Windows窗口则是指向Windows 内部数据结构的一个句柄,它的创建和显示要消耗系 统资源。一个CWnd对象通过其构造函数被创建,被析
第10章 Visual C++编程实例
调试:
首先,使用Visual C++集成开发环境中的菜单选项 “文件/新建”,并在项目选项卡中选择“Win32 Application"。 其次,在编译时要确定应用程序的可执行程序如
何使用MFC的类库。一种方法是使用共享的动态链接
库(DLL)。这种链接方式显著地减小了应用程序的可执 行文件的大小,并能有效地利
第10章 Visual C++编程实例
第10章 Visual C++编程实例
10.1 MFC编程流程 10.2 常用MFC类和消息处理
10.3 对话框的应用
10.4 菜 单 的 应 用
10.5 工具栏应用
第10章 Visual C++编程实例
10.1 MFC编程流程
在普通的C/C++程序中,可以看到程序从main函数 开始到结束的所有代码,但在Visual C++中MFC封装了 一部分类,同时也隐藏了一部分代码,因此我们看不 到源程序的所有代码,例如从项目的所有源文件中找 不到main函数。 基本对话框的MFC程序流程图如图10-1所示。
第10章 Visual C++编程实例
4) 定时器函数
(1) SetTimer:开始一个系统定时器。定时器的作 用是每隔指定时间发一次WM_TIMER消息。 (2) KillTimer:结束一个指定的系统定时器。 5) 提示函数
第10章 Visual C++编程实例
程序开始
生成CwinApp 的一个实例, 初始化全局对象 AfxWinMain() 的函数体 初始化句柄
退出句柄 WindMain () 的函数体 消息循环
退出句柄
程序结束
图 10-1
第10章 Visual C++编程实例
一个MFC程序运行的一般过程如下:
(1) 生成CwinApp的一个实例(调用CwinApp的构造函数), 初始化全局对象; (2) Win32入口程序函数WinMain调用函数AfxWinMain; (3) AfxWinMain调用函数CwinApp的成员函数InitInstance;
void CMyWnd::OnLButtonDown(UINT nFlags,CPoint point) { if(m_nBubbleCount<MAX_BUBBLE) {
int r=rand()%50+10;
CRect rect(point.x-r,point.y-r,point.x+r,point.y+r); m_rectBubble[m_nBubbleCount]=rect; m_nBubbleCount++; InvalidateRect(rect,FALSE);
第10章 Visual C++编程实例
OnPaint()函数根据数组m_rectBubble的内容画出一
个泡泡。其中语句。 dc.SelectStockObject(LTGRAY_BRUSH); 用于选择一个库存画刷,画刷决定了所画图形(如 椭圆、矩形和多边形等)内部的颜色。 在处理鼠标消息的ONLButtonDown()函数中,语句 int r=rand()%50+10; 随机确定了要画出的泡泡的半径(范围为10~50像 素点),其中全局函数rand()可产生一个随机整数。
}
第10章 Visual C++编程实例
}
void CMyWnd::OnPaint() {
CPaintDC dc(this);
CBrush brushNew; CPen penNew; brushNew.CreateSolidBrush(RGB(rand()%255,rand()%25 5,rand()%255));
第10章 Visual C++编程实例
3) 窗口的状态
(1) ShowWindow:显示或隐藏一个窗口,显示可以 有多种方式:最大化、最小化、正常显示等。 (2) IsWindowEnabled:判断一个窗口是否可见。 (3) IsWindowEnabled:判断窗口的禁止/使能状态,
禁止状态的窗口不能响应用户的键盘和鼠标的输入。
{
public: BOOL InitInstance(); }; BOOL CMyApp::InitInstance()
第10章 Visual C++编程实例
{
CMyWnd *pFrame=new CMyWnd; pFrame->Create(0,_T("吹彩色泡泡")); pFrame->ShowWindow(m_nCmdShow); this->m_pMainWnd=pFrame;
第10章 Visual C++编程实例
图 10-2
第10章 Visual C++编程实例
在CmyWnd类中声明了一个数组成员m_rectBubble,
用于存放泡泡的数据;另外,还声明了一个整型数据 成员m_nBubbleCount, 用来存放数组中泡泡的实际数量。 在框架窗口类的构造函数中该成员变量被初始化为0, 由于构造函数非常简单,因此使用了内联函数的形式。
第10章 Visual C++编程实例
OnPaint()函数用于绘制客户区的内容。要完成这 项任各,需要先建立一个设备环境(Device Context),这 可以通过声明一个CpaintDC类的对象dc实现。在声明 语句中,应将当前窗口对象指针this 传给CpaintDC类的 构造函数,把绘图区域确定为当前窗口的客户区。 Windows在窗口更新、移动、改变尺寸或移去覆盖在 其上的其它窗口对象时均会向该窗口发送WM_PAINT 消息,从而触发应用程序调用OnPaint()函数重绘窗口 客户区。
return TRUE;
} CMyApp ThisApp; //全局应用程序对象 按【Ctrl+F5】运行程序,运行结果如图10-2所示。
第10章 Visual C++编程实例
说明:
该程序声明了两个类,一个是由应用程序类 CwinApp派生出来的CmyApp类,一个是由框架窗口 CframeWnd类派生出来的CmyWnd类。MFC的基本类 名均以字母C打头,习惯上在为使用MFC编写的应用 程序中的类起名时也这样做。在程序中还声明了一个 CmyWnd类的全局对象ThisApp。
DECLARE_MESSAGE_MAP() }; //消息映射 BEGIN_MESSAGE_MAP(CMyWnd,CFrameWnd) ON_WM_LBUTTONDOWN() ON_WM_PAINT() END_MESSAGE_MAP()
第10章 Visual C++编程实例
//框架窗口类的成员函数
第10章 Visual C++编程实例
另外,也可以选择应用程序静态链接到MFC。静
态链接意味着,应用程序不依赖于MFC库文件的存在 (但仍然可能需要Msvcrt.dll文件)。静态链接的代价是
可执行文件更大,而且MFC内存的利用可能不够充分。
在菜单中选择“工程”中的“设置”对话框,在 对话框右方的“General”选项卡中通过组合框 “Microsoft Foundation Classes”选择使用MFC类库的 方法。可选项有三种,分别为“Not Using MFC(不使 用MFC)","Use MFC in a Shared DLL(以动态链接库方式 使用MFC)”和“Use MFC in a Static Library(以静态库 方式使用MFC)”。
int m_nBubbleCount;
public: CMyWnd() {m_nBubbleCount=0;}
第10章 Visual C++编程实例
protected:
afx_msg point); void OnLButtonDown(UINT nFlags,CPoint
afx_msg void OnPaint();
第10章 Visual C++编程实例
用系统资源。
然而,动态链接到MFC时要求提供Mfcnn.dll库文 件,文件名中的nn代表MFC的版本号。该文件通常在 Windows System或System32文件夹下。如果一个应用 程序动态链接到了MFC,但该应用程序通常用在那些 可能没有Mfcnn.dll库的计算机系统上,则应把这个库 文件作为应用程序包的一部分提供给用户。Microsoft 允许程序员自由地把这些库文件附在应用程序中。
(4) AfxWinMain调用函数CwinApp的成员函数Run;
(5) AfxWinMain函数返回到WinMain,WimMain结束,程 序结束。
第10章Hale Waihona Puke BaiduVisual C++编程实例
例10-1
吹泡泡程序。每当用户在窗口客户区中按
下鼠标左键时即可产生一个泡泡(彩色圆形)。 设计思路:显示一个泡泡所需的数据包括其位置
(1) FlashWindow:闪烁窗口。
(2) MessageBox:弹出一个标准消息框。
第10章 Visual C++编程实例
例如:开始一个系统定时器每0.5秒发一次
WM_TIMER消息,代码为: SetTimer(1,500,NULL): 其中,第一个参数表示定时器的标识,第二个参 数表示发送WM_TIMER的间隔时间,第三个参数是一 个回调函数,一般设为NULL。可以在WM_TIMER消 息的处理函数OnTimer(通过ClassWizard添加)中加入处 理代码来响应定时器消息。结束定时器的方法是调用
penNew.CreatePen(PS_SOLID,1,RGB(255,0,0));
dc.SelectObject(&brushNew); dc.SelectObject(&penNew);
第10章 Visual C++编程实例
for(int i=0;i<m_nBubbleCount;i++)
dc.Ellipse(m_rectBubble[i]); } //应用程序类 class CMyApp:public CWinApp
和大小,在MFC中可用其包含矩形表示。可设置一数
组,每当用户按下鼠标左键时,就产生一个泡泡的数 据并存入数组中。最后,由框架窗口类的OnPaint()函 数显示所有的泡泡。
第10章 Visual C++编程实例
#include<afxwin.h>
#define MAX_BUBBLE 250 class CMyWnd:public CFrameWnd { CRect m_rectBubble[MAX_BUBBLE];
(3) 窗口句柄的销毁:调用CWnd::DestroyWindow。
第10章 Visual C++编程实例
2) 窗口的大小和位置
(1) IsIconic:窗口是否处在最小化状态。 (2) IsZoomed:判断窗口是否在最大化状态。 (3) MoveWindow:改变窗口的大小、位置和Z轴顺序。 Z轴顺序指本窗口和其他窗口的覆盖关系。
第10章 Visual C++编程实例
10.2 常用MFC类和消息处理
10.2.1 常用MFC类 MFC的类构成了一个完整的体系,该体系由一个 被称为Cobject的类作为基类,其它类大部分由该类派 生而来,如CWnd(窗口类)、Cdocument(文档类)、 Cfile(文件类)等。也有一部分类如字符串类,Cstring和
构函数销毁,而一个Windows 窗口则通过CWnd的
Create函数创建,被DestroyWindow函数销毁。
第10章 Visual C++编程实例
1) 窗口句柄
(1) 窗口句柄的创建:当CWnd::Create被调用时, Windows窗口被创建,窗口句柄存放在CWnd的成员变 量m_hWnd中。 (2) 程序中窗口句柄的取得:可以直接利用成员变 量m_hWnd,但安全的方法是调用函数CWnd::Get(), 它返回与窗口对象相关联的句柄,并且当窗口对象没 有关联句柄时或当前CWnd指针为NULL时返回空指针。
时间类Ctime等则不从Cobject继承。
第10章 Visual C++编程实例
1. 窗口公共基类CWnd
类CWnd对所有Windows窗口提供功能支持,它是 所有窗口类的直接或间接父类。 一个CWnd对象和一个Windows窗口是有本质区别 的,尽管它们有密切的联系。CWnd对象是一个C++ 概念,即类的实例,而Windows窗口则是指向Windows 内部数据结构的一个句柄,它的创建和显示要消耗系 统资源。一个CWnd对象通过其构造函数被创建,被析
第10章 Visual C++编程实例
调试:
首先,使用Visual C++集成开发环境中的菜单选项 “文件/新建”,并在项目选项卡中选择“Win32 Application"。 其次,在编译时要确定应用程序的可执行程序如
何使用MFC的类库。一种方法是使用共享的动态链接
库(DLL)。这种链接方式显著地减小了应用程序的可执 行文件的大小,并能有效地利
第10章 Visual C++编程实例
第10章 Visual C++编程实例
10.1 MFC编程流程 10.2 常用MFC类和消息处理
10.3 对话框的应用
10.4 菜 单 的 应 用
10.5 工具栏应用
第10章 Visual C++编程实例
10.1 MFC编程流程
在普通的C/C++程序中,可以看到程序从main函数 开始到结束的所有代码,但在Visual C++中MFC封装了 一部分类,同时也隐藏了一部分代码,因此我们看不 到源程序的所有代码,例如从项目的所有源文件中找 不到main函数。 基本对话框的MFC程序流程图如图10-1所示。