青少年编程与数学 02-010 C++程序设计基础 43课题、MFC
- 一、MFC
- 二、使用步骤
-
-
- [1. 安装和配置开发环境](#1. 安装和配置开发环境)
-
- [1.1 安装Visual Studio](#1.1 安装Visual Studio)
- [1.2 配置项目](#1.2 配置项目)
- [2. 创建用户界面](#2. 创建用户界面)
-
- [2.1 使用资源编辑器](#2.1 使用资源编辑器)
- [3. 编写代码](#3. 编写代码)
-
- [3.1 添加消息处理函数](#3.1 添加消息处理函数)
- [4. 编译和运行](#4. 编译和运行)
- [5. MFC编程的最佳实践](#5. MFC编程的最佳实践)
- 总结
-
课题摘要:MFC是一个用于简化Windows应用程序开发的C++库,封装了Windows API的大部分功能,提供了丰富的类和函数,特别适用于开发具有复杂用户界面的应用程序。文章详细阐述了MFC的主要特点,包括封装Windows API、文档/视图架构、丰富的控件和对话框以及消息映射机制。通过一个简单的MFC应用程序示例,展示了如何创建项目、添加控件、编写消息处理函数以及编译和运行应用程序。此外,还介绍了MFC编程的最佳实践,如使用资源编辑器、消息映射、文档/视图架构、异常处理和资源管理。希望这些内容能帮助读者更好地理解和使用MFC进行编程。
一、MFC
MFC(Microsoft Foundation Classes)是一个由微软提供的C++库,用于简化Windows应用程序的开发。MFC封装了Windows API的大部分功能,并提供了一系列的类和函数,使得开发Windows应用程序更加容易和高效。MFC特别适用于开发具有复杂用户界面的应用程序,如桌面应用程序、工具软件等。
MFC的主要特点
- 封装Windows API :
- MFC封装了Windows API的大部分功能,提供了更易于使用的C++类和函数。
- 例如,
CWnd
类封装了Windows窗口的功能,CFile
类封装了文件操作的功能。
- 文档/视图架构 :
- MFC提供了文档/视图架构,使得开发多文档界面(MDI)和单文档界面(SDI)应用程序更加容易。
- 文档类(如
CDocument
)管理数据,视图类(如CView
)负责显示数据。
- 丰富的控件和对话框 :
- MFC提供了丰富的控件类,如
CButton
、CEdit
、CListBox
等,用于创建用户界面。 - 对话框类(如
CDialog
)简化了对话框的创建和管理。
- MFC提供了丰富的控件类,如
- 消息映射 :
- MFC使用消息映射机制,使得处理Windows消息更加直观和方便。
- 通过在类中定义消息映射表,可以轻松地将消息与处理函数关联起来。
MFC的使用示例
1. 创建一个简单的MFC应用程序
以下是一个简单的MFC应用程序示例,展示了如何创建一个窗口并处理基本的消息。
- 创建MFC应用程序项目 :
- 使用Visual Studio创建一个新的MFC应用程序项目。
- 选择"MFC应用程序"模板,输入项目名称,如
SimpleMFCApp
。
- 添加一个按钮控件 :
- 在资源视图中,打开主对话框资源(通常是
IDD_SIMPLEMFCAPI_DIALOG
)。 - 使用工具箱中的按钮控件,添加一个按钮,并设置其ID为
IDC_MYBUTTON
。
- 在资源视图中,打开主对话框资源(通常是
- 添加消息处理函数 :
- 在类视图中,右键点击对话框类(如
CSimpleMFCAppDlg
),选择"添加成员函数"。 - 选择消息映射,添加
BN_CLICKED
消息处理函数,处理按钮点击事件。
- 在类视图中,右键点击对话框类(如
- 编写消息处理函数 :
- 在生成的函数中,添加处理逻辑。
cpp
// SimpleMFCAppDlg.h
#pragma once
#include "afxdialogex.h"
class CSimpleMFCAppDlg : public CDialogEx
{
// 构造函数
public:
CSimpleMFCAppDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_SIMPLEMFCAPI_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedMybutton();
};
// SimpleMFCAppDlg.cpp
#include "stdafx.h"
#include "SimpleMFCApp.h"
#include "SimpleMFCAppDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 应用程序对话框
CSimpleMFCAppDlg::CSimpleMFCAppDlg()
: CDialogEx(IDD_SIMPLEMFCAPI_DIALOG)
{
}
void CSimpleMFCAppDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CSimpleMFCAppDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_MYBUTTON, &CSimpleMFCAppDlg::OnBnClickedMybutton)
END_MESSAGE_MAP()
// CSimpleMFCAppDlg 消息处理程序
BOOL CSimpleMFCAppDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置图标
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
return TRUE; // return TRUE 除非你设置了焦点
}
void CSimpleMFCAppDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
void CSimpleMFCAppDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 设备上下文用于绘制
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
HCURSOR CSimpleMFCAppDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CSimpleMFCAppDlg::OnBnClickedMybutton()
{
// 按钮点击事件处理
AfxMessageBox(_T("按钮被点击了!"));
}
MFC的最佳实践
- 使用资源编辑器 :
- 使用Visual Studio的资源编辑器创建和管理用户界面元素,如对话框、菜单、工具栏等。
- 消息映射 :
- 使用消息映射机制处理消息,使代码更加清晰和易于维护。
- 文档/视图架构 :
- 对于复杂的文档编辑应用程序,使用文档/视图架构可以更好地分离数据和视图逻辑。
- 异常处理 :
- 使用异常处理机制处理运行时错误,确保应用程序的健壮性。
- 资源管理 :
- 使用RAII技术管理资源,确保资源在作用域结束时自动释放。
总结
MFC是一个强大的C++库,用于简化Windows应用程序的开发。通过封装Windows API的功能,MFC提供了丰富的类和函数,使得开发具有复杂用户界面的应用程序更加容易和高效。希望这些内容能帮助你更好地理解和使用MFC。
二、使用步骤
以下是如何使用MFC进行编程的详细步骤和示例。
1. 安装和配置开发环境
1.1 安装Visual Studio
MFC开发通常需要使用Visual Studio。确保安装了Visual Studio,并且选择了"使用C++的桌面开发"工作负载。
1.2 配置项目
创建一个新的MFC应用程序项目:
- 打开Visual Studio。
- 选择"创建新项目"。
- 在项目类型中选择"MFC应用程序"。
- 输入项目名称和位置,点击"创建"。
- 在MFC应用程序向导中,选择应用程序类型(如单文档、多文档、对话框等),点击"完成"。
2. 创建用户界面
2.1 使用资源编辑器
Visual Studio的资源编辑器可以方便地创建和管理用户界面元素,如对话框、菜单、工具栏等。
- 添加对话框 :
- 在资源视图中,右键点击"资源文件",选择"添加" -> "资源"。
- 选择"对话框",点击"新建"。
- 使用工具箱中的控件(如按钮、编辑框、列表框等)添加到对话框中。
- 添加控件 :
- 例如,添加一个按钮控件,并设置其ID为
IDC_MYBUTTON
。
- 例如,添加一个按钮控件,并设置其ID为
3. 编写代码
3.1 添加消息处理函数
- 添加消息处理函数 :
- 在类视图中,右键点击对话框类(如
CSimpleMFCAppDlg
),选择"添加成员函数"。 - 选择消息映射,添加
BN_CLICKED
消息处理函数,处理按钮点击事件。
- 在类视图中,右键点击对话框类(如
- 编写消息处理函数 :
- 在生成的函数中,添加处理逻辑。
cpp
// SimpleMFCAppDlg.h
#pragma once
#include "afxdialogex.h"
class CSimpleMFCAppDlg : public CDialogEx
{
// 构造函数
public:
CSimpleMFCAppDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_SIMPLEMFCAPI_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedMybutton();
};
// SimpleMFCAppDlg.cpp
#include "stdafx.h"
#include "SimpleMFCApp.h"
#include "SimpleMFCAppDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 应用程序对话框
CSimpleMFCAppDlg::CSimpleMFCAppDlg()
: CDialogEx(IDD_SIMPLEMFCAPI_DIALOG)
{
}
void CSimpleMFCAppDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CSimpleMFCAppDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_MYBUTTON, &CSimpleMFCAppDlg::OnBnClickedMybutton)
END_MESSAGE_MAP()
// CSimpleMFCAppDlg 消息处理程序
BOOL CSimpleMFCAppDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置图标
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
return TRUE; // return TRUE 除非你设置了焦点
}
void CSimpleMFCAppDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
void CSimpleMFCAppDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 设备上下文用于绘制
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
HCURSOR CSimpleMFCAppDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CSimpleMFCAppDlg::OnBnClickedMybutton()
{
// 按钮点击事件处理
AfxMessageBox(_T("按钮被点击了!"));
}
4. 编译和运行
- 编译项目 :
- 在Visual Studio中,选择"生成" -> "生成解决方案"。
- 如果编译成功,会生成可执行文件。
- 运行应用程序 :
- 选择"调试" -> "开始调试"或按F5键运行应用程序。
- 应用程序窗口将显示,点击按钮会弹出消息框。
5. MFC编程的最佳实践
- 使用资源编辑器 :
- 使用Visual Studio的资源编辑器创建和管理用户界面元素,如对话框、菜单、工具栏等。
- 消息映射 :
- 使用消息映射机制处理消息,使代码更加清晰和易于维护。
- 文档/视图架构 :
- 对于复杂的文档编辑应用程序,使用文档/视图架构可以更好地分离数据和视图逻辑。
- 异常处理 :
- 使用异常处理机制处理运行时错误,确保应用程序的健壮性。
- 资源管理 :
- 使用RAII技术管理资源,确保资源在作用域结束时自动释放。
总结
MFC是一个强大的C++类库,用于简化Windows应用程序的开发。通过封装Windows API的功能,MFC提供了丰富的类和函数,使得开发具有复杂用户界面的应用程序更加容易和高效。希望这些内容能帮助你更好地理解和使用MFC进行编程。