程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 用TRUETYPE技術顯示漢字

用TRUETYPE技術顯示漢字

編輯:關於C++

我知道有一個FREETYPE庫可以把TRUETYPE字庫渲染成點陣字。但是請注意TRUETYPE技術中包含了多項Apple公司的技術專利(主要是解釋其HINT碼),目前FREETYPE項目負責人已經收到Apple公司的通知,要求其申請Apple的專利許可,目前正在談判之中。

想要避開專利問題,只好不用HINT,但是這樣一來顯示效果極差。

其實如果只是在Windows下(不管中文還是E文),只要先把中文轉換成UNICODE串(MultiByteToWideChar?),再用TextOutW函數輸出即可。

不管是95還是NT都支持這些函數,只要已經裝有相應的字體即可。沒有必要去自己解釋TRUETYPE。

灰衣老僧: 是嗎?專利問題有公司考慮! 

問題是轉換為Unicode在英文下輸出我沒成功! 

以前是高手: 怎麼能用CP_OEMCP呢? 

當然要填936了。

要顯式地使用TextOutW(),不能用dc.TextOut(),因為程序還是按非UNICODE方式編譯的。

wchar_t wstr[500];

int n=MultiByteToWideChar(936, MB_PRECOMPOSED,

str, -1, wstr, 500);

TextOutW(pDC->m_hDC, x, y, wstr);

系統必須裝有936代碼頁。怎麼裝?把cp_936.nls(VC++中有的)COPY到windows\system下,再在注冊表的

\HKEY_LOCAL_MACHINE\System\CurrentControlSet\control\Nls\Codepage中,加上936 = "cp_936.nls"

\HKEY_LOCAL_MACHINE_System\CurrentControlSet\control\Nls\Locale中,加上00000804 = "Chinese(PRC)"

灰衣老僧: 太棒了!成功了!等你回國,老僧一定請你喝酒!

Code:

BOOL bResult = m_Font.CreateFont(-16,0,0,0,400,0,0,0,134,3,2,1,50,"SimSun");
   char *pText = "Test漢字顯示測試Test";
   wchar_t wBuffer[256];
   int nLength = MultiByteToWideChar(936, MB_PRECOMPOSED, pText, -1, wBuffer, 256);
   CDC *pDC = GetDC();
   CFont *pFontTemp = (CFont *)pDC->SelectObject(&m_Font);
   TextOutW(pDC->m_hDC, 80, 80, wBuffer, nLength - 1);
   pDC->SelectObject(pFontTemp);
   ReleaseDC(pDC);

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved