Windows编程系列——第一讲:预备知识

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Neo_kh/article/details/81951803

写在前面:

        本人学生党,目前要做课程设计,被什么MFC、Qt、EasyX、Windows编程、Direct3D、AppGameKit等等等等弄得头昏脑胀(濒临爆炸)。索性从头到尾学一遍。
        另外,网上的东西太烦人,十多年以前的代码放在我VS2017上300多个link错误,找半天错误不说,还要下载VS2010生成工具。官网又不给我vs2010,今天弄了一天,可算通过**途径把2010安装了。这下好了,我的电脑不仅有2017,2015、2013、2010、2008版本的生成工具都有了。可还是有Link错误。
        得了得了,我自己写教程,这下没人能用bug为难我了吧?(话说网上有的大佬说话不说清楚,三言两语说完了,让我们看帖子的小白一脸茫然,拜托拜托,你们眼中很简单的东西在我们小白眼里很难的好不好?)
        这次找了本书,在博客上做笔记。用的编程环境是VS2017(今天刚升级到最新版本:15.8.1),像我一样自己摸索的同学可以用这篇博客学习。

Windows编程系列——第一讲:预备知识

        这一讲先介绍几个概念,扫扫盲。

1.GUI和CUI

      Windows支持两种类型的应用程序,一种是基于图形用户界面(Graphic User Interface,GUI)窗口应用程序,一种是基于控制台用户界面(Console User Interface)的控制台应用程序。如下图:

这里写图片描述

      而CUI就是我们初学C/C++必用的“黑框框”。这其实是上世纪遗留的东西,但没办法,它足够简单,所以入门都用它。另外提一句,有些程序员把控制台应用程序称为dos应用程序,其实不正确,它只是披着dos的“外衣”,具体历史可以Google。
        本系列博客主要是讲GUI。

2.DLL和静态库

动态链接库(Dynamic Link Library)和静态库(StaticLibrary)。以后用到再讲。

3.预编译头文件

        现在我们新建一个windows桌面应用程序(新建->项目->Windows桌面->Windows桌面应用程序)。加载好后发现编程环境已经为我们添加了一些代码,如图:
这里写图片描述
我们先不管其余的代码。只来解释一下第一句(注释不算):

include”stdafx.h”

stdafx.h是预编译头文件,顾名思义,在编译其他文件之前,VS会首先编译此文件。因为这个文件里面包含了一些项目所需的系统头文件。比如创建控制台应用程序时会包含stdio.h,创建win32项目时会包含Windows.h。在自己的头文件中包括“stdafx.h”就相当于包含了那些系统头文件。

4.TCHAR

        为了使代码兼容ASCII码和Unicode码,微软提供了通用字符类型TCHAR。通用字符类型的含义是,如果项目属性中选择“Unicode字符集”,则TCHAR代表WCHAR;如果在项目属性中选择“多字节字符集”,则TCHAR代表char。
当然我们一般用char就行,如果要用TCHAR,只需注意以下四点:

  1. 凡是用关键字char的地方都用TCHAR取代
  2. 凡是用char*的地方都用LPTSTR取代
  3. 凡是定义在双引号中的字符串都用 _T 或 TEXT重写
  4. 一些函数改换成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。

5.debug和release

        这两个东西弄混的话,会一不小心出来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两个版本下单独进行配置。这个以后遇到再讲。

6.关于命名规范

匈牙利命名法告诉我们,一个变量名=属性+类型+对象描述
属性是指全局变量还是局部变量,常量还是变量;类型是指是bool型还是指针类型。比如我有一个全局变量的指针Animal,则写成:g_pAnimal。这样别人一眼就知道这是全局变量,且是一个指针。
下面给出常用的命名规范

全局变量 g_
常量 c_
类成员变量 m_
指针 p
句柄 h
布尔型 b
浮点型 f
无符号 u
初始化函数 Init
临时变量 Tmp
目的对象 Dst
源对象 Src
窗口 Wnd

上面提到了一个词:句柄(handle)。句柄是一个整数值,来标识程序中不同对象或同类对象中的不同的实例,而实例即窗口、滚动条、图标、按钮、控件等等。应用程序通过句柄访问对象实例。(可以把句柄理解成指针,但不是指针)

7.冤有头债有主

微软提供了技术文档,当你学一些东西时,可以查阅它的技术文档。https://docs.microsoft.com/zh-cn/了。贴一张图感受一下:
这里写图片描述
还有MSDN Library,可以查函数的用法、参数含义等等,我们以后也会经常用到。https://msdn.microsoft.com/en-us/library/

这里写图片描述
不过因为都是用英语写的,可能有些晦涩。建议硬着头皮看下去,毕竟英语解释是最地道的。


下一讲:Windows编程系列——第二讲:创建窗口(上)

猜你喜欢

转载自blog.csdn.net/Neo_kh/article/details/81951803