怎么样提取16X16汉字字库用于LCD显示?

怎么样提取16X16汉字字库用于LCD显示?

提取16X16汉字字库用于LCD显示

Lanno Cheeke 2006-8-24

使用文件:

UCDOS中的HZK16字模文件

原理:

获取汉字的区位码(又称GB码),在HZK16中算出此汉字的起始地址,以16x2数组方式保存,数组中的值为1则打印,否则为空。

程序说明:

所使用的文字为一级汉字。

双击:位码增一;右击:区码增一。

  1.  
  2.  
  3. CHZKView.h
  4.  
  5. private:
  6.  
  7. intjj;//位码
  8.  
  9. intii;//区码
  10.  
  11. FILE*pFile;//字库文件指针
  12.  
  13. CHZKView.cpp
  14.  
  15. //初始化操作
  16.  
  17. CHZKView::CHZKView()
  18.  
  19. {
  20.  
  21. //TODO:addconstructioncodehere
  22.  
  23. this->pFile=fopen("HZK16","r");
  24.  
  25. ii=16;
  26.  
  27. jj=1;
  28.  
  29.  
  30.  
  31. }
  32.  
  33. //输出
  34.  
  35. voidCHZKView::OnDraw(CDC*pDC)
  36.  
  37. {
  38.  
  39. CHZKDoc*pDoc=GetDocument();
  40.  
  41. ASSERT_VALID(pDoc);
  42.  
  43. CRectrt;
  44.  
  45. GetClientRect(&rt);
  46.  
  47.  
  48.  
  49. intcx=rt.Width()/16;
  50.  
  51. intcy=rt.Height()/16;
  52.  
  53.  
  54.  
  55. unsignedcharpHz[]="对";
  56.  
  57. inti=pHz[0]-0xA0;
  58.  
  59. intj=pHz[1]-0xA0;
  60.  
  61. fseek(pFile,(94*(i-1)+(j-1))*32l,SEEK_SET);
  62.  
  63. unsignedcharmat[16][2];
  64.  
  65. intk=0;
  66.  
  67. fread(mat,32,1,pFile);
  68.  
  69.  
  70.  
  71. jj++;
  72.  
  73. fseek(pFile,(94*(ii-1)+(jj-1))*32l,SEEK_SET);
  74.  
  75. fread(mat,32,1,pFile);
  76.  
  77. for(j=0;j<16;j++)
  78.  
  79. for(i=0;i<2;i++)
  80.  
  81. for(k=0;k<8;k++)
  82.  
  83. if(mat[j][i]&(0x80>>k)){
  84.  
  85. pDC->SetPixel(i*8+k,j,RGB(255,0,0));
  86.  
  87. pDC->Rectangle((i*8+k)*cx,j*cy,(i*8+k)*cx+cx,j*cy+cy);
  88.  
  89. }
  90.  
  91.  
  92.  
  93. }
  94.  
  95. //清理操作
  96.  
  97. CHZKView::~CHZKView()
  98.  
  99. {
  100.  
  101. fclose(this->pFile);
  102.  
  103. }
  104.  
  105. //区码增一
  106.  
  107. voidCHZKView::OnRButtonUp(UINTnFlags,CPointpoint)
  108.  
  109. {
  110.  
  111. //TODO:Addyourmessagehandlercodehereand/orcalldefault
  112.  
  113. ii++;
  114.  
  115. Invalidate();
  116.  
  117. CView::OnRButtonUp(nFlags,point);
  118.  
  119. }
  120.  
  121.  
  122.  
  123. voidCHZKView::OnLButtonDblClk(UINTnFlags,CPointpoint)
  124.  
  125. {
  126.  
  127. //TODO:Addyourmessagehandlercodehereand/orcalldefault
  128.  
  129. Invalidate();
  130.  
  131. CView::OnLButtonDblClk(nFlags,point);
  132.  
  133. }
  134.  

//输出

 

  1. voidCHZKView::OnDraw(CDC*pDC)
  2.  
  3. {
  4.  
  5. CHZKDoc*pDoc=GetDocument();
  6.  
  7. ASSERT_VALID(pDoc);
  8.  
  9. CRectrt;
  10.  
  11. GetClientRect(&rt);
  12.  
  13.  
  14.  
  15. intcx=rt.Width()/16;
  16.  
  17. intcy=rt.Height()/16;
  18.  
  19.  
  20.  
  21. unsignedcharpHz[]="对";
  22.  
  23. inti=pHz[0]-0xA0;
  24.  
  25. intj=pHz[1]-0xA0;
  26.  
  27. fseek(pFile,(94*(i-1)+(j-1))*32l,SEEK_SET);
  28.  
  29. unsignedcharmat[16][2];
  30.  
  31. intk=0;
  32.  
  33. fread(mat,32,1,pFile);
  34.  
  35.  
  36.  
  37. jj++;
  38.  
  39. fseek(pFile,(94*(ii-1)+(jj-1))*32l,SEEK_SET);
  40.  
  41. fread(mat,32,1,pFile);
  42.  
  43. for(j=0;j<16;j++)
  44.  
  45. for(i=0;i<2;i++)
  46.  
  47. for(k=0;k<8;k++)
  48.  
  49. if(mat[j][i]&(0x80>>k)){
  50.  
  51. pDC->SetPixel(i*8+k,j,RGB(255,0,0));
  52.  
  53. pDC->Rectangle((i*8+k)*cx,j*cy,(i*8+k)*cx+cx,j*cy+cy);
  54.  
  55. }
  56.  
  57.  
  58.  
  59. }

 

 

  1. //清理操作
  2.  
  3. CHZKView::~CHZKView()
  4.  
  5. {
  6.  
  7. fclose(this->pFile);
  8.  
  9. }
  10.  
  11. //区码增一
  12.  
  13. voidCHZKView::OnRButtonUp(UINTnFlags,CPointpoint)
  14.  
  15. {
  16.  
  17. //TODO:Addyourmessagehandlercodehereand/orcalldefault
  18.  
  19. ii++;
  20.  
  21. Invalidate();
  22.  
  23. CView::OnRButtonUp(nFlags,point);
  24.  
  25. }
  26.  
  27.  
  28.  
  29. voidCHZKView::OnLButtonDblClk(UINTnFlags,CPointpoint)
  30.  
  31. {
  32.  
  33. //TODO:Addyourmessagehandlercodehereand/orcalldefault
  34.  
  35. Invalidate();
  36.  
  37. CView::OnLButtonDblClk(nFlags,point);
  38.  
  39. }