老是被同學們問一些關於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,大家還有問題嗎?