如果你是一個編程初學者,如果你剛剛結(jié)束C語言的課程。你可能會有點失望和懷疑:這就是C語言嗎?靠它就能編出軟件?無法想象Windows桌面上一個普通的窗口是怎樣出現(xiàn)在眼前的。從C語言的上機作業(yè)到Windows編程確實有比較大的gap?;蛟S你已經(jīng)看了programming Windows的前三章,但是對于那個hellowin程序甚為迷惘。希望hfire的這篇文章能幫你填補這個gap,并提供一些學習的經(jīng)驗。為什么是淺談,因為hfire知道的也不夠深,肯定會有錯誤,請批評指正。
程序與運行時環(huán)境及操作系統(tǒng)
當你用Turbo C編寫了一個C程序,然后編譯連結(jié)它,得到了一個可執(zhí)行文件。在Dos的命令提示符下鍵入這個exe文件的文件名,然后它就執(zhí)行了。表面看事情就是這些。作為一個應(yīng)用程序員,我們不用考慮背后的事情,但是有一個簡單的事實我們必須清楚的認識:程序不只是靠自己運行,它需要運行時環(huán)境的配合??紤]一下用一個printf函數(shù)顯示一個字符串的過程。顯然這個函數(shù)不是你自己寫的。或許你聽說過C-Runtime Library,C運行時庫,沒錯,你的程序只有依靠它才能運行。printf的代碼就在C運行時庫中,因此你可以輕松的調(diào)用它而不管它是怎么實現(xiàn)的。但是,C運行時庫也會調(diào)用一些別的函數(shù),這些函數(shù)是由操作系統(tǒng)提供的,稱為中斷服務(wù)程序,而操作系統(tǒng)的中斷服務(wù)程序會進一步的調(diào)用BIOS中斷服務(wù)程序??梢钥闯觯绦虻倪\行是由一層一層的服務(wù)支撐起來的。在這里面,操作系統(tǒng)擔當了非常重要的角色。它提供了程序員可以直接使用的例程,也可以稱為Application Programming Interface (應(yīng)用程序編程界面,API) 。Dos中一般沒有API的說法,Dos的編程界面是由中斷服務(wù)程序充當。在Windows中編程就要常常和API打交道。32位Windows的API有2000多個,一方面它提供了功能強大的編程界面,另一方面它使初學者望而卻步。
Windows操作系統(tǒng)基本常識
Windows是一個單用戶多任務(wù)圖形化操作系統(tǒng)。所謂單用戶,指同時只能由一個用戶(一個人)通過Windows系統(tǒng)操作電腦;所謂多任務(wù),指同時可以有多個進程并發(fā)執(zhí)行。既然Windows系統(tǒng)有這些特點,那么Windows編程就會體現(xiàn)這些特點。為了做到多任務(wù),Windows程序使用消息機制,有我的消息我才干活,沒我的消息就把CPU讓給別人;為了做到圖形化,Windows程序必須顯示窗口并自己繪制客戶區(qū),就連顯示字符串也必須畫到客戶區(qū)上。還有一點,Windows廣泛使用動態(tài)鏈接。Windows的API就放在動態(tài)鏈接庫中,以供程序運行時調(diào)用。在Windows 98中有32位的gdi32.dll,user32.dll,kernel32.dll和16位的gdi.exe,user.exe,krnl386.exe,API就存在于這些動態(tài)鏈接庫中。
什么是Windows SDK
SDK即software develope kit(軟件開發(fā)工具包),它包含了進行Windows軟件開發(fā)的文檔和API函數(shù)的輸入庫、頭文件(因為API在動態(tài)鏈接庫中,這些動態(tài)鏈接庫是系統(tǒng)的組成部分因此不用再提供,而輸入庫和頭文件則必須,這樣才能在你的程序中使用API函數(shù))。早期SDK是一個單獨發(fā)放的包,現(xiàn)在在Visual C++和其他一些開發(fā)環(huán)境中已經(jīng)包含了它。如果你已經(jīng)安裝了VC++那么就可以開始編寫Windows程序了。隨著Windows系統(tǒng)的發(fā)展,SDK的內(nèi)容越來越多,我們只要抓住基本的方面。至于其他專門的主題,就根據(jù)自己的興趣和技術(shù)方向進一步學習了。
不用被第一個Windows程序嚇住
如果你已經(jīng)開始,你的教材應(yīng)該是那本經(jīng)典的programming windows (petzold)或者是一本相似的書。但無論哪本書,一開始你都會面對一個基本的Windows SDK程序,這個程序有幾十行。盡管也不算長,但比C版的hello world長多了。更糟的是,里面充斥著奇怪的變量類型和常量定義,不過先不用被它嚇住,讓我們看看這里面有些什么。首先會有一個#include ,嗯,沒什么奇怪的,這和#inclde 沒什么兩樣。然后是一個函數(shù)聲明:LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; 有點困惑了,一下子就出來了好幾個“生詞”,而且函數(shù)名前面有兩個修飾符也是以前沒有遇到的。好在我們還可以辨認出這是一個函數(shù)聲明。再往下看是WinMain函數(shù),又是一堆生詞,我猜想你可能已經(jīng)開始郁悶了。想一遍看懂這個程序確實困難,所以看不懂也沒關(guān)系。看不下去了可以看看書上的講解。這篇文章并不是要完整分析這個程序的,hfire不可能有petzold講的好。在這里hfire幫你分析一下一些陌生的東西。
首先說Windows的數(shù)據(jù)類型。盡管這些數(shù)據(jù)類型看上去很陌生,其實它們是由C的基本數(shù)據(jù)類型define的。比如UINT就是unsinged int,PSTR就是pointer to string 的意思,猜猜就知道是char * 。Windows還有很多系統(tǒng)定義的結(jié)構(gòu)體,比如WNDCLASS,MSG等,這些東西見的多了就自然明白了。Windows還有一個重要的概念,句柄。通過句柄就可以操作Windows對象。HWND,HINSTANCE,HDC等都是句柄。
再說說Windows程序的結(jié)構(gòu)。一般有一個WinMain函數(shù)作為程序的入口點,在WinMain里面定義窗口類,進行消息循環(huán)。消息循環(huán)就是那個普通的while循環(huán),在其中接收消息、分發(fā)消息。然后是窗口函數(shù)WndProc,名字可以自己定。在其中用一個大的switch結(jié)構(gòu)檢索消息,在每個case下面寫處理消息的代碼。簡單的Windows SDK程序只要寫這兩個函數(shù)就夠了。等你的程序?qū)戦L了,就要把特定的消息處理代碼寫成函數(shù),以便在處理消息時調(diào)用,甚至你可以使用C++來寫程序。等你熟悉這種結(jié)構(gòu)以后,就可以任意發(fā)揮了。
其他的不想說太多,學SDK很重要的是不要期望在開始時把每行代碼都搞清楚。
學習的方法
當然是多寫程序了。好每個主題都寫一個。從一開始的窗口,文本顯示到圖形顯示、控件、對話框,多寫就能領(lǐng)會Windows編程的內(nèi)涵。當?shù)谝徊糠謱W的差不多了,可以寫一個綜合點的程序。后你會發(fā)現(xiàn)你可以寫很長的程序了,1000多行也不算長,但對于當時學C時是難以想象的。還有重要的是多上一些專門的網(wǎng)站,比如VC知識庫(www.vckbase.com)和VC之路(有一本很好的教程,不過現(xiàn)在網(wǎng)站的東西都沒了,正在恢復(fù)),另外www.csdn.net也是一個不錯的地方。
幾種Windows編程方法的辨析及其它
很多初學者往往會將Windows編程和VC++混為一談。打開VC++的新建項目,可以看到VC++支持很多種工程。包括命令行的,MFC的,還有就是Win32 Application,即SDK程序。使用VC++未必是編寫SDK程序,編寫SDK程序也未必要用VC++。 編寫Windows程序的方法也不止SDK一種,還包括使用類庫如MFC,OWL,使用快速開發(fā)工具如VB,Delphi。這些方法各有各的用處。使用SDK無疑是麻煩的了,我們學習SDK也并非是為了用它來編軟件,雖然它可以,主要是為了對Windows編程有比較清晰的認識,這樣你使用MFC時就可以做到“胸中自有溝壑”。
程序與運行時環(huán)境及操作系統(tǒng)
當你用Turbo C編寫了一個C程序,然后編譯連結(jié)它,得到了一個可執(zhí)行文件。在Dos的命令提示符下鍵入這個exe文件的文件名,然后它就執(zhí)行了。表面看事情就是這些。作為一個應(yīng)用程序員,我們不用考慮背后的事情,但是有一個簡單的事實我們必須清楚的認識:程序不只是靠自己運行,它需要運行時環(huán)境的配合??紤]一下用一個printf函數(shù)顯示一個字符串的過程。顯然這個函數(shù)不是你自己寫的。或許你聽說過C-Runtime Library,C運行時庫,沒錯,你的程序只有依靠它才能運行。printf的代碼就在C運行時庫中,因此你可以輕松的調(diào)用它而不管它是怎么實現(xiàn)的。但是,C運行時庫也會調(diào)用一些別的函數(shù),這些函數(shù)是由操作系統(tǒng)提供的,稱為中斷服務(wù)程序,而操作系統(tǒng)的中斷服務(wù)程序會進一步的調(diào)用BIOS中斷服務(wù)程序??梢钥闯觯绦虻倪\行是由一層一層的服務(wù)支撐起來的。在這里面,操作系統(tǒng)擔當了非常重要的角色。它提供了程序員可以直接使用的例程,也可以稱為Application Programming Interface (應(yīng)用程序編程界面,API) 。Dos中一般沒有API的說法,Dos的編程界面是由中斷服務(wù)程序充當。在Windows中編程就要常常和API打交道。32位Windows的API有2000多個,一方面它提供了功能強大的編程界面,另一方面它使初學者望而卻步。
Windows操作系統(tǒng)基本常識
Windows是一個單用戶多任務(wù)圖形化操作系統(tǒng)。所謂單用戶,指同時只能由一個用戶(一個人)通過Windows系統(tǒng)操作電腦;所謂多任務(wù),指同時可以有多個進程并發(fā)執(zhí)行。既然Windows系統(tǒng)有這些特點,那么Windows編程就會體現(xiàn)這些特點。為了做到多任務(wù),Windows程序使用消息機制,有我的消息我才干活,沒我的消息就把CPU讓給別人;為了做到圖形化,Windows程序必須顯示窗口并自己繪制客戶區(qū),就連顯示字符串也必須畫到客戶區(qū)上。還有一點,Windows廣泛使用動態(tài)鏈接。Windows的API就放在動態(tài)鏈接庫中,以供程序運行時調(diào)用。在Windows 98中有32位的gdi32.dll,user32.dll,kernel32.dll和16位的gdi.exe,user.exe,krnl386.exe,API就存在于這些動態(tài)鏈接庫中。
什么是Windows SDK
SDK即software develope kit(軟件開發(fā)工具包),它包含了進行Windows軟件開發(fā)的文檔和API函數(shù)的輸入庫、頭文件(因為API在動態(tài)鏈接庫中,這些動態(tài)鏈接庫是系統(tǒng)的組成部分因此不用再提供,而輸入庫和頭文件則必須,這樣才能在你的程序中使用API函數(shù))。早期SDK是一個單獨發(fā)放的包,現(xiàn)在在Visual C++和其他一些開發(fā)環(huán)境中已經(jīng)包含了它。如果你已經(jīng)安裝了VC++那么就可以開始編寫Windows程序了。隨著Windows系統(tǒng)的發(fā)展,SDK的內(nèi)容越來越多,我們只要抓住基本的方面。至于其他專門的主題,就根據(jù)自己的興趣和技術(shù)方向進一步學習了。
不用被第一個Windows程序嚇住
如果你已經(jīng)開始,你的教材應(yīng)該是那本經(jīng)典的programming windows (petzold)或者是一本相似的書。但無論哪本書,一開始你都會面對一個基本的Windows SDK程序,這個程序有幾十行。盡管也不算長,但比C版的hello world長多了。更糟的是,里面充斥著奇怪的變量類型和常量定義,不過先不用被它嚇住,讓我們看看這里面有些什么。首先會有一個#include
首先說Windows的數(shù)據(jù)類型。盡管這些數(shù)據(jù)類型看上去很陌生,其實它們是由C的基本數(shù)據(jù)類型define的。比如UINT就是unsinged int,PSTR就是pointer to string 的意思,猜猜就知道是char * 。Windows還有很多系統(tǒng)定義的結(jié)構(gòu)體,比如WNDCLASS,MSG等,這些東西見的多了就自然明白了。Windows還有一個重要的概念,句柄。通過句柄就可以操作Windows對象。HWND,HINSTANCE,HDC等都是句柄。
再說說Windows程序的結(jié)構(gòu)。一般有一個WinMain函數(shù)作為程序的入口點,在WinMain里面定義窗口類,進行消息循環(huán)。消息循環(huán)就是那個普通的while循環(huán),在其中接收消息、分發(fā)消息。然后是窗口函數(shù)WndProc,名字可以自己定。在其中用一個大的switch結(jié)構(gòu)檢索消息,在每個case下面寫處理消息的代碼。簡單的Windows SDK程序只要寫這兩個函數(shù)就夠了。等你的程序?qū)戦L了,就要把特定的消息處理代碼寫成函數(shù),以便在處理消息時調(diào)用,甚至你可以使用C++來寫程序。等你熟悉這種結(jié)構(gòu)以后,就可以任意發(fā)揮了。
其他的不想說太多,學SDK很重要的是不要期望在開始時把每行代碼都搞清楚。
學習的方法
當然是多寫程序了。好每個主題都寫一個。從一開始的窗口,文本顯示到圖形顯示、控件、對話框,多寫就能領(lǐng)會Windows編程的內(nèi)涵。當?shù)谝徊糠謱W的差不多了,可以寫一個綜合點的程序。后你會發(fā)現(xiàn)你可以寫很長的程序了,1000多行也不算長,但對于當時學C時是難以想象的。還有重要的是多上一些專門的網(wǎng)站,比如VC知識庫(www.vckbase.com)和VC之路(有一本很好的教程,不過現(xiàn)在網(wǎng)站的東西都沒了,正在恢復(fù)),另外www.csdn.net也是一個不錯的地方。
幾種Windows編程方法的辨析及其它
很多初學者往往會將Windows編程和VC++混為一談。打開VC++的新建項目,可以看到VC++支持很多種工程。包括命令行的,MFC的,還有就是Win32 Application,即SDK程序。使用VC++未必是編寫SDK程序,編寫SDK程序也未必要用VC++。 編寫Windows程序的方法也不止SDK一種,還包括使用類庫如MFC,OWL,使用快速開發(fā)工具如VB,Delphi。這些方法各有各的用處。使用SDK無疑是麻煩的了,我們學習SDK也并非是為了用它來編軟件,雖然它可以,主要是為了對Windows編程有比較清晰的認識,這樣你使用MFC時就可以做到“胸中自有溝壑”。