[轉]C語言圖形編程(二) -圖形顯示

一、確定顯示卡
二、選擇顯示模式  

三、圖形顯示
    20. detectgraph() 顯示卡檢測函數
    21. initgraph() 圖形初始化函數
    22. getdrivername() 獲取圖形驅動程序名的指針
    23. getgraphmode() 獲取圖形模式函數
    24. getmoderange()獲取模式值範圍函數
    25. getmaxmode()獲取最大顯示模式函數
    26. getmodename()獲取顯示模式名函數
    27. graphdefaults()圖形設置復位缺省值函數
    28. setgraphmode() 設置圖形模式函數
    29. restorecrtmode() 恢復文本顯示模式函數
    30. graphresult() 圖形操作結果函數
    31. grpaherrormsg() 圖形錯誤信息函數
    32. setgraphbufsize()設置圖形緩衝區大小函數
    33. setactivepage() 設置可輸出顯示頁函數
    34. setvisualpage() 設置可見顯示頁數
    35. closegraph()關閉圖形模式函數

   





一、確定顯示卡
  
微機系統顯示部分由顯示器(monitor)和顯示卡(adapter)兩部分組成。顯示器是獨立於主機的一種外部設備,顯示卡或稱顯示適配卡,也有的稱圖形卡,是插在主機上的一塊電路板。但也有的顯示卡與主機板設計在一起。顯示卡包括寄存器組、存儲器和控制電路三大部分。其中存儲器又包括顯示RAM和ROM BIOS兩部分,微機對顯示屏幕的所有操作都是通過顯示卡來實現的。因此要進行圖形顯示 ,首先要確定計算機上安裝的是何種顯示卡。一種方法是詢問計算機或終端使用者,確定將要使用的顯示卡類型。這種方法很難,因爲甚至專業程序員也不總是能確定他正在使用什麼樣的硬件。另一種方法是用軟件查詢硬件以識別當前的配置。如果有一些識別硬件的標準,這就很簡單了。在Borland C中對現在所使用的各種顯示卡提供了支持,這隻要調用detectgraph()函數就可以了,該函數爲程序員確定計算機上使用的顯示卡類型。

二、選擇顯示模式
   顯示模式是指顯示卡支持的分辨率與相應的顏色配置。每臺計算機都配置了某種類型顯示卡,可以爲該顯示卡指定顯示模式。

三、圖形顯示
    進行圖形顯示首先要確定顯示卡,然後選擇其顯示模式。這些工作都可以調用圖形功能函數來完成,其實就是把適合於顯示卡的圖形驅動程序裝入內存。如果圖形驅動程序未裝入內存,那麼圖形函數就不能操作。

20. detectgraph() 顯示卡檢測函數
功能: 函數detectgraph()在計算機上安裝有顯示卡的情況下,測定其顯示卡的類型。
用法: 此函數調用方式爲void detectgraph(int *driver,int *mode);
說明: 函數把driver所指向的整型變量設置爲圖形驅動程序的代碼,把mode所指向的整型變量設置爲顯示卡支持的最高有效模式(即該顯示卡能支持的最高分辨率)。
   該函數相應的頭文件爲graphics.h
返回值: 返回適合於該顯示卡的圖形驅動程序的代碼(也稱等價值),並存放在driver指向的變量中。若計算機系統中無圖形硬件,則由driver指向的變量設置爲-2。
例: 檢測計算機是否裝有顯示卡:
   int driver,mode;
   detectgraph(&driver,&mode);
   if(driver==-2)
   {
      printf("no graphics adapter in the computer");
      exit(1);
   }

21. initgraph() 圖形初始化函數
功能: 函數initgraph()用於初始化圖形系統,把適合的圖形驅動程序裝入內存,設置圖形函數所用的顯示模式。
用法: 該函數調用方式爲void initgraph(int *driver,int *mode,char *path);
說明: 1) 函數中參數driver指向圖形驅動程序(或者等價值)。
   在頭部文件graphics.h中定義了圖形驅動程序的宏名與其等價 ,如下:
宏   名              等價值
------------------------------
DETECT                  0
CGA                     1
MCGA                    2
EGA                     3
EGA64                   4
EGAMONO                 5
IBM8514                 6
HERCMONO                7
ATT400                  8
VGA                     9
PC3270                 10
--------------------------------

注:在現在的計算機中,上表中的許多顯示卡已經過時,不再使用。

這樣就不必擔心圖形驅動程序的準確名字,而只要用其等價值即可,若使用detect(即等價值0)時,initgraph()函數自動檢測當前計算機中裝有的顯示卡類型,並且選用最大分辨率的顯示模式。
2)參數mode指向顯示模式或用等價值(風表1-5),mode所指的值必須是有效模式之一。
3)參數path指向圖形驅動程序所在的路徑,例如path="C:/TC/BG1".若沒有指定路徑,就在當前目錄下尋找。
   一般圖形驅動程序包含在.BGI文件中,這些文件是系統可以得到的。這個函數對應的頭文件是graphics.h。
返回值: 無
例: 調用initgraph()自動檢測硬件圖形系統,並選用最大分辨率顯示模式。
   init drver,mode;
   driver=DETECT;
   mode=0;
   initgraph(&driver,&mode,"");

22. getdrivername() 獲取圖形驅動程序名的指針
功能: 函數getdrivername()返回指向當前圖形驅動程序名的指針。
用法: 此函數調用方式爲char *getdrivername(void);
說明: 本函數可以用來檢測顯示卡,但只能在initgraph()設置圖形驅動程序和顯示模式之後調用。
   該函數相應的頭文件爲graphics.h
返回值: 返回一指針,指向含有當前圖形驅動程序名的字符串。
例: 顯示當前圖形驅動程序名:
   #include<graphics.h>
   #include<stdio.h>
   void main()
   {
      int graphdriver=DETECT,graphmode;
      char *s;
      initgraph(&graphdriver,&graphmode,"");
      s=getdrivername();
      outtext("Using driver:");
      outtext(s);
      getch();
      closegraph();
   }

23. getgraphmode() 獲取圖形模式函數
功能: 函數getgrapgmode()返回當前圖形模式。
用法: 該函數調用方式爲int getgraphmode(void);
說明: getgraphmode()函數無參數調用。
      這個函數對應的頭文件是graphics.h
返回值: 返回initgraph()或setgraphmode()所設置的當前圖形模式值。
例: 顯示當前圖形模式的代碼:
   printf("graphics mode is %d",getgraphmode());

24. getmoderange()獲取模式值範圍函數
功能: 函數getmoderange()返回指定的圖形驅動程序能夠支持的最低和最高模式值。
用法: 函數調用方式爲 void getmoderange(int driver,int *lowmode,int himode);
說明: 參數driver是用來調用此函數時,指定圖形驅動程序等價值或宏名。
       其有效值如下:
   -------------------------------------
      宏  名               等價值
   -------------------------------------    
      DETECT                  0
      CGA                     1
      MCGA                    2
      EGA                     3
      EGA64                   4
      EGAMONO                 5
      IBM8514                 6
      HERCMONO                7
      ATT400                  8
      VGA                     9
      PC3270                 10
   -------------------------------------
  注:上表中的許多顯示卡在現在的計算機上已經過時,僅作參考。

   該函數想應的頭文件爲graphics.h
返回值: 返回的最小和最大有效值存放在參數指針lowmode和himode分別指向的整型變量中。
例: 顯示當前圖形硬件的顯示模式的範圍值:
   #include"graphics.h"
   void main()
   {
      int driver,mode;
      int low,high;
      mode=0;
     initgraph(&driver,&mode,"");
      getmoderange(driver,&low,&high);
      printf("mode range:%d--%d,low,high);
      getch();
      restorecrtmode();
   }

25. getmaxmode()獲取最大顯示模式函數
功能: 函數getmaxmode()返回當前加載的圖形驅動程序所支持的最大有效顯示模式。
用法: 函數調用方式爲int getmaxmode(void);
說明:本函數無參數調用,返回圖形驅動程序所支持的最大顯示模式,所有圖形驅動程序支持從0到getmaxmode()函數返回值中的任一整 數值(對應的顯示模式)。
   這個函數對應的頭文件是graphics.h
返回值:返回圖形驅動程序所支持的顯示模式最大值。
例: 顯示當前最大顯示模式:
   printf("The maxmode of this driver is %d/n",getmaxmode());

26. getmodename()獲取顯示模式名函數
功能: 函數getmodename()可獲取當前圖形驅動程序支持的指定顯示模式的名字。
用法: 此函數調用方式爲char *getmodename(int modecode);
說明: 參數modecode爲整型值。用以指定一顯示模式值調用該函數。
   這個函數對應的頭文件graphics.h
返回值:  返回指定模式值的顯示模式名。
例: 顯示當前最大顯示模式名:
#include<graphics.h>
#include<stdio.h>
void main()
{
   int graphdriver=DETECT,graphmode;
   int modecode;
   char *s;
   initgraph(&graphdriver,&graphmode,"");
   modecode=getmaxmode();
   s=getmodename(modecode);
   outtext("The maxmode name is:");
   outtext(s);
   getch();
   closegraph();
}

27. graphdefaults()圖形設置復位缺省值函數
功能: 函數grpahdefaults()把所有圖形設置復位爲它們的缺省值,這包括把圖形視口復位爲全屏幕;當前位置定位在0,0;調色板、背景色和繪圖色都被複位;填充顏色、填 充圖樣、文本文字和排齊方式都返回到它位的缺省值。
用法: 此函數調用方式爲void graphdefaults(void);
說明: 該函數無參數調用。
      這個函數相應的頭文件爲graphics.h
返回值: 無
例: 將圖形系統恢復爲其缺省值:
   graphdefaults();

28. setgraphmode() 設置圖形模式函數
   功能: 函數setgraphmode()用當前圖形驅動程序有效的圖形模式調用,一旦被調用,setgraphmode()選擇一個新的圖形模式。注意,圖形顯示模式必須事先由initgraph()初始化。
用法: 該函數調用方式爲void setgraphmode(int mode);
說明: 參數mode調用時爲指定的模式值。
      此函數相應的頭部文件是graphics.h
返回值: 無
例: 把VGA圖形卡設置爲VGAMED模式:
   setgraphmode(VGAMED);        // 圖形系統已經初始化

29. restorecrtmode() 恢復文本顯示模式函數
功能: 函數restrecrtmode()將顯示模式恢復到調用initgraph()時檢測出的初始文本模式。
用法: 這個函數調用方式爲void restorecrtmode(void);
說明: 函數restorecrtmode()和setgraphmode()函數一起使用,可以實現文本與圖形顯示之間的切換。
      此函數對應的頭文件爲graphics.h
返回值: 無
例: 恢復顯示模式爲初始文本模式:
   restorecrtmode();

30. graphresult() 圖形操作結果函數
功能: 函數graphresult()函數返回最後一次圖形操作的代碼。
用法: 此函數調用方式爲int graphresult(void);
說明: C爲圖形設置了代碼,它們是從-15到0的整數值。其含義見表1-6。
      調用該函數時,出錯狀態被複位爲0,所以返回值(代碼)最好存於變量中,以供需要時檢測,
      進行下一步圖形操作。
     
   圖形操作信息名稱 代碼 含   義
   grOK
   grNoInitGraph
   grNoDetected
   grFileNoFound
   grInvalidDriver
   grNoLoadMem
   grNoScanMem
   grNoFloadMem
   grFontNotFound
   grNoFontMem
   grInvalidMode
   grError
   grIOerror
   grInvalidFont
   grInvalidDeviceNum
0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-11
-12
-13
-14
-15
成功
沒有圖形初始化
沒有檢測到圖形硬件
沒有找到圖形驅動文件
無效圖形驅動程序
沒有足夠內存裝入圖形驅動程序
Scan填 充內存不足
Flood填 充內存不足
沒有找到字體文件
沒有足夠內存用於裝字體文件
無效圖形模式
一般圖形錯誤
輸入輸出錯誤
無效字體文件
無效字體號
無效設備號

這個函數對應的頭部文件是graphics.h
返回值: 返回最後一次圖形操作結果相應的代碼。
例: 調用graphresult()函數的實例見下面grapherrormsg()函數的例子。

31. grpaherrormsg() 圖形錯誤信息函數
功能: 函數grapherrormsg()返回指向出錯代碼相應的錯誤信息字符串的指針。
用法: 此函數調用方式爲char *grapherrormsg(int errcode);
說明: 參數errcode值,即出錯代碼由調用函數graphresult()獲得。這裏所有出錯代碼及相應的錯誤信息如表1-6中所述。
      該函數相應的頭文件是grpahics.h
返回值: 返回一個指向該出錯代碼相應的錯誤信息字符串的指針。
例: 用文字形式顯示有關出錯代碼相應的錯誤信息:
   int errorcode;
   errorcode=graphresult();
   printf(%s",grapherrormsg(errcode));

32. setgraphbufsize()設置圖形緩衝區大小函數
功能: 函數setgraphbufsize()用來設置有的圖形函數(如floodfill等)所要用到的內存緩衝區大小。
用法: 函數調用方式爲unsigned setgraphbufsize(unsigned bufsize);
說明: 這裏無符號參數bufsize爲所設置的緩衝區大小。
      一般不需要用到該函數,僅使用由initgraph()函數產生的內存緩衝區就夠了,緩衝區大小缺省時爲4KB(即4096個字節),足以用來填 充一個大約有650個頂點的多邊形,但是爲了節省內存,用戶可以減少緩衝區的大小,或者由於需要更多的緩衝區內存,這時可用函數setgraphbufsize()來增加緩衝區大小。注意,使用setgraphbufsize()函數必須在調用initgraph()之前。
返回值: 返回先前定義的圖形緩衝區字節數。
例: 調用此函數設置圖形緩衝區爲8KB字節:
   setgraphbufsize(0x2000);

33. setactivepage() 設置可輸出顯示頁函數
功能: 函數setactiveage()設置用作圖形輸出的顯示頁。
用法: 這個函數調用方式爲void setactivepage(int pagenum);
說明: 參數pagenum爲選擇的顯示頁號,如果調用成功,那麼後續圖形輸出就寫到選定的輸出頁上。缺省時是以0頁作爲當前輸出頁。該函數只在圖形驅動程序及其顯示模式支持多個顯示頁時才起作用。
      此函數相應的頭文件爲graphics.h
返回值: 無
例: 設置1頁爲輸出顯示頁:
   setactivepage(1);

34. setvisualpage() 設置可見顯示頁數
功能: 函數setvisualpage()設置屏幕上可見的顯示頁。
用法: 函數調用方式爲void setvisualpage(int pagenum);
說明: 參數pagenum爲設置的顯示頁號。缺省時是以0頁作爲當前可見頁。調用這個函數和調用setactivepage()一樣,僅在圖形驅動程序及其顯示模式支持多個顯示頁時纔有效。用戶可以用系統所支持的任何顯示頁,在它們之間切換,當然一次只能有一個顯示頁在屏幕上可見,有時需要在一頁上建立後備圖形葨圖像,它在當時不顯示,一旦需要時,可以馬上切換到該頁,如要實現動畫效果,只需切換顯示頁號即可。用setvisualpage()函數選 定實際顯示在屏幕上的可見頁,用setactivepage()函數選擇當前圖形輸出頁,從而實現圖形頁之間的顯示切換,通常這兩個函數都是缺省的,這時輸出頁就是可見頁。若不繪製動畫就不需要用到這兩個函數。
      這兩個函數對應的頭文件是graphics.h
返回值: 無
例: 設置可見頁爲第1頁:
   setvisualpage(1);

35. closegraph()關閉圖形模式函數
功能: 函數closegraph()將系統圖形模式關閉,,復位到initgraph()初始文本模式,並且釋放圖形驅動程序、字體和內部緩衝區所佔用的系統內存。
用法: 這個函數調用方式爲void closegraph(void);
說明: 當用戶的程序既用到圖形輸出又用到非圖形輸出時,應該調用此函數。特別是程序多次調用initgraph()函數的情況,要相應地調用closegraph函數,釋放調用initgraph()所佔用的內存,否則內存很快就滿了,程序無法運行,如果程序結束,也可以用restorecrtmode()函數代替該函數,這樣任何分配的內存都將釋放。
      此函數對應的頭文件是graphics.h
返回值: 無
例: 關閉圖形系統:
   closegraph();
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章