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学习小结的更多相关文章

  1. flex学习小结

    接触到flex一个多月了,今天做一个学习小结.如果有知识错误或者意见不同的地方.欢迎交流指教. 画外音:先说一下,我是怎么接触到flex布局的.对于正在学习的童鞋们,我建议大家没事可以逛逛网站,看看人 ...

  2. Python 学习小结

    python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...

  3. react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)

    react学习小结   本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...

  4. objective-c基础教程——学习小结

    objective-c基础教程——学习小结   提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...

  5. pthread多线程编程的学习小结

    pthread多线程编程的学习小结  pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写     程序员必上的开发者服务平台 —— DevSt ...

  6. ExtJs学习笔记之学习小结LoginDemo

    ExtJs学习小结LoginDemo 1.示例:(登录界面) <!DOCTYPE html> <html> <head> <meta charset=&quo ...

  7. MFC 学习之 鼠标移动到Toolbar按钮上显示提示信息(tooltip),状态栏也随之改变

    1.在ResourceView里加入Toolbar资源,命名IDR_TOOLBAR1 2.在主程序的.h文件中加入变量:           CToolBar m_toolbar;CImageList ...

  8. 点滴的积累---J2SE学习小结

    点滴的积累---J2SE学习小结 什么是J2SE J2SE就是Java2的标准版,主要用于桌面应用软件的编程:包括那些构成Java语言核心的类.比方:数据库连接.接口定义.输入/输出.网络编程. 学习 ...

  9. (转) Parameter estimation for text analysis 暨LDA学习小结

    Reading Note : Parameter estimation for text analysis 暨LDA学习小结 原文:http://www.xperseverance.net/blogs ...

随机推荐

  1. django框架知识3

    1.Django安装: 1.安装版本Django1.11.11 2.安装方式:命令行安装   pycharm安装 2.创建Django项目 1.创建方式:cd到你要创建的目录下  然后输入 Djang ...

  2. perl C/C++ 扩展(四)

    在前面三篇博客中,我们了解到如何使用c/c++ 扩展自己的perl 库,但是博主在学习过程中,对动态库或静态库的加载不是十分了解,后来自己又细挖一下.后来就有了这篇博文,再后来,没有再后来了,囧!! ...

  3. kali 装好java后提示 -bash: /home/javainstall/jdk1.8.0_171/bin/java: 没有那个文件或目录

    [问题现象] 在/etc/profile配置里面也是配置好了的,并且该目录是有java的 [问题原因] 出现这个问题的原因:64位的系统,安装了32位的Java. [解决方案] 通过网络搜索,发现通过 ...

  4. random 库

    random 是使用随机数的python 标准库 ——为随机数:采用梅森旋转算法生成的(伪)随机序列中的元素 —— import random 基本随机数函数:seed(),random() 扩展随机 ...

  5. 分布式通信-tcp/ip 单播

    服务端 public class SingleBroadCastSocketServer { public static void main(String[] args) { ServerSocket ...

  6. LM358与TL431验证

  7. [译]Understanding ECMAScript6 基本知识

    基本知识 ECMAScript 6在ECMAScript 5之上做了大量的改变.一些改变很大,比如添加新的类型或者语法,而其它的非常小,提供了语言之上的渐进改进.这个章节包含了那些渐进改进,它们可能不 ...

  8. Sql Server 排序规则字符集的冲突问题

    可通过如下sql 进行修改: 如果整个DB都不一致: Alter database Expense_Portal collate Chinese_PRC_CI_AS 某张Table的栏位不一致: ) ...

  9. Ice-cream Tycoon9(线段树)

    线段树的一些基本应用,就是函数写了很多,有点繁琐. 以每个物品的单价建树,刚开始写了个裸的想水过去直接MLE了,然后又离散化了下. 离散化单价后建树,lz数组用来清零,s数组保存结点所含物品个数,co ...

  10. MyBatis框架的XML数据访问Dao层接口的组合使用

    MyBatis 的前生为Apache的开源项目iBatis.其优势在于灵活,几乎可以替代JDBC,同时提供了编程接口.目前MyBatis的数据访问Dao层不需要实现类,也不需要像JDBC那样拼接Hql ...