老是被同學們問一些關於C語言初學時的圖形程式設計問題,感覺有點代表性,這裡統一做個回答。
一家之言哈,歡迎拍磚。
問題:
1、為什麼VC下找不到BGI檔案?
2、我按照書上寫的把程式輸入,編譯時發現找不到graphics.h檔案
3、VC是不是不支援圖形開發啊?
4、… …
問這類問題的同學還很多,總的來說,我覺得這些同學應該屬於初學C語言,對於語言、作業系統、平臺的概念還不清楚,因此會問這類問題。
首先,糾正一點,C語言就是C語言,是負責編制程式實現計算的,真正的C語言,是不帶任何平臺相關特點的,而圖形、聲音,是平臺相關,因為不是每個計算平臺都有圖形介面,因此,最原始的C,甚至是C++語言,是不帶任何圖形開發介面的。
就我本人而言,也犯過類似的迷糊,最開始我們在Apple II計算機上開發,由於其Basic語言是和計算機繫結在一起的,硬體也有圖形開發介面,使用匯編語言也能直接開發,因為,我就想當然地認為,計算機一定可以繪圖的。
後來學習了計算機圖形學,才發現不是這麼一回事,圖形終端,是單獨的一門大學問,和計算機基本上是割裂的,在以前大中小型機的時代,一臺計算機可以帶字元終端,如電傳打字機,也可以帶圖形終端,不過,有圖形終端的一般叫圖形工作站,呵呵,很拉風的。
記得90年我在石油物探局玩了一次Sun Sparc 490圖形工作站,我當時都迷了,90年,人家音訊、視訊介面就是標配,XWindows比我們現在的XP什麼的好看多了,按鈕全是圓弧帶陰影的,硬體實現實三維計算。記得當年是瞞著巴統進來的,一臺120萬美金,確實是好東東,20年前的配置,到現在都不見得落後多少。
呵呵,說遠了,主要是請大家清楚一點,計算機裡面還是可以細分的,圖形系統是圖形系統,計算機是計算機,我們大家一般都是從微型計算機PC開始學習程式設計的,再加上現在Windows系統這麼流行,可能有點想當然,以為圖形顯示卡是一臺計算機的標配,呵呵,不一定的。
好,話說回來,大家可能還有個誤區,以為C語言,C++語言,以及Java這些東東,是PC機的語言,其實也不是的,計算機硬體是硬體,軟體是軟體,C和C++都有自己的標準協會,Java有Sun公司在維護,因此,這些語言的產生和發展,其實和PC平臺沒有太多關係。
最起碼,C就是為Unix而生的,而Unix一般是大中小型機的標準作業系統,Windows最開始提供的是Pascal格式的api,大家查查Win32API,很多很古老的函式介面,前面都要有PASCAL修飾,表示這個介面符合PASCAL標準。甚至,目前我們用的匈牙利命名法,其實是Pascal的命名法,發明者是個匈牙利人,應該是Windows api的主要制定者之一。
因此,大家可以想象,C和C++語言的基本庫,本來就不可能繫結任何一個平臺,一定只會利用各個平臺共有的特點來完成設計,而圖形系統,大家可以想象,各個平臺都不一樣,很難有個通用的庫,所以,真實的C語言裡面,其實是不帶圖形啊,聲音啊這類庫的,這些都是各個硬體、作業系統軟體開發商,自行提供的。
VC是個特例,VC準確的講,應該不是一門C和C++的教學型語言,它更像Windows平臺定製的一個實用性C和C++語言。因此,他天生就有對Windows的整合性,自然支援Win32API中關於GUI的圖形函式,因此,VC是可以繪圖的。只要你有一個視窗,就可以再視窗DC上繪圖。如果使用DirectX的話,甚至可以利用虛擬的表面,直接訪問視訊記憶體,實現高速繪圖,開發遊戲。
不過這裡還得倒回去說一點,最開始PC平臺使用DOS作業系統,是沒有C語言的,當時有家公司叫做Borland,看中這個市場,推出了TurboC系列語言,後來又發展到Borland C++系列,大家不要跟我說不知道啊,Delphi知道不?
當時DOS平臺一般都有圖形卡,但卡的型別很多,而DOS顯然又沒有Windows這樣,提供統一的api介面訪問,因此,需要進行圖形繪製的廠商,一般需要自己根據各個卡型開發自己的驅動程式,以前有段時間,臺灣的遊戲很流行,很多遊戲一上來就讓玩家選擇顯示卡,如EGA、VGA等等,就是在選擇驅動程式。
驅動程式其實不復雜,就是封裝各個圖形卡的差異性,對上提供統一的api介面供上層函式呼叫,驅動一般都是彙編和C語言開發的。目前有很多工作崗位,招嵌入式開發工程師,主要就是寫驅動。看見沒,嵌入式由於沒有Windows這個統一的介面,也需要寫驅動。
這裡就要誇誇比爾蓋茲了,他的Windows系統其實意義重大,不僅僅起到了圖形介面作業系統的用途,它實際上整合了PC平臺的驅動標準,各個硬體廠商以後只要給Windows寫驅動就好了,不需要針對每個應用分別寫驅動,如AutoCAD的驅動和遊戲的驅動顯然就不是一碼事,這樣硬體廠商節約很多人力,自然說好。
軟體廠商呢,只要針對Windows平臺開發,就自然而然支援所有符合Windows規範的硬體,也無需自己每種硬體都採購一套,分別寫驅動,這節約了大量的人力和無力,因此,Windows最成功的,我認為還不是這個圖形介面,它整合了驅動標準,為業界節約了大量的成本,這是它的成功之處,值得稱道。
好了,說了這麼多,再回到Borland,由於它做TurboC的時代,還是DOS作業系統,沒有Windows這麼方便,但是PC平臺的C語言,要是不支援圖形繪製,市場會大打折扣,大家不買啊,因此,他必須讓他的C語言支援圖形,但是,圖形卡有很多啊,因此,他就開發出自己的圖形驅動標準,叫做BGI,這是一種檔案格式,一般安裝一套TurboC,裡面會帶一堆這個檔案,就是針對各個不同顯示卡的驅動。
而上層的程式,使用graphics.h這個標頭檔案,呼叫標準BGI的api呼叫,即可實現圖形開發,至於針對各個不同的圖形卡,api中有查詢介面,告訴你選擇哪個BGI而已。
OK,問上面問題的同學們明白沒?
不過話說回來,DOS畢竟是淘汰的東東,目前已經是Windows的世界,最起碼Linux的市場都比DOS大,因此,建議同學們自學C語言,還是看看書的出版年代,問問題的同學顯然對著一本TurboC的書在看,這很麻煩,學出來的東西一來不好做實驗,二來也沒有市場,現在估計沒有哪家公司還在使用TurboC開發。建議大家還是從VC學起吧。
VC下大家就不用問了,Windows是圖形作業系統,一定有圖形函式的,查查Win32API函式庫,看看MFC,都能找到一堆。
這裡簡單提示幾點:
1、Windows下,一切都是視窗,我們看到的一個軟體介面,如VC,如IE,是無數個視窗構成的,甚至Dialog上每個按鈕,都是視窗。
2、Windows下,只要是視窗,就一定有控制程式碼,Handle,這是每個視窗的靈魂,任何針對視窗的操作,幾乎都是從Handle開始的。
3、一般說來,視窗分兩類,可顯示的和不可顯示的,大多數是可顯示的。只要可顯示,就可以利用GetWindowDC,從Handle獲得DC。
4、DC到手,天下我有。呵呵,拿到DC,大家就想怎麼畫就怎麼畫了。可以設定畫筆,刷子,字型,可以用畫點,畫線的函式,可以填充,裁剪,等等,GUI圖形雖然效率偏低,做高速遊戲動畫可能不夠,不過,就大家目前做的圖形試驗,寫個物理教學題材的軟體,做個化學實驗軟體等等,足夠了。
OK,大家還有問題嗎?