用C语言编程16点阵字库
CFont ft;
ft.CreatePointFont(90,_T("宋体")); //做点阵字体。 90 所需字体高度(用0.1点表示,例如,传递120表示12点字体)。
DC.SelectObject(&ft);
DC.DrawText((LPCTSTR)str,str.GetLength(),&rt,DT_LEFT);把你要的字写入一个DC
然后用GetPixel得到dc的点阵结构 至于怎么存储就看怎么使用了
你好!!
你这个程序既然是读取的矢量字库了那么就不用区分16、20、24 的点阵大小了吧
你说的c语言,是控制台程序还是 WIN32 的程序?
这样可以么?
#include <alloc.h>
#include <ctype.h>
#include <dos.h>
#include <dir.h>
#include <io.h>
#include <graphics.h>
#define GETADR(n,str) (str *) calloc (n,sizeof(str)) // 申请N个指定字符串长度的地址
#define W16 16
#define C16 32
unsigned char bit[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
FILE *fi;
char *dot,str[20];
main(int argc,char *argv[])
{
int i,j,nn,xc,yc,MaxX,MaxY,menul[1000];
int graphdriver=DETECT,graphmode;
if(argc!=2){ //检测是否输入了2个参数
puts("LT16<???.N4>");
exit(0);
}
dot=GETADR(C16,char); //获取16个char长度的内存地址
fnmerge(str,"","",argv[1],".N4"); //建立str 为路径 ,文件名是 第一个参数.N4 的文件(这里可能有bug,str没初始化)
if((fi=fopen(str,"r"))==NULL){ //打开这个文件用于输入
puts("Can't open DATA.");
exit(0);
}
fscanf(fi,"%d",&nn); //读取一个整数
if(nn<=0||nn>1000) //这个数字必须在 0~1000之间
exit(0);
for (i=0;i<nn;i++)
fscanf(fi,"%d",&menul[i]); //根据这个数字来决定继续读取的数字数量
fclose(fi);
if((fi=fopen("CLIB16.DOT","rb"))==NULL){ //打开 CLIB16.DOT 这个文件
puts("Can't open CLIB16.DOT");
exit(0);
}
initgraph(&graphdriver,&graphmode,""); // 初始化图形模式
MaxX=getmaxx(); // 获得屏幕最大坐标范围
MaxY=getmaxy();
xc=0;
yc=20;
for(j=0;j<nn;j++){
i=readlibdot(menul[j]); //读取点阵数据
putchar16(xc,yc); //显示到对应的坐标系
xc+=20;
if(xc>MaxX-20){
yc+=20;
xc=0;
if(yc>MaxY-20){
getch();
clearviewport();
yc=0;
}
}
}
getch(); //按任意键继续
closegraph(); //关闭图形模式
}
readlibdot(int j)
{
int i0,j1,j2;
long order,k1;
j1=j/100;
j2=j-j1*100;
if(j1>=9)
j1=j1-6;
k1=94*j1+j2-95;
order=C16*k1;
fseek(fi,order,SEEK_SET);
i0=fread(dot,C16,1,fi);
return(i0);
}
putchar16(int bx,int by) //显示readlibdot 得到的汉字(保存在dot 里面)的每个象素点阵
{
int i,j,kk,k,x1,y1;
unsigned char marker;
kk=0;
y1=by;
for(i=0;i<16;i++,y1++){
for(j=0;j<2;j++){
x1=bx+j*8;
marker=*(dot+kk);
kk++;
for(k=0;k<8;k++){
if(!(marker&bit[k]))
continue;
putpixel(x1+k,y1,YELLOW);
}
}
}
return;
}
点阵字库
一般我们使用16*16的点阵宋体字库,所谓16*16,是每一个汉字在纵、横各16点的区域内显示的。
不过后来又有了HZK12、HZK24,HZK32和HZK48字库及黑体、楷体和隶书字库。
虽然汉字库种类繁多,但都是按照区位的顺序排列的。前一个字节为该汉字的区号,后一个字节为该字的位号。
每一个区记录94个汉字,位号则为该字在该区中的位置。
因此,汉字在汉字库中的具体位置计算公式为:94*(区号-1)+位号-1。
减1是因为数组是以0为开始而区号位号是以1为开始的。
这仅为以汉字为单位该汉字在汉字库中的位置,那么,如何得到以字节为单位得到该汉字在汉字库中的位置呢?
只需乘上一个汉字字模占用的字节数即可,
即:(94*(区号-1)+位号-1)*一个汉字字模占用字节数,而按每种汉字库的汉字大小不同又会得到不同的结果。
以16*16点阵字库为例,计算公式则为:(94*(区号-1)+(位号-1))*32。
汉字库文该从该位置起的32字节信息即记录了该字的字模信息。
了解点阵汉字及汉字库的构成原理后,显示汉字就变得简单。以16*16点阵字库为例,
通常的方法是:将文件工作指针移到需要的汉字字模处、将汉字库文件读入一2*16数组再用for循环一位位地显示。
#include "graphics.h"
#include "stdio.h"
main()
{ int i=VGA,j=VGAHI,k;
unsigned char mat[16][2],chinease[3]="我";
FILE *HZK;
if((HZK=fopen("hzk16","rb"))==NULL)exit(0);
initgraph(&i,&j,"");
i=chinease[0]-0xa0;j=chinease[1]-0xa0; /*获得区码与位码*/
fseek(HZK,(94*(i-1)+(j-1))*32l,SEEK_SET);
fread(mat,32,1,HZK);
for(j=0;j<16;j++)
for(i=0;i<2;i++)
for(k=0;k<8;k++)
if(mat[j][i]&(0x80>>k)) /*测试为1的位则显示*/
putpixel(i*8+k,j,WHITE);
getch();
closegraph();
fclose(HZK);
}
用C语言编程16点阵字库
for(i=0;i<16;i++,y1++){
设计一个16*16的点阵的代码,c语言的
include<stdio.h> void main(){ int i,j;for(i=0;i<16;i++){ for(j=0;j<16;j++)printf(" * ");printf("\\n");} }
我想编写16*16点阵的左移程序。用C语言,51单片机。你能否帮我编一个小...
temp++;if(temp==16)temp=0;} } } }
C语言编写16和32点阵字库
CFont ft;ft.CreatePointFont(90,_T("宋体")); \/\/做点阵字体。 90 所需字体高度(用0.1点表示,例如,传递120表示12点字体)。DC.SelectObject(&ft);DC.DrawText((LPCTSTR)str,str.GetLength(),&rt,DT_LEFT);把你要的字写入一个DC 然后用GetPixel得到dc的点阵结构 至于怎么存储就看怎么使用...
基于单片机16*16点阵C语言各种方式结合的显示程序
DisplayBottom(displayMatrix + 16);} void DisplayTop(unsigned char displayBlock[]){ unsigned char i, colSelect;P2 = 0x00;colSelect = 0x83;for(i = 0; i < 16; i++){ P0 = displayBlock[i];P3 = colSelect;DelayMs(10);screenSW = 1;colSelect += 0x10;} } void Display...
急!!C语言编写 汉字点阵字库
};\/* 以下是 '佳' 的 16点阵宋体 字模,32 byte *\/ 0x08,0x40,0x0C,0x40,0x18,0x48,0x17,0xFC,0x30,0x40,0x60,0x44,0xAF,0xFE,0x20,0x40,0x20,0x40,0x20,0x48,0x27,0xFC,0x20,0x40,0x20,0x40,0x20,0x44,0x2F,0xFE,0x20,0x00,};\/* 以下是 '志' 的 16点阵宋体 ...
关于一个C语言点阵的小问题!
每4个点写成一个16进制数。16*16 ,就是把字型分成16行,每行分16个点。你可以用中文字库里的 bitmap font,挖出来 用。下面是 24*24的 点阵,“我”字:000400 006700 01f660 0f8630 3b0618 030610 030600 03060c 7ffffe 030600 030600 033630 03c638 1f0660 7b02c0 230380 030300 030784 ...
急急急。。。跪求16x16点阵模块显示汉字的C语言程序
ulong row; \/\/点阵行 ulong dt;\/\/点阵显示数组 uchar code tab0[] = {0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0...
AT89C51单片机C语言编程16*16点阵程序
include <reg52.h>unsigned char code tab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; \/\/控制列,P2控制,低电平显示unsigned char code digittab[10][8]={{0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00}, \/\/0控制行,P0控制,高电平显示,八行十个数字{0x00,0x00,0x00,0x...
用keil51单片机C语言编写程序,使液晶显示器显示16*16点阵汉字,请问怎么...
{ P1=i;P2=led[32*j+2*i];P3=led[32*j+2*i+1];delay();i++;if(i==16)i=0;if(time_50ms==20){ time_50ms=0;j++;if(j==2)j=0;} } } int_T0() interrupt 1 { TH0=0X3C;TL0=0XB0;time_50ms++;} delay(){ unsigned char t1;for(t1=0;t1<100;t1++);} ...
势习丁桂: #include <stdio.h> #include <alloc.h> #include <ctype.h> #include <dos.h> #include <dir.h> #include <io.h> #include <graphics.h> #define GETADR(n,str) (str *) calloc (n,sizeof(str)) // 申请N个指定字符串长度的地址 #define W16 16 #define C16 32 ...
绥芬河市17674735393: 急!!C语言编写 汉字点阵字库 - ?
势习丁桂: /* 以下是 '谢' 的 16点阵宋体 字模,32 byte */0x01,0x08,0x42,0x08,0x37,0x88,0x24,0x88,0x07,0xFE,0x04,0x88,0xE7,0xC8,0x24,0xA8,0x2F,0xA8,0x21,0x88,0x22,0x88,0x2A,0x88,0x34,0x88,0x28,0x88,0x12,0xA8,0x01,0x10, }; /* 以下是 '佳' ...
绥芬河市17674735393: 设计一个16*16的点阵的代码,c语言的 - ?
势习丁桂: 很简单啊 #include<stdio.h> void main() {int i,j;for(i=0;i<16;i++){ for(j=0;j<16;j++)printf(" * ");printf("\n");} }
绥芬河市17674735393: 如何用c语言写16*16点阵显示汉字的程序 - ?
势习丁桂: 楼主没说清楚啊,你是用点阵led还是用lcd,用lcd的话支不支持汉字库.如果是用led就自己把汉字图像一行一行的发过去,不支持字库的lcd,设置lcd为图像模式,按图像发过去,支持...
绥芬河市17674735393: C语言设计汉字点阵字库 - ?
势习丁桂: 用C\C++都可吧 liubaoxinggo1986@126.com发过来,我看看 互学互探讨,要什么RMB
绥芬河市17674735393: 16 16点阵c语言字模 - ?
势习丁桂: 点阵大小:16 * 16 汉字点阵:(宋体) [王] 0x00,0x00,0x00,0x00,0x00,0x04,0x3f,0xf8,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x1f,0xf8,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x82,0x7f,0xfe,0x00,0x00[官] 0x00,0x00,0x01,0x00,0x20,...
绥芬河市17674735393: 用单片机实现16*16点阵显示,要用C语言编写程序+注释,顺便还要原理图,能帮帮忙么??? - ?
势习丁桂: 问题:1.字符串没加结束标志'\0'2. else if(ns>=n&&nt<n) for(i=0;i<n;i++) {m1[i]=s[i]; strcat(m1,t); strcpy(s,m1); } 这段错误#include"iostream.h"#include"string.h"#include"stdio.h" void mystrcat(char s[],char t[],int n) { char m1[100],m2[100]; int...
绥芬河市17674735393: 急!C语言编写 汉字点阵字库 '罗' '恒'这两个字 - ?
势习丁桂: #include <stdio.h>// 每个汉字的水平点数 const int WIDTH = 24;// 每个汉字的垂直点数 const int HEIGHT = 24;/*// 方案1 :每个汉字的笔画 const char FRONT_COLOR[]="■";// 方案1 :每个汉字的背景 const char BACKGROUND_COLOR[]=...
绥芬河市17674735393: 有关c语言点阵的一道编程题 - ?
势习丁桂: #include<stdio.h> void main() { FILE *fp; unsigned char buffer[12],s[20],c; int i,j;if ( fp=fopen("ASC12.fon","rb") ) {printf("Please input a char:"); scanf("%s",s); c=s[0];fseek(fp,c*12L,SEEK_SET); fread(buffer,12,1,fp);fclose(fp);for ( i=0;...
绥芬河市17674735393: 如图,要想点阵能显示汉字并左移,用C语言应如何编程? - ?
势习丁桂: C语言中,汉字是储存在汉字库里的.每个汉字在字库中以点阵字模形式存储,一般采用16*16点阵形式,每个点用一个二进位表示,存1的点,当显示时,可以在屏上显示一个亮点,存0的点,则在屏上不显示,这样把存某字的16*16点阵信息...