FontTestDlg.cpp
上传用户:sz81710966
上传日期:2013-03-01
资源大小:409k
文件大小:30k
源码类别:

多国语言处理

开发平台:

Visual C++

  1. /***********************************************************************************
  2. 注意:
  3. 1. 在程序编译时要注意对UNICODE码的支持(就是要添加宏:_UNICODE);
  4. 2. 在"Setting/link/Customize"中添加 :/nologo /entry:"wWinMainCRTStartup" ,
  5.    否则编译出错;
  6. 3. 将所有编码都转换成相应的unicode码进行显示和操作;
  7. 4. 此函数对于四字节的Uincide或者GB18030缺乏支持,在以后会作以补充; 
  8.  
  9. 修改:
  10. 原因:去掉CNumspinCtrl类对象,此类在UNICODE宏作用下比较异常
  11. ***********************************************************************************/
  12. #include "stdafx.h"
  13. #include "FontTest.h"
  14. #include "FontTestDlg.h"
  15. #include "..includeGBKUNICODE.h"
  16. #include "..includeGBKBIG5.h"
  17. //#include "..includeOutputHead.h"
  18. #ifdef _DEBUG
  19. #define new DEBUG_NEW
  20. #undef THIS_FILE
  21. static char THIS_FILE[] = __FILE__;
  22. #endif
  23. void CreateFont_Proc(LPVOID lpParam);
  24. /////////////////////////////////////////////////////////////////////////////
  25. // CAboutDlg dialog used for App About
  26. class CAboutDlg : public CDialog
  27. {
  28. public:
  29. CAboutDlg();
  30. // Dialog Data
  31. //{{AFX_DATA(CAboutDlg)
  32. enum { IDD = IDD_ABOUTBOX };
  33. //}}AFX_DATA
  34. // ClassWizard generated virtual function overrides
  35. //{{AFX_VIRTUAL(CAboutDlg)
  36. protected:
  37. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  38. //}}AFX_VIRTUAL
  39. // Implementation
  40. protected:
  41. //{{AFX_MSG(CAboutDlg)
  42. //}}AFX_MSG
  43. DECLARE_MESSAGE_MAP()
  44. };
  45. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  46. {
  47. //{{AFX_DATA_INIT(CAboutDlg)
  48. //}}AFX_DATA_INIT
  49. }
  50. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  51. {
  52. CDialog::DoDataExchange(pDX);
  53. //{{AFX_DATA_MAP(CAboutDlg)
  54. //}}AFX_DATA_MAP
  55. }
  56. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  57. //{{AFX_MSG_MAP(CAboutDlg)
  58. // No message handlers
  59. //}}AFX_MSG_MAP
  60. END_MESSAGE_MAP()
  61. /////////////////////////////////////////////////////////////////////////////
  62. // CFontTestDlg dialog
  63. CFontTestDlg::CFontTestDlg(CWnd* pParent /*=NULL*/)
  64. : CDialog(CFontTestDlg::IDD, pParent)
  65. {
  66. //{{AFX_DATA_INIT(CFontTestDlg)
  67. m_strBeginCode = _T("");
  68. m_nFontHeight = 16;
  69. m_nFontWidth = 16;
  70. //}}AFX_DATA_INIT
  71. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  72. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  73. m_nAddOrDelete = -1;
  74. m_pFont = new BYTE[TEST_CODE_LENGTH];
  75. memset(m_pFont, 0x00, TEST_CODE_LENGTH*sizeof(BYTE));
  76. m_nPrevCX = 0;
  77. m_nPrevCY = 0;
  78. m_nShowType = 0;
  79. m_fontHandle = NULL;
  80. m_dwThreadID = 0;
  81. m_nMemWidth = LEN_WIDTH_INIT;
  82. m_nMaxOffset = 0;
  83. m_nCurHandSel = 0;
  84. memset(m_byShowBuf, 0x00, TRAN_FILE_BUF_LEN*sizeof(BYTE));
  85. }
  86. void CFontTestDlg::DoDataExchange(CDataExchange* pDX)
  87. {
  88. CDialog::DoDataExchange(pDX);
  89. //{{AFX_DATA_MAP(CFontTestDlg)
  90. DDX_Control(pDX, IDC_EDIT_SOURCE, m_ctlEditSource);
  91. DDX_Control(pDX, IDC_COMBO_SOURCE, m_ctlSourceFrom);
  92. DDX_Control(pDX, IDC_COMBO_FONT, m_ctlFontSel);
  93. DDX_Control(pDX, IDC_COMBO_FONT_COLOR, m_ctlFontColor);
  94. DDX_Control(pDX, IDC_SPIN_FONT_WIDTH, m_spinWidth);
  95. DDX_Control(pDX, IDC_SPIN_FONT_HEIGHT, m_spinHeight);
  96. DDX_Control(pDX, IDC_COMBO_CODE_TYPE, m_ctlCombox);
  97. DDX_Control(pDX, IDC_EDIT_CODE, m_ctlCode);
  98. DDX_Control(pDX, IDC_EDIT_SHOW, m_ctlEdit);
  99. DDX_Text(pDX, IDC_EDIT_BEGIN_CODE, m_strBeginCode);
  100. DDV_MaxChars(pDX, m_strBeginCode, 6);
  101. DDX_Control(pDX, IDC_FONT_CURVE, m_fontCurve);
  102. DDX_Text(pDX, IDC_EDIT_FONT_HEIGHT, m_nFontHeight);
  103. DDX_Text(pDX, IDC_EDIT_FONT_WIDTH, m_nFontWidth);
  104. //}}AFX_DATA_MAP
  105. }
  106. BEGIN_MESSAGE_MAP(CFontTestDlg, CDialog)
  107. //{{AFX_MSG_MAP(CFontTestDlg)
  108. ON_WM_SYSCOMMAND()
  109. ON_WM_PAINT()
  110. ON_WM_QUERYDRAGICON()
  111. ON_BN_CLICKED(IDC_BUTTON_STOP, OnButtonStop)
  112. ON_BN_CLICKED(IDC_BUTTON_NEXT, OnButtonNext)
  113. ON_BN_CLICKED(IDC_BUTTON_APPLY, OnButtonApply)
  114. ON_CBN_SELCHANGE(IDC_COMBO_CODE_TYPE, OnSelchangeComboCodeType)
  115. ON_WM_SIZE()
  116. ON_EN_CHANGE(IDC_EDIT_FONT_WIDTH, OnChangeEditFontWidth)
  117. ON_EN_CHANGE(IDC_EDIT_FONT_HEIGHT, OnChangeEditFontHeight)
  118. ON_BN_CLICKED(IDC_BUTTON_CREATE_FONT, OnCreateFont)
  119. ON_BN_CLICKED(IDC_BUTTON_SELECT_FILE, OnSelectFile)
  120. ON_CBN_SELCHANGE(IDC_COMBO_SOURCE, OnSelchangeComboSource)
  121. ON_BN_CLICKED(IDC_BUTTON_FILE_URL, OnFileUrl)
  122. //}}AFX_MSG_MAP
  123. END_MESSAGE_MAP()
  124. /////////////////////////////////////////////////////////////////////////////
  125. // CFontTestDlg message handlers
  126. BOOL CFontTestDlg::OnInitDialog()
  127. {
  128. CDialog::OnInitDialog();
  129. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  130. ASSERT(IDM_ABOUTBOX < 0xF000);
  131. CMenu* pSysMenu = GetSystemMenu(FALSE);
  132. if (pSysMenu != NULL)
  133. {
  134. CString strAboutMenu;
  135. strAboutMenu.LoadString(IDS_ABOUTBOX);
  136. if (!strAboutMenu.IsEmpty())
  137. {
  138. pSysMenu->AppendMenu(MF_SEPARATOR);
  139. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  140. }
  141. }
  142. CString str;
  143. str.LoadString(IDS_TITLE);
  144. SetWindowText(str);
  145. SetIcon(m_hIcon, TRUE);  
  146. SetIcon(m_hIcon, FALSE);
  147. InitParameter();
  148. return TRUE;  
  149. }
  150. void CFontTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
  151. {
  152. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  153. {
  154. CAboutDlg dlgAbout;
  155. dlgAbout.DoModal();
  156. }
  157. else
  158. {
  159. CDialog::OnSysCommand(nID, lParam);
  160. }
  161. }
  162. void CFontTestDlg::OnPaint() 
  163. {
  164. if (IsIconic())
  165. {
  166. CPaintDC dc(this); 
  167. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  168. int cxIcon = GetSystemMetrics(SM_CXICON);
  169. int cyIcon = GetSystemMetrics(SM_CYICON);
  170. CRect rect;
  171. GetClientRect(&rect);
  172. int x = (rect.Width() - cxIcon + 1) / 2;
  173. int y = (rect.Height() - cyIcon + 1) / 2;
  174. dc.DrawIcon(x, y, m_hIcon);
  175. }
  176. else
  177. {
  178. CDialog::OnPaint();
  179. }
  180. }
  181. HCURSOR CFontTestDlg::OnQueryDragIcon()
  182. {
  183. return (HCURSOR) m_hIcon;
  184. }
  185. ////////////////////////////////////////////////////////////////////////////////
  186. //code self
  187. ////////////////////////////////////////////////////////////////////////////////
  188. bool CFontTestDlg::InitParameter()
  189. {
  190. CString str;
  191. m_langID = GetUserDefaultLangID();
  192. if(m_langID == 0x0804)
  193. {
  194. str.LoadString(IDS_LANG_CHINESE_PRC);
  195. GetDlgItem(IDC_EDIT_LANGUAGE) ->SetWindowText(str);
  196. str.LoadString(IDS_RES_UNICODE);
  197. m_ctlCombox.InsertString(0, (LPCTSTR)str);
  198. str.LoadString(IDS_RES_GB2312);
  199. m_ctlCombox.InsertString(1, (LPCTSTR)str);
  200. str.LoadString(IDS_RES_GBK);
  201. m_ctlCombox.InsertString(2, (LPCTSTR)str);
  202. str.LoadString(IDS_RES_GB18030);
  203. m_ctlCombox.InsertString(3, (LPCTSTR)str);
  204. str.LoadString(IDS_RES_BIG5);
  205. m_ctlCombox.InsertString(4, (LPCTSTR)str);
  206. m_ctlFontSel.SelectString(0, _T("宋体"));
  207. }
  208. else if(m_langID == 0x0404)
  209. {
  210. str.LoadString(IDS_LANG_CHINESE_TAIWAN);
  211. GetDlgItem(IDC_EDIT_LANGUAGE) ->SetWindowText(str);
  212. str.LoadString(IDS_RES_UNICODE);
  213. m_ctlCombox.InsertString(0, (LPCTSTR)str);
  214. str.LoadString(IDS_RES_BIG5);
  215. m_ctlCombox.InsertString(1, (LPCTSTR)str);
  216. m_ctlFontSel.SelectString(0, _T("Arial"));
  217. }
  218. else
  219. {
  220. str.LoadString(IDS_LANG_UNSUPPORT);
  221. GetDlgItem(IDC_EDIT_LANGUAGE) ->SetWindowText(str);
  222. str.LoadString(IDS_RES_UNICODE);
  223. m_ctlCombox.InsertString(0, (LPCTSTR)str);
  224. m_ctlFontSel.SelectString(0, _T("Arial"));
  225. }
  226. str.LoadString(IDS_SOURCE_ALL_CODE);
  227. m_ctlSourceFrom.InsertString(SOURCE_ALL_CODE, str);
  228. str.LoadString(IDS_SOURCE_HAND_EDIT);
  229. m_ctlSourceFrom.InsertString(SOURCE_HAND_EDIT, str);
  230. str.LoadString(IDS_SOURCE_SELECT_FILE);
  231. m_ctlSourceFrom.InsertString(SOURCE_SELECT_FILE, str);
  232. m_ctlSourceFrom.SetCurSel(SOURCE_ALL_CODE);
  233. GetDlgItem(IDC_BUTTON_SELECT_FILE) ->EnableWindow(FALSE);
  234. GetDlgItem(IDC_EDIT_SOURCE) ->EnableWindow(FALSE);
  235. m_ctlCombox.SetCurSel(0);
  236. m_ctlCombox.GetLBText(0,m_strCodeSel);
  237. m_pFont[0] = HIBYTE((WORD)UNICODE_BEGIN);
  238. m_pFont[1] = LOBYTE((WORD)UNICODE_BEGIN);
  239. ShowInfo();
  240. TCHAR szTemp[4] = {0};
  241. str.Empty();
  242. for(int i = 0; i < 2; i++)
  243. {
  244. _stprintf(szTemp, _T("%02X"), m_pFont[i]);
  245. str += szTemp;
  246. }
  247. m_strBeginCode = str;
  248. UpdateData(FALSE);
  249. //m_spinHeight.SetBuddy(&m_ctlFontHeight);
  250. //m_spinHeight.SetRange(LEN_WIDTH_MIN,LEN_WIDTH_MAX);
  251. //m_spinWidth.SetBuddy(&m_ctlFontWidth);
  252. //m_spinWidth.SetRange(LEN_WIDTH_MIN,LEN_WIDTH_MAX);
  253. //m_spinHeight.SetPos(LEN_WIDTH_INIT);
  254. //m_spinHeight.SetDelta(1);
  255. //m_spinWidth.SetPos(LEN_WIDTH_INIT);
  256. //m_spinWidth.SetDelta(1);
  257. str.LoadString(IDS_COLOR_SINGLE);
  258. m_ctlFontColor.InsertString(0, str);
  259. str.LoadString(IDS_COLOR_MULTICOLOR_8);
  260. m_ctlFontColor.InsertString(1, str);
  261. str.LoadString(IDS_COLOR_MULTICOLOR_16);
  262. m_ctlFontColor.InsertString(2, str);
  263. str.LoadString(IDS_COLOR_MULTICOLOR_24);
  264. m_ctlFontColor.InsertString(3, str);
  265. m_ctlFontColor.SetCurSel(0);
  266. GetDlgItem(IDC_BUTTON_APPLY) ->EnableWindow(FALSE);
  267. GetDlgItem(IDC_BUTTON_NEXT) ->EnableWindow(FALSE);
  268. GetDlgItem(IDC_BUTTON_STOP) ->EnableWindow(FALSE);
  269. return true;
  270. }
  271. bool CFontTestDlg::ShowInfo()
  272. {
  273. int nSel = m_ctlSourceFrom.GetCurSel();
  274. if(nSel == SOURCE_ALL_CODE)
  275. {
  276. TCHAR szTemp[4] = {0};
  277. CString str;
  278. WORD wFont = MAKEWORD(m_pFont[1], m_pFont[0]);
  279. if(m_nAddOrDelete == 0)
  280. wFont --;
  281. else if(m_nAddOrDelete == 1)
  282. wFont ++;
  283. else if(m_nAddOrDelete == -1)
  284. wFont += 0;
  285. m_pFont[1] = LOBYTE(wFont);
  286. m_pFont[0] = HIBYTE(wFont);
  287. str.Empty();
  288. for(int i = 0; i < 2; i++)
  289. {
  290. _stprintf(szTemp, _T("%02X"), m_pFont[i]);
  291. str += szTemp;
  292. }
  293. m_ctlCode.SetWindowText(str);
  294. CString strUnicode;
  295. strUnicode.LoadString(IDS_RES_UNICODE);
  296. if(m_strCodeSel != strUnicode)
  297. {
  298. CString strBig5, strGB2312, strGBK, strGB18030;
  299. strBig5.LoadString(IDS_RES_BIG5);
  300. strGB2312.LoadString(IDS_RES_GB2312);
  301. strGBK.LoadString(IDS_RES_GBK);
  302. strGB18030.LoadString(IDS_RES_GB18030);
  303. TCHAR tsFont[TEST_CODE_LENGTH]= {0};
  304. BYTE tempBuf[TEST_CODE_LENGTH]= {0};
  305. bool bTran = false;
  306. TCHAR tcGBK = 0x0000;
  307. TCHAR tcBig5 = 0x0000;
  308. if((m_strCodeSel == strGB2312) ||(m_strCodeSel == strGBK) ||(m_strCodeSel == strGB18030))
  309. {
  310. if(m_langID == 0x0404)
  311. {
  312. tcGBK = (TCHAR)MAKEWORD(m_pFont[1], m_pFont[0]);
  313. bTran = TranGBKAndBig5(tcGBK, tcBig5, FROM_GBK_TO_BIG5);
  314. if(!bTran)
  315. {
  316. m_ctlEdit.SetWindowText(_T(""));
  317. return false;
  318. }
  319. else
  320. {
  321. tempBuf[0] = HIBYTE((WORD)tcBig5);
  322. tempBuf[1] = LOBYTE((WORD)tcBig5);
  323. MultiByteToWideChar(CP_ACP,0,(char*)tempBuf,2,tsFont,1);
  324. }
  325. }
  326. else
  327. {
  328. MultiByteToWideChar(CP_ACP,0,(char*)m_pFont,2,tsFont,1);
  329. }
  330. }
  331. else if(m_strCodeSel == strBig5)
  332. {
  333. if(m_langID == 0x0804)
  334. {
  335. tcBig5 = (TCHAR)MAKEWORD(m_pFont[1], m_pFont[0]);
  336. bTran = TranGBKAndBig5(tcGBK, tcBig5, FROM_BIG5_TO_GBK);
  337. if(!bTran)
  338. {
  339. m_ctlEdit.SetWindowText(_T(""));
  340. return false;
  341. }
  342. else
  343. {
  344. tempBuf[0] = HIBYTE((WORD)tcGBK);
  345. tempBuf[1] = LOBYTE((WORD)tcGBK);
  346. MultiByteToWideChar(CP_ACP,0,(char*)tempBuf,2,tsFont,1);
  347. }
  348. }
  349. else
  350. {
  351. MultiByteToWideChar(CP_ACP,0,(char*)m_pFont,2,tsFont,1);
  352. }
  353. }
  354. m_ctlEdit.SetWindowText((LPCTSTR)tsFont);
  355. }
  356. }
  357. else if((nSel == SOURCE_HAND_EDIT) || (nSel == SOURCE_SELECT_FILE))
  358. {
  359. CString strHandSel;
  360. m_ctlEditSource.GetWindowText(strHandSel);
  361. int nTempHand = m_nCurHandSel; 
  362. CString strTemp = strHandSel.Mid(nTempHand, 1);
  363. m_ctlEdit.SetWindowText(strTemp);
  364. }
  365. return true;
  366. }
  367. bool CFontTestDlg::ShowGridInfo()
  368. {
  369. UpdateData();
  370. int nHeight = m_nFontHeight;//m_spinHeight.GetPos();
  371. int nSourceSel = m_ctlSourceFrom.GetCurSel();
  372. int nOffset = AnalyzeOffset(m_nMemWidth, nHeight, nSourceSel);
  373. if(nOffset == -1)
  374. {
  375. memset(m_byShowBuf, 0x00, sizeof(BYTE)*TRAN_FILE_BUF_LEN);
  376. m_fontCurve.ShowGridData((BSTR*)m_byShowBuf, m_nMemWidth, nHeight, m_nShowType);
  377. return false;
  378. }
  379. PreviewShow(m_nMemWidth, nHeight, nOffset);
  380. return true;
  381. }
  382. void CFontTestDlg::OnButtonStop() 
  383. {
  384. int nSel = m_ctlSourceFrom.GetCurSel();
  385. if(nSel == SOURCE_ALL_CODE)
  386. {
  387. m_nAddOrDelete = 0;
  388. }
  389. else if((nSel == SOURCE_HAND_EDIT) ||(nSel == SOURCE_SELECT_FILE))
  390. {
  391. m_nCurHandSel --;
  392. if(m_nCurHandSel < 0)
  393. m_nCurHandSel = m_ctlEditSource.GetWindowTextLength()-1;
  394. }
  395. ShowInfo();
  396. ShowGridInfo();
  397. }
  398. void CFontTestDlg::OnButtonNext() 
  399. {
  400. int nSel = m_ctlSourceFrom.GetCurSel();
  401. if(nSel == SOURCE_ALL_CODE)
  402. {
  403. m_nAddOrDelete = 1;
  404. }
  405. else if((nSel == SOURCE_HAND_EDIT) ||(nSel == SOURCE_SELECT_FILE))
  406. {
  407. m_nCurHandSel ++;
  408. //GetWindowTextLength()得到的长度包含结尾符""  
  409. if(m_nCurHandSel > (m_ctlEditSource.GetWindowTextLength()-1))
  410. m_nCurHandSel = 0;
  411. }
  412. ShowInfo();
  413. ShowGridInfo();
  414. }
  415. int CFontTestDlg::AnalyzeOffset(int nMemWidth, int nMemHeight, int nSourceType)
  416. {
  417. int nDiff = 0;
  418. if(nSourceType == SOURCE_ALL_CODE)
  419. {
  420. CString strUnicode, strBig5, strGB2312, strGBK, strGB18030;
  421. strUnicode.LoadString(IDS_RES_UNICODE);
  422. strBig5.LoadString(IDS_RES_BIG5);
  423. strGB2312.LoadString(IDS_RES_GB2312);
  424. strGBK.LoadString(IDS_RES_GBK);
  425. strGB18030.LoadString(IDS_RES_GB18030);
  426. WORD wBeginCode = 0x0000;
  427. if(m_strCodeSel == strUnicode)
  428. wBeginCode = (WORD)UNICODE_BEGIN;
  429. else if(m_strCodeSel == strGB2312)
  430. wBeginCode = (WORD)GB2312_BEGIN;
  431. else if(m_strCodeSel == strGBK)
  432. wBeginCode = (WORD)GBK_BEGIN;
  433. else if(m_strCodeSel == strGB18030)
  434. wBeginCode = (WORD)GB18030_BEGIN;
  435. else if(m_strCodeSel == strBig5)
  436. wBeginCode = (WORD)BIG5_BEGIN;
  437. bool bTran = GetCharToWORD();
  438. WORD wTran = MAKEWORD(m_pFont[1], m_pFont[0]);
  439. nDiff = wTran-wBeginCode;
  440. int nPrevOffset = 0;
  441. int nCurOffset = 0;
  442. int nPrevDiff = 0;
  443. FONT_DIFF_OFFSET * pDiff = NULL;
  444. POSITION pos = m_offSetDiffList.GetHeadPosition();
  445. while(pos)
  446. {
  447. pDiff = m_offSetDiffList.GetNext(pos);
  448. nCurOffset = pDiff->realOffset;
  449. if(nDiff > nCurOffset)
  450. {
  451. nPrevOffset = nCurOffset;
  452. nPrevDiff = pDiff->diffCount;
  453. continue;
  454. }
  455. else if(nDiff == nCurOffset)
  456. {
  457. return -1;;
  458. }
  459. else if((nDiff > nPrevOffset) && (nDiff < nCurOffset))
  460. {
  461. nDiff -= nPrevDiff;
  462. break;
  463. }
  464. }
  465. if(nDiff > m_nMaxOffset)
  466. {
  467. nDiff -= nPrevDiff;
  468. }
  469. }
  470. else if((nSourceType = SOURCE_HAND_EDIT) || (nSourceType == SOURCE_SELECT_FILE))
  471. {
  472. nDiff = m_nCurHandSel;
  473. }
  474. return (nDiff*nMemWidth*nMemHeight/8);
  475. }
  476. bool CFontTestDlg::PreviewShow(int nMemWidth, int nMemHeight, int nOffset)
  477. {
  478. CString strLibraryFile;
  479. GetDlgItem(IDC_EDIT_FONT_LIBRARY_URL) ->GetWindowText(strLibraryFile);
  480. int nLen = strLibraryFile.GetLength();
  481. if(nLen == 0)
  482. return false;
  483. CFile fl;
  484. CFileException p;
  485. BOOL bOpen = fl.Open((LPCTSTR)strLibraryFile, CFile::modeRead, &p);
  486. if(!bOpen)
  487. return false;
  488. memset(m_byShowBuf, 0x00, TRAN_FILE_BUF_LEN * sizeof(BYTE));
  489. fl.Seek(nOffset, CFile::begin);
  490. fl.Read(m_byShowBuf, (nMemWidth*nMemWidth)/8);
  491. fl.Close();
  492. m_fontCurve.SetGridHoriNum(nMemWidth);
  493. m_fontCurve.SetGridVerNum(nMemWidth);
  494. m_fontCurve.ShowGridData((BSTR*)m_byShowBuf, nMemWidth, nMemHeight, m_nShowType); 
  495. return false;
  496. }
  497. bool CFontTestDlg::FreeResource()
  498. {
  499. m_nMaxOffset = 0;
  500. POSITION pos = m_offSetDiffList.GetHeadPosition();
  501. while(pos)
  502. {
  503. FONT_DIFF_OFFSET * pDiff = m_offSetDiffList.GetNext(pos);
  504. delete pDiff;
  505. }
  506. m_offSetDiffList.RemoveAll();
  507. return true;
  508. }
  509. void CFontTestDlg::OnCancel() 
  510. {
  511. delete [] m_pFont;
  512. if(m_fontHandle != NULL)
  513. {
  514. CloseHandle(m_fontHandle);
  515. }
  516. FreeResource();
  517. CDialog::OnCancel();
  518. }
  519. bool CFontTestDlg::GetCharToWORD(bool bInitBegin)
  520. {
  521. if(bInitBegin)
  522. {
  523. UpdateData();
  524. LPCTSTR lpLeft = (LPCTSTR)m_strBeginCode;
  525. TCHAR * pLeft = _tcsupr((TCHAR *)lpLeft);
  526. char chFir = LOBYTE(pLeft[0]);
  527. char chSec = LOBYTE(pLeft[1]);
  528. BYTE byFir = isdigit(chFir) ? (chFir - 0x30) : (chFir - 0x37);
  529. BYTE bySec = isdigit(chSec) ? (chSec - 0x30) : (chSec - 0x37);
  530. m_pFont[0] = byFir << 4 | bySec;
  531. chFir = LOBYTE(pLeft[2]);
  532. chSec = LOBYTE(pLeft[3]);
  533. byFir = isdigit(chFir) ? (chFir - 0x30) : (chFir - 0x37);
  534. bySec = isdigit(chSec) ? (chSec - 0x30) : (chSec - 0x37);
  535. m_pFont[1] = byFir << 4 | bySec;
  536. }
  537. return true;
  538. }
  539. void CFontTestDlg::OnButtonApply() 
  540. {
  541.  bool bBegin = true; 
  542.  GetCharToWORD(bBegin);
  543.  m_nAddOrDelete = -1;
  544.  ShowInfo();
  545.  ShowGridInfo();
  546. }
  547. void CFontTestDlg::OnSelchangeComboCodeType() 
  548. {
  549. m_ctlCode.SetWindowText(_T(""));
  550. m_ctlEdit.SetWindowText(_T(""));
  551. int nSel = m_ctlCombox.GetCurSel();
  552. m_strCodeSel.Empty();
  553. m_ctlCombox.GetLBText(nSel, m_strCodeSel);
  554. CString strUnicode, strBig5, strGB2312, strGBK, strGB18030;
  555. strUnicode.LoadString(IDS_RES_UNICODE);
  556. strBig5.LoadString(IDS_RES_BIG5);
  557. strGB2312.LoadString(IDS_RES_GB2312);
  558. strGBK.LoadString(IDS_RES_GBK);
  559. strGB18030.LoadString(IDS_RES_GB18030);
  560. if(m_strCodeSel == strGB2312)
  561. {
  562. m_pFont[0] = HIBYTE((WORD)GB2312_BEGIN);
  563. m_pFont[1] = LOBYTE((WORD)GB2312_BEGIN);
  564. }
  565. else if(m_strCodeSel == strGBK)
  566. {
  567. m_pFont[0] = HIBYTE((WORD)GBK_BEGIN);
  568. m_pFont[1] = LOBYTE((WORD)GBK_BEGIN);
  569. }
  570. else if(m_strCodeSel == strGB18030)
  571. {
  572. m_pFont[0] = HIBYTE((WORD)GB18030_BEGIN);
  573. m_pFont[1] = LOBYTE((WORD)GB18030_BEGIN);
  574. }
  575. else if(m_strCodeSel == strBig5)
  576. {
  577. m_pFont[0] = HIBYTE((WORD)BIG5_BEGIN);
  578. m_pFont[1] = LOBYTE((WORD)GB18030_BEGIN);
  579. }
  580. else if(m_strCodeSel == strUnicode)
  581. {
  582. m_pFont[0] = HIBYTE((WORD)UNICODE_BEGIN);
  583. m_pFont[1] =LOBYTE((WORD)UNICODE_BEGIN);
  584. }
  585. TCHAR szTemp[4] = {0};
  586. CString str;
  587. str.Empty();
  588. for(int i = 0; i < 2; i++)
  589. {
  590. _stprintf(szTemp, _T("%02X"), m_pFont[i]);
  591. str += szTemp;
  592. }
  593. m_strBeginCode = str;
  594. UpdateData(FALSE);
  595. m_ctlCode.SetWindowText(str);
  596. if(m_strCodeSel != strUnicode)
  597. {
  598. TCHAR tsFont[TEST_CODE_LENGTH] = {0};
  599. MultiByteToWideChar(CP_ACP,0,(char*)m_pFont,2,tsFont,1);
  600. m_ctlEdit.SetWindowText((LPCTSTR)tsFont);
  601. }
  602. }
  603. /*
  604. 注意:
  605. 1. 以统一的标准(客户坐标或者屏幕坐标)来进行显示;
  606. 在本函数中统一是先使用屏幕坐标,然后将其转换成客户坐标进行操作,因为MoveWindow()
  607. 是使用的是客户坐标;
  608. */
  609. void CFontTestDlg::OnSize(UINT nType, int cx, int cy) 
  610. {
  611. CDialog::OnSize(nType, cx, cy);
  612. CRect rect, wndRect;
  613. int nSize = 0;
  614. int nHeight = 0; 
  615. int nWidth = 0;
  616. CWnd * pPreview = (CWnd *)GetDlgItem(IDC_STATIC_PREVIEW);
  617. if(pPreview != NULL)
  618. {
  619. pPreview ->GetWindowRect(rect);
  620. ScreenToClient(rect);
  621. }
  622. CRect dlgRect;
  623. GetWindowRect(dlgRect);
  624. ScreenToClient(dlgRect);
  625. switch(nType)
  626. {
  627. case SIZE_MAXIMIZED:
  628. break;
  629. case SIZE_RESTORED:
  630. if(m_nPrevCX != 0)
  631. {
  632. nWidth = dlgRect.Width() - m_nPrevCX;
  633. rect.right += nWidth;
  634. nHeight = dlgRect.Height() - m_nPrevCY;;
  635. rect.bottom += nHeight;
  636. pPreview ->MoveWindow(rect, TRUE);
  637. }
  638. break;
  639. default:
  640. break;
  641. }
  642. m_nPrevCX = dlgRect.Width();
  643. m_nPrevCY = dlgRect.Height();
  644. }
  645. void CFontTestDlg::OnChangeEditFontWidth() 
  646. {
  647. UpdateData();
  648. m_nFontHeight = m_nFontWidth;//m_spinWidth.GetPos(); 
  649. UpdateData(FALSE);
  650. }
  651. void CFontTestDlg::OnChangeEditFontHeight() 
  652. {
  653. UpdateData();
  654. m_nFontWidth = m_nFontHeight;//m_spinWidth.GetPos(); 
  655. UpdateData(FALSE);
  656. }
  657. bool CFontTestDlg::GetFontSize(FONT_SHOW_SIZE &fontShow)
  658. {
  659. int nColorUnit = 0;
  660. int nSel = m_ctlFontColor.GetCurSel();
  661. if(nSel == 0)
  662. nColorUnit = COLOR_BIT_1;
  663. else if(nSel == 1)
  664. nColorUnit = COLOR_BIT_8;
  665. else if(nSel == 2)
  666. nColorUnit = COLOR_BIT_16;
  667. else if(nSel == 3)
  668. nColorUnit = COLOR_BIT_24;
  669. UpdateData();
  670. int nFontWidth = m_nFontHeight;//m_spinHeight.GetPos();
  671. if(nFontWidth <= 8)
  672. m_nMemWidth = 8;
  673. else if(nFontWidth <= 16)
  674. m_nMemWidth = 16;
  675. else if(nFontWidth <= 32)
  676. m_nMemWidth = 32;
  677. fontShow.colorUnit = nColorUnit;
  678. fontShow.fontSize = CSize(nFontWidth, nFontWidth);
  679. fontShow.memSize = CSize(m_nMemWidth, nFontWidth);
  680. return true;
  681. }
  682. /////////////////////////////////////////////////////////////////////////////
  683. //Thread Operation
  684. ////////////////////////////////////////////////////////////////////////////
  685. /*
  686. 问题:
  687. 1. 在窗口进程中可以显示,在工作线程中却不能显示;
  688.    改多线程为单线程;
  689. */
  690. void CFontTestDlg::OnCreateFont() 
  691. {
  692. /*if(m_fontHandle != NULL)
  693. CloseHandle(m_fontHandle);
  694. m_fontHandle = CreateThread(NULL, 
  695. 0,
  696. (LPTHREAD_START_ROUTINE)CreateFont_Proc,
  697. this,
  698. 0,
  699. &m_dwThreadID);*/
  700. int nSel = m_ctlSourceFrom.GetCurSel();
  701. bool bCreate = CreateFontLibrary(nSel);
  702. if(!bCreate)
  703. {
  704. CString strTip, strTitle;
  705. strTip.LoadString(IDS_CREATE_LIBRARY_FAIL);
  706. strTitle.LoadString(IDS_TITLE);
  707. MessageBox(strTip, strTitle, MB_OK | MB_ICONWARNING);
  708. return;
  709. }
  710. }
  711. void CreateFont_Proc(LPVOID lpParam)
  712. {
  713. CFontTestDlg * pDlg = (CFontTestDlg *)lpParam;
  714. pDlg ->CreateFontLibrary();
  715. }
  716. /*
  717. 描述:
  718. 1. 生成字库所需要的条件有:字库编码类型(决定字符的起始编码)、
  719. 点阵范围(决定占用的内存大小)、色彩数(决定是否彩色); 
  720. */
  721. bool CFontTestDlg::CreateFontLibrary(int nCreateType)
  722. {
  723. //字库文件
  724. CString szFile;
  725. GetDlgItem(IDC_EDIT_FONT_LIBRARY_URL) ->GetWindowText(szFile);
  726. if(szFile.IsEmpty())
  727. return false;
  728. CFile * pTempFile = NULL;
  729. CFile * pLibraryFile = NULL;
  730. try
  731. {
  732. pTempFile = new CFile(_T(FILE_TEMP_TRAN), CFile::modeCreate | CFile::modeReadWrite);
  733. pLibraryFile = new CFile((LPCTSTR)szFile, CFile::modeCreate | CFile::modeWrite);
  734. }
  735. catch(CFileException * pl)
  736. {
  737. delete pTempFile;
  738. delete pLibraryFile;
  739. return false;
  740. }
  741. //初始化
  742. FreeResource();
  743. GetDlgItem(IDC_BUTTON_CREATE_FONT) ->EnableWindow(FALSE);
  744. GetDlgItem(IDC_BUTTON_APPLY) ->EnableWindow(FALSE);
  745. GetDlgItem(IDC_BUTTON_NEXT) ->EnableWindow(FALSE);
  746. GetDlgItem(IDC_BUTTON_STOP) ->EnableWindow(FALSE);
  747. m_nCurHandSel = 0;
  748. bool bReturn = false;
  749. FONT_SHOW_SIZE sizeFont;
  750. memset(&sizeFont, 0x00, sizeof(FONT_SHOW_SIZE));
  751. bReturn = GetFontSize(sizeFont);
  752. int nMemBuf = sizeFont.memSize.cx * sizeFont.memSize.cy * sizeFont.colorUnit/8;
  753. BYTE * pMemBuf = (BYTE *)malloc(sizeof(BYTE) * nMemBuf);
  754. memset(pMemBuf, 0x00, sizeof(BYTE) * nMemBuf);
  755. memset(m_byShowBuf, 0x00, sizeof(BYTE)*TRAN_FILE_BUF_LEN);
  756. m_fontCurve.ShowGridData((BSTR*)m_byShowBuf, (short)sizeFont.memSize.cx, 
  757. (short)sizeFont.memSize.cx, m_nShowType);
  758. //创建指定格式的字体、位图并分配内存
  759. CClientDC clientDC(this);
  760. CFont showFont;
  761. CBitmap memBmp;
  762. CDC memDC;
  763. memDC.CreateCompatibleDC(&clientDC); //创建内存设备环境
  764. CString strFontSel;
  765. m_ctlFontSel.GetWindowText(strFontSel);
  766. showFont.CreateFont(sizeFont.fontSize.cy, 
  767. (sizeFont.fontSize.cx+1)/2,
  768. 0,
  769. 0,
  770. FW_NORMAL,
  771. FALSE,
  772. FALSE,
  773. FALSE,
  774. DEFAULT_CHARSET,
  775. OUT_TT_PRECIS,
  776. CLIP_TT_ALWAYS,
  777. PROOF_QUALITY,
  778. DEFAULT_PITCH,
  779. (LPCTSTR)strFontSel);//m_logFont.lfFaceName);
  780. memBmp.CreateBitmap(sizeFont.memSize.cx, 
  781. sizeFont.memSize.cy,
  782. 1,
  783. sizeFont.colorUnit,
  784. NULL);
  785. CFont * pOldFont = memDC.SelectObject(&showFont);
  786. CBitmap * pOldBitmap = memDC.SelectObject(&memBmp);
  787. CString strUnicode, strBig5, strGB2312, strGBK, strGB18030;
  788. strUnicode.LoadString(IDS_RES_UNICODE);
  789. strBig5.LoadString(IDS_RES_BIG5);
  790. strGB2312.LoadString(IDS_RES_GB2312);
  791. strGBK.LoadString(IDS_RES_GBK);
  792. strGB18030.LoadString(IDS_RES_GB18030);
  793. int nSel = m_ctlCombox.GetCurSel();
  794. CString codeStr;
  795. m_ctlCombox.GetLBText(nSel, codeStr);
  796. TCHAR beginCh = 0x00;
  797. TCHAR endCh = 0x00;
  798. TCHAR constBeginCh = 0x00;
  799. if(codeStr == strUnicode)
  800. {
  801. beginCh = UNICODE_BEGIN;
  802. endCh = UNICODE_END;
  803. }
  804. else if(codeStr == strGB2312)
  805. {
  806. beginCh = GB2312_BEGIN;
  807. endCh = GB2312_END;
  808. }
  809. else if(codeStr == strGBK)
  810. {
  811. beginCh = GBK_BEGIN;
  812. endCh = GBK_END;
  813. }
  814. else if(codeStr == strBig5) 
  815. {
  816. beginCh = BIG5_BEGIN;
  817. endCh = BIG5_END;
  818. }
  819. else if(codeStr == strGB18030)
  820. {
  821. beginCh = GBK_BEGIN;
  822. endCh = GBK_END;
  823. }
  824. constBeginCh = beginCh;
  825. //生成字库文件
  826. CRect rect;
  827. rect.left = rect.top = 0;
  828. CWnd * pWnd = GetDlgItem(IDC_EDIT_SHOW);
  829. pWnd ->GetWindowRect(rect);
  830. ScreenToClient(rect);
  831. WORD wTran = 0;
  832. TCHAR tcTemp = 0x0000;
  833. TCHAR tcTempGBK = 0x0000;
  834. LCID dwLang = GetUserDefaultLangID();
  835. bool bTran = false;
  836. int nReturn = 0;
  837. FONT_DIFF_OFFSET * pDiff = NULL;
  838. int nDiffCount = 0;
  839. if(nCreateType == SOURCE_ALL_CODE)
  840. {
  841. for(; beginCh <= endCh; beginCh ++)
  842. {
  843. if((codeStr == strGB2312) || (codeStr == strGBK) || (codeStr == strGB18030))
  844. {
  845. bTran = TranGBKAndUnicode(beginCh, tcTemp, FROM_GBK_TO_UNICODE);
  846. if(!bTran)
  847. {
  848. nDiffCount ++;
  849. pDiff = new FONT_DIFF_OFFSET;
  850. pDiff->realOffset = beginCh - constBeginCh;
  851. pDiff ->diffCount = nDiffCount;
  852. m_offSetDiffList.AddTail(pDiff);
  853. m_nMaxOffset = pDiff->realOffset;
  854. continue;
  855. }
  856. }
  857. else if(codeStr == strBig5)
  858. {
  859. bTran = TranGBKAndBig5(tcTempGBK, beginCh, FROM_BIG5_TO_GBK);
  860. {
  861. if(!bTran)
  862. {
  863. nDiffCount ++;
  864. pDiff = new FONT_DIFF_OFFSET;
  865. pDiff->realOffset = beginCh - constBeginCh;
  866. pDiff ->diffCount = nDiffCount;
  867. m_offSetDiffList.AddTail(pDiff);
  868. m_nMaxOffset = pDiff->realOffset;
  869. continue;
  870. }
  871. else
  872. {
  873. TranGBKAndUnicode(tcTempGBK, tcTemp, FROM_GBK_TO_UNICODE);
  874. }
  875. }
  876. }
  877. else if(codeStr == strUnicode)
  878. {
  879. tcTemp = beginCh;
  880. }
  881. WideCharToMultiByte(
  882. CP_ACP,
  883. 0,
  884. &tcTemp,
  885. 1,
  886. (char *)&wTran,
  887. 2,
  888. NULL,
  889. NULL);
  890. memDC.FillSolidRect(0, 0, sizeFont.memSize.cx, sizeFont.memSize.cy, RGB(255,255,255));
  891. memDC.TextOut(0, 0, &tcTemp, 1);
  892. clientDC.BitBlt(125, 125, sizeFont.fontSize.cx, sizeFont.fontSize.cy, 
  893. &memDC, rect.left, rect.top, SRCCOPY);  
  894. memBmp.GetBitmapBits(nMemBuf, pMemBuf);
  895. pTempFile ->Write(pMemBuf, nMemBuf);
  896. }
  897. }
  898. else if((nCreateType == SOURCE_HAND_EDIT) || (nCreateType == SOURCE_SELECT_FILE))
  899. {
  900. CString strSource;
  901. m_ctlEditSource.GetWindowText(strSource);     //直接得到的是UNICODE码
  902. int nSourceLen = strSource.GetLength();
  903. TCHAR * pSource = (LPTSTR)(LPCTSTR)strSource;
  904. for(int i = 0; i < nSourceLen ; i++)
  905. {
  906. tcTemp = pSource[i];
  907. WideCharToMultiByte(
  908. CP_ACP,
  909. 0,
  910. &tcTemp,
  911. 1,
  912. (char *)&wTran,
  913. 2,
  914. NULL,
  915. NULL);
  916. memDC.FillSolidRect(0, 0, sizeFont.memSize.cx, sizeFont.memSize.cy, RGB(255,255,255));
  917. memDC.TextOut(0, 0, &tcTemp, 1);
  918. clientDC.BitBlt(125, 125, sizeFont.fontSize.cx, sizeFont.fontSize.cy, 
  919. &memDC, rect.left, rect.top, SRCCOPY);  
  920. memBmp.GetBitmapBits(nMemBuf, pMemBuf);
  921. pTempFile ->Write(pMemBuf, nMemBuf);
  922. }
  923. }
  924. TranFile(pLibraryFile, pTempFile);
  925. //退出
  926. memDC.SelectObject(pOldFont);
  927. memDC.SelectObject(pOldBitmap);
  928. free(pMemBuf);
  929. delete pTempFile;
  930. delete pLibraryFile;
  931. SetFileAttributes(_T(FILE_TEMP_TRAN), FILE_ATTRIBUTE_NORMAL);
  932. DeleteFile(_T(FILE_TEMP_TRAN));
  933. GetDlgItem(IDC_BUTTON_APPLY) ->EnableWindow(TRUE);
  934. GetDlgItem(IDC_BUTTON_NEXT) ->EnableWindow(TRUE);
  935. GetDlgItem(IDC_BUTTON_STOP) ->EnableWindow(TRUE);
  936. GetDlgItem(IDC_BUTTON_CREATE_FONT) ->EnableWindow(TRUE);
  937. return true;
  938. }
  939. bool CFontTestDlg::TranFile(CFile * pDesFile, CFile * pSrcFile)
  940. {
  941. ASSERT((pDesFile != NULL) && (pSrcFile != NULL));
  942. BYTE tempBuf[TRAN_FILE_BUF_LEN] = {0};
  943. DWORD dwDesFile = pSrcFile->GetLength();
  944. int nCir = (dwDesFile%TRAN_FILE_BUF_LEN == 0) ? (dwDesFile/TRAN_FILE_BUF_LEN) :
  945. (dwDesFile/TRAN_FILE_BUF_LEN + 1);
  946. DWORD dwRead = 0, dwSum = 0;
  947. for(int i = 0; i < nCir; i++)
  948. {
  949. memset(tempBuf, 0x00, TRAN_FILE_BUF_LEN);
  950. pSrcFile ->Seek(dwSum, CFile::begin);
  951. dwRead = pSrcFile ->Read(tempBuf, TRAN_FILE_BUF_LEN);
  952. for(DWORD j = 0; j < dwRead; j++)
  953. tempBuf[j] = ~tempBuf[j];
  954. pDesFile ->Seek(dwSum, CFile::begin);
  955. pDesFile ->Write(tempBuf, dwRead);
  956. dwSum += dwRead;
  957. }
  958. return true;
  959. }
  960. void CFontTestDlg::OnSelectFile() 
  961. {
  962. CFileDialog dlg(true);
  963. int nSel = dlg.DoModal();
  964. if(nSel == IDCANCEL)
  965. return;
  966. m_ctlEditSource.SetWindowText(_T(""));
  967. m_strSourceFile = dlg.GetPathName();
  968. if(m_strSourceFile.IsEmpty())
  969.  return;
  970.  
  971. CFile fl;
  972. CFileException p;
  973. BYTE bySelectFileBuf[TRAN_FILE_BUF_LEN+1] = {0};
  974. TCHAR tcTranBuf[TRAN_FILE_BUF_LEN] = {0};
  975. int dwSum = 0;
  976. int dwRead = 0;
  977. BYTE  tempBuf[TEST_CODE_LENGTH] = {0};
  978. TCHAR tempTchar[TEST_CODE_LENGTH] = {0};
  979. BYTE byCir = 0x00;
  980. if(fl.Open(m_strSourceFile, CFile::modeRead, &p))
  981. {
  982. dwSum = fl.GetLength();
  983. for(int i = 0; i < dwSum; i+=TRAN_FILE_BUF_LEN)
  984. {
  985. memset(tcTranBuf, 0x0000, TRAN_FILE_BUF_LEN);
  986. fl.Seek(i, CFile::begin);
  987. if(byCir == 0x00)
  988. {
  989. dwRead = fl.ReadHuge(bySelectFileBuf, TRAN_FILE_BUF_LEN*sizeof(BYTE));
  990. }
  991. else
  992. {
  993. bySelectFileBuf[0] = byCir;
  994. dwRead = fl.ReadHuge(bySelectFileBuf+1, TRAN_FILE_BUF_LEN*sizeof(BYTE));
  995. dwRead ++;
  996. }
  997. byCir = 0x00;
  998. bool bEndFlag = false;
  999. int j = 0;
  1000. for(j = 0; j < dwRead ; j++)
  1001. {
  1002. if(bySelectFileBuf[j] > 0x7F)
  1003. {
  1004. j++;
  1005. if(j == dwRead)
  1006. bEndFlag = true;
  1007. }
  1008. }
  1009. if(bEndFlag)
  1010. {
  1011. byCir = bySelectFileBuf[dwRead -1];
  1012. dwRead --;
  1013. }
  1014. for(j = 0; j < dwRead; j ++)
  1015. {
  1016. memset(tempBuf, 0x00, TEST_CODE_LENGTH);
  1017. if(bySelectFileBuf[j] > 0x7F)
  1018. {
  1019. memcpy(tempBuf, bySelectFileBuf+j, 2);
  1020. j++;
  1021. }
  1022. else
  1023. {
  1024. memcpy(tempBuf, bySelectFileBuf+j, 1);
  1025. }
  1026. MultiByteToWideChar(CP_ACP,0,(char*)tempBuf,2,tempTchar,1);
  1027. _tcscat(tcTranBuf, tempTchar);
  1028. }
  1029. m_ctlEditSource.SetSel(m_ctlEditSource.GetWindowTextLength(),m_ctlEditSource.GetWindowTextLength());
  1030. m_ctlEditSource.ReplaceSel((LPCTSTR)tcTranBuf);
  1031. }
  1032. fl.Close();
  1033. }
  1034. }
  1035. void CFontTestDlg::OnSelchangeComboSource() 
  1036. {
  1037.  int nSel = m_ctlSourceFrom.GetCurSel();
  1038.  if(nSel == SOURCE_SELECT_FILE)
  1039.  {
  1040.  GetDlgItem(IDC_BUTTON_SELECT_FILE) ->EnableWindow(TRUE);
  1041.  GetDlgItem(IDC_EDIT_BEGIN_CODE) ->EnableWindow(TRUE);
  1042.  GetDlgItem(IDC_EDIT_SOURCE) ->EnableWindow(FALSE);
  1043.  }
  1044.  else if(nSel == SOURCE_HAND_EDIT)
  1045.  {
  1046. GetDlgItem(IDC_BUTTON_SELECT_FILE) ->EnableWindow(FALSE);
  1047. GetDlgItem(IDC_EDIT_BEGIN_CODE) ->EnableWindow(FALSE);
  1048. GetDlgItem(IDC_EDIT_SOURCE) ->EnableWindow(TRUE);
  1049. m_ctlEditSource.SetFocus();
  1050.  }
  1051.  else
  1052.  {
  1053. GetDlgItem(IDC_BUTTON_SELECT_FILE) ->EnableWindow(FALSE);
  1054. GetDlgItem(IDC_EDIT_BEGIN_CODE) ->EnableWindow(TRUE);
  1055. GetDlgItem(IDC_EDIT_SOURCE) ->EnableWindow(FALSE);
  1056.  }
  1057. }
  1058. void CFontTestDlg::OnFileUrl()
  1059. {
  1060. GetDlgItem(IDC_EDIT_FONT_LIBRARY_URL) ->SetWindowText((LPCTSTR)_T(""));
  1061. CFileDialog dlg(FALSE, _T("txt"), _T("library"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
  1062. _T("Text files(*.txt)||"), NULL);
  1063. if(dlg.DoModal() == IDCANCEL)
  1064. return;
  1065. CString szFile = dlg.GetPathName();
  1066. GetDlgItem(IDC_EDIT_FONT_LIBRARY_URL) ->SetWindowText((LPCTSTR)szFile);
  1067. }