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();
最新文章
- 如何实现侧边栏菜单之间的分割线——不用border-bottom
- 实现一种快速查找Richedit中可见区域内OLE对象的方法
- Android annotations REST
- HttpServletrequest 与HttpServletResponse总结
- IE8 松散耦合进程框架(Loosely-Coupled IE (LCIE)--特性介绍
- 华硕本本重装系统后出现can not open file c:\RECOVERY.DAT
- 解决vmware安装 win7 后 没有虚拟网卡驱动 不能上网的问题
- 关于Qt5 UI设计的一些小知识
- chrome浏览器默认样式覆盖input背景
- vim的基本使用方法
- asp.net中用FileStream类实现下载文件功能,自定义下载路径,像IE下载一样
- 【Python】回文
- Python可视化:Seaborn库热力图使用进阶
- (转)JAVA堆栈操作
- python连接数据库异步存储
- jsp获取当前项目跟路径
- redis安装集群的2种方式
- [contest 781] 9.6
- 支持向量机(理论+opencv实现)
- Linux 2440 LCD 控制器【转】
热门文章
- 洛谷 P1712 [NOI2016]区间(线段树)
- Node.js 使用Stream的pipe(管道)方法实现文件复制
- 第三章 “我要点爆”微信小程序云开发之点爆方式页面和爆炸之音页面制作
- 【Linux】Devops的一些运维工具
- PHP不重新编译,单独添加模块扩展的方法
- git上如何删除已有项目
- 微信开发(一)URL配置
- [Python]&#39;unicodeescape&#39; codec can&#39;t decode bytes in position 2-3: truncated \UXXXXXXXX escape 错误
- swiper 解决动态加载数据滑动失效的问题
- Tinghua Data Mining 7