MFC框架(Num29)
目录
一、MFC程序组成:
MFC概述:
框架组成:
创建:
报错解决(对COM组件的调用返回了错误HRESULT E_FAIL):
编辑
运行顺序:
使用:
1.名字+Dlg.cpp文件中:
2.资源视图Dialog中:
注意:
二、消息映射:
消息映射表:
消息及控件添加的使用:
1.消息添加:
2.控键的消息添加:
控件变量和值变量使用:
1.值变量的使用:
2.控键变量的使用:
模态窗口和非模态窗口:
对话框:
1.模态对话框:
2.非模态对话框:
三、图片控件和位置排版:
图片控件:
使用:
控件位置编辑:
使用:
一、MFC程序组成:
MFC概述:
- mfc:微软基础类库。并且包含一个应用程序框架,这些框架由很多类组成,这些类中又包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类
- MFC是上层的,Win32是低层的
- win32是windows下最基本的编程方式,它是其它方式实现的基础
- mfc是封装的类,最后还是会调用win32api,可以理解为mfc是对win32的封装,使用win32编程的方式,写了一个又一个的类,使用方便
框架组成:
2019创建项目的方式
两个重要组成类:
- APP类
- DLG类
创建:
- 如果没有就去组件里搜一下,这三个下载一下
- 要做的是一个页面,选择基于对话框来实现:
- 动态库和静态库选择:(一般选用动态库)
- 如果程序要发给别人,要注意别人的电脑里有没有相同的环境,没有则会出错
- 文档模版属性不需要管,用户界面功能中,最小化框和最大化框据情况选择
- 最小化和最大化是打开时的初始状态
- 对话框标题就是左上角的标题,自行添加即可
- 生成的类APP一般也不动,完成即可
- 运行一下出来是这样:
报错解决(对COM组件的调用返回了错误HRESULT E_FAIL):
###这种情况在命名的时候不要带下划线“_”
运行顺序:
- win32应用程序的执行过程:
winmain->WNDCLASSEX->RegisterClassEx->CreateWindow->ShowWindow->UpdateWindow->消息循环
- mfc应用程序的执行过程:
全局对象theApp->相关构造函数->WinMain函数
//调用完CWinApp的构造函数之后由链接器向程序内自动链接的AfxWinMain函数将被调用,而这个函数是MFC程序的入口函数
使用:
1.名字+Dlg.cpp文件中:
CMFCApplication1Dlg::CMFCApplication1Dlg(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_MFCAPPLICATION1_DIALOG, pParent)
{m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON2);
}
//获取APP加载Icon,括号中的ID东西可以更改
2.资源视图Dialog中:
- 打开工具箱:
- 以上这些都是控件,可以直接拖入窗口做更改,当按键多的时候可以开启网格(倒数第二个图标):
注意:
- 写的每一个对话框类都会对应一个窗口(可以在 名字+Dlg.h 文件中看到):
// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_MFCAPPLICATION1_DIALOG };
- 枚举的ID在资源视图Dialog属性中可以看到
二、消息映射:
消息映射表:
除了一些没有基类的类或CObject的直接派生类外,其他的类都可以自动生成消息映射表
//BEGIN和END区间就为消息映射表
BEGIN MESSAGE MAP(CMFCApplication2Dlg, CDialogEx)
ON_WM_SYSCOMMANDO
ON _WM_PAINT()...
END_MESSAGE_MAP()
消息及控件添加的使用:
1.消息添加:
-
右键项目点击类向导:
- 多个项目的时候类是那个项目中的就选哪一个项目:
- 类名要选择对话框类
###双击或者选中点击添加处理程序即可
- 1.可以看到类中会出现函数声明:
public:afx_msg void OnLButtonDown(UINT nFlags, CPoint point); };
- 2.消息映射会多出一个声明:ON_WM_LBUTTONDOWN()
- 3.处理函数中会多出来一个:
void CMFCApplication1Dlg::OnLButtonDown(UINT nFlags, CPoint point) {// TODO: 在此添加消息处理程序代码和/或调用默认值CDialogEx::OnLButtonDown(nFlags, point); }
2.控键的消息添加:
- 双击控件,会生成消息处理函数通常是点击一次控件的消息处理
- 也可以通过控件ID直接对控件做某些操作(控件ID可以改变)
###不要重复双击同一个按键创建多次
- 类向导中可以看到命令那一栏中有控件的ID,点击可以看到右侧可以实现的功能
- 双击会弹出修改函数名的提示:
###自动生成的函数参数列表:UINT nFlags, CPoint point//nFlags无符号整型,point坐标
控件变量和值变量使用:
1.值变量的使用:
- 工具箱中Edit Control是文本输入的操作:
- 选中文本输入框,选择添加变量(类别选择值,名称是值变量的名字):
- 双击要操作消息的控键,代码如下(点击按键就可以的到输入的东西的弹窗了):
void CMFCApplication1Dlg::OnBnClickedButton4() {// TODO: 在此添加控件通知处理程序代码UpdateData(true);//把控件上面的内容,更新到绑定的值变量中MessageBox(m_name);m_name = _T("张三");UpdateData(false);//把绑定的值变量的内容,更新到控件上 }
2.控键变量的使用:
-
选中文本输入框,选择添加变量(类别选择控键):
void CMFCApplication1Dlg::OnBnClickedButton4() {CString str;m_edit.GetWindowText(str);//得到控键变量上的文本MessageBox(str);m_edit.SetWindowText(_T("张三"));m_edit.MoveWindow(200, 200, 100, 30);//控键移动 }
-
值变量初始化的位置:
1.名字+Dlg.h文件的类中就是一个自定义的变量:
CString m_name;
2.名字+Dlg.cpp文件初始化列表中进行初始化(做注释的两行,类型是控件的没有对值的初始化操作,直接进行的关联):
CMFCApplication1Dlg::CMFCApplication1Dlg(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_MFCAPPLICATION1_DIALOG, pParent), m_name(_T(""))//初始化
{m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON2);
}void CMFCApplication1Dlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT1, m_name);//对控件ID进行关联DDX_Control(pDX, IDC_EDIT2, m_edit);
}
模态窗口和非模态窗口:
对话框:
- 模态对话框:对话框没有处理完是无法跳过该对话框对父窗口进行操作
- 非模态对话框:这个对话框和其它窗口的操作是可以相互独立的
1.模态对话框:
void CMFCApplication1Dlg::OnBnClickedButton6()
{// TODO: 在此添加控件通知处理程序代码CMFCApplication1Dlg dlg;dlg.DoModal();//模态操作会进行一个阻塞操作//必须先关掉弹出的对话框才能看到下面弹出的对话框MessageBox(0);
}
2.非模态对话框:
- 新创建一个对话框(插入一个Dialog,注意它不会自带对话框类):
- 双击该对话框,创建MFC类:
- 在母窗口类的.h文件中导入要创建的非模态子窗口的头文件,用上面同样的方法使用 名字+Dlg 声明变量(注释标记的两行):
// MFCApplication1Dlg.h: 头文件
//#pragma once#include"MyDailog.h"//######// CMFCApplication1Dlg 对话框
class CMFCApplication1Dlg : public CDialogEx
{
// 构造
public:CMFCApplication1Dlg(CWnd* pParent = nullptr); // 标准构造函数// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_MFCAPPLICATION1_DIALOG };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 实现
protected:HICON m_hIcon;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()
public:afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
public:afx_msg void OnBnClickedButton1();afx_msg void OnClickedButton5();afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);virtual BOOL PreTranslateMessage(MSG* pMsg);CString m_name;afx_msg void OnBnClickedButton4();CEdit m_edit;afx_msg void OnBnClickedButton6();MyDailog md;//######
};
- 找到 消息处理函数 书写额外的初始化代码:
BOOL CMFCApplication1Dlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动// 执行此操作SetIcon(m_hIcon, TRUE); // 设置大图标SetIcon(m_hIcon, FALSE); // 设置小图标// TODO: 在此添加额外的初始化代码return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
BOOL CMFCApplication1Dlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动// 执行此操作SetIcon(m_hIcon, TRUE); // 设置大图标SetIcon(m_hIcon, FALSE); // 设置小图标// TODO: 在此添加额外的初始化代码md.Create(IDD_DIALOG1, this);//第一个参就是当前对话框的ID,第二个是谁弹的这个窗口return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
-
控件中:相关的函数中
void CMFCApplication1Dlg::OnBnClickedButton6()
{md.ShowWindow(SW_SHOW);//非模态对话框,必须处理的是DoModal,非必须处理的是ShowWindow
}
- 这样写会报错(断延,书写不规范):
void CMFCApplication1Dlg::OnBnClickedButton6()
{CDialog cd;cd.MoveWindow(400,300,400,500);cd.DoModal();
}
三、图片控件和位置排版:
图片控件:
- 加载图片资源,可以通过资源文件加载,也可以通过外部文件加载
- 设置控件属性,类型,加载图片ID,使图片显示
- 对控件进行位置上的调整
使用:
- 工具箱中找到Picture Control拖进来:
- 属性中先改类型再改图像(通过文件加载一定要修改ID,因为每一个创建的ID都会是IDC_STATIC):
- 如果图片过大可以将位置中的居中图像改为true(不会缩放):
- 加载图片的方法:
BOOL CMFCApplication1Dlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动// 执行此操作SetIcon(m_hIcon, TRUE); // 设置大图标SetIcon(m_hIcon, FALSE); // 设置小图标// TODO: 在此添加额外的初始化代码md.Create(IDD_DIALOG1, this);//第一个参就是当前对话框的ID,第二个是谁弹的这个窗口//加载图片CStatic* bmp = (CStatic*)GetDlgItem(IDC_STATIC_BMP);HBITMAP bitmap = (HBITMAP)LoadImage(AfxGetApp()->m_hInstance, _T("res/love_study.bmp"), IMAGE_BITMAP, 100, 100, LR_LOADFROMFILE);//当前实例,路径bmp->SetBitmap(bitmap);return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
控件位置编辑:
- 在对话框中选中多个控件,在vs的工具栏里面就会有一个“对话框编辑器”。(按住CTRL键点击控件,可切换参考控件)
- 在编辑器中会有一些:左对齐,右对齐,顶对齐,底对齐,垂直,水平等等,可以自行使用,让控件变得对齐
- 横向:有3个控件,中间的控件会移到前后两个控件的水平位置的中间
- 纵向,同上
- 使宽度、高度、大小相同;先操作的第一个控件,变成和后操作的第二个控件一样的宽度或高度或大小
使用:
- 对话框编辑页面,右键将这三个勾上就好:
- 选中对话框中的按键(空心的是选中的,实心的是以此为基准的):
- 想要让所有按键都对齐,可以使用菜单栏的左对齐即可(在最上方第二行):
- 这两个按键是按照水平中间位置/垂直中间位置进行排版:
- 垂直排版如下:
- 点击纵向按选中的按键的最上面和最下面的按键之间的距离均匀分布(横向同理):
使宽度/高度相同按键,即向实心的为标准: