首頁  >  文章  >  運維  >  Win32 SDK基礎(三)如何從零開始建立windows視窗的第一步

Win32 SDK基礎(三)如何從零開始建立windows視窗的第一步

黄舟
黄舟原創
2017-06-06 09:38:402231瀏覽

一、Windows的程式分類說起。

     從高中第一次接觸電腦開始(慚愧,高中才會用電腦,大學一年級才知道有QQ這麼東西,家裡窮,沒辦法),在我的概念中電腦應該就是windows這樣的。所以,直到大學臨畢業,才知道原來還有linux#這種作業系統,然後畢業之後開始工作才明白蘋果公司也有一套自己的作業系統.所以,至今也想不明白,我怎麼就踏上了碼農這條不歸路。然後一踏上就一發不可收拾,直到某天被拍死在沙灘上。 。 。

       廢話說太多了,我們進入主題。 接觸過了這麼多年的windows,身為碼農,我們有必要先把windows的這些程式分下類別:

(1)控制台程式。

     這恐怕身為專業碼農,發展過的第一個程式。我們在大學一年級第一次用C語言寫第一個「hello world」時,當時的程式就是控制台程式.他的本質是DOS程序,沒有自己的窗口,你看到的輸出Hello world的視窗是程式本身借用了作業系統的DOS。視窗。

(2)視窗程式。

     視窗程式恐怕是我們接觸最多的一種程式了,從常用的office到各種可見介面的程序,都是windows下視窗程式。而本次專欄的目標,就是介紹windows視窗程式的基礎。

(3)動態庫程式。

     這就是大名鼎鼎的dll,可能對新手來說只看過豬跑,沒吃過豬肉,對於windows的普通用戶來說可能豬跑都沒見過。但是身為一個程式設計師老油條,這應該再熟悉不過了吧。我們也會在後面介紹該類程式的開發基礎。

(4)靜態庫程式。

     這種是後綴名為lib的程式類型,屬於古董等級的程式了,沒有dll 常用,但是依然有自己的江湖地位。同樣我們後面也會介紹其開的開發基礎。

     介紹完了廢話以及winddows程式的分類,我們開發正式開始下面的內容了。

 

#

二、從零開始創建windows的過程

#      本文的主要目的是介紹下自己創建windows程式的方法,也許你聽過MFC程序,這個介面框架已經將# Windows介面程式的建立過程完全封裝,而我們接下來要學習的就是擺脫MFC的束縛,從零開發創建一個windows介面程式。首先我們先介紹下創建Windows程式的一個步驟,在後面的文章中我會逐步實作並解釋每個步驟。

    建立一個Windows介面程式共分為7步驟:

(1)定義WinMain函數(這是windows 介面程式的入口,請參考本專欄第一篇文章內容)。

(2)定義視窗處理函數。

(3)註冊視窗

(4)建立視窗

(5)顯示視窗

(6)寫訊息循環函數

#(7)處理訊息

#三、建立試驗環境

     我們先建立一個win32視窗程式。 我們用VS2015程式設計環境,建立win32視窗程式的步驟是檔案 #->新建->項目,在範本裡面選擇#Visual C++,然後選擇Win32視窗程式。 但是在最後一步,點擊完成按鈕之前,我們要選擇空項目,也就是說這個項目建成後將會什麼文件都沒有,我們要新建一個cpp文件來從零開始創建一個視窗程式。


#3.1 定義winMain函數。

       我們在新新增的空白的cpp檔案中,新增下列程式入口的wWinMain函數:

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

    這裡我們先介紹下WinMain函數的幾個參數:

hInstance — — 目前程式的實例句柄,也就是目前程式所在的記憶體的位置

#

hPrevInstance ——当前程序前一个程序实例句柄,目前已经废弃,不再使用。

lpCmdLine —— 命令行参数,我们执行程序时可以用命令行的形式传入一些参数。

nCmdShow —— 窗口的显示方式,最大化、最小化那种。

3.2 定义窗口处理函数

      窗口处理函数用来为系统回调函数,主要用来处理消息。像我们平常对程序的一系列操作,反应到程序内部,其实都是产生了一系列的操作。比如窗口关闭时会传递窗口关闭的消息,窗口最大化时也会传递最大化的消息,包括我们拖动窗口都会产生消息。而我们定义的窗口处理函数就是处理操作上述的消息,如下面所示,我们定义的窗口处理函数处理了一个WM_DESTROY消息,这是我们在关闭窗口时发送的消息,被我们的窗口处理函数捕获之后,会调用系统的APIPostQuitMessage(0),使窗口退出

    窗口处理函数共有四个参数:

hWnd —— 是窗口的句柄。

uMsg —— 是传入的消息,它的本质就是无符号整形的数字。

wParamlParam —— 是消息附带的两个参数。

//窗口处理函数
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);
}

     我们先定义窗口处理函数,稍后再进行使用。

3.3 编写窗口注册函数

         一个窗口,在创建之前需要先向操作系统进行注册,这类似现实生活中我们开公司,要先向工商局进行注册一样。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;
    }
}

3.4 创建窗口

    接下来我们创建窗口,创建窗口我们使用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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn