MFC学习小结
2019/1/13
视频来源: https://www.bilibili.com/video/av20005978/?p=26
一. 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. 一些比较重要的视图
1.1类视图
可以看到所有dialog所对应的实体类,右键属性可以重载方法。
1.2工具箱
在此处添加各种控件
1.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()
三.关于代码乱码的事情
详细内容戳:
https://blog.csdn.net/goforwardtostep/article/details/53079967
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();
上一篇: 浅析C# Dictionary实现原理
下一篇: 昨天跟一女的相亲