- 論壇徽章:
- 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;
/*打開(kāi)字庫(kù)文件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進(jìn)制的160等于16進(jìn)制的A0 */
wh = *(c+1) - 0xa0; /*獲得區(qū)碼與位碼 */
offset = (94 * (qh - 1) + (wh - 1)) * 72L; /*計(jì)算該漢字在字庫(kù)中偏移量 */
fseek(HZK, offset, SEEK_SET); /*將文件指針移動(dòng)到偏移量的位置 */
fread(buff, 72, 1, HZK); /*從偏移量的位置讀取72個(gè)字節(jié) */
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點(diǎn)陣漢字,一共有24行 */
for (j = 0; j < 3; j++) /*橫向有3個(gè)字節(jié),循環(huán)判斷每個(gè)字節(jié)的 */
for (k = 0; k < 8; k++) /*每個(gè)字節(jié)有8位,循環(huán)判斷每位是否為1 */
if (mat[i * 3 + j] & (0x80 >> k)) /*測(cè)試當(dāng)前位是否為1 */
printf("%s", c1); /*為1的顯示為字符c1 */
else
printf("%s", c2); /*為0的顯示為字符c2 */
printf("\n"); /*輸完一行以后,進(jìn)行換行 */
}
}
int main(int argc,char *argv)
{
char *code;
/*漢字占兩個(gè)字節(jié),前景字符和背景字符都要有兩個(gè)英文字符或一個(gè)中文字符,否則字體將變形*/
unsigned char *HzkC1 = "**";
unsigned char *HzkC="王";
unsigned char *HzkC2 = " ";
char buffer2[72]; /*存儲(chǔ)中文字模信息 */
unsigned char *hzk;
getHzKCode(HzkC, buffer2);
hzk = buffer2;
printHzKChar(hzk, HzkC1, HzkC2);
return;
}
我的點(diǎn)陣是24*24,GBK2312的,獲取的區(qū)位碼不對(duì)。這個(gè)程序我想擴(kuò)展成將指定的漢字的點(diǎn)陣替換成我自定義的字符點(diǎn)陣,用于實(shí)驗(yàn)需要。 |
|