📄 fonttestdlg.cpp
字号:
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 + -