三级黄色在线视频中文,国产精品一二三区,在线观看三级,成人午夜久久,日韩国产一区二区,韩日免费av,日韩成人一级

C語言實(shí)現(xiàn)可視化人機(jī)界面的有效方法

來源:萬方數(shù)據(jù)

點(diǎn)擊:1911

A+ A-

所屬頻道:新聞中心

關(guān)鍵詞:C語言 人機(jī)界面 圖形函數(shù)庫

    引言

        C語言中要實(shí)現(xiàn)可視化人機(jī)界面, 就必須要繪制圖像, 而printf( )函數(shù)只能用來輸出文本, 顯然不能滿足繪圖的要求。但是, C語言標(biāo)準(zhǔn)函數(shù)庫提供了一個(gè)較為強(qiáng)大的圖形函數(shù)庫,所有圖形函數(shù)都在頭文件graph程序包括了Graphics. h 頭文件以后, 所有圖形函數(shù)的使用都必須在圖形模式下進(jìn)行。而默認(rèn)模式都是文本模式, 在這種模式下所有圖形函數(shù)都是無法正常工作的。所以必須先使用一個(gè)圖形模式初始化函數(shù)將計(jì)算機(jī)設(shè)置為圖形模式。本文利用這些圖形函數(shù)提出了實(shí)現(xiàn)可視化人機(jī)界面的有效方法。

    1 設(shè)置圖形模式

        要使用C語言繪制圖形通常首先要提供一個(gè)graphics. h 頭文件, 它包含了大量的圖形繪制函數(shù)。無法立即使用這些函數(shù), 必須首先設(shè)置屏幕為圖形模式。要將原來屏幕默認(rèn)的文本模式(80列, 25 行字符模式) 設(shè)置為圖形模式, 必須對顯示卡進(jìn)行操作。顯示卡實(shí)際上就是顯示適配器的通稱, 不同的顯示適配器有著不同的色彩種數(shù)和圖形分辨率。因此, 在使用圖形函數(shù)作圖之前, 必須使用一個(gè)Graphics. h圖形函數(shù)庫提供的初始化圖形模式的initgraph( )函數(shù)根據(jù)顯示適配器種類設(shè)置成為某種確定的圖形模式。

        另外, 盡管在程序最開始加了# include , 但如果在初始化圖形語句中沒有將驅(qū)動(dòng)程序的路徑寫對, 會導(dǎo)致程序無法找到圖形驅(qū)動(dòng)文件, 從而無法在圖形模式下進(jìn)行工作。在屏幕上總是出現(xiàn)如下出錯(cuò)信息:

        BGI Error: Graphics not initialized( use initag raph)下面給出一個(gè)最簡化的初始化圖形模式的例程以清楚地說明問題:

        # include

        / * 聲明標(biāo)準(zhǔn)圖形函數(shù)頭文件* /

        int main( )

        {

        int g driver , gmode; / * 定義圖形驅(qū)動(dòng)器變量* /

        gdriver= DETECT ; / * 設(shè)定圖形驅(qū)動(dòng)器為自動(dòng)監(jiān)測* /

        initgraph( & gdriver, & gmode,c: \ tc) ;

        / * 初始化圖形模式* /

        line( 100, 100, 200, 200) ; / * 畫線* /

        getch( ) ;

        clo seg raph( ) ; / * 關(guān)閉圖形模式* /

        return 0;

        }

        程序的幾點(diǎn)說明:

        (1) 對于gdriver, 是原本要求設(shè)置所希望的并且計(jì)算機(jī)提供的圖形驅(qū)動(dòng)器, 而gmode 則是對應(yīng)于這種驅(qū)動(dòng)器的使用模式。將gdriver 設(shè)置為DETECT, 讓硬件自動(dòng)監(jiān)測圖形驅(qū)動(dòng)器和模式, 這將非常省力。

        (2) 如果發(fā)現(xiàn)bg i 文件在c: \ tc 目錄下, 而當(dāng)前目錄在c: \ \ 下, path 可以使用絕對路徑, 如: c: \ \ tc; 也可以使用相對路徑, 如: \ \ tc。

        (3)一旦初始化了圖形模式便可以作圖了, 在程序中l(wèi)ine ( 100, 100, 200, 200) 語句就是在圖形模式下畫一條從點(diǎn)( 100, 100) 到點(diǎn)( 200, 200) 的直線。(4) 使用closeg raph( ) 函數(shù)來退出圖形狀態(tài)回到默認(rèn)的文本狀態(tài)。

    2 在圖形模式下寫字

        在圖形模式下, 仍然可以使用標(biāo)準(zhǔn)輸出printf( ) ,put s( ) , putchar ( ) 將文本輸出到屏幕。不過C 語言圖形函數(shù)提供了一些專門用于在圖形顯示模式下的文本輸出函數(shù)out tex txy ( ) 等。

        還可以利用setcolor( ) 函數(shù)設(shè)置輸出文字的顏色。用戶還可以對文本字符大小進(jìn)行設(shè)置, 具體實(shí)現(xiàn)方法有如下兩個(gè)函數(shù):

        sett ex tsty le( ) / * 水平和垂直方向以相同倍數(shù)放大* /

        setusercharsize( ) / * 分別定義水平和垂直放大倍數(shù)* /

    3 獨(dú)立圖形程序的建立

        當(dāng)在圖形模式下寫好程序, 然后放在別的用戶的計(jì)算機(jī)中卻發(fā)現(xiàn)對方根本無法使用。這是因?yàn)樵谠O(shè)置圖形模式的時(shí)候, 要求有對應(yīng)的BGI 文件( 對于用init graph( ) 函數(shù)直接進(jìn)行圖形初始化程序, 在編譯和連接時(shí)并沒有將相應(yīng)的驅(qū)動(dòng)程序* . bgi 裝入到執(zhí)行程序) 。而將軟件復(fù)制給用戶的時(shí)候并沒有將BGI 文件復(fù)制給用戶, 于是用戶根本無法進(jìn)入圖形模式( 當(dāng)程序進(jìn)行到initgraph( ) 語句時(shí), 從該函數(shù)中第三個(gè)形式參數(shù)char* path 所規(guī)定的路徑中去找相應(yīng)的驅(qū)動(dòng)程序, 若沒有,將出現(xiàn)錯(cuò)誤:

        BGI Eorro: Gra phics not initialize ( useinitgraph) )即便將所有* . bgi 文件復(fù)制給用戶, 還是可能存在一個(gè)路徑錯(cuò)誤問題。

        因此只能將BGI 文件( 圖形驅(qū)動(dòng)程序) 也一起裝到程序中, 這樣問題就解決了。這里提供了建立一個(gè)不需要驅(qū)動(dòng)程序就能獨(dú)立運(yùn)行的可執(zhí)行圖形程序的方法, 以下是具體步驟( 這里以VGA EGA 顯示器為例) :

        (1) 在C 語言編譯器目錄下輸入命令:

        BGIOBJ EGAVGA

        BGIOBJ 命令將驅(qū)動(dòng)程序EGAVGA. BGI 轉(zhuǎn)化成EGAVGA. OBJ 的目標(biāo)文件。

        (2) 在C 語言編譯器目錄下輸入命令:

        TLIBLIB\ GRAPHICS. LIB+ EGAVGATLIB 命令的意思是將EGABGA. OBJ 的目標(biāo)模塊裝到GRAPHICS. LIB 庫文件中。

        (3) 在程序中調(diào)用initgraph( ) 函數(shù)之前加上一句:

        registerbg idriver( EGAVGA_driver) ;

        該函數(shù)告訴連接程序在連接時(shí)把EGAVGA 的驅(qū)動(dòng)程序裝入到GRA PHICS. LIB 庫文件中。

    4 實(shí)現(xiàn)動(dòng)畫思路

        為了達(dá)到動(dòng)態(tài)顯示由下位機(jī)傳送過來的信息, 就必須使用動(dòng)畫技術(shù)。動(dòng)畫片的原理是將一幅一幅的圖片排列起來, 至少以24 幅/ s 的速度連續(xù)播放, 這樣以來騙過了人們遲鈍的眼睛, 使人們誤以為看到的一切在運(yùn)動(dòng), 而忘記了這一切都只是靜止圖片組成的。

        這一思路對做電腦動(dòng)畫非常有幫助, 很容易讓人聯(lián)想到將屏幕作為一張圖片, 每次對屏幕這樣的圖片進(jìn)行重新繪制。具體思路如下:

        (1) 在屏幕上畫一個(gè)將要運(yùn)動(dòng)的圖像;

        (2) 停留一些時(shí)間( 事實(shí)上非常短, 很可能只有幾十到幾百毫秒) ;

        (3) 清除屏幕( 或者是屏幕的局部);

        (4) 在剛才被清除的地方相近處( 固定增量) 重新畫一個(gè)圖像;

        (5) 重復(fù)步驟(2) ~ (4) 。

    5 簡單動(dòng)畫實(shí)現(xiàn)

        邏輯運(yùn)算中的異或指A 與B 的非同B 與A 的非進(jìn)行或操作的結(jié)果。異或邏輯運(yùn)算有一個(gè)特點(diǎn), 如果A 和B 是相同的, 那么結(jié)果一定為0( 1 異或1= 1* 0+0* 1= 0+ 0= 0) ?;蛘哒f, 自身異或等于沒有進(jìn)行任何操作。異或與圖形繪制有一定的關(guān)系。

        如果在一個(gè)位置畫了一條紅色的線, 然后在這個(gè)位置再畫一次結(jié)果是紅線還在那里, 沒有變化??墒侨绻诋嫷谝粭l線之前就設(shè)置用異或方式畫線, 那么當(dāng)畫第二條線的時(shí)候奇跡便發(fā)生了屏幕上的那條紅線消失了。實(shí)現(xiàn)清單如下:

        # include

        # include < stdio.h>

        # include < stdlib.h>

        # include < conio.h>

        int main( void) {

        int gdriver= DETECT , gmode;

        initgraph( & gdriver, & gmode, ) ; / / 初始化圖形模式

        setwritemode( XOR_PUT) ; / / 設(shè)置異或模式

        setcolor( RED) ; / / 設(shè)置前景顏色為紅色

        line( 100, 200, 500, 200) ; / / 畫紅線

        getch( ) ;

        closeg raph( ) ; / / 關(guān)閉圖形模式, 恢復(fù)到文本模式

        return 0;

        }

        在要進(jìn)行異或操作之前, 使用了一個(gè)設(shè)置異或模式的函數(shù)setwritemode( ) 。異或可以幫助我們用最簡單的方法二次完全重畫方法擦除原先的圖形。那么如何將它和動(dòng)畫聯(lián)系起來呢?

        提出的異或思路如下:

        (1)設(shè)置異或模式, 然后在屏幕上畫一個(gè)圓和一個(gè)正方形;

        (2)停留一些時(shí)間;

        (3)在剛才畫圓的位置用同樣的顏色再畫一個(gè)圓(圓消失了) ;

        (4)在剛才畫圓位置相近處( 固定增量) 再畫一個(gè)圓;

        (5)重復(fù)步驟(2) ~ (4) 。

        以下是使用異或思路實(shí)現(xiàn)一個(gè)運(yùn)動(dòng)的圓和一個(gè)靜止的正方形的例程。

      # include < graphics. h>

        # include < stdlib. h>

        # include < stdio. h>

        # include < conio . h>

        int main( void)

        { int gdriver= DETECT, gmode;

        void * ball;

        int x, y, maxx ;

        unsigned int size;

        initgraph( & g driver, & gmode,) ;

        maxx= get maxx ( ) ;

        x= 0; y= 200;

        rectangle( x , y+ 11, x+ 20, y+ 31) ; / / 繪制矩形

        circle( x+ 10, y, 10) ; / / 繪制圓

        size= imagesize( x , y- 10, x+ 20, y+ 10) ;

        / / 計(jì)算保存區(qū)域大小

        ball= mallo c( size) ; / / 申請保護(hù)區(qū)域內(nèi)存

        getimage( x , y- 10, x+ 20, y+ 10, ball) ;

        / / 保存圓所在的位置圖形到內(nèi)存

        while( ! kbhit( ) ) {

        putimage( x, y- 10, ball, XOR_PUT) ;

        / / 用異或方式在新位置繪制圓, 圓消失

        x+ = 10; / / 計(jì)算圓移動(dòng)增量

        if ( x> = max x ) {

        x= 0;

        putimage( x, y- 10, ball, XOR_PUT) ;

        / / 用異或方式在新位置繪制圓, 圓出現(xiàn)

        delay( 1000) ; / / 延遲一定時(shí)間

        } }

        free(ball) ;

        closegraph( ) ;

        return 0;

        }

        該程序的運(yùn)行情況, 和前面的例程的效果差不多。但從實(shí)際畫點(diǎn)開銷角度來看, 3 個(gè)圓球運(yùn)行的例程是不一樣的。

        本例程使用XOR 異或方法重畫, 每次畫點(diǎn)開銷為:

        10* 4 點(diǎn)(重畫圓形清除) + 10* 4 點(diǎn)(重畫圓形) = 80 點(diǎn)

        由此可見,異或在這里是最好的繪制動(dòng)畫的選擇。


    (審核編輯: 智匯小新)

    聲明:除特別說明之外,新聞內(nèi)容及圖片均來自網(wǎng)絡(luò)及各大主流媒體。版權(quán)歸原作者所有。如認(rèn)為內(nèi)容侵權(quán),請聯(lián)系我們刪除。