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//消息处理方法预引用
21LRESULT CALLBACK MyWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
22
23int 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//该函数由应用程序定义,但不由应用程序调用
60LRESULT 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//消息处理方法预引用
21LRESULT CALLBACK MyWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
22
23int 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//该函数由应用程序定义,但不由应用程序调用
60LRESULT 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>