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

写在前面:

        在图书馆找了本书,在博客上做笔记,以免遗忘。用的编程环境是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编程系列——第二讲:创建窗口(上)

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值