⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainform.cpp.bak

📁 delphi的汉字字库显示代码
💻 BAK
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <stdio.h>
#include "MainForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
AnsiString __fastcall GetAppPath(void)
{
AnsiString s = ParamStr(0);
int pos = 0;
int count = s.Length();
for (int i = count; s.SubString(i,1) != "\\"; i--, pos = i);
return s.SubString(1, pos);
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall ShowHZ(char *S,
        int x,
        int y,
        int PixelStyle,
        TCanvas *Canvas)
{

int PixelSize = PixelStyle;
unsigned char  Qu;
unsigned char Wei;
//char *S = STR.c_str();
AnsiString File1Name, File2Name, File3Name;
FILE *iFileHandle1,*iFileHandle2,*iFileHandle3, *iTemp;
const unsigned char Bit[8] = {128,64,32,16,8,4,2,1};
unsigned char  AreaOffset;
unsigned int HZKSize;
unsigned char ASCSize;
int innerX, innerY;
int Len = StrLen(S);
if (Len>=1)
{
switch (PixelSize)
  {
  case 12: HZKSize = 24;  //汉字库字模大小24字节(12*16/8)
           ASCSize = 12;  //ASC字库字模大小12字节
           AreaOffset = 0;//16区以前不独立成字库
           File1Name = GetAppPath()+"font\\HZK12";
           iFileHandle1 = fopen(File1Name.c_str(), "rb");
           File2Name = GetAppPath()+"font\\ASC12";
           iFileHandle2 = fopen(File2Name.c_str(), "rb");
           break;
  case 16: HZKSize = 32;  //汉字库字模大小32字节(12*16/8)
           ASCSize = 16;  //ASC字库字模大小16字节
           AreaOffset = 0;//16区以前不独立成字库
           File1Name = GetAppPath()+"font\\HZK16";
           iFileHandle1 = fopen(File1Name.c_str(), "rb");
           File2Name = GetAppPath()+"font\\ASC16";
           iFileHandle2 = fopen(File2Name.c_str(), "rb");
           break;
  case 24: HZKSize = 72;  //汉字库字模大小32字节(24*24/8)
           ASCSize = 72;  //ASC字库字模大小16字节(24*24/8)
           AreaOffset = 15;//16区以前独立成字库
           File1Name = GetAppPath()+"font\\HZK24F";
           iFileHandle1 = fopen(File1Name.c_str(), "rb");
           File2Name = GetAppPath()+"font\\ASC24";
           iFileHandle2 = fopen(File2Name.c_str(), "rb");
           File3Name = GetAppPath()+"font\\HZK24T";
           iFileHandle3 = fopen(File3Name.c_str(), "rb");
           break;
  case 40: HZKSize = 200;  //汉字库字模大小32字节(40*40/8)
           ASCSize = 120;  //ASC字库字模大小16字节(40*24/8)
           AreaOffset = 15;//16区以前独立成字库
           File1Name = GetAppPath()+"font\\HZK40S";
           iFileHandle1 = fopen(File1Name.c_str(), "rb");
           File2Name = GetAppPath()+"font\\ASC40";
           iFileHandle2 = fopen(File2Name.c_str(), "rb");
           File3Name = GetAppPath()+"font\\HZK40T";
           iFileHandle3 = fopen(File3Name.c_str(), "rb");
           break;
  case 48: HZKSize = 288;  //汉字库字模大小32字节(48*48/8)
           ASCSize = 144;  //ASC字库字模大小16字节(48*24/8)
           AreaOffset = 15;//16区以前独立成字库
           File1Name = GetAppPath()+"font\\HZK48S";
           iFileHandle1 = fopen(File1Name.c_str(), "rb");
           File2Name = GetAppPath()+"font\\ASC48";
           iFileHandle2 = fopen(File2Name.c_str(), "rb");
           File3Name = GetAppPath()+"font\\HZK48T";
           iFileHandle3 = fopen(File3Name.c_str(), "rb");
           break;
  }
int DataPos;
unsigned char *LineData = new char[HZKSize];//最大可能分配文件块空间
unsigned char Area; //处理后的区
unsigned char Biti; //处理后的位
unsigned char C1, C2;//先后判断的2个字符
int Level;          //字符集别:0,Ascii;1,符号(16区以前全角);2,汉字
bool ascii = true;  //判断显示位置推动
for (int k = 0; k < Len;)//注意,这里没有k++,循环内调整循环变量
   {
//=========================================================
//一下代码为判断文本级别
   C1 = (unsigned char)(S[k]);
   k = k + 1;
   if (C1 < 160) Level = 0;//ASCII处理C1
   else
      if (Len>=k+1)
      {
      C2 = (unsigned char)(S[k]);
      if (C2 < 160) Level = 0; //ASCII处理C1
      else
        {
        if (C1 < 175) Level = 1;//符号处理[C1][C2]
        else Level = 2;//汉字处理[C1][C2]
        k = k + 1;
        }
      }
//=========================================================
   switch (Level)
     {
     case 0:
        {
        if (k > 1)
           {
           if (ascii) x = x + PixelSize/2;
           else x = x + PixelSize;
           }
        ascii = true;
        switch (PixelSize) //根据字库特点,对变量进行合理约束
          {
          case 16: Area = C1; break;
          case 24: Area = C1; if (C1 > 128) Area = 32; break;
          case 12: case 40: case 48: Area = C1 - 32;
          if (C1 >= 160) Area = 0; if (C1-32 < 0) Area = 0; break;
          }
        //DataPos = Area * ASCSize * 1L;
        if (PixelSize == 24)
           DataPos = Area * ASCSize * 1L + 256;
        else
           DataPos = Area * ASCSize * 1L;
        fseek(iFileHandle2, DataPos, 0);
        fread(LineData, ASCSize, 1, iFileHandle2);
        for (int i = 0; i < PixelSize; i++)
         {
         for (int j = 0; j < PixelSize / 2; j++)
          {
   /*          innerX = x + j; innerY = y + i;
            switch (PixelSize)
            {
            case 12: case 16: case 40: case 48:
            if ((LineData[i*((PixelSize/2 + 7)/8)+(j/8)]&Bit[j%8])!=0) //+7***关键***
               Canvas->Pixels[innerX][innerY] = clBlack;
            else
               Canvas->Pixels[innerX][innerY] = clWhite;
            break;
            case 24:
            if ((LineData[i*((PixelSize + 7)/8)+(j/8)]&Bit[j%8])!=0) //+7***关键***
               Canvas->Pixels[innerX][innerY] = clBlack;
            else
               Canvas->Pixels[innerX][innerY] = clWhite;            
            break;
            }*/
          innerX = x + j; innerY = y + i;
          if ((LineData[i*((PixelSize/2 + 7)/8)+(j/8)]&Bit[j%8])!=0) //+7***关键***
             Canvas->Pixels[innerX][innerY] = clBlack;
          else
             Canvas->Pixels[innerX][innerY] = clWhite;  
          }
         }
        }
     break;
     case 1:
     case 2:
        {
        if (k > 2)
           {
           if (ascii) x = x + PixelSize/2;
           else x = x + PixelSize;
           }
        ascii = false;
        Qu = C1-160;
        Wei =C2-160;
        if (Qu > 94) Qu = 94;
        if (Wei > 94) Wei = 94;
        if (Level == 2)
           {
           switch (PixelSize)
             {
             case 24: case 40: case 48:
             Area = Qu - AreaOffset;break;
             default:Area = Qu;
             }
           iTemp = iFileHandle1;
           }
        else
           {
           Area = Qu;
           switch (PixelSize)
             {
             case 24: case 40: case 48: iTemp = iFileHandle3; break;
             default: iTemp = iFileHandle1;
             }
           }
        Biti = Wei;
        //下面这行代码,计算位置***关键***,尤其是“L”的使用        
        DataPos = ((Area-1) * 94L + Biti - 1) * HZKSize * 1L;
        fseek(iTemp, DataPos, 0);
        fread(LineData, HZKSize, 1, iTemp);
        for (int i = 0; i < PixelSize; i++)
           {
           for (int j = 0; j < PixelSize; j++)
              {
              switch (PixelSize)
                 {
                 case 24: innerX = x + i; innerY = y + j; break;
                 case 12: case 16: case 40:
                 case 48: innerX = x + j; innerY = y + i; break;
                 }
              if ((LineData[i*((PixelSize+7)/8)+(j/8)]&Bit[j%8])!=0) //+7***关键***
                 Canvas->Pixels[innerX][innerY] = clBlack;
              else
                 Canvas->Pixels[innerX][innerY] = clWhite;
              }
           }
        }
     break;
     }
   }
switch (PixelSize)
  {
  case 12: fclose(iFileHandle1); fclose(iFileHandle2); break;
  case 16: fclose(iFileHandle1); fclose(iFileHandle2); break;
  case 24: fclose(iFileHandle1); fclose(iFileHandle2);
           fclose(iFileHandle3); break;
  case 40: fclose(iFileHandle1); fclose(iFileHandle2);
           fclose(iFileHandle3); break;
  case 48: fclose(iFileHandle1); fclose(iFileHandle2);
           fclose(iFileHandle3); break;
  }
delete []LineData;
}
}

void __fastcall TForm1::Button2Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString S = "我a只想说de话,数学:春风冷~!";
ShowHZ(S.c_str(),0,0,24, Canvas);
//只能显示1个汉字,
//汉字,x,y,大小(只能是12,16,24,40,48)
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{
AnsiString S = ",";
unsigned char Qu, Wei;
Qu = S[1]-160;
Wei = S[2]-160;
ShowMessage(S + "字\n区:"+IntToStr(Qu)+"\n位:"+IntToStr(Wei));
}
//---------------------------------------------------------------------------


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -