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

📄 fonttestdlg.cpp

📁 万能字库生成工具: 将UNICODE
💻 CPP
📖 第 1 页 / 共 3 页
字号:

		return;
	}
}

void CreateFont_Proc(LPVOID lpParam)
{
	CFontTestDlg * pDlg = (CFontTestDlg *)lpParam;
	pDlg ->CreateFontLibrary();
}

/*
描述:
	1. 生成字库所需要的条件有:字库编码类型(决定字符的起始编码)、
		点阵范围(决定占用的内存大小)、色彩数(决定是否彩色); 
*/
bool CFontTestDlg::CreateFontLibrary(int nCreateType)
{
//字库文件
	CString szFile;
	GetDlgItem(IDC_EDIT_FONT_LIBRARY_URL) ->GetWindowText(szFile);
	if(szFile.IsEmpty())
		return false;
	CFile * pTempFile = NULL;
	CFile * pLibraryFile = NULL;
	try
	{
		pTempFile = new CFile(_T(FILE_TEMP_TRAN), CFile::modeCreate | CFile::modeReadWrite);
		pLibraryFile = new CFile((LPCTSTR)szFile, CFile::modeCreate | CFile::modeWrite);
	}
	catch(CFileException * pl)
	{
		delete pTempFile;
		delete pLibraryFile;
		
		return false;
	}
	
//初始化
	FreeResource();
	GetDlgItem(IDC_BUTTON_CREATE_FONT) ->EnableWindow(FALSE);
	GetDlgItem(IDC_BUTTON_APPLY) ->EnableWindow(FALSE);
	GetDlgItem(IDC_BUTTON_NEXT) ->EnableWindow(FALSE);
	GetDlgItem(IDC_BUTTON_STOP) ->EnableWindow(FALSE);
	m_nCurHandSel = 0;
	
	bool bReturn = false;
	FONT_SHOW_SIZE sizeFont;
	memset(&sizeFont, 0x00, sizeof(FONT_SHOW_SIZE));
	bReturn = GetFontSize(sizeFont);
	int nMemBuf = sizeFont.memSize.cx * sizeFont.memSize.cy * sizeFont.colorUnit/8;
	BYTE * pMemBuf = (BYTE *)malloc(sizeof(BYTE) * nMemBuf);
	memset(pMemBuf, 0x00, sizeof(BYTE) * nMemBuf);

	memset(m_byShowBuf, 0x00, sizeof(BYTE)*TRAN_FILE_BUF_LEN);
	m_fontCurve.ShowGridData((BSTR*)m_byShowBuf, (short)sizeFont.memSize.cx, 
		(short)sizeFont.memSize.cx, m_nShowType);
	
//创建指定格式的字体、位图并分配内存
	CClientDC clientDC(this);
	CFont showFont;
	CBitmap memBmp;
	CDC memDC;

	memDC.CreateCompatibleDC(&clientDC);		//创建内存设备环境
	CString strFontSel;
	m_ctlFontSel.GetWindowText(strFontSel);
	showFont.CreateFont(sizeFont.fontSize.cy, 
				(sizeFont.fontSize.cx+1)/2,
				0,
				0,
				FW_NORMAL,
				FALSE,
				FALSE,
				FALSE,
				DEFAULT_CHARSET,
				OUT_TT_PRECIS,
				CLIP_TT_ALWAYS,
				PROOF_QUALITY,
				DEFAULT_PITCH,
				(LPCTSTR)strFontSel);//m_logFont.lfFaceName);
	memBmp.CreateBitmap(sizeFont.memSize.cx, 
				sizeFont.memSize.cy,
				1,
				sizeFont.colorUnit,
				NULL);
	CFont * pOldFont = memDC.SelectObject(&showFont);
	CBitmap * pOldBitmap = memDC.SelectObject(&memBmp);

	CString strUnicode, strBig5, strGB2312, strGBK, strGB18030;
	strUnicode.LoadString(IDS_RES_UNICODE);
	strBig5.LoadString(IDS_RES_BIG5);
	strGB2312.LoadString(IDS_RES_GB2312);
	strGBK.LoadString(IDS_RES_GBK);
	strGB18030.LoadString(IDS_RES_GB18030);

	int nSel = m_ctlCombox.GetCurSel();
	CString codeStr;
	m_ctlCombox.GetLBText(nSel, codeStr);
	TCHAR beginCh = 0x00;
	TCHAR endCh = 0x00;
	TCHAR constBeginCh = 0x00;

	if(codeStr == strUnicode)
	{
		beginCh = UNICODE_BEGIN;
		endCh = UNICODE_END;
	}
	else if(codeStr == strGB2312)
	{
		beginCh = GB2312_BEGIN;
		endCh = GB2312_END;
	}
	else if(codeStr == strGBK)
	{
		beginCh = GBK_BEGIN;
		endCh = GBK_END;
	}
	else if(codeStr == strBig5) 
	{
		beginCh = BIG5_BEGIN;
		endCh = BIG5_END;
	}
	else if(codeStr == strGB18030)
	{
		beginCh = GBK_BEGIN;
		endCh = GBK_END;
	}
	constBeginCh = beginCh;

//生成字库文件
	CRect rect;
	rect.left = rect.top = 0;
	CWnd * pWnd = GetDlgItem(IDC_EDIT_SHOW);
	pWnd ->GetWindowRect(rect);
	ScreenToClient(rect);

	WORD wTran = 0;
	TCHAR tcTemp = 0x0000;
	TCHAR tcTempGBK = 0x0000;
	LCID dwLang = GetUserDefaultLangID();
	bool bTran = false;
	int nReturn = 0;
	FONT_DIFF_OFFSET * pDiff = NULL;
	int nDiffCount = 0;

	if(nCreateType == SOURCE_ALL_CODE)
	{
		for(; beginCh <= endCh; beginCh ++)
		{
			if((codeStr == strGB2312) || (codeStr == strGBK) || (codeStr == strGB18030))
			{	
				bTran = TranGBKAndUnicode(beginCh, tcTemp, FROM_GBK_TO_UNICODE);
				if(!bTran)
				{
					nDiffCount ++;
					pDiff = new FONT_DIFF_OFFSET;
					pDiff->realOffset = beginCh - constBeginCh;
					pDiff ->diffCount = nDiffCount;
					m_offSetDiffList.AddTail(pDiff);
					
					m_nMaxOffset = pDiff->realOffset;
					
					continue;
				}
			}
			else if(codeStr == strBig5)
			{
				bTran = TranGBKAndBig5(tcTempGBK, beginCh, FROM_BIG5_TO_GBK);
				{
					if(!bTran)
					{
						nDiffCount ++;
						pDiff = new FONT_DIFF_OFFSET;
						pDiff->realOffset = beginCh - constBeginCh;
						pDiff ->diffCount = nDiffCount;
						m_offSetDiffList.AddTail(pDiff);

						m_nMaxOffset = pDiff->realOffset;
						
						continue;
					}
					else
					{
						TranGBKAndUnicode(tcTempGBK, tcTemp, FROM_GBK_TO_UNICODE);
					}
				}
			}
			else if(codeStr == strUnicode)
			{
				tcTemp = beginCh;
			}
			
			WideCharToMultiByte(
				CP_ACP,
				0,
				&tcTemp,
				1,
				(char *)&wTran,
				2,
				NULL,
				NULL);
			
			memDC.FillSolidRect(0, 0, sizeFont.memSize.cx, sizeFont.memSize.cy, RGB(255,255,255));
			memDC.TextOut(0, 0, &tcTemp, 1);
			clientDC.BitBlt(125, 125, sizeFont.fontSize.cx, sizeFont.fontSize.cy, 
				&memDC, rect.left, rect.top, SRCCOPY);  
			memBmp.GetBitmapBits(nMemBuf, pMemBuf);
			
			pTempFile ->Write(pMemBuf, nMemBuf);
		}
	}
	else if((nCreateType == SOURCE_HAND_EDIT) || (nCreateType == SOURCE_SELECT_FILE))
	{
		CString strSource;
		m_ctlEditSource.GetWindowText(strSource);     //直接得到的是UNICODE码
		int nSourceLen = strSource.GetLength();
		TCHAR * pSource = (LPTSTR)(LPCTSTR)strSource;

		
		for(int i = 0; i < nSourceLen ; i++)
		{
			tcTemp = pSource[i];
			WideCharToMultiByte(
				CP_ACP,
				0,
				&tcTemp,
				1,
				(char *)&wTran,
				2,
				NULL,
				NULL);
			
			memDC.FillSolidRect(0, 0, sizeFont.memSize.cx, sizeFont.memSize.cy, RGB(255,255,255));
			memDC.TextOut(0, 0, &tcTemp, 1);
			clientDC.BitBlt(125, 125, sizeFont.fontSize.cx, sizeFont.fontSize.cy, 
				&memDC, rect.left, rect.top, SRCCOPY);  
			memBmp.GetBitmapBits(nMemBuf, pMemBuf);
			
			pTempFile ->Write(pMemBuf, nMemBuf);
		}
		
	}
	TranFile(pLibraryFile, pTempFile);

//退出
	memDC.SelectObject(pOldFont);
	memDC.SelectObject(pOldBitmap);
	free(pMemBuf);
	delete pTempFile;
	delete pLibraryFile;

	SetFileAttributes(_T(FILE_TEMP_TRAN), FILE_ATTRIBUTE_NORMAL);
	DeleteFile(_T(FILE_TEMP_TRAN));

	GetDlgItem(IDC_BUTTON_APPLY) ->EnableWindow(TRUE);
	GetDlgItem(IDC_BUTTON_NEXT) ->EnableWindow(TRUE);
	GetDlgItem(IDC_BUTTON_STOP) ->EnableWindow(TRUE);
	GetDlgItem(IDC_BUTTON_CREATE_FONT) ->EnableWindow(TRUE);

	return true;
}

bool CFontTestDlg::TranFile(CFile * pDesFile, CFile * pSrcFile)
{
	ASSERT((pDesFile != NULL) && (pSrcFile != NULL));

	BYTE	tempBuf[TRAN_FILE_BUF_LEN] = {0};
	DWORD dwDesFile = pSrcFile->GetLength();
	int nCir = (dwDesFile%TRAN_FILE_BUF_LEN == 0) ? (dwDesFile/TRAN_FILE_BUF_LEN) :
				(dwDesFile/TRAN_FILE_BUF_LEN + 1);
	DWORD dwRead = 0, dwSum = 0;
	for(int i = 0; i < nCir; i++)
	{
		memset(tempBuf, 0x00, TRAN_FILE_BUF_LEN);
		pSrcFile ->Seek(dwSum, CFile::begin);
		dwRead = pSrcFile ->Read(tempBuf, TRAN_FILE_BUF_LEN);

		for(DWORD j = 0; j < dwRead; j++)
			tempBuf[j] = ~tempBuf[j];
		
		pDesFile ->Seek(dwSum, CFile::begin);
		pDesFile ->Write(tempBuf, dwRead);
		
		dwSum += dwRead;
	}

	return true;
}

void CFontTestDlg::OnSelectFile() 
{
	CFileDialog dlg(true);
	
	int nSel = dlg.DoModal();
	if(nSel == IDCANCEL)
		return;

	m_ctlEditSource.SetWindowText(_T(""));	
	
	m_strSourceFile = dlg.GetPathName();
	if(m_strSourceFile.IsEmpty())
	 return;
 
	CFile fl;
	CFileException p;
	BYTE bySelectFileBuf[TRAN_FILE_BUF_LEN+1] = {0};
	TCHAR tcTranBuf[TRAN_FILE_BUF_LEN] = {0};	
	int dwSum = 0;
	int dwRead = 0;
	BYTE  tempBuf[TEST_CODE_LENGTH] = {0};
	TCHAR tempTchar[TEST_CODE_LENGTH] = {0};
	BYTE byCir = 0x00;
	if(fl.Open(m_strSourceFile, CFile::modeRead, &p))
	{
		dwSum = fl.GetLength();
		for(int i = 0; i < dwSum; i+=TRAN_FILE_BUF_LEN)
		{
			memset(tcTranBuf, 0x0000, TRAN_FILE_BUF_LEN);
			fl.Seek(i, CFile::begin);
			if(byCir == 0x00)
			{
				dwRead = fl.ReadHuge(bySelectFileBuf, TRAN_FILE_BUF_LEN*sizeof(BYTE));
			}
			else
			{
				bySelectFileBuf[0] = byCir;
				dwRead = fl.ReadHuge(bySelectFileBuf+1, TRAN_FILE_BUF_LEN*sizeof(BYTE));
				dwRead ++;
			}

			byCir = 0x00;
			bool bEndFlag = false;
			int j = 0;
			for(j = 0; j < dwRead ; j++)
			{
				if(bySelectFileBuf[j] > 0x7F)
				{
					j++;
					if(j == dwRead)
						bEndFlag = true;
				}
			}
			if(bEndFlag)
			{
				byCir = bySelectFileBuf[dwRead -1];
				dwRead --;
			}

			for(j = 0; j < dwRead; j ++)
			{
				memset(tempBuf, 0x00, TEST_CODE_LENGTH);
				if(bySelectFileBuf[j] > 0x7F)
				{
					memcpy(tempBuf, bySelectFileBuf+j, 2);
					j++;
				}
				else
				{
					memcpy(tempBuf, bySelectFileBuf+j, 1);
				}
				MultiByteToWideChar(CP_ACP,0,(char*)tempBuf,2,tempTchar,1);
				_tcscat(tcTranBuf, tempTchar);
			}
			m_ctlEditSource.SetSel(m_ctlEditSource.GetWindowTextLength(),m_ctlEditSource.GetWindowTextLength());
			m_ctlEditSource.ReplaceSel((LPCTSTR)tcTranBuf);
		}
		fl.Close();
	}
}

void CFontTestDlg::OnSelchangeComboSource() 
{
	 int nSel = m_ctlSourceFrom.GetCurSel();

	 if(nSel == SOURCE_SELECT_FILE)
	 {
		 GetDlgItem(IDC_BUTTON_SELECT_FILE) ->EnableWindow(TRUE);
		 GetDlgItem(IDC_EDIT_BEGIN_CODE) ->EnableWindow(TRUE);

		 GetDlgItem(IDC_EDIT_SOURCE) ->EnableWindow(FALSE);
	 }
	 else if(nSel == SOURCE_HAND_EDIT)
	 {
		GetDlgItem(IDC_BUTTON_SELECT_FILE) ->EnableWindow(FALSE);	
		GetDlgItem(IDC_EDIT_BEGIN_CODE) ->EnableWindow(FALSE);

		GetDlgItem(IDC_EDIT_SOURCE) ->EnableWindow(TRUE);
		m_ctlEditSource.SetFocus();
	 }
	 else
	 {
		GetDlgItem(IDC_BUTTON_SELECT_FILE) ->EnableWindow(FALSE);
		GetDlgItem(IDC_EDIT_BEGIN_CODE) ->EnableWindow(TRUE);
		GetDlgItem(IDC_EDIT_SOURCE) ->EnableWindow(FALSE);
	 }
	
}

void CFontTestDlg::OnFileUrl()
{
	GetDlgItem(IDC_EDIT_FONT_LIBRARY_URL) ->SetWindowText((LPCTSTR)_T(""));
	
	CFileDialog dlg(FALSE, _T("txt"), _T("library"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
		_T("Text files(*.txt)||"), NULL);
	if(dlg.DoModal() == IDCANCEL)
		return;
	
	CString szFile = dlg.GetPathName();
	GetDlgItem(IDC_EDIT_FONT_LIBRARY_URL) ->SetWindowText((LPCTSTR)szFile);
}

⌨️ 快捷键说明

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