📄 ucguifontgen.cpp
字号:
retCharInfo.BytesPerLine = SizeChar.cx / 8;
return retCharInfo;
}
bool GenAllCharInfo()
{
int offset = 0, FileLen = 0;
int c1 = 0, c2 = 0;
char HZ[3];
CHARINFO OneCharInfo;
offset = 0x60 + (0xf8-0xb0+0xaa-0xa1)*(0xff - 0xa1);
sprintf(hzkprefix_tmp, hzkcharinfo, fontname, offset);
WirteHZKFile(hzkprefix_tmp, strlen(hzkprefix_tmp), fp);
for(area1 = 0x20; area1 < 0x80; area1++){
if(area1 >= 0x20 && area1 < 0x80)
{
if(!GetAscCharIsOut(area1)) continue;
OneCharInfo = GetOneCharInfo(area1, 0);
fontsize = OneCharInfo.XSize;
byteline = OneCharInfo.BytesPerLine;
fontXDist = OneCharInfo.XDist;
#ifdef Need_Note
HZ[0] = area1;
HZ[1] = 0;
sprintf(hzkprefix_tmp, hzkcharinfo_2, fontsize, fontXDist, byteline, fontname, 0, area1, HZ, (unsigned char)area1-0x20);
#else
sprintf(hzkprefix_tmp, hzkcharinfo_2, fontsize, fontXDist, byteline, fontname, 0, (unsigned char)area1-0x20);
#endif
}
// 2005-8-27 22:04:26
WirteHZKFile(hzkprefix_tmp, strlen(hzkprefix_tmp), fp);
memset(hzkprefix_tmp, 0, strlen(hzkprefix_tmp));
}
offset = 0x5f;
for(area1 = 0xa1; area1 < 0xf8; area1++){
if(area1 > 0xa9 && area1 < 0xb0) continue;
for(area2 = 0xa1; area2 < 0xff; area2++)
{
if(!GetHZCharIsOut(area1, area2)) continue;
OneCharInfo = GetOneCharInfo(area1, area2);
fontsize = OneCharInfo.XSize;
byteline = OneCharInfo.BytesPerLine;
fontXDist = OneCharInfo.XDist;
#ifdef Need_Note
HZ[0] = area1;
HZ[1] = area2;
HZ[2] = 0;
sprintf(hzkprefix_tmp, hzkcharinfo_2, fontsize, fontXDist, byteline, fontname, area1, area2, HZ, ++offset);
#else
sprintf(hzkprefix_tmp, hzkcharinfo_2, fontsize, fontXDist, byteline, fontname, area1, area2);
#endif
WirteHZKFile(hzkprefix_tmp, strlen(hzkprefix_tmp), fp);
memset(hzkprefix_tmp, 0, strlen(hzkprefix_tmp));
}
}
WirteHZKFile(hzksuffix, strlen(hzksuffix), fp);
return 1;
}
bool GenOneFontHZ(int area1, int area2)
{
int i = 0, j = 0, pixelPoint = 0;
SIZE SizeChar;
unsigned char HZ[3];
char buf[1000], tmpbuf[10];
//memset(buf, 0, 1000);
//memset(tmpbuf, 0, 100);
buf[0] = 0;
tmpbuf[0] = 0;
HZ[0] = area1;
HZ[1] = area2;
HZ[2] = 0x0;
TextOut(hDC, 0, 0, (LPCTSTR)HZ, strlen((const char *)HZ));
GetTextExtentPoint(hDC, (LPCTSTR)HZ, strlen((const char *)HZ), &SizeChar);
sprintf(buf, "/* %s 0x%02x%02x*/", HZ, area1, area2);
int OldCharCx = SizeChar.cx;
if(SizeChar.cx % 8) SizeChar.cx = (SizeChar.cx + 7) & 0xffff8;
fontsize = SizeChar.cy;
byteline = SizeChar.cx / 8;
if(area2 == 0){
sprintf(hzkprefix_long_tmp, hzkprefix, fontname, area2, area1, SizeChar.cy*SizeChar.cx, buf);
}
else{
sprintf(hzkprefix_long_tmp, hzkprefix, fontname, area1, area2, SizeChar.cy*SizeChar.cx, buf);
}
WirteHZKFile(hzkprefix_long_tmp, strlen(hzkprefix_long_tmp), fp);
memset(hzkprefix_long_tmp, 0, strlen(hzkprefix_long_tmp));
memset(buf, 0, strlen(buf));
for(i = 0; i < SizeChar.cy; i++)
{
for(j = 0; j< SizeChar.cx; j++)
{
if(j !=0 && (j % 8 == 0)) strcat(buf, ",");
if(j > (OldCharCx-1)){
sprintf(tmpbuf, "%c", '_');
strcat(buf, tmpbuf);
}
else if((pixelPoint = GetPixel(hDC, j, i))){
sprintf(tmpbuf, "%c", '_');
strcat(buf, tmpbuf);
}
else if (pixelPoint == 0){
sprintf(tmpbuf, "%c", 'X');
strcat(buf, tmpbuf);
}
}
strcat(buf, ",");
sprintf(hzkprefix_long_tmp, "%s", buf);
WirteHZKFile(hzkprefix_long_tmp, strlen(hzkprefix_long_tmp), fp);
memset(hzkprefix_long_tmp, 0, strlen(hzkprefix_long_tmp));
memset(buf, 0, strlen(buf));
}
WirteHZKFile(hzksuffix, strlen(hzksuffix), fp);
return 1;
}
bool GenAllFontHZ()
{
HWND char_progress = 0;
// char* lpCharTest = (char*)malloc(100 * sizeof(char));
// free(lpCharTest);
if((fp = fopen(fontfile, "wb")) == NULL){
MessageBox(g_hDlg, "找开文件失败", "failed", 0);
return 0;
}
sprintf(hzkprefix_long_tmp, hzktitleinfo, fontfile, fontname);
WirteHZKFile(hzkprefix_long_tmp, strlen(hzkprefix_long_tmp), fp);
memset(hzkprefix_long_tmp, 0, 1000);
sprintf(hzkprefix_tmp, hzkhead, fontname);
WirteHZKFile(hzkprefix_tmp, strlen(hzkprefix_tmp), fp);
memset(hzkprefix_tmp, 0, 300);
int i = 0, j = 0, CurrentPos = 0;
char_progress = GetDlgItem(g_hDlg, IDC_GENCHARPROGRESS);
int nMinRange = 0, nMaxRange = 0;/* = 0x60 + (0xf8-0xb0+0xaa-0xa1)*(0xff - 0xa1);*/
nMaxRange = GetCharInfoPos(0xf7, 0xfe) - (GetCharInfoPos(0xaf, 0xfe) - GetCharInfoPos(0xaa, 0xfe));
SendMessage(char_progress, PBM_SETRANGE, 0, MAKELPARAM(nMinRange, nMaxRange));
//CHARINFO* lpAllCharInfo = (CHARINFO*)malloc(nMaxRange*sizeof(CHARINFO));
for(i = 0x20; i < 0x80; i++){
if(!GetAscCharIsOut(i)) continue;
GenOneFontHZ(i, 0);
SendMessage(char_progress, PBM_SETPOS, ++CurrentPos, 0);
}
int BytePos = 0;
for(i = 0xa1; i < 0xf8; i++){
if(i > 0xa9 && i < 0xb0) continue;
for(j = 0xa1; j < 0xff; j++){
if(!GetHZCharIsOut(i, j)) continue;
GenOneFontHZ(i, j);
SendMessage(char_progress, PBM_SETPOS, CurrentPos++, 0);
}
}
char* lastPropName = NULL;
GenAllCharInfo();
lastPropName = GenFontPropInfo();
GenFontInfo(lastPropName);
free(lastPropName);
fclose(fp);
return 1;
}
bool ShowGenFontHZDlg()
{
int i = 0, j = 0;
DialogBox(g_hInst, (LPCTSTR)IDD_GENALLFONT, 0, (DLGPROC)GenAllFontProc);
return 1;
}
///////////////////////////////////////////////////////////////////////
//
// 函数名 : SetOutputAllAsc
// 功能描述 : 设定输出指定范围的ASCII字符...
// 参数 : char range1
// 参数 : char range2
// 返回值 : bool
//
///////////////////////////////////////////////////////////////////////
bool SetOutputAllAsc(char range1, char range2)
{
if(range1 < 0x20 || range1 > 0x80) return 0;
if(range2 < 0x20 || range2 > 0x80) return 0;
for(int i = range1; i <= range2; i++){
OutputCharFlag[(i-0x20)/32] |= (1 << (i-0x20)%32);
}
return 1;
}
///////////////////////////////////////////////////////////////////////
//
// 函数名 : GenOutPutCharLin
// 功能描述 : 产生输出字符的链表, 在OutputCharFlag数组中将相应为置1.
// 参数 : unsigned char* OutputChar
// 返回值 : bool
//
///////////////////////////////////////////////////////////////////////
bool GenOutPutCharLin(unsigned char* OutputChar)
{
int BytePos = 0;
int len = strlen((const char *)OutputChar);
if(OutputChar != NULL){
for(i = 0; i < len; i++)
{
//ascii字符...
if(OutputChar[i] < 0x80 && OutputChar[i] > 0x1f){
OutputCharFlag[(OutputChar[i]-0x20)/32] |= (1 << (OutputChar[i]-0x20)%32);
}
else if(OutputChar[i] >= 0xa1){
BytePos = (OutputChar[i]-0xa1)*94 + (OutputChar[++i] - 0xa1) + 0x60;
OutputCharFlag[BytePos/32] |= (1 << BytePos%32);
}
}
}
return 1;
}
///////////////////////////////////////////////////////////////////////
//
// 函数名 : GetFontNameAndFile
// 功能描述 : 获取字体名及生成的.C字体文件名...
// 参数 : HWND hDlg
// 参数 : const LOGFONT& logfont
// 返回值 : bool
//
///////////////////////////////////////////////////////////////////////
bool GetFontNameAndFile(HWND hDlg, const LOGFONT& logfont)
{
GetDlgItemText(hDlg, IDC_EDITFONTNAME, fontname, 100);
if(!(signed int)strlen(fontname)){
MessageBox(hDlg, "请选择字体, 字体名不能为空!", "警告", 0);
return 0;
}
for(i = 0; i < FONTKING; i++)
{
if(!strcmp(fontname, fontNameStruct[i].fontName_cn)){
strcpy(fontname, fontNameStruct[i].fontName_en);
break;
}
if(fontname[0] == '@'){
if(!strcmp(fontname+1, fontNameStruct[i].fontName_cn)){
strcpy(fontname+1, fontNameStruct[i].fontName_en);
break;
}
}
}
for(i = 0; i < (signed int)strlen(fontname); i++)
{
if((unsigned char)fontname[i] > 0xa1){
MessageBox(hDlg, "字体文件名不能包含中文!", "警告", 0);
return 0;
}
if(fontname[i] == 0x20){
fontname[i] = '_';
}
}
SetDlgItemText(hDlg, IDC_EDITFONTNAME, fontname);
sprintf(fontfile, "%s_%d.c", fontname, abs(logfont.lfHeight));
sprintf(fontname, "%s_%d", fontname, abs(logfont.lfHeight));
return 1;
}
static HFONT currentfont = 0;
// Mesage handler for about box.
LRESULT CALLBACK GenAllFontProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
int pixelPoint = 0;
static CHOOSEFONT choosefont;
static LOGFONT logfont;
//HWND hwndFontName = 0;
switch (message)
{
case WM_INITDIALOG:
{
g_hDlg = hDlg;
SetDlgItemText(hDlg, IDC_EDITFONTNAME, "选择字体后输入字体名!");
return TRUE;
}
case WM_COMMAND:
if(LOWORD(wParam) == IDOK)
{
hDC = GetDC(hDlg);
if(currentfont != 0) SelectObject(hDC, currentfont);
if(!GetFontNameAndFile(hDlg, logfont)) break;
SetCursor(LoadCursor(NULL, IDC_WAIT));
//初始化所有字符均为输出字符...
for(i = 0; i < 300; i++){
OutputCharFlag[i] = 0xffffffff;
}
InvalidateRect(hDlg, 0, 0);
GenAllFontHZ();
SetCursor(LoadCursor(NULL, IDC_ARROW));
MessageBox(g_hDlg, "导出GBK码.C文件成功!", "成功导出!", 0);
ReleaseDC(hDlg, hDC);
if(currentfont != 0) DeleteObject(currentfont);
}
else if(LOWORD(wParam) == IDC_CHOOSEFONT){
choosefont.lStructSize = 0x3c;
choosefont.hwndOwner = hDlg;
choosefont.lpLogFont = &logfont;
choosefont.lpfnHook = NULL;
choosefont.Flags = 0x4b & ~CF_ENABLEHOOK;
choosefont.iPointSize = 10;
ChooseFont(&choosefont);
currentfont = CreateFontIndirect(choosefont.lpLogFont);
SetDlgItemText(hDlg, IDC_EDITFONTNAME, logfont.lfFaceName);
if(!GetFontNameAndFile(hDlg, logfont)) break;
}
else if(LOWORD(wParam) == IDCHOOSETEXT)
{
if(!GetFontNameAndFile(hDlg, logfont)) break;
DialogBox(g_hInst, (LPCTSTR)IDD_DIALOGTEXT, 0, (DLGPROC)ChooseFontProc);
}
else if(LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}
// Mesage handler for about box.
LRESULT CALLBACK ChooseFontProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
char OutputChar[9000];
RECT winRect, winRect2;
// static HFONT currentfont = 0;
switch (message)
{
case WM_INITDIALOG:
{
GetWindowRect(g_hDlg, &winRect);
GetWindowRect(hDlg, &winRect2);
MoveWindow(hDlg, winRect.left, winRect.top+100, winRect2.right-winRect2.left, winRect2.bottom-winRect2.top, 1);
//GetDlgItem(IDD_GENALLFONT
SetDlgItemText(hDlg, IDC_EDITCHOSETEXT, "请输入自定义的字符!");
return TRUE;
}
case WM_COMMAND:
if(LOWORD(wParam) == IDOK)
{
hDC = GetDC(g_hDlg);
if(currentfont != 0) SelectObject(hDC, currentfont);
memset(OutputChar, 0, 9000);
GetDlgItemText(hDlg, IDC_EDITCHOSETEXT, OutputChar, 9000);
SetCursor(LoadCursor(NULL, IDC_WAIT));
//初始化所有字符均为不输出字符...
for(i = 0; i < 300; i++){
OutputCharFlag[i] = 0;
}
GenOutPutCharLin((unsigned char *)OutputChar);
if(SendMessage(GetDlgItem(hDlg, IDC_CHECKALLASC), BM_GETSTATE, 0, 0) == BST_CHECKED)
{
SetOutputAllAsc(0x20, 0x7f);
}
InvalidateRect(g_hDlg, 0, 0);
GenAllFontHZ();
EndDialog(hDlg, LOWORD(wParam));
SetCursor(LoadCursor(NULL, IDC_ARROW));
MessageBox(g_hDlg, "导出GBK码.C文件成功!", "成功导出!", 0);
if(currentfont != 0) DeleteObject(currentfont);
ReleaseDC(g_hDlg, hDC);
}
else if(LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -