MFC入门
- 1.基础
- 1.1创建MFC项目
- 1.2通过一些小操作了解MFC
- 1.2.1点击鼠标左键出现坐标
- 1.2.2onDraw和onPaint
- 1.3MFC框架中一些重要的函数
- 1.3.1Initlnstance函数
- 1.3.2PreCreateWindow函数
- 1.3.3OnCreate函数
- 1.4拓展知识点
- 2.代码编写案例
- 2.1弹出模式对话框和非模式对话框
- 2.1.1创建对话框程序
- 2.1.2创建控件
- 2.1.3插入新对话框
- 2.1.4添加类,链接对话框
- 2.1.5添加事件
- 2.1.6非模态对话框
- 2.2更改和获取文字
- 2.2.1更改文字
- 2.2.2获取文字
- 2.3static txt显示bmp图片
- 2.4edict conctrol相关属性
- 2.4.1类向导
- 2.5一个复制粘贴程序(了解编辑框)
- 2.5.1控件准备
- 2.5.2添加编辑框默认内容
- 2.5.3绑定事件
- 2.6更改获取文字2.0
- 2.6.1创建控件
- 2.6.2添加变量
- 2.6.3绑定事件
- 2.7 下拉框
- 2.7.1Combo Box属性
- 2.7.2代码实现下拉框增删改查
- 2.7.3绑定选择改变事件
- 2.8列表控件
- 2.8.1 list control属性
- 2.8.2绑定事件
- 3.9树控件
- 3.9.1Tree control属性
- 3.9.2绑定事件
使用视频课程:黑马程序员MFC 如果你只是想学习如何使用MFC,可以直接从p8开始看
他人博客可供参考:
1.基础
1.1创建MFC项目
打开vs,文件→新建→项目
在向导中更改以下设置,其余不用改变
编写MFC项目,比较推荐使用类视图,如果没有请:视图→类试图
1.2通过一些小操作了解MFC
1.2.1点击鼠标左键出现坐标
void CMFCtwoView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CView::OnLButtonDown(nFlags, point);
CString str;
str.Format(TEXT("x=%d,y=%d"), point.x, point.y);
MessageBox(str);
}
1.2.2onDraw和onPaint
onDraw为MFC自带,onPaint在属性消息里面,onPaint会覆盖onDraw,如果有onDraw不要使用onPaint
void CMFCtwoView::OnDraw(CDC* pDC)
{
CMFCtwoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
pDC->TextOutW(100, 100, TEXT("!!!!"));
// TODO: 在此处为本机数据添加绘制代码
}
void CMFCtwoView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CView::OnPaint()
dc.TextOutW(100, 100, TEXT("...."));
}
1.3MFC框架中一些重要的函数
1.3.1Initlnstance函数
应用程序类的一个虚函数,MFC应用程序的入口
1.3.2PreCreateWindow函数
当框架调用CreateEx函数创建窗口时,会首先调用PreCreateWindow函数。。
通过修改传递给PreCreateWindow的结构体类型参数CREATESTRUCT,应用程序可以更改用于创建窗口的属性。在产生窗口之前让程序员有机会修改窗口外观
最后再调用CreateWindowEx函数完成窗口的创建
1.3.3OnCreate函数
OnCreate是-一个消息响应凾数,是响应WM_ CREATE消息的-一个凾数,而WM_CREATE消息是由Create凾数調用的.一个窗口創建(Create)之后,会向操作系統WM_CREATE消息,OnCreate0函数主要是用来响应此消息的。。
OnCreate与Create的区別:
■Create()负责注册并产生窗口,像动态创建控件中的Create()一样,窗口創建之后会向操作系統发送WM_CREATE消息
■ OnCreate()不产生窗口, 只是在窗口显示前设置窗口的属性如风格、位置等。
■onCreate()是消息WM _CREATE 的消息响应凾数。
1.4拓展知识点
●MFC 中后缀名为Ex的函数都是扩展函数。
●在MFC中,以Afx为前綴的函数都是全局函数,可以在程序的任何地方调用它们。
2.代码编写案例
2.1弹出模式对话框和非模式对话框
2.1.1创建对话框程序
文件→新建→项目
在向导中更改以下配置,其余不用动
打开界面如图
如果不小心关掉了,按以下方式可以打开
①更改外观可以右键属性
②如果默认控件都不需要,可以ctrl+A再delete
2.1.2创建控件
再工具箱中拖入俩button,然后改名,工具箱要是没有就ctil+alt+x
2.1.3插入新对话框
可以根据自己需要,在右键属性更改ID
2.1.4添加类,链接对话框
2.1.5添加事件
有三种添加事件的方法
①点击控件,右键属性,在属性中找到事件,自行添加
②点击控件,右键添加事件处理程序
③直接双击
在对应代码中添加类型头文件
#include"MotaiDialog.h"
添加事件的代码:
void CMFCThreeDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
MotaiDialog dlg1;
dlg1.DoModal();
}
目前完整的代码长这样:
// MFCThreeDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "MFCThree.h"
#include "MFCThreeDlg.h"
#include "afxdialogex.h"
#include"MotaiDialog.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_ABOUTBOX };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CMFCThreeDlg 对话框
CMFCThreeDlg::CMFCThreeDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(IDD_MFCTHREE_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMFCThreeDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CMFCThreeDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, &CMFCThreeDlg::OnBnClickedButton1)
END_MESSAGE_MAP()
// CMFCThreeDlg 消息处理程序
BOOL CMFCThreeDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CMFCThreeDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CMFCThreeDlg::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 CMFCThreeDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CMFCThreeDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
MotaiDialog dlg1;
dlg1.DoModal();
}
2.1.6非模态对话框
添加对话框,添加类,添加事件均如上,但如果一直同上,会闪退。
故而,先在主函数中添加成员变量
光是这样会导致多次重复创建对象而报错
要在主cpp文件中的OnInitDialog()函数相关位置(如图)进行创建对象
再到触发函数中写显示代码
最后代码长这样
// MFCThreeDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "MFCThree.h"
#include "MFCThreeDlg.h"
#include "afxdialogex.h"
#include"MotaiDialog.h"
#include"FeiMotai.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_ABOUTBOX };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CMFCThreeDlg 对话框
CMFCThreeDlg::CMFCThreeDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(IDD_MFCTHREE_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMFCThreeDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CMFCThreeDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, &CMFCThreeDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CMFCThreeDlg::OnBnClickedButton2)
END_MESSAGE_MAP()
// CMFCThreeDlg 消息处理程序
BOOL CMFCThreeDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
dlg2.Create(IDD_DIALOGofFEIMOTAI);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CMFCThreeDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CMFCThreeDlg::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 CMFCThreeDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CMFCThreeDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
MotaiDialog dlg1;
dlg1.DoModal();
}
void CMFCThreeDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
//创建对话框对象
//
//dlg2.Create(IDD_DIALOGofFEIMOTAI);
//显示
dlg2.ShowWindow(SW_SHOWNORMAL);
}
2.2更改和获取文字
2.2.1更改文字
创建MFC项目。并在向导中选择对话框
在画布中拖入一个static text和button
m_test.SetWindowText(TEXT("O(∩_∩)O"));
2.2.2获取文字
再添加一个button
添加事件
void CMFC4Dlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
CString str;
m_test.GetWindowTextW(str);
MessageBox(str);
}
2.3static txt显示bmp图片
略
用到很少,实在要用详见视频教程P12
2.4edict conctrol相关属性
2.4.1类向导
当创建的类太多的时候可以使用类向导
2.5一个复制粘贴程序(了解编辑框)
2.5.1控件准备
2.5.2添加编辑框默认内容
同2.2.1处添加变量
2.5.3绑定事件
在复制按钮上绑定事件(前提对象已经添加好)
void CMFC5Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CString str;
m_edit.GetWindowTextW(str);
m_edit2.SetWindowTextW(str);
}
在退出按钮上绑定事件
void CMFC5Dlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
//exit(0);//退出整个程序
//CDialog::OnOK();//退出当前对话框
CDialog::OnCancel();//退出当前对话框
}
2.6更改获取文字2.0
2.6.1创建控件
2.6.2添加变量
2.6.3绑定事件
设置内容:
void CMFC5Dlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
//设置内容
m_edit3 = TEXT("123");
//将变量内容显示到控件中
UpdateData(FALSE);
}
获取内容:
void CMFC5Dlg::OnBnClickedButton4()
{
// TODO: 在此添加控件通知处理程序代码
//将控件内容显示到变量中
UpdateData(TRUE);
//获取内容
MessageBox(m_edit3);
}
2.7 下拉框
2.7.1Combo Box属性
2.7.2代码实现下拉框增删改查
对控件添加变量进行绑定
添加代码:
//增加
m_combo.AddString(TEXT("111"));
m_combo.AddString(TEXT("222"));
m_combo.AddString(TEXT("333"));
m_combo.AddString(TEXT("444"));
//设置默认选项
m_combo.SetCurSel(0);
//插入
m_combo.InsertString(5,TEXT("666666"));
//删除
m_combo.DeleteString(7);
//获取
CString str;
m_combo.GetLBText(1,str);
MessageBox(str);
2.7.3绑定选择改变事件
void CMFC6Dlg::OnCbnSelchangeCombo1()
{
// TODO: 在此添加控件通知处理程序代码
int index = m_combo.GetCurSel();
CString str;
m_combo.GetLBText(index, str);
MessageBox(str);
}
2.8列表控件
2.8.1 list control属性
2.8.2绑定事件
添加对象
增添代码”
//设置表头
CString str[] = { TEXT("111"),TEXT("222"),TEXT("333") };
for (int W = 0; W < 3; W++) {
m_list.InsertColumn(W, str[W],LVCFMT_LEFT,100);//索引,内容,对齐方式,宽度
}
//设置正文内容
//表头不算正文,索引从0开始
//m_list.InsertItem(0, TEXT("LALALA"));
//m_list.SetItemText(0, 1,TEXT("LULULU"));
int j;
for (int i = 0; i < 5; i++) {
j = 0;
CString name;
m_list.InsertItem(i, TEXT("name"));
m_list.SetItemText(i, ++j,TEXT("222222"));
m_list.SetItemText(i, ++j, TEXT("33333333"));
}
//设置额外属性,网格,整行选中
m_list.SetExtendedStyle(m_list.GetExtendedStyle()|LVS_EX_FULLROWSELECT);
3.9树控件
要使用树控件,创建mfc文件需要建立基于对话框的项目
3.9.1Tree control属性
3.9.2绑定事件
1.添加对象
2.添加图标文件
准备号.ico图标,可以进行格式转换,放在当前项目文件夹的res里
3.添加代码
// TODO: 在此添加额外的初始化代码
//树控件使用
//1.设置图标
//准备HICON图标
HICON icon[4];
icon[0] = AfxGetApp()->LoadIconW(IDI_ICON1);
icon[1] = AfxGetApp()->LoadIconW(IDI_ICON2);
icon[2] = AfxGetApp()->LoadIconW(IDI_ICON3);
icon[3] = AfxGetApp()->LoadIconW(IDI_ICON4);
//CImageList list;//必须保存住这个成员变量,写入.h成为成员变量
//创建图片合集
list.Create(30, 30, ILC_COLOR32, 4, 4);
//添加具体的图片
for (int i = 0; i < 4; i++) {
list.Add(icon[i]);
}
m_tree.SetImageList(&list,TVSIL_NORMAL);
//2.设置节点
HTREEITEM root = m_tree.InsertItem(TEXT("根节点"), 0, 0, NULL);
HTREEITEM parent = m_tree.InsertItem(TEXT("父节点"), 1, 1, root);
HTREEITEM sub1 = m_tree.InsertItem(TEXT("子节点1"), 2, 2, parent);
HTREEITEM sub2 = m_tree.InsertItem(TEXT("子节点2"), 3, 3, parent);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
保存成员变量
运行