Windows开发基础知识
概述
Windows 开发指的是以Windows API(WinAPI)进行在Windows平台上的开发
参考资料
Windows 开发的代码规范约定
在Windows开发经常会遇到一些隐晦难懂的API以及数据类型,已将常见类型写入表中做对应
Windows的字符集
Windows本地支持Unicode字符串使用在UI节点、文件名称上,因为Unicode字符可以兼容所有文字和语言,Windows使用UTF16做代表,每个UTF16的字符都占16位大小,UTF16也称为宽字符,用于区分ANSI字符,在c++中有w_char
类型来支持宽字符,而在头文件WinNT.h
同样有定义
typedef wchar_t WCHAR;
在随后很多案例中你可以看到在定义宽字符文字、字符串时在其前面放入L
来定义
wchar_t a = L'a';
wchar_t *str = L"hello";
Unicode和ANSI的函数
在Windows API中对于处理字符串等相关函数都会提供Unicode版本和ANSI版本的函数,如下案例一样,通常会以A
或W
结尾,对于ANSI和Unicode
- SetWindowTextA:使用ANSI字符串
- SetWindowTextW:使用Unicode字符串
除此之外在内部还会有一个宏定义,这个宏定义可以帮助你根据情况调用对于版本的函数,如下所示
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif
在通常情况下我们都会用Unicode字符串,并且也推荐使用Unicode版本的函数来调用,第一是支持的字符集多。第二是Unicode的效率相对ANSI要高
TCHARs
当应用需要支持Windows各个版本的系统时,根据目标平台为ANSI或Unicode字符串编译相同的代码是很有用的,为此Windows SDK提供了以下宏定义去映射Unicode或ANSI子字符串
宏定义 | Unicode | ANSI |
---|---|---|
TCHAR | wchar_t | char |
TEXT(“x”) | L"x" | “x” |
什么是Window
Windows就是通常见到的窗口成的框架,我们称为应用窗口或者主窗口,Window包含非客户区域和客户区域
- 客户区域:用于与客户交互的区域
- 非客户区域:由操作系统管理的区域
Window Handlers
Windows Handler代表Window对象的引用,这是一个不透明的数据类型(包含代码和数据),它只是一个数字被操作系统用于引用来操作,你可以将Windows上所有窗口看作为Windows窗口假想表内的数据,而引用正是对窗口的一对一映射
屏幕和窗口坐标系
坐标是通过与设备无关的像素为单位来测量的
Windows程序入口
在所有Windows程序中都会包含一个方法,如下所示,他的名字是WinMain
要么是wWinMain
,这里它的签名是wWinMain
// Unicode版本
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);
// ANSI版本
INT WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, INT nCmdShow)
这里4个参数分别是:
- hInstance:称为“实例句柄”或“模块句柄”,当可执行文件(EXE)加载到内存中时,操作系统使用这个值来识别它,某些函数也需要实例句柄作为参数来调用
- hPrevInstance:没有任何意义。它曾用于16位系统,但现在总是为零
- pCmdLine:包含命令行参数的Unicode字符串
- nCmdShow:是一个标志,表示主应用程序窗口是最小化、最大化还是正常显示
这个方法的返回值操作系统不会使用,但是你可以自己使用来返回一些特定意义的状态值给你所写的应用程序