Tc 圖形庫graphics.h的函數庫及用法(一)

Tc 圖形庫graphics.h的函數庫及用法(一)

圖形函數


    Turbo C提供了非常豐富的圖形函數, 所有圖形函數的原型均在graphics. h
中, 本節主要介紹圖形模式的初始化、獨立圖形程序的建立、基本圖形功能、圖
形窗口以及圖形模式下的文本輸出等函數。另外, 使用圖形函數時要確保有顯示
器圖形驅動程序*BGI, 同時將集成開發環境Options/Linker中的Graphics lib選
爲on, 只有這樣才能保證正確使用圖形函數。
    1. 圖形模式的初始化
    不同的顯示器適配器有不同的圖形分辨率。即是同一顯示器適配器, 在不同
模式下也有不同分辨率。因此, 在屏幕作圖之前, 必須根據顯示器適配器種類將
顯示器設置成爲某種圖形模式, 在未設置圖形模式之前, 微機系統默認屏幕爲文
本模式(80列, 25行字符模式), 此時所有圖形函數均不能工作。設置屏幕爲圖形
模式, 可用下列圖形初始化函數:
     void far initgraph(int far *gdriver, int far *gmode, char *path);
    其中gdriver和gmode分別表示圖形驅動器和模式, path是指圖形驅動程序所
在的目錄路徑。有關圖形驅動器、圖形模式的符號常數及對應的分辨率見表2。
    圖形驅動程序由Turbo C出版商提供, 文件擴展名爲.BGI。根據不同的圖形
適配器有不同的圖形驅動程序。例如對於EGA、 VGA 圖形適配器就調用驅動程序
EGAVGA.BGI。

               表2. 圖形驅動器、模式的符號常數及數值
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
     圖形驅動器(gdriver)           圖形模式(gmode)
   ───────────      ───────────     色調   分辨率
    符號常數     數值            符號常數      數值
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    CGA           1             CGAC0            0           C0    320*200
                              CGAC1            1           C1    320*200
                              CGAC2            2           C2    320*200
                              CGAC3            3           C3    320*200
                              CGAHI            4           2色   640*200
───────────────────────────────────
    MCGA          2             MCGAC0           0           C0    320*200
                              MCGAC1           1           C1    320*200
                              MCGAC2           2           C2    320*200
                              MCGAC3           3           C3    320*200
                              MCGAMED          4           2色   640*200
                              MCGAHI           5           2色   640*480
───────────────────────────────────
    EGA           3             EGALO            0          16色   640*200
                              EGAHI            1          16色   640*350
───────────────────────────────────
    EGA64         4             EGA64LO          0          16色   640*200
                              EGA64HI          1           4色   640*350
───────────────────────────────────
    EGAMON        5             EGAMONHI         0           2色   640*350
───────────────────────────────────
    IBM8514       6             IBM8514LO        0         256色   640*480
                              IBM8514HI        1         256色 1024*768
───────────────────────────────────
    HERC          7             HERCMONOHI       0           2色   720*348
───────────────────────────────────
    ATT400        8             ATT400C0         0           C0    320*200
                              ATT400C1         1           C1    320*200
                              ATT400C2         2           C2    320*200
                              ATT400C3         3           C3    320*200
                              ATT400MED        4           2色   320*200
                              ATT400HI         5           2色   320*200
───────────────────────────────────
    VGA           9             VGALO            0          16色   640*200
                              VGAMED           1          16色   640*350
                              VGAHI            2          16色   640*480
───────────────────────────────────
    PC3270        10            PC3270HI         0           2色   720*350
───────────────────────────────────
    DETECT        0             用於硬件測試
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

    例4. 使用圖形初始化函數設置VGA高分辨率圖形模式
     #include <graphics.h>
     int main()
     {
          int gdriver, gmode;
          gdriver=VGA;
          gmode=VGAHI;
          initgraph(&gdriver, &gmode, "c:\\tc");
          bar3d(100, 100, 300, 250, 50, 1);        /*畫一長方體*/
          getch();
          closegraph();
          return 0;
     }

    有時編程者並不知道所用的圖形顯示器適配器種類, 或者需要將編寫的程序
用於不同圖形驅動器, Turbo C提供了一個自動檢測顯示器硬件的函數,   其調用
格式爲:
     void far detectgraph(int *gdriver, *gmode);
    其中gdriver和gmode的意義與上面相同。

    例5. 自動進行硬件測試後進行圖形初始化
     #include <graphics.h>
     int main()
     {
          int gdriver, gmode;
          detectgraph(&gdriver, &gmode);      /*自動測試硬件*/
          printf("the graphics driver is %d, mode is %d\n", gdriver,
                 gmode);        /*輸出測試結果*/
          getch();
          initgraph(&gdriver, &gmode, "c:\\tc");
                               /* 根據測試結果初始化圖形*/
          bar3d(10, 10, 130, 250, 20, 1);
          getch();
          closegraph();
          return 0;
      }

    上例程序中先對圖形顯示器自動檢測, 然後再用圖形初始化函數進行初始化
設置, 但Turbo C提供了一種更簡單的方法,   即用gdriver= DETECT 語句後再跟
initgraph()函數就行了。採用這種方法後, 上例可改爲:

    例6.
     #include <graphics.h>
     int main()
     {
          int gdriver=DETECT, gmode;
          initgraph(&gdriver, &gmode, "c:\\tc");
          bar3d(50, 50, 150, 30, 1);
          getch();
          closegraph();
          return 0;
     }
    另外, Turbo C提供了退出圖形狀態的函數closegraph(), 其調用格式爲:
     void far closegraph(void);
    調用該函數後可退出圖形狀態而進入文本方式(Turbo C 默認方式), 並釋放
用於保存圖形驅動程序和字體的系統內存。

    2. 獨立圖形運行程序的建立
    Turbo C對於用initgraph()函數直接進行的圖形初始化程序, 在編譯和鏈接
時並沒有將相應的驅動程序(*.BGI)裝入到執行程序, 當程序進行到intitgraph()
語句時, 再從該函數中第三個形式參數char *path中所規定的路徑中去找相應的
驅動程序。若沒有驅動程序, 則在C:\TC中去找, 如C:\TC中仍沒有或TC不存在,
將會出現錯誤:
     BGI Error: Graphics not initialized (use 'initgraph')
    因此, 爲了使用方便, 應該建立一個不需要驅動程序就能獨立運行的可執行
圖形程序,Turbo C中規定用下述步驟(這裏以EGA、VGA顯示器爲例):
    1. 在C:\TC子目錄下輸入命令:BGIOBJ EGAVGA
    此命令將驅動程序EGAVGA.BGI轉換成EGAVGA.OBJ的目標文件。
    2. 在C:\TC子目錄下輸入命令:TLIB LIB\GRAPHICS.LIB+EGAVGA
    此命令的意思是將EGAVGA.OBJ的目標模塊裝到GRAPHICS.LIB庫文件中。
    3. 在程序中initgraph()函數調用之前加上一句:
       registerbgidriver(EGAVGA_driver):
該函數告訴連接程序在連接時把EGAVGA的驅動程序裝入到用戶的執行程序中。
    經過上面處理,編譯鏈接後的執行程序可在任何目錄或其它兼容機上運行。
假設已作了前兩個步驟,若再向例6中加 registerbgidriver()函數則變成:
    例7:
     #include<stdio.h>
     #include<graphics.h>
     int main()
     {
         int gdriver=DETECT,gmode;
         registerbgidriver(EGAVGA_driver):   / *建立獨立圖形運行程序 */
         initgraph( gdriver, gmode,"c:\\tc");
         bar3d(50,50,250,150,20,1);
         getch();
         closegraph();
         return 0;
     }
    上例編譯鏈接後產生的執行程序可獨立運行。
    如不初始化成EGA或CGA分辨率, 而想初始化爲CGA分辨率,   則只需要將上述
步驟中有EGAVGA的地方用CGA代替即可。

3.屏幕顏色的設置和清屏函數
    對於圖形模式的屏幕顏色設置, 同樣分爲背景色的設置和前景色的設置。在
Turbo C中分別用下面兩個函數。
    設置背景色:         void far setbkcolor( int color);
    設置作圖色:         void far setcolor(int color);
    其中color 爲圖形方式下顏色的規定數值, 對EGA, VGA顯示器適配器, 有關
顏色的符號常數及數值見下表所示。
                表3 有關屏幕顏色的符號常數表
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  符號常數       數值      含義            符號常數       數值      含義
───────────────────────────────────
  BLACK           0        黑色            DARKGRAY        8        深灰
  BLUE            1        蘭色            LIGHTBLUE       9        深蘭
  GREEN           2        綠色            LIGHTGREEN      10       淡綠
  CYAN            3        青色            LIGHTCYAN       11       淡青
  RED             4        紅色            LIGHTRED        12       淡紅
  MAGENTA         5        洋紅            LIGHTMAGENTA    13       淡洋紅
  BROWN           6        棕色            YELLOW          14       黃色
  LIGHTGRAY       7        淡灰            WHITE           15       白色
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    對於CGA適配器, 背景色可以爲表3中16種顏色的一種, 但前景色依賴於不同
的調色板。共有四種調色板, 每種調色板上有四種顏色可供選擇。不同調色板所
對應的原色見表4。
               表4 CGA調色板與顏色值表
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
       調色板                                顏色值
───────────        ──────────────────
  符號常數     數值               0          1          2          3
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
      C0        0                背景        綠         紅         黃
      C1        1                背景        青        洋紅        白
      C2        2                背景       淡綠       淡紅        黃
      C3        3                背景       淡青      淡洋紅       白
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

    清除圖形屏幕內容使用清屏函數, 其調用格式如下:
     voide far cleardevice(void);
    有關顏色設置、清屏函數的使用請看例8。
    例8:
     #include<stdio.h>
     #include<graphics.h>
     int main()
     {
          int gdriver, gmode, i;
          gdriver=DETECT;
          registerbgidriver(EGAVGA_DRIVER);/*建立獨立圖形運行程序*/
          initgraph(&gdriver, &gmode", "");/*圖形初始化*/
          setbkcolor(0);                    /*設置圖形背景*/
          cleardevice();
          for(i=0; i<=15; i++)
          {
            setcolor(i);                    /*設置不同作圖色*/
            circle(320, 240, 20+i*10);      /*畫半徑不同的圓*/
            delay(100);                     /*延遲100毫秒*/
          }
          for(i=0; i<=15; i++)
          {
             setbkcolor(i);                 /*設置不同背景色*/
             cleardevice();
             circle(320, 240, 20+i*10);
             delay(100);
          }
          closegraph();
          return 0;
     }

    另外, TURBO C也提供了幾個獲得現行顏色設置情況的函數。
    int far getbkcolor(void);       返回現行背景顏色值。
    int far getcolor(void);         返回現行作圖顏色值。
    int far getmaxcolor(void);      返回最高可用的顏色值


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章