看Windows程序设计笔记(持续更新)
1.1.1 windows api的链接
1.1.2 第一个win32程序
2.1.1 定义与不定义UNICODE
2.1.2 对于char和wchar_t函数的区别
3.1.1 窗口的系统概述
3.1.2 一个win32程序
3.1.3 窗口类的注册
Windows程序设计
1.1.1 windows的api链接
去使用Windows的API的时候,不是将对应的东西链接进程序里面,而是通过动态链接这个进程将程序与Windows接口进行连接。
1.1.2 第一个win32程序
#include <windows.h> 在windows.h中包含了其它的头文件,下面这些头文件是一些比较重要的头文件
Windef.h 基本的数据类型定义
Winnt.h 对于Unicode类型的定义
Winbase.h 内核函数
Winuser.h 用户界面函数
Wingdi.h 图形设备接口的函数
1. #include <Windows.h>
2.
3. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
4.
5. MessageBox(NULL, TEXT("HEELLO"), TEXT("HelloMsg"), 0);
6. return 0;
7. }
在这段程序中,WinMain是程序的入口
在参数中,HINSTANCE hInstance,这个可以理解为这个程序窗口的句柄
在参数中,HINSTANCE hPrevInstance
在参数中,PSTR szCmdLine 程序的命令行
在参数中,int iCmdShow 最初程序显示是最小化还是全屏……这些东西
MessageBox(NULL, TEXT("HEELLO"), TEXT("HelloMsg"), 0);
1、 第一个参数是窗口的句柄
2、 第二个参数是显示内容
3、 第三个参数是标题
4、 第四个参数是显示的按钮(0是MB_OK),当然了也有其它的值,这些值都在winuser.h中
2.1.1 UNICODE定义时和不定义时的区别
在windows.h的头文件中,WINNT.H头文件中负责处理基本的UNICODE功能
当你使用 L"" L+“”的时候,是告诉编译器下面的每一个字符都是2个字节的,同时用wchar_t来声明变量
当你使用char 来声明一个变量时,请不要使用L+“” ,char是每个字符1个字节
宽字符串和字符串就是wchar_t 和 char,他们的库函数有区别
如果UNICODE被定义的话,TCHAR就是wchat_t,如果没有被定义那么TCHAR就是char
对于字符集有多字节和UNICODE那么这两个有什么区别呢?
区别在于
如果没有声明UNICODE的时候,_TCHAR是char 同时_T 是_T(x)就是什么都不加
如果声明了UNICODE 的时候,_TCHAR是wchar_t 同时_T是 L ## x 就是添加了L告诉编译器这个是wchar_t
下面的东西来自,tchar.h 这个头文件中,他们都是在不同的地方,我拼凑到一起方便看
1. #ifdef _UNICODE
2. typedef wchar_t _TCHAR;
3. #define __T(x) L ## x
4. #define _T(x) __T(x)
5. #else
6. typedef char _TCHAR;
7. #define __T(x) x
8. #define _T(x) __T(x)
9. #endif
2.1.2 对于UNICODE和宽字符的函数区别
函数后面的A和W代表的是 ASCII版和宽字符版,在头文件中用UNICODE是否定义来区别他们
可以使用sprintf这个函数来对 字符串(在C中是没有String的,所以char []是字符串) 赋值,此函数要加入头文件 iostream
当然了这些函数都是有Windows版本的,windows的通用版本是:wsprintf,ASCII版是wsprintfA,宽字符版是:wsprintfW
1. char szBuff[100];
2. sprintf_s(szBuff, "hhh%d", 5);

3.1.1 窗口的系统概述
简单来说是,一个Windows的窗口创建的时候,会同时存在一个消息队列的东西,这个消息队列呢会保存着窗口的消息,而在你的代码中,有一个函数叫消息循环,它会把windows发送的消息翻译和分发给对应的窗口,这里需要注意的是,是windows发送消息给窗口的消息(windows向应用程序也就是窗口发送了一条消息)
3.1.2 hellowin程序
这个是简单的win32程序
这里做了一些简单的标注,对于里面使用的一些标识符(CS_HREDRAW)下面做出了区分
1. #include <windows.h>
2.
3.
4. LRESULT CALLBACK WndProc(HWND , UINT , WPARAM , LPARAM );
5.
6. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
7. static TCHAR szAppName[] = TEXT("HelloWin");
8. HWND hwnd;
9. MSG msg;
10. WNDCLASS wndclass;
11. wndclass.style = CS_HREDRAW | CS_VREDRAW;
12. wndclass.lpfnWndProc = WndProc;
13. wndclass.cbClsExtra = 0;
14. wndclass.cbWndExtra = 0;
15. wndclass.hInstance = hInstance;
16. wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //LoadIcon 加载图标
17. wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); //LoadCurrsor 加载鼠标光标
18. wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //GetStockObject获取一个图形对象,这里是对窗口的背景进行重绘的画刷
19. wndclass.lpszMenuName = NULL;
20. wndclass.lpszClassName = szAppName;
21.
22. if (!RegisterClass(&wndclass)) { //RegisterClass 为应用程序的窗口注册一个窗口类
23. MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR); //MessageBox 显示消息框
24. return 0;
25. }
26.
27. hwnd = CreateWindow(szAppName, // CreateWindow 基于窗口类创建一个窗口
28. TEXT("The Hello Program"),
29. WS_OVERLAPPEDWINDOW,
30. CW_USEDEFAULT,
31. CW_USEDEFAULT,
32. CW_USEDEFAULT,
33. CW_USEDEFAULT,
34. NULL,
35. NULL,
36. hInstance,
37. NULL);
38.
39. ShowWindow(hwnd, iCmdShow); //ShowWindow 在屏幕中显示窗口
40. UpdateWindow(hwnd); // UpdateWindow 对窗口自身进行重绘
41.
42. while (GetMessage(&msg, NULL, 0, 0)) { // GetMessage 从消息队列中获取消息
43. TranslateMessage(&msg); // TranslateMessage 翻译一些键盘消息
44. DispatchMessage(&msg); // DispatchMessage 分发消息 将消息发送给窗口
45. }
46. return msg.wParam;
47. }
48.
49. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
50. HDC hdc;
51. PAINTSTRUCT ps;
52. RECT rect;
53.
54. switch (message) {
55. case WM_CREATE:
56. //PlaySound(TEXT("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC); // PlaySound 播放声音
57. return 0;
58. case WM_PAINT:
59. hdc = BeginPaint(hwnd, &ps); // BeginPaint 窗口绘制开始
60. GetClientRect(hwnd, &rect); // GetClientRect 获取窗口客户区尺寸
61. DrawText(hdc, TEXT("hello,windows!"), -1, &rect, // DrawText 显示一个文本字符串
62. DT_SINGLELINE | DT_CENTER | DT_VCENTER);
63. EndPaint(hwnd, &ps); // EndPaint 结束窗口绘制
64. return 0;
65. case WM_DESTROY:
66. PostQuitMessage(0); // PostQuitMessage 将退出的消息放入消息队列里面
67. return 0;
68. }
69. return DefWindowProc(hwnd, message, wParam, lParam); // DefWindowProc 默认的消息处理
70. }
上面的代码中包含部分数据结构
MSG 消息结构
WNDCLASS 窗口类结构
PAINTSTRUCT 绘制结构
RECT 矩形结构
句柄的数据类型
HINSTANCE 实例句柄-程序本身
HWND 窗口句柄
HDC 设备环境句柄
HICON 图标句柄
HCURSOR 鼠标句柄
HBRUSH 画刷句柄
3.1.3 窗口类的注册
RegisterClass 此函数是注册窗口类的函数,它只需要一个参数,一个窗口类
在窗口类中 lpfnWndProc 是窗口类的消息处理函数
lpszClassName 是窗口类的名称,一般情况下,窗口类的名称和程序名相同
style 是窗口类的风格,这里的 CS_HREDRAW(水平尺寸) 和 CS_VREDRAW(垂直尺寸) 是代表着不管是水平还是垂直被改变的时候,窗口类都将重新绘制
cbClsExtra和cbWndExtra是窗口结构中预留的一些额外空间
hInstance 这个是应用程序的实例句柄是WinMain的一个参数
hIcon 为所有基于该窗口类的窗口设定一个图标,LoadIcon是加载一个图标
hCursor 是设置一个预定义的鼠标指针,鼠标移动到窗口的客户区的时候出现的鼠标指针样式