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();
MFC学习小结的更多相关文章
- flex学习小结
接触到flex一个多月了,今天做一个学习小结.如果有知识错误或者意见不同的地方.欢迎交流指教. 画外音:先说一下,我是怎么接触到flex布局的.对于正在学习的童鞋们,我建议大家没事可以逛逛网站,看看人 ...
- Python 学习小结
python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...
- react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)
react学习小结 本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...
- objective-c基础教程——学习小结
objective-c基础教程——学习小结 提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...
- pthread多线程编程的学习小结
pthread多线程编程的学习小结 pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写 程序员必上的开发者服务平台 —— DevSt ...
- ExtJs学习笔记之学习小结LoginDemo
ExtJs学习小结LoginDemo 1.示例:(登录界面) <!DOCTYPE html> <html> <head> <meta charset=&quo ...
- MFC 学习之 鼠标移动到Toolbar按钮上显示提示信息(tooltip),状态栏也随之改变
1.在ResourceView里加入Toolbar资源,命名IDR_TOOLBAR1 2.在主程序的.h文件中加入变量: CToolBar m_toolbar;CImageList ...
- 点滴的积累---J2SE学习小结
点滴的积累---J2SE学习小结 什么是J2SE J2SE就是Java2的标准版,主要用于桌面应用软件的编程:包括那些构成Java语言核心的类.比方:数据库连接.接口定义.输入/输出.网络编程. 学习 ...
- (转) Parameter estimation for text analysis 暨LDA学习小结
Reading Note : Parameter estimation for text analysis 暨LDA学习小结 原文:http://www.xperseverance.net/blogs ...
随机推荐
- Java常见设计模式学习(非原创)
文章大纲 一.策略模式二.观察者模式三.工厂模式四.单例模式五.其他模式六.设计模式总结七.参考文章 一.策略模式 现在假设我们有个"鸭子项目",首先我们用OOP(面向对象)的 ...
- 类的property特性
目录 什么是 property特性 简单示例 property属性的两种方式 装饰器 类属性方式 property+类的封装 应用 私有属性添加getter和setter方法 使用property升级 ...
- 【NOI省选模拟】小奇的花园
「题目背景」 小奇在家中的花园漫步时,总是会思考一些奇怪的问题. 「问题描述」 小奇的花园有n个温室,标号为1到n,温室以及以及温室间的双向道路形成一棵树. 每个温室都种植着一种花,随着季节的变换,温 ...
- JavaScript简介和发展史,JavaScript组成和开发工具-乐字节
一.JavaScript简介 JavaScript 是一种具有面向对象能力的.解释型的程序设计语言.更具体一点,它是基于对象和事件驱动并具有相对安全性的客户端脚本语言.它的主要目的是,验证发往服务器端 ...
- jdbc学习day1
- STP-4-每VLAN生成树和Trunk上的STP
如果在有冗余链路且有多个VLAN的交换网络中只使用 STP实例,那么在稳定状态中,仍会有一些端口处于阻塞状态不被使用,冗余链路实际上变成了备份链路. PVST+特性能为每个VLAN创建一个STP实例. ...
- eclipse打开jsp的方式怎么设置成默认
https://jingyan.baidu.com/article/4ae03de34137be3eff9e6b93.html
- 如何 发布一个 arcgis 服务
1,打开arcgis, 加载一个图层 后然后如下操作
- 海德汉S3078长度计
手头有一款海德汉S3078的增量式长度计. 图三为长度计引出线缆的针脚编号,其中,Up和传感器Up短路,0V与传感器0V短路,其他为输出信号线缆.时序如图: Ua1和Ua2两个信号的相位,可以得出长度 ...
- hdu6376 度度熊剪纸条
思路: 01背包.有些细节需要注意一下,比如k = 0的情况. 实现: #include <bits/stdc++.h> using namespace std; typedef pair ...