MFC(Microsoft Foundation Classes)是微软公司提供的一套用于Windows平台上的C++类库,它为开发者提供了一个功能强大且易于使用的图形界面开发框架。通过学习MFC,开发者可以快速地创建出具有专业水平的Windows应用程序。本文将为你介绍50个实用的MFC编程实例,帮助你快速掌握C++图形界面开发。
实例1:创建第一个MFC应用程序
- 打开Visual Studio,创建一个新的MFC应用程序项目。
- 在项目中的主窗口类中,重写
OnInitDialog函数,添加必要的初始化代码。 - 运行程序,查看效果。
void CFirstApp::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 在此添加额外的初始化
m_btnHelloWorld.SetWindowText(_T("Hello, World!"));
return TRUE; // 返回 TRUE 除非你设置了控件的焦点
}
实例2:使用按钮控件
- 在主窗口中添加一个按钮控件。
- 在按钮的点击事件处理函数中添加代码。
void CFirstApp::OnBnClickedButton1()
{
MessageBox(_T("按钮被点击!"), _T("提示"), MB_ICONINFORMATION);
}
实例3:使用编辑框控件
- 在主窗口中添加一个编辑框控件。
- 在编辑框的内容变化时,获取编辑框中的内容。
void CFirstApp::OnEditChanged()
{
CString str;
m_editBox.GetWindowTextW(str);
// 使用str进行后续处理
}
实例4:使用列表框控件
- 在主窗口中添加一个列表框控件。
- 向列表框中添加数据。
void CFirstApp::AddItemsToListBox()
{
CString str[] = {_T("苹果"), _T("香蕉"), _T("橘子")};
for (int i = 0; i < sizeof(str) / sizeof(str[0]); ++i)
{
m_listBox.AddString(str[i]);
}
}
实例5:使用组合框控件
- 在主窗口中添加一个组合框控件。
- 向组合框中添加数据。
void CFirstApp::AddItemsToComboBox()
{
CString str[] = {_T("苹果"), _T("香蕉"), _T("橘子")};
for (int i = 0; i < sizeof(str) / sizeof(str[0]); ++i)
{
m_comboBox.AddString(str[i]);
}
}
实例6:使用进度条控件
- 在主窗口中添加一个进度条控件。
- 控制进度条的值。
void CFirstApp::OnUpdateProgress()
{
int progress = 0;
m_progressBar.SetPos(progress);
}
实例7:使用定时器控件
- 在主窗口中添加一个定时器控件。
- 设置定时器的时间间隔。
void CFirstApp::OnTimer(UINT_PTR nIDEvent)
{
// 定时器事件处理代码
if (nIDEvent == 1)
{
// TODO: 定时器事件处理代码
}
}
实例8:使用对话框控件
- 创建一个自定义对话框类。
- 在对话框中添加必要的控件和事件处理函数。
class CMyDialog : public CDialogEx
{
DECLARE_MESSAGE_MAP()
public:
CMyDialog(CWnd* pParent = nullptr) : CDialogEx(IDD_MY_DIALOG, pParent)
{
// TODO: 在此添加构造代码
}
// 对话框数据
#ifdef AFX_DESIGN_TIME
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
#endif
// 实现
protected:
DECLARE_MESSAGE_MAP()
public:
virtual BOOL OnInitDialog();
// TODO: 在此添加额外的对话框初始化
void OnBnClickedButton1();
};
实例9:使用多文档界面(MDI)
- 创建一个MDI应用程序。
- 在MDI主窗口中添加子窗口。
void CMyMDIApp::OnCmdMsg()
{
// TODO: 在此添加命令处理程序代码
if (!CDocument::OnCmdMsg())
return FALSE;
// 检查命令ID
if (IDM_FILE_NEW == m_nLastCmd)
{
CMyMDIChild* pChild = new CMyMDIChild;
pChild->ShowWindow(SW_SHOW);
}
return TRUE;
}
实例10:使用单文档界面(SDI)
- 创建一个SDI应用程序。
- 在SDI应用程序中创建文档和视图。
void CMySDIApp::OnFileNew()
{
// TODO: 在此添加文件新建代码
CMyDocument* pDoc = new CMyDocument;
pDoc->LoadFile(_T("newfile.txt"));
CMyView* pView = new CMyView;
pView->SetDocument(pDoc);
pView->ShowWindow(SW_SHOW);
pView->Invalidate();
}
实例11:使用富文本编辑框(RichEdit)
- 在主窗口中添加一个富文本编辑框控件。
- 设置编辑框的文本格式。
void CFirstApp::SetRichEditText()
{
CFont font;
font.CreateFont(24, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
DEFAULT_CHARSET, OUT_OUTLINE_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, _T("Arial"));
CRichEditCtrl& richEdit = m_richEdit;
richEdit.SetFont(&font);
richEdit.SetWindowText(_T("Hello, RichEdit!"));
}
实例12:使用树形控件
- 在主窗口中添加一个树形控件。
- 向树形控件中添加节点。
void CFirstApp::AddItemsToTreeCtrl()
{
CTreeCtrl& treeCtrl = m_treeCtrl;
HTREEITEM hRoot = treeCtrl.InsertItem(_T("根节点"), 0, 0);
HTREEITEM hChild1 = treeCtrl.InsertItem(_T("子节点1"), 0, 0, hRoot);
treeCtrl.InsertItem(_T("子节点1-1"), 0, 0, hChild1);
HTREEITEM hChild2 = treeCtrl.InsertItem(_T("子节点2"), 0, 0, hRoot);
treeCtrl.InsertItem(_T("子节点2-1"), 0, 0, hChild2);
}
实例13:使用列表视图控件
- 在主窗口中添加一个列表视图控件。
- 向列表视图中添加项。
void CFirstApp::AddItemsToListView()
{
CListViewCtrl& listView = m_listView;
LVITEM lvItem;
lvItem.mask = LVIF_TEXT | LVIF_IMAGE;
lvItem.iItem = 0;
lvItem.iSubItem = 0;
lvItem.pszText = _T("苹果");
lvItem.iImage = 0;
listView.InsertItem(&lvItem);
lvItem.pszText = _T("香蕉");
lvItem.iImage = 1;
listView.InsertItem(&lvItem);
lvItem.pszText = _T("橘子");
lvItem.iImage = 2;
listView.InsertItem(&lvItem);
}
实例14:使用表格控件
- 在主窗口中添加一个表格控件。
- 向表格中添加行和列。
void CFirstApp::AddItemsToTableCtrl()
{
CTableCtrl& tableCtrl = m_tableCtrl;
int nRows = 3;
int nCols = 3;
tableCtrl.SetNumberOfRows(nRows);
tableCtrl.SetNumberOfCols(nCols);
for (int i = 0; i < nRows; ++i)
{
for (int j = 0; j < nCols; ++j)
{
CString str = _T("Row");
str += _T(" ");
str += CString::Format(_T("%d"), i);
str += _T(" Col");
str += _T(" ");
str += CString::Format(_T("%d"), j);
tableCtrl.SetItemText(i, j, str);
}
}
}
实例15:使用滑块控件
- 在主窗口中添加一个滑块控件。
- 控制滑块的位置。
void CFirstApp::OnSliderChange()
{
int nPos = m_slider.GetPos();
// 使用nPos进行后续处理
}
实例16:使用进度条控件
- 在主窗口中添加一个进度条控件。
- 控制进度条的值。
void CFirstApp::OnProgressChange()
{
int nPos = m_progressBar.GetPos();
// 使用nPos进行后续处理
}
实例17:使用定时器控件
- 在主窗口中添加一个定时器控件。
- 设置定时器的时间间隔。
void CFirstApp::OnTimer(UINT_PTR nIDEvent)
{
// 定时器事件处理代码
if (nIDEvent == 1)
{
// TODO: 定时器事件处理代码
}
}
实例18:使用组合框控件
- 在主窗口中添加一个组合框控件。
- 向组合框中添加数据。
void CFirstApp::AddItemsToComboBox()
{
CString str[] = {_T("苹果"), _T("香蕉"), _T("橘子")};
for (int i = 0; i < sizeof(str) / sizeof(str[0]); ++i)
{
m_comboBox.AddString(str[i]);
}
}
实例19:使用列表框控件
- 在主窗口中添加一个列表框控件。
- 向列表框中添加数据。
void CFirstApp::AddItemsToListBox()
{
CString str[] = {_T("苹果"), _T("香蕉"), _T("橘子")};
for (int i = 0; i < sizeof(str) / sizeof(str[0]); ++i)
{
m_listBox.AddString(str[i]);
}
}
实例20:使用编辑框控件
- 在主窗口中添加一个编辑框控件。
- 在编辑框的内容变化时,获取编辑框中的内容。
void CFirstApp::OnEditChanged()
{
CString str;
m_editBox.GetWindowTextW(str);
// 使用str进行后续处理
}
实例21:使用按钮控件
- 在主窗口中添加一个按钮控件。
- 在按钮的点击事件处理函数中添加代码。
void CFirstApp::OnBnClickedButton1()
{
MessageBox(_T("按钮被点击!"), _T("提示"), MB_ICONINFORMATION);
}
实例22:使用对话框控件
- 创建一个自定义对话框类。
- 在对话框中添加必要的控件和事件处理函数。
class CMyDialog : public CDialogEx
{
DECLARE_MESSAGE_MAP()
public:
CMyDialog(CWnd* pParent = nullptr) : CDialogEx(IDD_MY_DIALOG, pParent)
{
// TODO: 在此添加构造代码
}
// 对话框数据
#ifdef AFX_DESIGN_TIME
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
#endif
// 实现
protected:
DECLARE_MESSAGE_MAP()
public:
virtual BOOL OnInitDialog();
// TODO: 在此添加额外的对话框初始化
void OnBnClickedButton1();
};
实例23:使用多文档界面(MDI)
- 创建一个MDI应用程序。
- 在MDI主窗口中添加子窗口。
void CMyMDIApp::OnCmdMsg()
{
// TODO: 在此添加命令处理程序代码
if (!CDocument::OnCmdMsg())
return FALSE;
// 检查命令ID
if (IDM_FILE_NEW == m_nLastCmd)
{
CMyMDIChild* pChild = new CMyMDIChild;
pChild->ShowWindow(SW_SHOW);
}
return TRUE;
}
实例24:使用单文档界面(SDI)
- 创建一个SDI应用程序。
- 在SDI应用程序中创建文档和视图。
void CMySDIApp::OnFileNew()
{
// TODO: 在此添加文件新建代码
CMyDocument* pDoc = new CMyDocument;
pDoc->LoadFile(_T("newfile.txt"));
CMyView* pView = new CMyView;
pView->SetDocument(pDoc);
pView->ShowWindow(SW_SHOW);
pView->Invalidate();
}
实例25:使用富文本编辑框(RichEdit)
- 在主窗口中添加一个富文本编辑框控件。
- 设置编辑框的文本格式。
void CFirstApp::SetRichEditText()
{
CFont font;
font.CreateFont(24, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
DEFAULT_CHARSET, OUT_OUTLINE_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, _T("Arial"));
CRichEditCtrl& richEdit = m_richEdit;
richEdit.SetFont(&font);
richEdit.SetWindowText(_T("Hello, RichEdit!"));
}
实例26:使用树形控件
- 在主窗口中添加一个树形控件。
- 向树形控件中添加节点。
void CFirstApp::AddItemsToTreeCtrl()
{
CTreeCtrl& treeCtrl = m_treeCtrl;
HTREEITEM hRoot = treeCtrl.InsertItem(_T("根节点"), 0, 0);
HTREEITEM hChild1 = treeCtrl.InsertItem(_T("子节点1"), 0, 0, hRoot);
treeCtrl.InsertItem(_T("子节点1-1"), 0, 0, hChild1);
HTREEITEM hChild2 = treeCtrl.InsertItem(_T("子节点2"), 0, 0, hRoot);
treeCtrl.InsertItem(_T("子节点2-1"), 0, 0, hChild2);
}
实例27:使用列表视图控件
- 在主窗口中添加一个列表视图控件。
- 向列表视图中添加项。
void CFirstApp::AddItemsToListView()
{
CListViewCtrl& listView = m_listView;
LVITEM lvItem;
lvItem.mask = LVIF_TEXT | LVIF_IMAGE;
lvItem.iItem = 0;
lvItem.iSubItem = 0;
lvItem.pszText = _T("苹果");
lvItem.iImage = 0;
listView.InsertItem(&lvItem);
lvItem.pszText = _T("香蕉");
lvItem.iImage = 1;
listView.InsertItem(&lvItem);
lvItem.pszText = _T("橘子");
lvItem.iImage = 2;
listView.InsertItem(&lvItem);
}
实例28:使用表格控件
- 在主窗口中添加一个表格控件。
- 向表格中添加行和列。
void CFirstApp::AddItemsToTableCtrl()
{
CTableCtrl& tableCtrl = m_tableCtrl;
int nRows = 3;
int nCols = 3;
tableCtrl.SetNumberOfRows(nRows);
tableCtrl.SetNumberOfCols(nCols);
for (int i = 0; i < nRows; ++i)
{
for (int j = 0; j < nCols; ++j)
{
CString str = _T("Row");
str += _T(" ");
str += CString::Format(_T("%d"), i);
str += _T(" Col");
str += _T(" ");
str += CString::Format(_T("%d"), j);
tableCtrl.SetItemText(i, j, str);
}
}
}
实例29:使用滑块控件
- 在主窗口中添加一个滑块控件。
- 控制滑块的位置。
void CFirstApp::OnSliderChange()
{
int nPos = m_slider.GetPos();
// 使用nPos进行后续处理
}
实例30:使用进度条控件
- 在主窗口中添加一个进度条控件。
- 控制进度条的值。
void CFirstApp::OnProgressChange()
{
int nPos = m_progressBar.GetPos();
// 使用nPos进行后续处理
}
实例31:使用定时器控件
- 在主窗口中添加一个定时器控件。
- 设置定时器的时间间隔。
void CFirstApp::OnTimer(UINT_PTR nIDEvent)
{
// 定时器事件处理代码
if (nIDEvent == 1)
{
// TODO: 定时器事件处理代码
}
}
实例32:使用组合框控件
- 在主窗口中添加一个组合框控件。
- 向组合框中添加数据。
void CFirstApp::AddItemsToComboBox()
{
CString str[] = {_T("苹果"), _T("香蕉"), _T("橘子")};
for (int i = 0; i < sizeof(str) / sizeof(str[0]); ++i)
{
m_comboBox.AddString(str[i]);
}
}
实例33:使用列表框控件
- 在主窗口中添加一个列表框控件。
- 向列表框中添加数据。
void CFirstApp::AddItemsToListBox()
{
CString str[] = {_T("苹果"), _T("香蕉"), _T("橘子")};
for (int i = 0; i < sizeof(str) / sizeof(str[0]); ++i)
{
m_listBox.AddString(str[i]);
}
}
