MFC学习小结
2019/1/13
一. MFC框架中一些重要的函数
1. InitInstance函数
应用程序类的一个虚函数,MFC应用程序的入口。初始化的作用。
2. PreCreateWindow函数
当框架调用CreateEx函数创建窗口时,会首先调用PreCreateWindow函数。
通过修改传递给PreCreateWindow的结构体类型参数CREATESTRUCT,应用程序可以更改用于创建窗口的属性。在产生窗口之前让程序员有机会修改窗口的外观。
最后再调用CreateWindowEx函数完成窗口的创建。
3. OnCreate函数
OnCreate是一个消息响应函数,是响应WM_CREATE消息的一个函数,而WM_CREATE消息是由Create函数调用的。一个窗口创建(Create)之后,会向操作系统发送WM_CREATE消息,OnCreate()函数主要是用来响应此消息的。
OnCreate与Create的区别:
- 1.Create()负责注册并产生窗口,像动态创建控件中的Create()一样,窗口创建之后会向操作系统发送WM_CREATE消息。
- 2.OnCreate()不产生窗口,只是在窗口显示前设置窗口的属性如风格、位置等。
- 3.OnCreate()是消息WM_CREATE的消息响应函数。
4. OnDraw和OnPaint
OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中。
- OnPaint()是CWnd的类成员,负责响应WM_PAINT消息。
- OnDraw()是CView的成员函数,没有响应消息的功能。
当视图变得无效时(包括大小的改变,移动,被遮盖等等),Windows发送WM_PAINT消息。该视图的OnPaint 处理函数通过创建CPaintDC类的DC对象来响应该消息并调用视图的OnDraw成员函数。OnPaint最后也要调用OnDraw,因此一般在OnDraw函数中进行绘制。
通常我们不必编写OnPaint处理函数。当在View类里添加了消息处理OnPaint()时,OnPaint()就会覆盖掉OnDraw()。
二.基于对话框的编程
1. 创建Dialog对应类
点击Dialog右键,添加类
对于控件添加属性:(一般定义为private)
1) 一般添加control(控件关联变量)
2) 对于编辑框,可以添加value(即值类型的)
2. 一些比较重要的视图
2.1类视图
可以看到所有Dialog所对应的实体类,右键属性可以重载方法。
2.2工具箱
在此处添加各种控件
2.3属性
修改控件的属性或者类的属性
3. 对编辑框一些属性的修改
属性 |
含义 |
Number |
True只能输入数字 |
Password |
True密码模式 |
Want return |
True接收回车键,自动换行,只有在多行模式下,才能换行 |
Multiline |
True多行模式 |
Auto VScroll |
True 当垂直方向字符太多,自动出现滚动条,同时设置Vertical Scroll才有效 |
Vertical Scroll |
True当垂直方向字符太多,自动出现滚动条,和Auto VScroll配合使用 |
Horizontal Scroll |
True当垂直方向字符太多,自动出现滚动条,和Auto HScroll配合使用 |
Read Only |
True 只读 |
- 若编辑框的内容改变了,则应使用语句UpdateData(TRUE) 获取对话框数据
若变量的值改变了,则应使用语句UpdateData(FALSE) 初始化对话框控件
1) getWindowText setWIndowText 设置和获取值
2) 默认小bug 单行点击回车就退出--重写OnOk 注释掉里面的代码
4. 模态框与非模态框
4.1模态窗口创建 CDlgExec dlg
dlg.DoModal()
4.2非模态创建
1)CDlgShow dlg 写到.h做成员
2)dlg.Create 写到初始化 oninitDialog 保证只创建一次
3)dlg.showWindow()
三.关于代码乱码的事情
1. Unicode
Char *转CString
法1:
CString strData;
wchar_t *data = _T("1234"); // 或者 wchar_t *data = L"1234"; (L 和 _T的区别见下文)
strData.Format(_T("%s"), data);
注意:这里对wchar_t赋值必须加上 _T() 或者 L ,否则编译会提示 无法从“const char [5]”转换为“wchar_t *”,因为我们当前的编码为 UNICODE ,而 wchar_t 为宽字节类型。
法2:
char* pData = "1234";
CString strData(pData);
法3:
CString strData;
char* pData = "1234";
strData.Format(("%s"), pData ); // 编译提示无法将参数 1 从“const char [3]”转换为“const wchar_t *
//因为我们现在的编码为 UNICODE ,所以 我们不能直接使用("%s"),要进行如下修改
strData.Format(_T("%s"), pData ); // 编译正确
CStirng转char*
方法一:使用API:WideCharToMultiByte进行转换
CString str = _T("D://校内项目//QQ.bmp");
//注意:以下n和len的值大小不同,n是按字符计算的,len是按字节计算的 int n = str.GetLength(); // n = 14, len = 18
//获取宽字节字符的大小,大小是按字节计算的 int len = WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),NULL,0,NULL,NULL);
//为多字节字符数组申请空间,数组大小为按字节计算的宽字节字节大小 char * pFileName = new char[len+1]; //以字节为单位
//宽字节编码转换成多字节编码 WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),pFileName,len,NULL,NULL);
pFileName[len+1] = '/0'; //多字节字符以'/0'结束
方法二:使用函数:T2A、W2A
CString str = _T("D://校内项目//QQ.bmp");
//声明标识符 USES_CONVERSION;
//调用函数,T2A和W2A均支持ATL和MFC中的字符转换 char * pFileName = T2A(str); //char * pFileName = W2A(str); //也可实现转换
注意:有时候可能还需要添加引用#include <afxpriv.h>
Char *转CString
法1:
CString strData;
char* pData = "1234";
strData.Format("%s", pData );
法2:
// 编码设置为 ANSI
CString strData;
wchar_t *data = L"1234"; // 这里我们用 L ,用 _T 编译错误,因为编码为ANSI,_T不起作用
strData.Format(_T("%s"), data); // ANSI编码,这里相当于strData.Format("%s", data);
CStirng转char*
// 第一种
CString str1 ="123";
char *p =(LPSTR)(LPCSTR)str1;
// 第二种
使用 GetBuffer方法返回 char * 类型
CString str1 ="123";
char *t1 =str1.GetBuffer(str1.GetLength());
str1.ReleaseBuffer();