從高中第一次接觸電腦開始(慚愧,高中才會用電腦,大學一年級才知道有QQ這麼東西,家裡窮,沒辦法),在我的概念中電腦應該就是windows這樣的。所以,直到大學臨畢業,才知道原來還有linux#這種作業系統,然後畢業之後開始工作才明白蘋果公司也有一套自己的作業系統.所以,至今也想不明白,我怎麼就踏上了碼農這條不歸路。然後一踏上就一發不可收拾,直到某天被拍死在沙灘上。 。 。
廢話說太多了,我們進入主題。 接觸過了這麼多年的windows,身為碼農,我們有必要先把windows的這些程式分下類別:
這恐怕身為專業碼農,發展過的第一個程式。我們在大學一年級第一次用C語言寫第一個「hello world」時,當時的程式就是控制台程式.他的本質是DOS程序,沒有自己的窗口,你看到的輸出Hello world的視窗是程式本身借用了作業系統的DOS。視窗。
視窗程式恐怕是我們接觸最多的一種程式了,從常用的office到各種可見介面的程序,都是windows下視窗程式。而本次專欄的目標,就是介紹windows視窗程式的基礎。
這就是大名鼎鼎的dll,可能對新手來說只看過豬跑,沒吃過豬肉,對於windows的普通用戶來說可能豬跑都沒見過。但是身為一個程式設計師老油條,這應該再熟悉不過了吧。我們也會在後面介紹該類程式的開發基礎。
這種是後綴名為lib的程式類型,屬於古董等級的程式了,沒有dll 常用,但是依然有自己的江湖地位。同樣我們後面也會介紹其開的開發基礎。
介紹完了廢話以及winddows程式的分類,我們開發正式開始下面的內容了。
#
# 本文的主要目的是介紹下自己創建windows程式的方法,也許你聽過MFC程序,這個介面框架已經將# Windows介面程式的建立過程完全封裝,而我們接下來要學習的就是擺脫MFC的束縛,從零開發創建一個windows介面程式。首先我們先介紹下創建Windows程式的一個步驟,在後面的文章中我會逐步實作並解釋每個步驟。
建立一個Windows介面程式共分為7步驟:
(1)定義WinMain函數(這是windows 介面程式的入口,請參考本專欄第一篇文章內容)。
(2)定義視窗處理函數。
(3)註冊視窗
(4)建立視窗
(5)顯示視窗
(6)寫訊息循環函數
#(7)處理訊息
我們先建立一個win32視窗程式。 我們用VS2015的程式設計環境,建立win32視窗程式的步驟是檔案 #->新建->項目,在範本裡面選擇#Visual C++,然後選擇Win32視窗程式。 但是在最後一步,點擊完成按鈕之前,我們要選擇空項目,也就是說這個項目建成後將會什麼文件都沒有,我們要新建一個cpp文件來從零開始創建一個視窗程式。
我們在新新增的空白的cpp檔案中,新增下列程式入口的wWinMain函數:
#int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { }
這裡我們先介紹下WinMain函數的幾個參數:
hInstance — — 目前程式的實例句柄,也就是目前程式所在的記憶體的位置。
#hPrevInstance ——当前程序的前一个程序实例句柄,目前已经废弃,不再使用。
lpCmdLine —— 命令行参数,我们执行程序时可以用命令行的形式传入一些参数。
nCmdShow —— 窗口的显示方式,最大化、最小化那种。
窗口处理函数用来为系统回调函数,主要用来处理消息。像我们平常对程序的一系列操作,反应到程序内部,其实都是产生了一系列的操作。比如窗口关闭时会传递窗口关闭的消息,窗口最大化时也会传递最大化的消息,包括我们拖动窗口都会产生消息。而我们定义的窗口处理函数就是处理操作上述的消息,如下面所示,我们定义的窗口处理函数处理了一个WM_DESTROY消息,这是我们在关闭窗口时发送的消息,被我们的窗口处理函数捕获之后,会调用系统的APIPostQuitMessage(0),使窗口退出。
窗口处理函数共有四个参数:
hWnd —— 是窗口的句柄。
uMsg —— 是传入的消息,它的本质就是无符号整形的数字。
wParam、lParam —— 是消息附带的两个参数。
//窗口处理函数 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); }
我们先定义窗口处理函数,稍后再进行使用。
一个窗口,在创建之前需要先向操作系统进行注册,这类似现实生活中我们开公司,要先向工商局进行注册一样。wce是一个WNDCLASSEX 类型的结构体,这就是一个窗口类,包含了我们所需要的窗口信息,包括菜单、图标、背景色等等。它最主要的是两个成员,hInstance是当前程序的实例句柄,lpszClassName是我们注册的类名称,其他的这里不再解释,可参照MSDN。
我们通过RegisterClassEx()这个API将窗口类在操作系统中进行注册,并通过其返回值判断是否注册成功。我们在WinMain函数中进行窗口的注册工作,请看下面的代码:
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; } }
接下来我们创建窗口,创建窗口我们使用CreateWindowEx系统API,请留意下面它的第2、3两个参数,第二个参数使我们之前注册的窗口类名称,第三个参数是窗口的标题名称,其他的是一些窗口显示的参数,这里不再详细解释。
HWND hWnd = CreateWindowEx(0, “Main”, “Window”, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, g_hInstance, NULL);
以上是Win32 SDK基礎(三)如何從零開始建立windows視窗的第一步的詳細內容。更多資訊請關注PHP中文網其他相關文章!