版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第12章C語言綜合應用程序示例北京郵電大學出版社內容提要
多模塊編程方法
圖形處理應用
操作系統接口應用
C語言與匯編語言混合編程
綜合應用程序示例--漢字顯示技術一個有實用價值的C語言應用程序往往較大,需要劃分成不同的模塊,分配給不同的程序員去完成。因此,在實用軟件的開發中,往往需要采用多模塊編程技術。12.1多模塊編程方法
使用多模塊編程技術的處理過程大致如下:
1、首先將一個大的源程序根據其功能合理地劃分成若干個小的源程序,每個小源程序均以程序文件(.C)的形式保存在磁盤上。并建立一個包括各個源程序模塊的文件名的工程文件(.prj)。
2、然后用編譯器進行編譯,將工程文件中指定的多個源程序文件進行編譯,生成多個目標文件和一個可執行文件。注意,在分模塊單獨編譯處理的各個程序模塊中,必須有且只有一個主函數
main()。一、程序模塊組織1、使用外部變量即一個程序文件file1.c中定義一個外部變量,另一個程序文件file2.c中的函數可以通過外部變量說明后來使用這個變量,以實現模塊間的通信。說明形式:extern
類型說明符
外部變量名
;
注意:只是進行了說明,并不是變量定義。2、舉例利用外部變量實現程序模塊f1.c與程序模塊f2.c之間的通信。
二、模塊之間的通信設程序模塊文件
f1.c的內容如下:
#include<stdio.h>intvar=8;/*全局變量的定義*/
main(){printf(“%d”,var);proc1();printf(“%d\n”,var);}
程序模塊文件f2.c的內容如下:externintvar;/*外部變量的說明*/proc1(){var=25;}程序編譯連接生成可執行文件,執行結果為:
825
1、#include命令經過預處理后,會將其后有關文件的內容拷貝到命令所在的源程序文件中。
2、在上一個例子中,程序要能夠編譯運行,需建立一個工程文件f12.prj,其內容為:
f1.cf2.c然后對f12.prj文件編譯運行即可。
3、也可以在f1.c文件開頭加一預處理命令:三、預處理命令#include的應用#include<stdio.h>#include<f2.c>intvar=8;main(){……}對f1.c文件直接編譯運行即可。12.2圖形處理應用圖形處理是計算機應用的一個極具特色的領域,有很好的應用前景,可以增強程序的趣味性、實用性。一、基本圖形處理庫函數
TurboC支持多種顯示適配器的各種顯示模式,提供了畫點、線、圓、橢圓、多邊形以及輸出各種字體等功能的函數。這些函數包含在圖形頭文件(graphics.h)中,在進行目標程序連接時,也必須將圖形庫文件graphics.lib連接到目標程序中去,其圖形接口還包括圖形顯示驅動程序(*.BGI)等。作用:將一個圖形驅動程序裝入內存,并將系統設置成圖形模式;說明:gd指定所用的圖形驅動程序,其值可參照書上的圖形驅動程序常量表;
gm說明初始化的圖形模式,其取值見附錄;
path指定驅動程序目錄路徑,空字符時表示驅動程序就在當前目錄下。
例如:若已知所用的圖形適配器為CGA,并打算使用
640×200高分辨率模式CGAHI,則圖形初始化部分可寫成:1、圖形系統初始化函數⑴顯示模式控制函數initgraph(gd,gm,path)intgd=CGA,gm=CGAHI;initgraph(&gd,&gm,“\\TC”);⑵自動檢測顯示器硬件的函數detectgraph(gd,gm)
作用:當編程者不知所用的圖形適配器的類型,或者需要編寫在不同圖形模式下均能運行的圖形程序,使用該函數可以完成對適配器的檢查,獲取顯示器類型號(賦給gd)及相應的顯示模式(賦給gm)。
例如:圖形初始化部分可以寫成:
intgd,gm;detectgraph(&gd,&dm);/*自動測試硬件*/initgraph(&gd,&gm,“\\TC”);
/*根據測試結果進行圖形初始化*/⑷恢復顯示方式函數closegraph()
作用:關閉圖形系統,返回文本工作方式。⑸恢復工作模式函數restorecrtmode()
設置圖形工作模式函數setgraphmode()
作用:使顯示器工作方式在圖形和文本方式之間來回切換。⑶清屏函數cleardevice()
作用:用于畫圖前進行清除屏幕;
作用范圍為整個屏幕。
2、基本圖形函數⑴三種最基本的圖形函數:畫點、線、圓函數畫點函數
putpixel(x,y,color);作用:將在坐標x、y指定的位置上畫一點,該點的顏色由color值決定。畫線函數
line(startx,starty,endx,endy);作用:在(startx,starty)和(endx,endy)兩點
間畫一直線,顏色為系統當前顏色。畫圓函數
circle(x,y,radius);作用:用當前顏色畫一個圓心在(x,y)處,半徑大小為radius的圓。⑵畫圓弧、扇形、橢圓函數
畫圓弧函數
arc(x,y,start,end,radius);
作用:用當前顏色,以(x,y)為圓心,(start,end)為起止角,radius為半徑畫圓弧。畫扇形函數
pieslice(x,y,start,end,radius);
作用:用當前顏色,以(x,y)為圓心,(start,end)為起止角,radius為半徑畫扇形。
畫橢圓函數
ellipse(x,y,start,end,xradius,yradius);
作用:用當前畫線顏色,以(x,y)為中心,(start,end)
為起止角,(xradius,yradius)為兩軸半徑畫橢圓。說明:start、end均以角度為單位。⑶畫多邊形、矩形和條形圖函數
畫多邊形函數drawpoly(numpoints,points);
作用:用當前顏色畫一個多邊形,多邊形的頂點數為numpoints,而points指向的整形數組連續存放著各頂點的(x,y)坐標。畫矩形函數rectangle(left,top,right,bottom);
作用:用當前顏色,以(left,top)為左上角坐標,以
(right,bottom)為右下角坐標畫一個矩形。
畫條形圖函數bar(left,top,right,bottom);
bar3d(left,top,right,bottom,depth,topflag);作用:用當前顏色,畫一實心條形圖;
depth決定bar3d()產生的三維條形圖的厚度,
topflag決定是否加頂蓋。3、顏色控制函數屏幕上顯示出的點、線、面的顏色稱為前景色,而襯托它們的背景顏色稱為背景色。在TurboC中常使用的16個標準色為:⑴顏色設置函數setcolor(color);作用:用顏色值color設置當前畫圖顏色。⑵圖形填充函數floodfill(x,y,bordercolor);作用:該函數對任意封閉圖形進行填充,其顏色和模式由設定的或缺省的顏色與圖形模式決定。說明:編程時該函數位于畫圖函數之后;參數(x,y)
為封閉圖形中的任意一點,bordercolor是封閉圖形的邊框顏色。⑶填充模式函數setfillstyle(pattern,color);作用:來設定floodfill()函數的填充模式。說明:參數pattern的值及其符號如下表所示。
舉例:利用基本作圖函數及顏色控制函數畫圖。#include<graphics.h>#include<stdio.h>#include<conio.h>voidbox(int,int,int,int);main(){intgd=DETECT,gm,i;
/*將圖形模式設置成缺省模式*/initgraph(&gd,&gm,“\\tc”);
/*根據測試結果進行圖形初始化*/cleardevice();
/*清屏幕*/setcolor(1);
/*設置當前畫圖顏色為藍色*/line(0,0,639,349);
/*畫一條直線*/box(100,100,300,200,1);
/*調box函數畫一個框*/floodfill(110,110,1);
/*填充顏色*/setcolor(2);
/*設置當前畫圖顏色為綠色*/line(50,200,400,125);
/*畫一條直線*/circle(320,175,100);
/*畫一個圓*/
setcolor(BLUE);
/*設置當前畫圖顏色為藍色*/circle(100,100,200);
/*再畫一個圓*/setfillstyle(SILID-FILL,GREEN);
/*設填充模式*/floodfill(500,250,1);
/*填充*/getch();
for(i=0;i<15;i++){setfillstyle(HATCH-FILL,i);
/*設填充線為陰影線*/bar(20*i,0,20*(i+1),20);
/*畫矩形條*/}getch();
closegraph();
/*關閉圖形模式*/}voidbox(x1,y1,x2,y2,color)/*畫一個封閉框*/intx1,y1,x2,y2,color;{setcolor(color);
line(x1,y1,x1,y2);
line(x1,y1,x2,y1);
line(x2,y1,x2,y2);
line(x2,y2,x1,y2);
}4、圖形模式下字符輸出函數
⑴字符輸出函數outtext(str);
作用:在當前位置輸出由str指定的字符串。說明:它能用不同的字型、大小,和不同的顯示方向輸出文字。⑵字符輸出屬性函數
settextstyle(font,direction,charsize);
作用:改變輸出字符串的字型、大小和方向。說明:參數font確定所用的字型;
direction的值表示字符的顯示方向。它可以是HORIZ-DIR(水平輸出,值為0),或是
VERT-DIR(垂直輸出,值為1)。
charsize是增加字符大小的倍數(0~10)。⑶字符輸出定位函數
outtextxy(x,y,str);
作用:將str指向的字符串輸出到窗口位置(x,y)上。5、視口操作函數
TurboC所有圖形函數實際上都是在視口(即窗口)上操作的(在沒有定義視口的情況下,它是整個屏幕)。用戶可以同時建立多個不同大小的視口,每個視口操作函數的參數都是以其左上角(坐標為0,0)為參考點的相對坐標。
⑴設置視口函數setviewport(x1,y1,x2,y2,clipflag);
作用:設置左上角坐標為(x1,y1),右下角坐標為
(x2,y2)的視口。說明:clipflag決定是否顯示超出視口的圖形部分。
0—顯示;1—不顯示。
⑵視口清除函數clearviewport();
作用:清除視口內的圖形。
注意:使用setviewport()函數可以在屏幕上開辟多個視口,這些視口可以重迭,但最近一次設置的視口才是當前視口。各圖形函數都是在當前視口中操作。其它視口中的內容只要不被清除,就可以保持在屏幕上。舉例:通過改變坐標位置移動視口,從而實現一個立方體的連續往左移動。#include<graphics.h>#include<stdio.h>main(){intgd=DETECT,gm,i;
initgraph(&gd,&gm,“\\tc”);
/*圖形系統初始化*/
cleardevice();
for(i=0;i<10;i++){setfillstyle(1,i);
setviewport(10*i,0,639,199,1);
/*開辟一個視口*/setcolor(5);
bar3d(10,120,60,150,40,1);/*畫一個三維立方體*/
floodfill(70,130,5);
/*填充側面顏色*/floodfill(30,110,5);
/*填頂部顏色*/delay(300);
/*延時*/clearviewport();
/*清除視口*/}closegraph();
}6、建立獨立運行的圖形處理程序
要脫離
TurboC集成環境,建立可獨立運行的可執行圖形程序,必須將圖形驅動程序(有的還要將字體驅動程序)連接到可執行的圖形程序中。⑴在\tc子目錄下輸入命令:
C:\TC>BGIOBJEGAVGA↙
作用:將驅動程序EGAVGA.BGI轉換成相應的目標文件EGAVGA.OBJ。⑵在\tc子目錄下輸入命令:
C:\TC>TLIBLIB\graphics.lib+EGAVGA·OBJ↙
作用:將目標文件EGAVGA·OBJ添加到
graphics.lib庫文件中。⑶在用戶程序調用initgraph()函數之前應加一語句:
registerbgidriver(EGAVGA-driver);
字體驅動程序的連接類似。經過上述處理,經編譯連接后的執行程序便可在任何目錄或其它兼容機上運行了。
二、圖形處理庫函數應用示例舉例:設有一組實驗數據存于數組val中,將它們用曲線表示在
x-y坐標平面上。
#include<graphics.h>#include<math.h>main(){floatval[]={3.9,5.3,7.2,9.6,12.9,10.0,23.2,31.4,39.8,50.2,62.9,56.0,92.0,105.7,122.8,125.7,150.7,179.3,203.2,211.0};{char*ch[]={"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20"};inti,j,x1,x2,y1,y2,n;charstr[10];intgraphdriver=DETECT,graphmode;registerbgidriver(EGAVGA_driver);initgraph(&graphdriver,&graphmode,"");/*圖形系統初始化*/cleardevice();/*清屏*/setviewport(20,20,570,450,1);/*開辟一個圖形視口*/setcolor(1);/*置當前畫圖顏色為藍色*/n=20;x1=80;y1=390-1.5*val[0];for(i=0;i<=n-1;i++){x2=x1+20;y2=390-1.5*val[i];setcolor(12);line(x1,y1,x2,y2);/*在兩坐標點間連線,形成曲線*/setcolor(WHITE);circle(x2,y2,1);/*通過畫小圓圈打點*/x1=x2;y1=y2;}setcolor(WHITE);line(80,390,500,390);/*畫橫軸*/
j=0;for(i=100;i<=80+n*20;i=i+20)/*標記橫軸刻度*/{line(i,390,i,400);outtextxy(i-4,405,ch[j]);j++;}outtextxy(200,420,"Everytimes");
line(80,390,80,5);/*畫縱軸*/for(j=0;j<=300;j=j+50)/*標記縱軸刻度*/{line(70,390-1.5*j,80,390-1.5*j);sprintf(str,"%d",j);/*將j的值轉換成串型存于
str數組中*/outtextxy(45,390-1.5*j-3,str);}
settextstyle(0,1,1);outtextxy(30,40,"Values");getch();closegraph();/*關閉圖形模式*/}11.3操作系統接口應用1、DOS基本組成
由引導程序模塊、基本輸入輸出系統、文件管理和系統調用模塊、命令處理模塊等幾個部分組成。
C語言可以通過庫函數實現與操作系統接口,即調用操作系統中的子程序,從而實現用戶應用程序的深層次的開發。一、DOS操作系統簡介
2、操作系統接口
DOS為用戶引用其功能子程序,利用了系統的軟件中斷。通過CPU的軟中斷指令INTn調用相應的程序。指令中的n是中斷調用號(也稱中斷類型號),中斷調用號不同,則調用的程序就不同。通過軟件中斷調用
BIOS中的基本I/O服務子程序,這種方法常被稱為低層接口。常用的有:利用
INT10指令調用有關顯示器服務程序;利用
INT16H指令調用鍵盤服務程序。例:設置顯示器顯示模式為320*200彩色圖形模式的匯編語言程序段如下:MOV AL,4;
設顯示模式MOV AH,0;
設功能號INT 10H ;系統功能調用通過軟件中斷調用IBMDOS模塊中的功能程序,即所謂系統功能調用,是高層接口。如INT21H指令便是典型的軟件接口,該接口包括了許多子功能。
例
:向顯示器輸出字符“A”的匯編語言程序段如下:MOV DL,“A”
;
置顯示字符MOV AH,2;
設功能號
INT21H ;系統功能調用
使用這兩種接口,用戶就可以在不與極復雜的硬件接口打交道的情況下,使用系統資源,開發各種應用軟件。
C語言作為一種中級語言,它的一些庫函數實際上就是調用了一些系統功能調用子程序,用戶可以利用它們來調用BIOS及DOS軟件接口,以實現特定功能。二、操作系統接口庫函數1、通用軟中斷調用庫函數int86()int86(intintno,unionREGS*inregs,unionREGS*outregs);說明:參數intno表示調用類型號,相當于中斷指令intn調用的中斷類型號n;參數inregs用于接收調用功能號及相關的一些入口參數;參數outregs用于接收調用后的返回值,即出口參數。舉例:在屏幕的35行、20列處顯示字符串“COMPUTER”。
#include<stdio.h>#include<dos.h>#include<conio.h>
#defineVIDEO0x10/*10H號軟中斷*/main(){unionREGSinregs,outregs;inregs.h.ah=2;/*2號功能,即設置光標位置*/inregs.h.dh=35;/*置行號為
35*/inregs.h.dl=20;/*置列號為
20*/inregs.h.bh=0;/*置顯示頁號為0*/clrscr();int86(VIDEO,&inregs,&outregs);/*調用BIOS的子程序將光標定位*/printf(“COMPUTER”);/*在當前光標位置處輸出字符串*/return(0);}2、系統功能調用庫函數
intdos()和intdosx()
intdos(unionREGS*inregs,unionREGS*outregs);intdosx(unionREGS*inregs,unionREGS*outregs,structREGS*segregs);說明:與DOS的系統功能調用(INT21H)相對應。參數inregs是入口參數,表示相應的功能號;參數
outregs是出口參數,保存調用后的返回值;參數
segregs是一個結構SREGS類型的指針,用來設置和保存CPU段寄存器的值。3、發送DOS命令庫函數
system()
system(char*cmd);說明:cmd為DOS系統下的命令字符串。三、鼠標器及其應用
安裝好鼠標器驅動程序,并進行初始化后,然后在應用程序中利用
INT33H功能調用管理鼠標器的各種操作。例1:編寫一個C語言函數,完成鼠標器初始化工作,測試鼠標安裝情況,顯示檢查結果。
#include<dos.h>unionREGSregs;
intMsinit(){intrecored;
regs.x.ax=0;
/*0#功能,初始化鼠標*/int86(0x33,®s,®s);
/*調BIOS子程序*/recored=regs.x.ax;
/*調用結果返回在AX寄存器中*/
if(recored==0){printf(“MousenotfoundorMousedrivernotinstalled.\n“);
return0;}/*初始化不成功*/elsereturnrecored;
/*初始化成功*/}例2:編寫讀取鼠標狀態和鼠標位置的函數。
voidMsget(int*px,int*py,int*pbuttons){regs.x.ax=3;
/*調用3號功能測試鼠標器*/int86(0x33,®s,®s);*px=regs.x.cx;
/*返回鼠標位置*/*py=regs.x.dx;
/*返回鼠標位置*/*buttons=regs.x.bx;
/*返回鼠標狀態*/}12.4C語言與匯編語言混合編程由C語言程序直接調用匯編語言程序的方法有兩種:一種是在程序中嵌入匯編代碼或直接調用匯編語言子程序。一、匯編語言子程序的一般格式
.MODEL內存模式.DATA……;定義數據.CODEPUBLIC_子程序名;說明在C中調用的子程序名_子程序名
PROC過程類型
……;子程序體RET_子程序名
ENDP;子程序定義結束
END;程序結束說明:
1、匯編子程序和C語言的內存模式應一致;
2、過程類型有FAR和NEAR兩種,表示調用程序和被調用程序是否在同一個段內;
3、C語言對應的匯編語言中,函數名和變量名前多加了一個下劃線(_),因此在匯編語言中,子程序名前應有下劃線。舉例:匯編語言子程序示例。
.modelsmall
.datatimedb10;10毫秒.codepublic_delay;延遲10ms_delayprocmovbl,timedelay:movcx,2801wait:loopwaitdecbljnzdelayret_delayendpend二、全局變量的傳遞
C語言程序(extern)和匯編語言程序(public)可以通過全局變量傳遞信息,其數據類型的對應關系如下表所示。
由于C語言大小寫是有區別的,從而在與匯編語言混合編程時,最好在options菜單下的Linker子項中將Case-SensitiveLink置成off狀態來取消其區別。
三、參數和返回值的傳遞
C語言程序和匯編語言程序的參數傳遞是通過堆棧來完成的。所謂堆棧,實質就是一種先進后出的內存區域,且只在一端進行出棧和入棧操作。對C語言而言,參數進棧的順序是從右到左。如在C語言程序中有語句power2(intpara1,intpara2),則執行該語句時堆棧中的內容如下圖所示,通過sp便可得到參數值,從而完成參數的數據傳遞。舉例:設某C語言程序如下:
#include“stdio.h”
intpower2(int,int);
main()
{printf(“2的4次方乘以8為:%d”,power2(8,4));}當匯編語言子程序有返回值時,是通過ax和dx寄存器來進行傳遞的。
匯編語言子程序如下:
.modelsmall
.code
public_power2
_power2proc
pushbpmovbp,spmovax,[bp+4];將第一個參數的值8送到ax中
movcx,[bp+6];將第二個參數的值4送到cx中
shlax,cl;將ax的內容左移cl次,每移一次表示乘2popbpret
_power2endpend四、匯編語言子程序的匯編及與C程序的連接
1、在集成環境下,進行混合編程的程序編譯連接時,需要先用宏匯編(MASM.EXE)將匯編語言程序進行匯編,生成OBJ文件。然后,將此OBJ文件加入到C程序中。最后進行連接,生成EXE文件。
2、將OBJ文件加入到C程序,對TurboC而言,非常簡單。先編輯一個工程文件(*.prj),其內容是需要連接的匯編OBJ文件和C語言文件名列表,如:
myc.cmymasm.obj3、然后在TurboC的集成環境中選擇
project主菜單中的
projectname項,將上面編輯的工程文件名寫入,便可進行連接。
五、內嵌匯編指令的C程序結構在C程序嵌入匯編指令的格式為:
asm<操作碼><操作數><;或換行>
例如:intmax(inta,intb){asmmovax,aasmcmpax,basmjgokasmmovax,b
ok:return_ax;/*_ax為TurboC定義的偽寄存器變量名*/}說明:
⑴在匯編語言代碼中使用的C語言變量應該初始化且用ptr指明對應的匯編語言類型;
⑵偽指令如
db等不能嵌入;
⑶在_asm塊中的注釋為匯編語言的注釋,即分號;
⑷不應在
_asm塊中用
ret指令返回,而應用C語言的return返回;
⑸匯編語言指令不需以分號(;)作語句結束;
⑹也可用“_asm<操作碼><操作數><;或換行>”的形式加一行匯編語言指令。例如:
#include"iostream.h"intasmmax(inta,intb){intmaxn=0;/*初始化maxn*/_asm {movax,wordptra;將a的值賦給ax寄存器
movdx,wordptrb;將b的值賦給dx寄存器
cmpax,dx;比較ax和dx的大小
jgok;ax比dx大則轉標號ok處
movax,dx};將dx的值賦給axok:
_asmmovwordptrmaxn,ax;將ax的值賦給maxnreturnmaxn;}main(){printf(“%d”,asmmax(10,50));return0;
}六、內嵌匯編指令的C程序的編譯和連接對于TurboC而言,內嵌匯編指令的C程序要用TCC命令行來實現編譯連接,其形式是:
TCC<命令行選項><文件名>“命令行選項”中與內嵌匯編指令程序有關的選項參考書本。例如:
TCC–Ic:\tc\include–Lc:\tc\lib–B–mlP1P2.asmmylib.lib它表示:在c:\tc\include目錄中找包含文件(-I);
在c:\tc\lib目錄中找庫文件mylib.lib(-L);用大模式(-ml)編譯文件P1.c,調用TASM對
P2.asm進行編譯,連接生成可執行文件P1.exe。12.5綜合應用程序示例--漢字顯示技術
一、漢字顯示的基本原理
1、國標漢字字符集與區位碼
區位碼:每個漢字在漢字庫中有確定的區號和位號。區號在前,位號在后,合成一個4位的十進制數字,這就是所謂的區位碼,用兩個字節存放,第一個字節表示區號,第二個字節表示位號。只要知道了區位碼,就可知道該漢字在字庫中的地址。每個漢字在字庫中以點陣字模形式存儲,點陣有16x16
、24x24及32x32等多種。16x16點陣字庫中,每個點陣字模用32個字節來描述,其中的每個點使用一個二進制位。當需要顯示時,把某個漢字的16x16點陣信息直接送到顯示器上,值為1的點可以在屏上顯示一個亮點;值為0的點則不亮,這樣就可顯現出相應的漢字。國標碼:與區位碼之間存在著一種簡單的換算關系:國標碼的區號=區位碼的區號+32(或20H)國標碼的位號=區位碼的位號+32(或20H)例如,“計”字的區位碼為2838(或1C26H),其國標碼為6070(或3C46H)。2、漢字內碼
漢字內碼是漢字信息處理系統內部標示漢字的編碼,也稱機內碼。它與國標碼也存在一種簡單的對應關系:機內碼區號=國標碼的區號+128(或80H)機內碼位號=國標碼的位號+128(或80H)例如,“啊”字的區位碼為1602(1002H),國標碼為3022H,機內碼為B0A2H。3、區位碼與內碼的轉化關系及字模顯示技術漢字內碼與區位碼存在著固定的轉換關系:設某漢字內碼的十六進制數表示形式為0xkkjj,則相應區位碼的區號qh和位號wh分別為:qh=0xkk-0xa0;
wh=0xjj-0xa0;
在西文狀態下,對使用漢字的C語言程序采用如下方法:讀出漢字的內碼,將其轉換成字庫的區位碼,然后直接到字庫中去找出漢字字模。再用有關的位操作和循環語句,對字模各個字節的每一位進行判斷。如果某位是1,則按設置的顏色在屏幕的相應位置畫點,若該位為0則不畫點。這樣就可按預先設置的顏色在相應的位置顯示出該漢字來。若用十進制數表示內碼為c1c2,則
qh=c1-160;
wh=c2-160;即區位碼qw為:
qw=100*(c1-160)+(c2-160);反之亦可由區位碼qw求得區號和位號:
qh=qw/100; wh=qw-100*qh;對于國標2312-80漢字字庫,漢字庫分成94個區,每個區有94個位,每個位存放一個漢字,當漢字點陣為16×16時,每個漢字的字模大小為(16×16)/8=32個字節。因而該漢字在漢字庫中離起點的偏移位置(以字節為單位),可由如下表達式計算:
offset=(94*(qh-1)+(wh-1))*32L;注意,偏移量對于不同的漢字庫是不相同的。下面給出幾種常用漢字庫中地址碼offset的計算公式:⑴ucdos中的字庫CCLIB.DAT存放16x16點陣字模:
offset=((qh-1)*94+(wh-1))*32L;⑵CCDOS2.13中的字庫HZK16存放16x16點陣字模:
offset=((qh-16)*94+wh-1+15*94)*32L;⑶SPDOS5.0的簡體字庫CCLIB.DAT存放16x16點陣字模:
offset=((qh-7)*94+wh-1)*32L;⑷CCDOS2.13中的字庫hzk24存放24x24點陣字模:
offset=((qh-16)*94+wh-1)*72L;
二、西文DOS環境下的漢字顯示
1、漢字顯示方法在西文DOS環境下,可以采用畫點或畫線的方法。⑴利用畫點函數putpixel()顯示漢字根據漢字字模點陣信息的各個字節每位的狀態來判斷是否在相應的位置上畫點。若該位為1,則在相應的位置上用函數putpixel()畫一點;若是0則跳過。這樣形成的亮點組合起來就是一個漢字的字形。
⑵利用畫線函數lineto()顯示漢字
根據漢字字模點陣信息可以確定組成漢字16線每條線的線型參數,用setlinestyle()設置線型,再由lineto()函數畫16點長的線,重復16次這樣的過程,畫16條不同的線型的直線,就可組成一個漢字。設置線型函數setlinestyle(line
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 金屬冶煉行業鋅冶煉浸出工藝優化項目技術創新總結報告
- 汽車行業汽車信息化項目技術創新總結報告?
- 2026年輸血試題及答案
- 通信網絡系統安裝檢驗批質量驗收記錄
- 電纜豎井敷設施工工藝及施工方法
- 商品房項目預應力鋼筋張拉施工方案-施工作業指導書
- 藥學服務試題及答案
- 2026年病區醫院感染管理防控知識考題及答案
- 高考英語2022年全國乙卷作文真題深度點評與滿分作文賞析
- 2026臨床執業助理醫師資格考試模擬試題及答案解析
- 2026年高考化學終極沖刺:專題03 化學反應原理綜合題(大題專練逐空突破)(全國適用)(原卷版及解析)
- 中醫診斷學之診斷思路與診斷方法
- 會計管理內部控制制度
- GB/T 31458-2026醫院安全防范要求
- 實驗室觸電培訓
- 政協提案知識培訓講稿
- 《2025年寧夏社區工作者招聘考試高頻考點試題解析》
- 人工智能賦能鄉村治理的實踐邏輯、現實困境與優化路徑
- 2026年區分觀點與事實基礎練習含答案
- 2026年金融行業風險管理部主管面試題集及解答
- 服裝質檢培訓課件模板
評論
0/150
提交評論