在图书馆找了本书,在博客上做笔记,以免遗忘。用的编程环境是VS2017(今天刚升级到最新版本:15.8.1),像我一样自己摸索的同学可以用这篇博客学习。
这一讲先介绍几个概念,扫扫盲。
Windows支持两种类型的应用程序,一种是基于图形用户界面(Graphic User Interface,GUI)窗口应用程序,一种是基于控制台用户界面(Console User Interface)的控制台应用程序。如下图:
而CUI就是我们初学C/C++必用的“黑框框”。这其实是上世纪遗留的东西,但没办法,它足够简单,所以入门都用它。另外提一句,有些程序员把控制台应用程序称为dos应用程序,其实不正确,它只是披着dos的“外衣”,具体历史可以Google。
本系列博客主要是讲GUI。
动态链接库(Dynamic Link Library)和静态库(StaticLibrary)。以后用到再讲。
现在我们新建一个windows桌面应用程序(新建->项目->Windows桌面->Windows桌面应用程序)。加载好后发现编程环境已经为我们添加了一些代码,如图:
我们先不管其余的代码。只来解释一下第一句(注释不算):
include”stdafx.h”
stdafx.h是预编译头文件,顾名思义,在编译其他文件之前,VS会首先编译此文件。因为这个文件里面包含了一些项目所需的系统头文件。比如创建控制台应用程序时会包含stdio.h,创建win32项目时会包含Windows.h。在自己的头文件中包括“stdafx.h”就相当于包含了那些系统头文件。
为了使代码兼容ASCII码和Unicode码,微软提供了通用字符类型TCHAR。通用字符类型的含义是,如果项目属性中选择“Unicode字符集”,则TCHAR代表WCHAR;如果在项目属性中选择“多字节字符集”,则TCHAR代表char。
当然我们一般用char就行,如果要用TCHAR,只需注意以下四点:
第四点是说,在学习c语言时,习惯使用了C-Run Time库中的许多字符串处理函数(如strcpy、strlen),微软建议使用通用字符类型后,出现了TCHAR版本的函数。下面给出常用函数对照表:
函数功能 | ASCII码版本 | TCHAR版本 |
---|---|---|
字符串长度 | strlen | _tcslen |
字符串复制 | strcpy | _tcscpy |
字符串连接 | strcat | _tcscat |
字符串比较 | strcmp | _tcscmp |
将数据格式化成字符串 | sprintf | _stprintf |
将字符串化成浮点数 | atof | _tcstof |
下面举个栗子:
在控制台输出“hello world”时,会用到:
printf("%s\n","Hello World!");
而TCHAR对应的语句变成了:
_tprintf(_T("%s"),_T("Hello World!");
建议用到的时候参考官网的一些文档,或者看一些别人的博客,如:这一篇。这是个外国小哥哥写的,讲的很详细,纯英文,不过我相信你们都看得懂,因为毕竟我都看的懂。。。顺便说一句,通用字符串类型是PTSTR。
这两个东西弄混的话,会一不小心出来100多个错误,吓死你/滑稽
从字面上讲,一个是调试版本,一个是发行版本。debug版本包含了大量的调试信息和保护机制。举个例子:
TCHAR text[10],*bugs=_T("The code has bug !");
_tcspy(text,bugs);
错误很明显,字符串bugs包含的字符超过了字符数组text的容量,把bugs复制到数组text中会导致下标越界。在编译和连接阶段不会报错。在release版本下,这段代码不一定每次都报错,因为很可能text数组后面的内存空间并未分配,即使越界也没有太大关系。但是在debug版本下,由于采取了保护机制,程序运行时会报错。
注意:两种版本使用不同的库!在使用MFC的情况下,调试版本使用MFC42D.dll,而发行版本使用MFC42.dll。二者最根本的区别是编译的时候使用了不同的选项。具体内容我也不甚清楚,但记住一点:两个版本必须单独配置。例如在配置引入库时,必须在debug和release两个版本下单独进行配置。这个以后遇到再讲。
匈牙利命名法告诉我们,一个变量名=属性+类型+对象描述
属性是指全局变量还是局部变量,常量还是变量;类型是指是bool型还是指针类型。比如我有一个全局变量的指针Animal,则写成:g_pAnimal。这样别人一眼就知道这是全局变量,且是一个指针。
下面给出常用的命名规范
全局变量 | g_ |
---|---|
常量 | c_ |
类成员变量 | m_ |
指针 | p |
句柄 | h |
布尔型 | b |
浮点型 | f |
无符号 | u |
初始化函数 | Init |
临时变量 | Tmp |
目的对象 | Dst |
源对象 | Src |
窗口 | Wnd |
上面提到了一个词:句柄(handle)。句柄是一个整数值,来标识程序中不同对象或同类对象中的不同的实例,而实例即窗口、滚动条、图标、按钮、控件等等。应用程序通过句柄访问对象实例。(可以把句柄理解成指针,但不是指针)
微软提供了技术文档,当你学一些东西时,可以查阅它的技术文档。https://docs.microsoft.com/zh-cn/了。贴一张图感受一下:
还有MSDN Library,可以查函数的用法、参数含义等等,我们以后也会经常用到。https://msdn.microsoft.com/en-us/library/
不过因为都是用英语写的,可能有些晦涩。建议硬着头皮看下去,毕竟英语解释是最地道的。
下一讲:Windows编程系列——第二讲:创建窗口(上)