我已經在Delphi中編寫了一個Windows程序,它使用GetCharWidth和Em-Square非常精確地放置和包裝文本到屏幕和打印機。這與ANSI文本很好地協作,你只需要檢索和計算255個字符的寬度,但是當你使用65535個字符的Unicode時,它太慢了。由於必須創建兩個寬度數組,一個用於正常,一個用於粗體,問題變得更糟。所見即所得編碼
//Setup a reference canvas for measuring purposes
RefDC := CreateCompatibleDC (FCanvas.Handle) ;
DPI := GetDeviceCaps (RefDC , LOGPIXELSY) ;
//find EmSquare
GetOutlineTextMetrics (RefDC , sizeof(otm) , @otm[0]) ;
EmSq := otm[0].otmEmSquare ;
//calc NORMAL char sizes
GetObject (FCanvas.Font.Handle , SizeOf (lf) , @lf) ;
lf.lfHeight := -EmSq ;
lf.lfWidth := 0 ;
lf.lfWeight := FW_NORMAL ;
hf := CreateFontIndirect (lf) ;
hold := SelectObject (RefDC , hf) ;
GetCharWidth (RefDC , 0 , $FFFF , nCharWidth) ;
for a := 0 to $FFFF do
fCharWidth[a] := nCharWidth[a]* PixelSize/EmSq ;
SelectObject (RefDC , hold) ;
DeleteObject (hf) ;
//calculate line height
PixelSize := abs (fCanvas.Font.Size * DPI/72) ;
GetOutlineTextMetrics (RefDC , sizeof(otm) , @otm[0]) ;
LineHt := round ((otm[0].otmTextMetrics.tmHeight +
otm[0].otmTextMetrics.tmExternalLeading) *
PixelSize/EmSq) ;
//calculate Bold char sizes
lf.lfWeight := FW_BOLD ;
hf := CreateFontIndirect (lf) ;
hold := SelectObject (RefDC , hf) ;
GetCharWidth (RefDC , 0 , $FFFF , nCharWidth) ;
for a := 0 to $FFFF do
fBoldWidth[a] := nCharWidth[a] * PixelSize/EmSq ;
SelectObject (RefDC , hold) ;
DeleteObject (hf) ;
DeleteDC (RefDC) ;`
Unicode沒有65,535個字符。它通過分配碼點來定義(撰寫本文時)約107,000個字符。你可能在談論UTF-16,這是一種以16位單位明確表示所有這些代碼點的方法(http://en.wikipedia.org/wiki/UTF-16)。它是一種可變長度編碼,因爲某些字符可能佔用多個16位單元,但其設計使基本多語言平面中的所有代碼點都「適合」在一個16位單元中。 – 2010-08-16 21:29:34
那麼你的問題是什麼? – 2010-08-16 21:40:39
我需要更快的方式來做到這一點。必須有其他所見即所得的策略可以更有效地處理UNICODE。 – Mitch 2010-08-16 21:46:50