- 论坛徽章:
- 0
|
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
void getHzKCode(unsigned char *c, char buff[])
{
unsigned char qh, wh;
unsigned long offset;
FILE *HZK;
/*打开字库文件hzk24*/
if ((HZK = fopen("HZKS_24*24.DZK", "rb")) == NULL) {
printf("Can't open haz24,Please add it?");
getchar();
exit(0);
}
qh = *(c) - 0xa0; /*10进制的160等于16进制的A0 */
wh = *(c+1) - 0xa0; /*获得区码与位码 */
offset = (94 * (qh - 1) + (wh - 1)) * 72L; /*计算该汉字在字库中偏移量 */
fseek(HZK, offset, SEEK_SET); /*将文件指针移动到偏移量的位置 */
fread(buff, 72, 1, HZK); /*从偏移量的位置读取72个字节 */
printf("qh:%d,wh:%d,offset:%ld\n\r", qh, wh, offset);
}
void printHzKChar(char *mat, char *c1, char *c2)
{
int i, j, k;
for (i = 0; i < 24; i++) { /*24*24点阵汉字,一共有24行 */
for (j = 0; j < 3; j++) /*横向有3个字节,循环判断每个字节的 */
for (k = 0; k < 8; k++) /*每个字节有8位,循环判断每位是否为1 */
if (mat[i * 3 + j] & (0x80 >> k)) /*测试当前位是否为1 */
printf("%s", c1); /*为1的显示为字符c1 */
else
printf("%s", c2); /*为0的显示为字符c2 */
printf("\n"); /*输完一行以后,进行换行 */
}
}
int main(int argc,char *argv)
{
char *code;
/*汉字占两个字节,前景字符和背景字符都要有两个英文字符或一个中文字符,否则字体将变形*/
unsigned char *HzkC1 = "**";
unsigned char *HzkC="王";
unsigned char *HzkC2 = " ";
char buffer2[72]; /*存储中文字模信息 */
unsigned char *hzk;
getHzKCode(HzkC, buffer2);
hzk = buffer2;
printHzKChar(hzk, HzkC1, HzkC2);
return;
}
我的点阵是24*24,GBK2312的,获取的区位码不对。这个程序我想扩展成将指定的汉字的点阵替换成我自定义的字符点阵,用于实验需要。 |
|