Win32 SDK基礎(chǔ)(三)之如何從零開始創(chuàng)建windows窗口的第一步

一、windows的程序分類說起。

? ? ?從高中第一次接觸電腦開始(慚愧,高中才會用電腦,大學(xué)一年級才知道有qq這么個東西,家里窮,沒辦法),在我的概念中電腦應(yīng)該就是windows這樣的。所以,直到大學(xué)臨畢業(yè),才知道原來還有linux這種操作系統(tǒng),然后畢業(yè)之后開始工作才明白蘋果公司也有一套自己的操作系統(tǒng)。所以,至今也想不明白,我怎么就踏上了碼農(nóng)這條不歸路。然后一踏上就一發(fā)不可收拾,直到某天被拍死在沙灘上。。。

? ? ? ?廢話說多了,我們進入主題。接觸過了這么多年的windows,作為碼農(nóng),我們有必要先把windows的這些程序分下類:

(1)控制臺程序。

? ? ?這恐怕作為一個專業(yè)碼農(nóng),開發(fā)過的第一種程序。我們在大學(xué)一年級第一次用C語言編寫第一個“hello world”時,當(dāng)時的程序就是控制臺程序。他的本質(zhì)是DOS程序,沒有自己的窗口,你看到的輸出Hello world的窗口是程序本身借用了操作系統(tǒng)的DOS窗口。

(2)窗口程序。

? ?? 窗口程序恐怕是我們接觸最多的一種程序了,從常用的office到各種可見界面的程序,都是windows下窗口程序。而本次專欄的目標(biāo),就是介紹windows窗口程序的基礎(chǔ)。

(3)動態(tài)庫程序。

? ? ?這就是大名鼎鼎的linuxl,對于新手來說可能只見過豬跑,沒吃過豬肉,對于windows的普通用戶來說可能豬跑都沒見過。但是作為一個程序員老油條,這應(yīng)該再熟悉不過了吧。我們也會在后面介紹該類程序的開發(fā)基礎(chǔ)。

(4)linux庫程序。

? ?? 這種是后綴名為lib的程序類型,屬于古董級別的程序了,沒有dll常用,但是依然有自己的江湖地位。同樣我們后面也會介紹其開的開發(fā)基礎(chǔ)。

? ? ?介紹完了廢話以及winddows程序的分類,我們開發(fā)正式開始下面的內(nèi)容了。

?

二、從零開始創(chuàng)建windows的過程

? ? ??本文的主要目的是介紹下自己創(chuàng)建windows程序的方法,也許你聽說過MFC程序,這種界面linux已經(jīng)將Windows界面程序的創(chuàng)建過程完全封裝,而我們接下來要學(xué)習(xí)的就是擺脫MFC的束縛,從零開發(fā)創(chuàng)建一個windows界面程序。首先我們先介紹下創(chuàng)建Windows程序的一個步驟,在后面的文章中我會逐步實現(xiàn)并解釋每個步驟。

? ? 創(chuàng)建一個Windows界面程序共分為7步:

(1)定義Winlinuxlinux(這是windows界面程序的入口,請參照本專欄第一篇文章內(nèi)容)。

(2)定義窗口處理函數(shù)。

(3)注冊窗口

(4)創(chuàng)建窗口

(5)顯示窗口

(6)編寫消息linux函數(shù)

(7)處理消息

三、創(chuàng)建試驗環(huán)境

? ? ?我們先創(chuàng)建一個win32窗口程序。我們用VS2015linux環(huán)境,創(chuàng)建win32窗口程序的步驟是文件->新建->項目,在模板里面選擇Visual C++,然后選擇Win32窗口程序。但是在最后一步,點擊完成linux之前,我們要選擇空項目,也就是說這個項目建成后將會什么文件都沒有,我們要新建一個cpp文件來從零開始創(chuàng)建一個窗口程序。

Win32 SDK基礎(chǔ)(三)之如何從零開始創(chuàng)建windows窗口的第一步

3.1 定義winMain函數(shù)。

???? ??我們在新添加的空的cpp文件中,添加如下程序入口的wWinMain函數(shù):

int?APIENTRY?wWinMain(_In_?HINSTANCE?hInstance,  _In_opt_?HINSTANCE?hPrevInstance,  _In_?LPWSTR????lpCmdLine,  _In_?int???????nCmdShow)  {  }

? ? 這里我們先介紹下WinMain函數(shù)的幾個參數(shù):

hInstance?——?當(dāng)前程序的實例句柄,也就是目前程序所在的內(nèi)存的位置

hPrevInstance?——當(dāng)前程序前一個程序實例句柄,目前已經(jīng)廢棄,不再使用。

lpCmdLine?—— 命令行參數(shù),我們執(zhí)行程序時可以用命令行的形式傳入一些參數(shù)。

nCmdShow?—— 窗口的顯示方式,最大化、最小化那種。

3.2 定義窗口處理函數(shù)

? ? ??窗口處理函數(shù)用來為系統(tǒng)linux,主要用來處理消息。像我們平常對程序的一系列操作,反應(yīng)到程序內(nèi)部,其實都是產(chǎn)生了一系列的操作。比如窗口關(guān)閉時會傳遞窗口關(guān)閉的消息,窗口最大化時也會傳遞最大化的消息,包括我們拖動窗口都會產(chǎn)生消息。而我們定義的窗口處理函數(shù)就是處理操作上述的消息,如下面所示,我們定義的窗口處理函數(shù)處理了一個WM_DESTROY消息,這是我們在關(guān)閉窗口時發(fā)送的消息,被我們的窗口處理函數(shù)捕獲之后,會調(diào)用系統(tǒng)的APIPostQuitMessage(0),使窗口linux

? ? 窗口處理函數(shù)共有四個參數(shù):

hWnd —— 是窗口的句柄。

uMsg?—— 是傳入的消息,它的本質(zhì)就是無符號整形的數(shù)字。

wParamlParam?—— 是消息附帶的兩個參數(shù)。

//窗口處理函數(shù)  LRESULT?CALLBACK?WndProc(HWND?hWnd,?UINT?uMsg,?WPARAM?wParam,?LPARAM?lParam)  {  ????switch?(uMsg)  ????{  ????????case?WM_DESTROY:  ????????PostQuitMessage(0);//可以使GetMessage返回0  ????????break;  ????????default:  ????????break;  ????}  ????return?DefWindowProc(hWnd,?uMsg,?wParam,?lParam);  }

? ? ?我們先定義窗口處理函數(shù),稍后再進行使用。

3.3 編寫窗口注冊函數(shù)

? ? ? ???一個窗口,在創(chuàng)建之前需要先向操作系統(tǒng)進行注冊,這類似現(xiàn)實生活中我們開公司,要先向工商局進行注冊一樣。wce是一個WNDlinuxEX?類型的linux,這就是一個窗口類,包含了我們所需要的窗口信息,包括菜單、圖標(biāo)、背景色等等。它最主要的是兩個成員,hInstance是當(dāng)前程序的實例句柄,lpszClassName是我們注冊的類名稱,其他的這里不再解釋,可參照MSDN。

? ? 我們通過RegisterClassEx()這個API將窗口類在操作系統(tǒng)中進行注冊,并通過其返回值判斷是否注冊成功。我們在WinMain函數(shù)中進行窗口的注冊工作,請看下面的代碼:

int?APIENTRY?wWinMain(_In_?HINSTANCE?hInstance,  _In_opt_?HINSTANCE?hPrevInstance,  _In_?LPWSTR????lpCmdLine,  _In_?int???????nCmdShow)  {  ????//注冊窗口類  ????WNDCLASSEX?wce?=?{?0?};  ????wce.cbSize?=?sizeof(wce);  ????wce.cbClsExtra?=?0;  ????wce.cbWndExtra?=?0;  ????wce.hbrBackground?=?(HBRUSH)(COLOR_WINDOW?+?1);  ????wce.hCursor?=?NULL;  ????wce.hIcon?=?NULL;  ????wce.hIconSm?=?NULL;  ????wce.hInstance?=?hInstance;  ????wce.lpfnWndProc?=?wndProc;  ????wce.lpszClassName?=?“Main”;  ????wce.lpszMenuName?=?NULL;  ????wce.style?=?CS_HREDRAW?|?CS_VREDRAW;  ????ATOM?nAtom?=?RegisterClassEx(&wce);  ????if?(!nAtom?)  ????{  ????????MessageBox(NULL,?"注冊失敗",?"Infor",?MB_OK);  ????????return?0;  ????}  }

3.4 創(chuàng)建窗口

? ? 接下來我們創(chuàng)建窗口,創(chuàng)建窗口我們使用CreateWindowEx系統(tǒng)API,請留意下面它的第2、3兩個參數(shù),第二個參數(shù)使我們之前注冊的窗口類名稱,第三個參數(shù)是窗口的標(biāo)題名稱,其他的是一些窗口顯示的參數(shù),這里不再詳細(xì)解釋。

HWND?hWnd?=?CreateWindowEx(0,?“Main”,?“Window”,  WS_OVERLAPPEDWINDOW,?CW_USEDEFAULT,?CW_USEDEFAULT,?CW_USEDEFAULT,?CW_USEDEFAULT,?NULL,?NULL,?g_hInstance,?NULL);

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊6 分享