前言

额总的来说c++的语法是又看了一遍~~猪脑子啊有些就是没记住。
先看看windows的api,然后玩玩老的mfc先吧。


引用


正文

白天没起来,下午game了一会,然后又刷手机。


windows程序设计就是c++类的形式封装成windowsAPI,然后设计的应用程序框架。减少程序开发的工作量。

对于没有图形化的命令行界面,程序入口都在main函数
而对于windows而言,它的入口在WinMain。

对于winmain的介绍,在没有引用文件下,可以去官方文档查看

1
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);
  • hInstance 称为“实例句柄”或“模块句柄”。操作系统使用此值在内存中加载可执行文件时标识可执行文件 (EXE) 。 某些Windows函数需要实例句柄,例如加载图标或位图。
  • hPrevInstance 没有意义。 它在 16 位Windows中使用,但现在始终为零。
  • pCmdLine 包含命令行参数作为 Unicode 字符串。
  • nCmdShow 是一个标志,指示主应用程序窗口是最小化、最大化还是正常显示。

这是大概的情况。然后要使用windows的功能,自然要引用头文件windows.h

1
2
3
4
5
#include<Windows.h>

int WINAPI WinMain(){

}

参数暂时没有做,然后如果想要标准输入输出也可以用<stdio.h>or<iostream>

因为是以c++类的方式封装,在名字上会有相似

1
2
3
4
5
#include<Windows.h>

int WINAPI WinMain(){
WNDCLASS wndclass;
}

可以右键一直查询定义,也可以直接在文档搜,本质上是一个结构体。

1
2
3
4
5
6
7
8
9
10
11
typedef struct _WNDCLASS {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName; } WNDCLASS ;

英语不好多翻译一下。。。windows的封装一堆参数太哈人了。


题外话,空项目创建写代码如果编译有问题,可以看我另一篇的解决方法。


可以打开这个功能,有的时候方便直接看封装好的是如何定义的。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <Windows.h>
#include <stdio.h>

LPCTSTR clsName = "my";
LPCTSTR msgName = "xuexi";

LRESULT CALLBACK MyWinProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);

//windows主函数入口
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR lpCmdLine,
INT nCmdShow
){
// windows对象,设计窗口类
WNDCLASS wndclass;
wndclass.cbClsExtra = NULL;
wndclass.cbWndExtra = NULL;
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hInstance = hInstance;
//定义交互响应
wndclass.lpfnWndProc = MyWinProc; //回调
//定义窗口代号
wndclass.lpszClassName = clsName;
wndclass.lpszMenuName = NULL;
wndclass.style = CS_HREDRAW | CS_VREDRAW;

//注册窗口类
RegisterClass(&wndclass);

//创建窗口
HWND hwnd;
hwnd = CreateWindow(
clsName, msgName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL,
hInstance, NULL
);

//显示窗口和刷新窗口
ShowWindow(hwnd, SW_SHOWNORMAL);
UpdateWindow(hwnd);

//消息循环
MSG msg;
while (GetMessage(&msg,NULL,NULL,NULL)){ //得到消息
TranslateMessage(&msg); //翻译消息为字符
DispatchMessage(&msg); //分派消息
}

return msg.wParam;
}

LRESULT CALLBACK MyWinProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
){
// uMsg 消息类型
int ret = 0;
HDC hdc;
switch (uMsg){
case WM_CHAR:
char szChar[20];
sprintf_s(szChar, "您刚才按下了:%c", wParam);
MessageBox(hwnd,szChar,"char",NULL);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd, "检测鼠标左键按下", "msg",NULL);
break;
case WM_PAINT:
PAINTSTRUCT ps;
hdc = BeginPaint(hwnd, &ps);
TextOut(hdc, 0, 0, "www.baidu.com", strlen("www.baidu.com"));
EndPaint(hwnd, &ps);
MessageBox(hwnd, "重绘", "msg", NULL);
break;
case WM_CLOSE:
ret = MessageBox(hwnd, "是否真的结束?", "msg", MB_YESNO);
if (ret == IDYES){
DestroyWindow(hwnd); //如果选择yes则销毁窗口
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
//break;
}
return 0;
}

窗口就是这玩意,不难理解也不难看出

句柄[handle]:二级指针、资源的编号。窗口句柄、文件句柄、数据库连结句柄。

至于c++窗口类对象和窗口之间的关系,就是对象内置窗口句柄,窗口点击关闭之后,对象不一定就释放了,但是对象的生命周期结束了,窗口就一定销毁了。


windows常见数据类型

code 含义
DWORD 32字节无符号整型数据
DWORD32 32字节无符号整型数据
DWORD64 64字节无符号整型数据
HANDLE 对象句柄,最基本的句柄类型
HICON 图标的句柄
HINSTANCE 程序实例的句柄
HKEY 注册表键的句柄
HMODULE 模块的句柄
HWND 窗口的句柄
INT 32位符号整型数据类型
INT_PTR 指向INT的指针类型
INT32 32位符号整型
INT64 64位符号整型
LONG32 32位符号整型
LONG64 64位符号整型
LPARAM 消息的L参数
WPARAM 消息的w参数
LPCSTR windows,ANSI,字符串常量
LPCTSTR 根据环境配置,如果定义了Unicode宏,则是LPCWSTR,否则LPCSTR
LPCWSTR Unicode字符串常量
LPDWORD 指向DWORD类型的指针
LPSTR windows,ANSI,字符串变量
LPTSTR 根据环境配置,如果定义了Unicode宏,则是LPWSTR,否则LPSTR类型
LPWSTR Unicode字符串变量
SIZE_T 表示内存大小,以字节位单位,其最大值是CPU最大寻址范围
TCHAR 如果定义了Unicode,则为WCHAR
WCHAR 16位Unicode字符

windows命名

前缀 含义 前缀 含义
a 数组array b 布尔值bool
by 无符号字符[字节] c 字符[字节]
cb 字节计数 rgb 保存颜色值的长整型
cx,cy 短整型[计算x,y的长度] dw 无符号长整型
fn 函数 h 句柄
i 整型 m_ 类的数据成员member
n 短整型或整型 np 近指针
p 指针 l 长整型
lp 长指针 s 字符串string
sz 以0结尾的字符串 tm 正文大小
w 无符号整型 x,y 无符号整型[表示x,y的坐标]

总结

用空项目套窗口太累了。。。基础窗口全要自己写,而且参数是真的多。
先了解基本原理吧。