WIN API下的窗口创建
为了与MFC创建窗口的过程对照,也进行了一下WIN API下创建窗口的过程:
话说:WIN API创建一个窗口的过程的确够烦的。
1
/*
2
MFC 中创建窗口程序的过程:
3
1:创建一个继承自CWinApp的应用程序类,并创建该类的全局实例。
4
2:创建继承自WFrameWnd的窗口类
5
3: 在窗口类中声明消息处理过程及声明消息映射
6
4: 定义应用程序类,在其入口函数中指定应用程序主窗口。
7
5: 定义窗口类,在其构造函数中创建窗口自身,并创建相关的控件。
8
6: 在消息映射中加入需要处理的事件
9
6: 实现窗口类的消息处理函数
10
11
而通过WINDOWS API创建的过程为:
12
设计一个窗口类;
13
注册窗口类;
14
创建窗口;
15
显示及更新窗口。
16
*/
17
#include <windows.h>
18
//独一无二的类名,一般用GUID字串,以免与其他程序的类名重复
19
//static const char * CLASS_NAME = L"{198CEAB2-AD78-4ed3-B099-247639080CB0}";
20
//消息处理方法预引用
21
LRESULT CALLBACK MyWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
22
23
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
24
{
25
WNDCLASS wndclass;
26
wndclass.cbClsExtra=0;
27
wndclass.cbWndExtra=0;
28
wndclass.hbrBackground=reinterpret_cast<HBRUSH>(COLOR_BTNFACE+1);
29
wndclass.hCursor=LoadIcon(0, MAKEINTRESOURCE(IDI_WINLOGO));
30
wndclass.hIcon=LoadIcon(NULL,IDI_ERROR);
31
32
wndclass.hInstance=hInstance;
33
wndclass.lpfnWndProc=MyWndProc; //指定窗口的消息处理函数
34
wndclass.lpszClassName=L"MyWindow";
35
36
wndclass.lpszMenuName=NULL;
37
wndclass.style=CS_HREDRAW | CS_VREDRAW;
38
39
RegisterClass(&wndclass); //注册窗口类
40
//创建窗口
41
HWND hWnd=CreateWindow(L"XuZhiZe",L"McJeremy",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);
42
//显示窗口
43
ShowWindow(hWnd,SW_SHOWNORMAL);
44
UpdateWindow(hWnd);
45
46
//消息循环
47
MSG msg;
48
while(GetMessage(&msg,NULL,0,0))
49
{
50
//转换消息参数
51
TranslateMessage(&msg);
52
//分发消息
53
DispatchMessage(&msg);
54
}
55
return 0;
56
}
57
58
//实现消息处理函数
59
//该函数由应用程序定义,但不由应用程序调用
60
LRESULT CALLBACK MyWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
61
{
62
switch(uMsg)
63
{
64
case WM_LBUTTONDOWN:
65
MessageBox(hWnd,L"mouse clicked",L"asdfasdf",0);
66
HDC hdc;
67
hdc=GetDC(hWnd); //GetDC获取当前窗口的设备上下文,不加参数,则是整个屏幕的设备上下文
68
TextOut(hdc,0,50,L"asdfasdf",strlen("asdfdfasdf"));
69
ReleaseDC(hWnd,hdc); //通过GetDC(),GetWindowDC()获取的DC,需要ReleaseDc()来释放
70
//而通过CreateDC(),CreateWindowDC()创建的,需要用DeleteDC()来释放
71
break;
72
case WM_CLOSE:
73
if(IDYES==MessageBox(hWnd,L"end?",L"xxx",MB_YESNO))
74
{
75
DestroyWindow(hWnd);
76
}
77
break;
78
case WM_DESTROY:
79
PostQuitMessage(0); //如果是“窗口销毁”事件,则应该在消息队列中投递
80
break;
81
default:
82
return DefWindowProc(hWnd,uMsg,wParam,lParam);
83
}
84
return 0;
85
}
/*2
MFC 中创建窗口程序的过程:3
1:创建一个继承自CWinApp的应用程序类,并创建该类的全局实例。4
2:创建继承自WFrameWnd的窗口类5
3: 在窗口类中声明消息处理过程及声明消息映射6
4: 定义应用程序类,在其入口函数中指定应用程序主窗口。7
5: 定义窗口类,在其构造函数中创建窗口自身,并创建相关的控件。8
6: 在消息映射中加入需要处理的事件9
6: 实现窗口类的消息处理函数10

11
而通过WINDOWS API创建的过程为:12
设计一个窗口类;13
注册窗口类;14
创建窗口;15
显示及更新窗口。16
*/17
#include <windows.h>18
//独一无二的类名,一般用GUID字串,以免与其他程序的类名重复19
//static const char * CLASS_NAME = L"{198CEAB2-AD78-4ed3-B099-247639080CB0}";20
//消息处理方法预引用21
LRESULT CALLBACK MyWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);22

23
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)24
{25
WNDCLASS wndclass;26
wndclass.cbClsExtra=0;27
wndclass.cbWndExtra=0;28
wndclass.hbrBackground=reinterpret_cast<HBRUSH>(COLOR_BTNFACE+1);29
wndclass.hCursor=LoadIcon(0, MAKEINTRESOURCE(IDI_WINLOGO));30
wndclass.hIcon=LoadIcon(NULL,IDI_ERROR);31

32
wndclass.hInstance=hInstance;33
wndclass.lpfnWndProc=MyWndProc; //指定窗口的消息处理函数34
wndclass.lpszClassName=L"MyWindow";35

36
wndclass.lpszMenuName=NULL;37
wndclass.style=CS_HREDRAW | CS_VREDRAW;38

39
RegisterClass(&wndclass); //注册窗口类40
//创建窗口41
HWND hWnd=CreateWindow(L"XuZhiZe",L"McJeremy",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);42
//显示窗口43
ShowWindow(hWnd,SW_SHOWNORMAL);44
UpdateWindow(hWnd);45

46
//消息循环47
MSG msg;48
while(GetMessage(&msg,NULL,0,0))49
{50
//转换消息参数51
TranslateMessage(&msg);52
//分发消息53
DispatchMessage(&msg);54
}55
return 0;56
}57

58
//实现消息处理函数59
//该函数由应用程序定义,但不由应用程序调用60
LRESULT CALLBACK MyWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)61
{62
switch(uMsg)63
{64
case WM_LBUTTONDOWN:65
MessageBox(hWnd,L"mouse clicked",L"asdfasdf",0);66
HDC hdc;67
hdc=GetDC(hWnd); //GetDC获取当前窗口的设备上下文,不加参数,则是整个屏幕的设备上下文68
TextOut(hdc,0,50,L"asdfasdf",strlen("asdfdfasdf"));69
ReleaseDC(hWnd,hdc); //通过GetDC(),GetWindowDC()获取的DC,需要ReleaseDc()来释放70
//而通过CreateDC(),CreateWindowDC()创建的,需要用DeleteDC()来释放71
break;72
case WM_CLOSE:73
if(IDYES==MessageBox(hWnd,L"end?",L"xxx",MB_YESNO))74
{75
DestroyWindow(hWnd);76
}77
break;78
case WM_DESTROY:79
PostQuitMessage(0); //如果是“窗口销毁”事件,则应该在消息队列中投递80
break;81
default:82
return DefWindowProc(hWnd,uMsg,wParam,lParam); 83
}84
return 0;85
}
<h3>
心静似高山流水不动,心清若巫峰雾气不沾。
</h3>
心静似高山流水不动,心清若巫峰雾气不沾。
</h3>



浙公网安备 33010602011771号