自從上次做了那個SDK的黑白棋後我就一直對MFC耿耿於懷,最近又被一些童鞋“苦苦糾纏”,沒辦法,就只好研究下windows程序設計的內容了。這裡只針對入門級玩家,如果您是大神,那就不浪費您寶貴的時間了,當然如果您是和我一樣的菜鳥,那就請跟著我一起來揭開windows程序設計的神秘面紗吧。
需要強調的是要寫windows程序需要了解SDK或者是MFC不知道這個名詞的朋友請“百度google”之),對於語言的選擇還是那句話,語言是溝通的工具,不過主流的還是C或者C++。C可以使用SDK或者MFC來設計windows程序,但用MFC前必須了解面向對象的概念。C++如果用來設計SDK程序的話會感覺怪怪的,不夠也行。來看看下面這張圖:
這是我模仿程秉輝大哥畫的一張圖,由圖中你可以很容易的看出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:
{……;break;}
……
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的例子應該會容易理解點。當然我也在學習中,之後也會繼續和大家分享我學習中遇到的難點和快樂,希望大家共同進步。
本文出自 “菜鳥浮出水” 博客,請務必保留此出處http://rangercyh.blog.51cto.com/1444712/397568