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

📄 ucguifontgen.cpp

📁 ucgui中文字体转换工具
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -