圖形模式下的漢字顯示
更新時間: 2007-06-01 10:06:00來源: 粵嵌教育瀏覽量:726
我們在編寫一些應(yīng)用軟件時,為了使軟件更為通俗淺顯、易學(xué)易用,具備漢字的用戶界面是必不可少的條件。在文本模式下,只要有漢字操作系統(tǒng)的支持,顯示漢字是不成問題的。只要用printf或cprintf就可以了。
#include void main()
{
printf("我正在學(xué)習(xí)C語言!");
}
在圖形模式下顯示漢字就稍稍麻煩些??尚业氖怯泻芏嗳藦氖逻@一問題的研究,并開發(fā)了一些用于漢字顯示的函數(shù)。這些函數(shù)不需要漢字系統(tǒng)的支持,但用到其中的字庫文件。如UCDOS的HZK16。
漢字顯示的步是打開字庫文件。
函數(shù): int OpenHz(const char *Hz16Path); 功能:打開字庫文件Hz16Pathint handle; /*打開的字庫文件指針*/int OpenHz(const char *Hz16Path){return (handle=open(Hz16Path,O_RDONLY|O_BINARY));} 打開字庫文件后,就可以用下面介紹的函數(shù)顯示16點陣的漢字。
函數(shù): int WrtHz16(int x,int y,int z,int color,char *p); 功能:在(x,y)用color顏色顯示漢字串p,漢字之間的空格數(shù)為z。intWrtHz16(int x, int y,int z,int color,char *p)
{
unsigned int i,c1,c2,f=0; /*x,y:write at (x,y);*/
int rec,i1,i2,i3; /*z:space between;*/
long l; /*color:txt color*/
char by[32]; /*p:HZ str*/
if( handle<0 ) return -1; while((i=*p++)!=0){
if(i>0xa1)
if(f==0){
c1=(i-0xa1)&0x07f;
f=1;
}
else{
c2=(i-0xa1)&0x07f;
f=0;
rec=c1*94+c2;
l=rec*32L;
lseek(handle,l,SEEK_SET);
read(handle,by,32);
for(i1=0;i1<16;i1++)
for(i2=0;i2<2;i2++)
for(i3=0;i3<8;i3++)
if(GetBit(by[i1*2+i2],7-i3))
putpixel(x+i2*8+i3,y+i1,color);
x=x+z+16;
}
}
return(x);
}
函數(shù)GetBit定義如下:
函數(shù): int GetBit(unsigned char c,int n); 功能:取得漢字的點陣數(shù)據(jù)。
int GetBit(unsigned char c,int n)
{
return((c>>n)&1);
}
漢字顯示結(jié)束,應(yīng)該關(guān)閉字庫文件。
void CloseHz(void)
{
close( handle );
}
#include "\Caic\Include\Hz.h"
#include
#include const char* Hz16Path = "\\UCDOS\\Hzk16.";
const char* HzStr = "苦丁香C語言輔助學(xué)習(xí)軟件";
void main(){
int gr=DETECT,gm;
initgraph(&gr,&gm,"\\Caic\\Bgi");
OpenHz( Hz16Path );
Wrt16Hz(20,20,4,RED,HzStr);
CloseHz();
getch();
closegraph();
}顯示24點陣及放大漢字
下面探討一下如何顯示24點陣及放大漢字。24點陣字庫也可在任意一種漢字系統(tǒng)中找到。如UCDOS的HZK24S。
函數(shù): int WrtHz24(int x,int y,int z,int color,int m,\int n,char *p); 功能:顯示24點陣及放大漢字。
int WrtHz24(int x,int y,int z,int color,int m,int n,char *p)
{
unsigned int i,c1,c2,f=0; /*z: 漢字字符間的空格*/
int i1,i2,i3,i4,i5,rec; /*x,y: 先是位置(x,y)*/
long l; /*color:漢字顏色*/
char by[72]; /*m: x 方向的放大倍數(shù)*/
/*n: y 方向的放大倍數(shù)*/
if( handle<0 ) return -1; /*p: 顯示漢字串*/ while((i=*p++)!=0){
if(i>0xa1)
if(f==0){
c1=(i-0xa1)&0x7f;
f=1;
}
else{
c2=(i-0xa1)&0x7f;
f=0;
rec=(c1-15)*94+c2;
l=rec*72L;
lseek(handle,l,SEEK_SET);
read(handle,by,72);
for(i1=0;i1<24*m;i1=i1+m)
for(i4=0;i4 for(i2=0;i2<=2;i2++)
for(i3=0;i3<8;i3++)
if(GetBit(by[i1/m*3+i2],7-i3))
for(i5=0;i5 putpixel(x+i1+i4,y+i2*8*n+i3*n+i5,color);
x=x+24*m+z;
}
}
return(x);
} 使用Wrt24Hz的例子:#include "\Caic\Include\Hz.h"
#include
#include const char* Hz24Path = "C:\\Ucdos\\fnt\\hzk24s."
const char* HzStr = "苦丁香C語言輔助學(xué)習(xí)軟件";
void main(){
int gr=DETECT,gm;
initgraph(&gr,gm,"\\Caic\\Bgi");
OpenHz( Hz24Path );
Wrt24Hz(20,20, /*先是在(x,y)*/
4, /*漢字間的空格為4*/
RED, /*用紅色顯示*/
2, /*x 方向放大2倍*/
4, /*y 方向放大4倍*/
HzStr); /*顯示字符串*/
CloseHz();
getch();
closegraph();
}
推薦閱讀
- ·Linux字符設(shè)備驅(qū)動框架解析:file_operations的核心作用與實現(xiàn)
- ·廣東朝歌數(shù)碼科技股份有限公司專場招聘會
- ·深化產(chǎn)教融合,共筑技能人才培養(yǎng)新生態(tài) —— 廣州華立學(xué)院到訪粵嵌從化校區(qū)為深化產(chǎn)教
- ·校企合作新突破 | 粵嵌科技與三亞學(xué)院共探產(chǎn)教融合新路徑
- ·粵嵌科技入選國家級職業(yè)數(shù)字展館聯(lián)合建設(shè)單位,賦能計算機程序設(shè)計員高技能人才培養(yǎng)
- ·嵌入式實時操作系統(tǒng)的性能優(yōu)化與實現(xiàn)路徑
- ·校企攜手賦能教育!粵嵌科技助力海南科技職業(yè)大學(xué)探索 AGI 時代教學(xué)新范式
- ·嵌入式系統(tǒng)中的低功耗設(shè)計策略與實現(xiàn)路徑
- ·深圳市軒宇軟件開發(fā)有限公司專場招聘會
- ·嵌入式系統(tǒng)中的代碼空間優(yōu)化:策略與實踐