杨记

碎片化学习令人焦虑,系统化学习使人进步

0%

C创建窗口

使用C语言创建一个简单窗口,学习自黑马程序员&传智教育

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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include <windows.h>

//6 处理消息(窗口过程)
LRESULT CALLBACK WindowProc(HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);


//程序入口函数
//WINAPI宏定义 __stdcall,参数的传递顺序 从右到左依次入栈,并在函数返回前清空堆栈
int WINAPI WinMain(
HINSTANCE hInstance, //H 句柄 应用程序的实例句柄
HINSTANCE hPrevInstance, //前一个应用程序的句柄,在win32环境下,一般为NULL,不起作用
LPSTR lpCmdLine, //char *argv[]
int nShowCmd) //显示命令,最大化,最小化,正常
{
//1 设计窗口
//2 注册窗口
//3 创建窗口
//4 显示和更新
//5 通过循环取消息
//6 处理消息(窗口过程)


//1 设计窗口
WNDCLASS wc;
wc.cbClsExtra = 0; //类的额外的内存
wc.cbWndExtra = 0; //窗口的额外内存
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //设置背景
wc.hCursor = LoadCursor(NULL, IDC_HAND); //设置光标, 第一个参数为NULL,代表使用系统提供的光标
wc.hIcon = LoadIcon(NULL, IDI_ERROR); //设置图标,第一个参数为NULL,代表使用系统提供的图标
wc.hInstance = hInstance; //应用程序示例句柄 传入WinMain中的形参即可
wc.lpfnWndProc = WindowProc; //窗口过程 回调函数
wc.lpszClassName = TEXT("WIN"); //指定窗口类名称
wc.lpszMenuName = NULL; //菜单名称
wc.style = 0; //显示风格,0代表默认

//2 注册窗口
RegisterClass(&wc);

//3 创建窗口
/*
lpClassName, 类名
lpWindowName, 标题名
dwStyle, 窗口样式 WS_OVERLAPPEDWINDOW
x, 窗口水平坐标 CW_USEDEFAULT
y, 窗口垂直坐标
nWidth, 宽
nHeight, 高
hWndParent, 父窗口 NULL
hMenu, 菜单 NULL
hInstance, 实例句柄 hInstance
lpParam 附加值 NULL
*/
HWND hwnd = CreateWindow(wc.lpszClassName, TEXT("WINDOWS"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

//4 显示和更新
ShowWindow(hwnd, SW_SHOWNORMAL);
UpdateWindow(hwnd);

//5 通过循环取消息
/*
HWND hwnd; 主窗口句柄
UINT message; 具体消息名称
WPARAM wParam; 附加消息 键盘消息
LPARAM lParam; 附加消息 鼠标消息
DWORD time; 消息产生时间
POINT pt; 附加消息 鼠标消息
*/
MSG msg;
while (1)
{
/*
_Out_ LPMSG lpMsg, 消息
_In_opt_ HWND hWnd, 捕获窗口,填NULL代表捕获所有的窗口
_In_ UINT wMsgFilterMin, 最小和最大的过滤消息 一般填0
_In_ UINT wMsgFilterMax); 填0代表捕获所有消息
*/
if (GetMessage(&msg, NULL, 0, 0) == FALSE)
{
break;
}

//不为FALSE

//翻译消息
TranslateMessage(&msg);

//分发消息
DispatchMessage(&msg);
}

//6 处理消息(窗口过程)

return 0;
}


//6 处理消息(窗口过程)
//CALLBACK 宏定义 __stdcall,参数的传递顺序 从右到左依次入栈,并在函数返回前清空堆栈
LRESULT CALLBACK WindowProc(
HWND hwnd, //消息所属的窗口句柄
UINT uMsg, //具体消息名称 WM_XXXX消息名
WPARAM wParam, //键盘附加消息
LPARAM lParam //鼠标附加消息
)
{
switch (uMsg)
{
case WM_CLOSE: //点击窗口的关闭
DestroyWindow(hwnd); //DestroyWindow发送另一个消息 WM_DESTROY
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_LBUTTONDOWN: //鼠标左键按下
{
int xPos = LOWORD(lParam);
int yPos = HIWORD(lParam);
char buf[1024];
wsprintf(buf, TEXT("x = %d y = %d"), xPos, yPos);
MessageBox(hwnd, buf, TEXT("鼠标左键按下"), MB_OK);
break;
}
case WM_KEYDOWN: //键盘
{
MessageBox(hwnd, TEXT("键盘按下"), TEXT("键盘按下"), MB_OK);
break;
}
case WM_PAINT: //绘图
{
PAINTSTRUCT ps; //绘图结构体
HDC hdc = BeginPaint(hwnd, &ps);
TextOut(hdc, 100, 100, TEXT("HELLO"), strlen("HELLO"));
break;
}
}

//返回值默认处理方式
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

欢迎关注我的其它发布渠道