天天看點

入門Windows程式設計

自從上次做了那個SDK的黑白棋後我就一直對MFC耿耿于懷,最近又被一些童鞋“苦苦糾纏”,沒辦法,就隻好研究下windows程式設計的内容了。這裡隻針對入門級玩家,如果您是大神,那就不浪費您寶貴的時間了,當然如果您是和我一樣的菜鳥,那就請跟着我一起來揭開windows程式設計的神秘面紗吧。

需要強調的是要寫windows程式需要了解SDK或者是MFC(不知道這個名詞的朋友請“百度google”之),對于語言的選擇還是那句話,語言是溝通的工具,不過主流的還是C或者C++。C可以使用SDK或者MFC來設計windows程式,但用MFC前必須了解面向對象的概念。C++如果用來設計SDK程式的話會感覺怪怪的,不夠也行。來看看下面這張圖:

入門Windows程式設計

這是我模仿程秉輝大哥畫的一張圖,由圖中你可以很容易的看出SDK和MFC的不同在于SDK直接調用API函數,而MFC用類封裝來調用API,當然也可以直接調用。

廢話不多說了,因為之前我設計的那個黑白棋是用SDK設計的,是以這裡我先講解一下SDK的設計方法,MFC的設計思想在以後的文章中慢慢來吧。

我們可以簡單的認為windows程式是基于消息的事件驅動程式(這純粹是小弟我個人看法,若有不對各路大牛還請見諒),我們對計算機做出的每一個操作都可能觸發程式發送某個消息,比如我們移動滑鼠就有可能發送WM_MOUSEMOVE消息,這個消息暫且不去管他,後面會講。為什麼說有可能呢?因為我們在設計程式時是可以讓它忽略這種操作的,就是我們常說的不響應使用者操作。而發送的消息交由處理函數來進行處理就是我們常說的事件被觸發了。可能說到這裡有些人暈了,沒事,暈了就直接往下看。

為什麼微軟的系統要叫windows呢?因為它最大的特點就是程式大部分以一種視窗的形式存在,如你現在打開的浏覽器就是一個視窗,是以我們設計的windows程式顯而易見也應該是以這種形式存在,那麼其實SDK的程式結構很簡單,就兩個部分,也可以說是兩個主要函數,一個是主函數WinMain(),這個函數就和C語言中的main()函數一樣,對于一般的windows程式必不可少。還有一個函數,就是消息處理函數,名字随便你了,比如叫WinProc()。隻要我們寫出這兩個函數,一個簡單的windows程式就算可以了。那這兩個函數怎麼寫呢?

首先來看WinMain函數的主要結構:

int WinMain(……)

{

    ……

    RegisterClass(……);——注冊視窗類

    CreateWindow(……);——建立視窗

    ShowWindow(……);——顯示視窗

    UpdateWindow(……);——更新視窗

    while (GetMessage(……))——循環接受并處理消息

    {

        TranslateMessage(……);

        DispatchMessage(……);

    }

    return(……);

}

至于……裡面寫什麼,後面再說。看到這裡你會說:嗯~sounds great~,除了那些紅色的函數。OK,讓我們不要去管那些函數,當然他們的功能倒是可以從他們的命名看出來(自注釋的命名方式真的不錯哦~)。

再來看看我們的WinProc函數:

long CALLBACK WinProc(……)

    switch(message)

        case WM_MOUSEMOVE:

        {……;break;}

        case WM_KEYDOWN:

        ……

        default:

        {return DefWindowProc(……);}

    return(0);

這時你會說:好吧,我看到那些WM開頭的消息了,然後這裡有一個case-switch語句。沒錯,我用藍色标明的地方就是處理消息的一個小單元,在這個case語句中,首先比對到WM_MOUSEMOVE消息,然後case中會寫上處理函數進行處理,最後傳回等待下一個消息的到來。

上面兩個函數都不太難看懂,我在附件中給出了一個簡單的完整架構,除了WinProc中接收消息的地方沒有寫之外,其他該寫的都寫了,有興趣的朋友可以下載下傳下來看看,如果你能夠明白,就建議你看看我之前的一篇黑白棋的博文http://rangercyh.blog.51cto.com/1444712/394825,下載下傳後面的源碼,仔細研究一下,那個源碼有很多不妥和胡亂寫的地方,因為那是我的第一次嘗試,寫的爛點應該可以了解吧!看完代碼後你會對windows程式的SDK設計有一個感性的認識,接下來我建議你借本windows程式設計教材來看看,這時你再看他的Hello world的例子應該會容易了解點。當然我也在學習中,之後也會繼續和大家分享我學習中遇到的難點和快樂,希望大家共同進步。

繼續閱讀