為了與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}