文本和字體
這里有兩種字體:位圖(光柵)字體和TrueType字體,而我們要想實(shí)現(xiàn)高分辨率的應(yīng)用程序就只能使用Truetype字體,因?yàn)槲粓D(光柵)字體只能在96-DPI的屏幕分辨率下正常,而且不能夠縮放,Windows已經(jīng)支持TrueType字體很長(zhǎng)時(shí)間了,所以找到一個(gè)很好的TrueType字體并且定義到我們的應(yīng)用系統(tǒng)中并不是什么大的問(wèn)題,另外一個(gè)原因只能使用Truetype字體,因?yàn)橐恍┳钚碌募夹g(shù),比如說(shuō)GDI+,但是它只支持Truetype字體的操作。
缺省的字體可以通過(guò)windows句柄(HWNDs)和得到,而圖形設(shè)備(HDCs)獲得的是位圖(光柵)字體,所以有時(shí)候在改變字體的時(shí)候,不管缺省字體不是HWNDs和HDC字體,只要它是TrueType字體,我們就可以改變它:
HFONT font = (HFONT) GetStockObject (DEFAULT_GUI_FONT); SendMessage (hwnd, WM_SETFONT, (WPARAM) font, 0); SelectObject (hdc, font); 當(dāng)我們?cè)诖翱谏蟿?chuàng)建字體的時(shí)候,可以使用像素指定字體尺寸,然后調(diào)整分辨率。
LOGFONT lf; Memset (&lf, 0, sizeof (lf)); lf.lfHeight = SCALEY (13); HFONT font = CreateFontIndirect (&lf);
或者可以使用Windows API提供的選擇文字通用對(duì)話框,允許使用更準(zhǔn)確的像素點(diǎn)來(lái)指定字體尺寸,然后經(jīng)過(guò)一些算法后轉(zhuǎn)化字體尺寸為像素,可以指定只使用TrueType字體來(lái)顯示。
CHOOSEFONT data; Memset (&data, 0, sizeof (data)); data.lStructSize = sizeof (data); data.hwndOwner = form; data.Flags = CF_TTONLY | CF_SCREENFONTS; ChooseFont (&data);
最好的方法常常是在各種高分辨率下指定一個(gè)尺寸和一個(gè)區(qū)域的尺寸并且使用字體尺寸作為度量比例尺來(lái)指定這個(gè)頁(yè)面中的其它元素,比如說(shuō),可以設(shè)定按鈕之間的間距為缺省字體的高度的多少,使用GetTextMetrics()這個(gè)函數(shù)可以重新設(shè)定一個(gè)字體的高度。
TEXTMETRIC metrics; GetTextMetrics (hdc, &metrics); Int height = metrics.tmHeight;
最好不要使用TEXTMETRIC提供的tmAveCharWidth 方法,因?yàn)樗豢梢蕴幚碛⑽淖帜,除此以外我們還可以使用GetTextExtent()的這個(gè)方法來(lái)確認(rèn)所關(guān)心的字符串的尺寸,我們可以用GetTextExtentPoint32()繪制一個(gè)環(huán)繞字符串的矩形,示例如下:
SIZE size; GetTextExtentPoint32 (hdc, string, strlen (string), &size); Int paddingX = SCALEX (8); Int paddingY = SCALEX (8); Rectangle (hdc, x - paddingX, y - paddingY, x + size.cx + paddingX, y + size.cy + paddingY); TextOut (hdc, x, y, string, strlen (string));
最后,我們意識(shí)到盡管TrueType字體縮放精細(xì),但是他們不是線性縮放,也就是說(shuō)在DPI增加10%以后字符串的長(zhǎng)度不能正確的增加10%,(使用GDI+就沒(méi)有這個(gè)問(wèn)題),因?yàn)橐恍┨囟ǖ淖帜钢荒茉趲讉(gè)尺寸上看起來(lái)不錯(cuò),而TrueType卻可以自動(dòng)選擇一個(gè)近似的尺寸正確顯示,這是使用GetTextExtent這個(gè)函數(shù)的原因。
出處:UI花園
責(zé)任編輯:moby
上一頁(yè) 高分辨率下界面布局的解決方案 [1] 下一頁(yè) 高分辨率下界面布局的解決方案 [3]
|