WIN API下的視窗建立

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.