首页 > 代码库 > C Tips:显示点阵汉字的小样例

C Tips:显示点阵汉字的小样例

非常简陋的一段小程序,演示怎样显示点阵字库。有时间的时候再详解。

#include <stdio.h>
#include <stdlib.h>

struct HzkInfoStruct
{
	int HzkSelect;
	int HzkSquare;
	char * fileName;
	FILE * file;
	int martixBytesCount;
	unsigned char *pMatrix;
};

typedef struct HzkInfoStruct HzkInfo;

void SelectHZK(HzkInfo * pHzkInfo);
void LoadHzkInfo(HzkInfo * pHzkInfo);
void CleanupHzkInfo(HzkInfo hzkInfo);
void GetQuWh(unsigned char *chineaseWord, int * qu, int * wh);
void FillMartix(HzkInfo * pHzkInfo, const int qu, const int wh);
void PrintMartix(HzkInfo hzkInfo);

int _tmain(int argc, _TCHAR* argv[])
{
	unsigned char chinease[3] = "京";
	HzkInfo hzkInfo;
	int qu;
	int wh;

	SelectHZK(&hzkInfo);

	if(hzkInfo.file == NULL || hzkInfo.pMatrix == NULL)
	{
		printf("HZK loading failed. Will exit now.\n");
		goto EXIT;
	}

	GetQuWh(chinease, &qu, &wh);
	FillMartix(&hzkInfo, qu, wh);
	PrintMartix(hzkInfo);

	EXIT:
	CleanupHzkInfo(hzkInfo);
	return 0;
}

void GetQuWh(unsigned char *chineaseWord, int * qu, int * wh)
{
	*qu = chineaseWord[0] - 0xa0;
	*wh = chineaseWord[1] - 0xa0;
}

void FillMartix(HzkInfo * pHzkInfo, const int qu, const int wh)
{
	fseek(pHzkInfo->file, (94 * (qu - 1) + (wh - 1)) * pHzkInfo->martixBytesCount, SEEK_SET);
	fread(pHzkInfo->pMatrix, pHzkInfo->martixBytesCount, 1, pHzkInfo->file);
}

void PrintMartix(HzkInfo hzkInfo)
{
	int i, j, k;
	int i_steps = hzkInfo.HzkSquare / 8;
	unsigned char * pMatrix = hzkInfo.pMatrix;

	printf("\n");

	for (j = 0; j < hzkInfo.HzkSquare; j++)
	{
		for (i = 0; i < i_steps; i++)
		{
			for (k = 0; k < 8; k++)
			{
				if (pMatrix[i] & (0x80 >> k))
				{
					printf("%c ", '*');
				}
				else
				{
					printf("  ");
				}
			}
		}

		pMatrix += i_steps;
		printf("\n");
	}

	printf("\n");
}

void SelectHZK(HzkInfo * pHzkInfo)
{

SELECT:

	printf("Please select [0: Exit; 1: HZK16; 2: HZK32;] : ");
	scanf_s("%d", &(pHzkInfo->HzkSelect));

	if(pHzkInfo->HzkSelect == 0)
	{
		exit(0);
	}

	if(pHzkInfo->HzkSelect < 1 || pHzkInfo->HzkSelect > 2)
	{
		goto SELECT;
	}

	switch(pHzkInfo->HzkSelect)
	{
	case 1:
		pHzkInfo->fileName = "Hzk16";
		pHzkInfo->HzkSquare = 16;
		break;
	case 2:
		pHzkInfo->fileName = "HZK32";
		pHzkInfo->HzkSquare = 32;
		break;
	}
	
	LoadHzkInfo(pHzkInfo);
}

void CleanupHzkInfo(HzkInfo hzkInfo)
{
	if(hzkInfo.pMatrix != NULL)
	{
		fclose(hzkInfo.file);

		free(hzkInfo.pMatrix);
		hzkInfo.pMatrix = NULL;
	}
}

void LoadHzkInfo(HzkInfo * pHzkInfo)
{
	printf("Loading %s ... ", pHzkInfo->fileName);
	if ((fopen_s(&(pHzkInfo->file), pHzkInfo->fileName, "rb")) != 0)
	{
		printf("Failed.\n");
		pHzkInfo->file = NULL;
		pHzkInfo->martixBytesCount = 0;
		pHzkInfo->pMatrix = NULL;
	}
	else
	{
		pHzkInfo->martixBytesCount = pHzkInfo->HzkSquare * pHzkInfo->HzkSquare / 8;
		pHzkInfo->pMatrix = (unsigned char *)malloc(pHzkInfo->martixBytesCount);

		if(pHzkInfo->pMatrix == NULL)
		{
			printf("Malloc failed.\n");
			fclose(pHzkInfo->file);
			pHzkInfo->file = NULL;
			pHzkInfo->martixBytesCount = 0;
			pHzkInfo->pMatrix = NULL;

			return;
		}

		printf("Done.\n");
	}
}

演示效果:


使用16*16 的字库:



使用32*32 的字库: