高分辨率下文字字體、圖像、界面布局的解決方案.doc_第1頁(yè)
高分辨率下文字字體、圖像、界面布局的解決方案.doc_第2頁(yè)
高分辨率下文字字體、圖像、界面布局的解決方案.doc_第3頁(yè)
高分辨率下文字字體、圖像、界面布局的解決方案.doc_第4頁(yè)
高分辨率下文字字體、圖像、界面布局的解決方案.doc_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

高分辨率下文字字體、圖像、界面布局的解決方案作者來(lái)源:劉大鵬 發(fā)布時(shí)間:2006年01月19日 為什么要保證我們的軟件產(chǎn)品或應(yīng)用程序中的文本、圖像和字體、布局等問(wèn)題呢,因?yàn)槲覀冇脩?hù)的終端顯示設(shè)備通常型號(hào)和設(shè)置各異,如最近出現(xiàn)的169,低于8”的等最新款式移動(dòng)手提電腦,我們的應(yīng)用程序和軟件產(chǎn)品通常會(huì)在這樣的終端變得面目全非,而這顯然給用戶(hù)的使用帶來(lái)了嚴(yán)重的問(wèn)題,直接導(dǎo)致的問(wèn)題如:操作易用性Usability、功能可接近性Accessibility、文本可讀性Readability等,而這樣的問(wèn)題并非不可逾越,要解決如何讓我們的應(yīng)用程序在高分辨率的顯示下仍然保持正??梢?,重點(diǎn)需要解決四個(gè)方面的問(wèn)題文本和字體、圖像(圖形、圖標(biāo)和鼠標(biāo)指針)、版面設(shè)置和重繪等。 前言 所有的應(yīng)用程序都可以工作在高分辨率下顯示嗎?答案當(dāng)然是否定的?,F(xiàn)在比較標(biāo)準(zhǔn)的計(jì)算機(jī)顯示器都已經(jīng)可以支持顯示大概96像素點(diǎn)/英寸的分辨率了,而且越來(lái)越多的應(yīng)用程序都可以運(yùn)行在這種分辨率下,但是卻仍然面臨分辨率日益增長(zhǎng)的帶來(lái)的危險(xiǎn)。現(xiàn)在,我們可以輕松的買(mǎi)到一臺(tái)133-DPI顯示分辨率的筆記本電腦,甚至還有170DPI的,也許幾年以后200-DPI的顯示分辨率已經(jīng)隨處可見(jiàn)了,著名的工業(yè)雜志DisplaySearch曾經(jīng)預(yù)言在2002年底有40%的膝上電腦已經(jīng)超過(guò)100-DPI的屏幕分辨率了,而且這個(gè)數(shù)字還在增長(zhǎng)。例圖1.各種常見(jiàn)分辨率下字體外觀 現(xiàn)在大多數(shù)的應(yīng)用程序要想顯示正常都依賴(lài)于分辨率,我們有些應(yīng)用程序如果沒(méi)有高分辨率的支持將會(huì)變得非常丑陋并且導(dǎo)致用戶(hù)易用性降低,與此同時(shí)越來(lái)越多的用戶(hù)使用了大字體。但是遺憾的是當(dāng)分辨率在130-DPI和200-DPI的時(shí)候是不成比例的,在96-DPI下的同一個(gè)應(yīng)用程序在這種分辨率下會(huì)變得無(wú)法使用,有的時(shí)候這些應(yīng)用程序的字體或控件會(huì)一律變得很小,但是更多的情況是一部分界面元素的尺寸正確的(例如,應(yīng)用程序使用了缺省的字體,那么將會(huì)在這個(gè)基礎(chǔ)上比原來(lái)大一些)而另外一部分不正確,如下圖所示: 例圖2.改變分辨率帶來(lái)的影響 由此可見(jiàn),增強(qiáng)和改善我們應(yīng)用程序在高分辨率下的顯示支持是非常有必要的,那么重要的標(biāo)準(zhǔn)應(yīng)該是:圖片看起來(lái)更好,文本也應(yīng)該看起來(lái)更清晰。比如文本在200-DPI分辨率顯示器上清晰的像激光打印機(jī)輸出的一樣(因?yàn)橛?jì)算機(jī)顯示有更多的顏色像素和灰度縮放支持,200-DPI的顯示器的質(zhì)量相當(dāng)于600-DPI的打印機(jī))所以PDA和Smartphone的廠商相對(duì)于紙介更看重高分辨率下的顯示。 開(kāi)發(fā)一個(gè)適應(yīng)多分辨率的應(yīng)用程序不是很簡(jiǎn)單,尤其對(duì)于一個(gè)已經(jīng)成形的應(yīng)用程序和系統(tǒng)來(lái)說(shuō),動(dòng)靜可能不小,但是它的好處是可以使我們不必再假設(shè)分辨率的各種情況,避免不能縮放帶來(lái)的質(zhì)量下降(比如說(shuō)位圖和位圖字體),而且開(kāi)發(fā)支持高分辨率的應(yīng)用程序有時(shí)候會(huì)覺(jué)得有些單調(diào)和乏味,但是如果我們的產(chǎn)品或應(yīng)用程序是為了服務(wù)于特定人群的(比如說(shuō)視力不好、和需要長(zhǎng)時(shí)間工作的人以及視弱人群),那么我們的工作就會(huì)變得非常有必要(在高對(duì)比度下和使用擴(kuò)展大字體的情況都和高分辨率有關(guān))。 系統(tǒng)韻律 Windows平臺(tái)本身提供了幫助解決用戶(hù)系統(tǒng)高分辨率問(wèn)題的解決途徑,我們可以通過(guò)一個(gè)小函數(shù)GetDeviceCaps()先獲得當(dāng)前的顯示分辨率,然后通過(guò)GetSystemMetrics()這個(gè)系統(tǒng)韻律函數(shù)和讀取系統(tǒng)信息和參數(shù)的SystemParametersInfo()函數(shù)提供的方法來(lái)改變windows中的圖形以及控件元素、和字體的尺寸,從一個(gè)3d的邊框效果乃至到一個(gè)小圖標(biāo)的尺寸,都可以隨心所欲的改變。 大概原理是首先利用GetDeviceDaps()這個(gè)函數(shù)獲得當(dāng)前分辨下的X、和Y軸的數(shù)值作為基準(zhǔn);然后再確定要縮放到多少。 關(guān)鍵問(wèn)題 在設(shè)計(jì)高分辨率的應(yīng)用程序過(guò)程中,我們要特別注意四個(gè)重要的方面:文本和字體、圖像(圖形、圖標(biāo)和鼠標(biāo)指針),版面設(shè)置以及重繪。 文本和字體 這里有兩種字體:位圖(光柵)字體和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字體,我們就可以改變它: HFONTfont=(HFONT)GetStockObject(DEFAULT_GUI_FONT); SendMessage(hwnd,WM_SETFONT,(WPARAM)font,0); SelectObject(hdc,font); 當(dāng)我們?cè)诖翱谏蟿?chuàng)建字體的時(shí)候,可以使用像素指定字體尺寸,然后調(diào)整分辨率。 LOGFONTlf; Memset(&lf,0,sizeof(lf); lf.lfHeight=SCALEY(13); HFONTfont=CreateFontIndirect(&lf); 或者可以使用WindowsAPI提供的選擇文字通用對(duì)話框,允許使用更準(zhǔn)確的像素點(diǎn)來(lái)指定字體尺寸,然后經(jīng)過(guò)一些算法后轉(zhuǎn)化字體尺寸為像素,可以指定只使用TrueType字體來(lái)顯示。 CHOOSEFONTdata; 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è)字體的高度。 TEXTMETRICmetrics; GetTextMetrics(hdc,&metrics); Intheight=metrics.tmHeight; 最好不要使用TEXTMETRIC提供的tmAveCharWidth方法,因?yàn)樗豢梢蕴幚碛⑽淖帜?,除此以外我們還可以使用GetTextExtent()的這個(gè)方法來(lái)確認(rèn)所關(guān)心的字符串的尺寸,我們可以用GetTextExtentPoint32()繪制一個(gè)環(huán)繞字符串的矩形,示例如下:SIZEsize; GetTextExtentPoint32(hdc,string,strlen(string),&size); IntpaddingX=SCALEX(8); IntpaddingY=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ù)的原因。 圖像 圖像是以光柵為基礎(chǔ)的文件,(比如說(shuō)BMP、JPEG和GIF),如圖標(biāo)和鼠標(biāo)指針等。圖像相對(duì)于字體來(lái)說(shuō)要更難處理一些,因?yàn)閳D像是由離散的像素組成,如果當(dāng)前顯示分辨率和圖像設(shè)計(jì)時(shí)的分辨率不一致,那么圖像就需要根據(jù)正確的物理尺寸縮放,我們可以通過(guò)StrectchBlt()函數(shù)縮放一個(gè)位圖而不是BitBlt(),當(dāng)圖像被Load時(shí)它可以輕易的幫助應(yīng)用系統(tǒng)縮放圖像,而且更準(zhǔn)確些。 BITMAPinfo; GetObject(bitmap,sizeof(info),(PTSTR)&info); HDChdcBitmap=CreateCompatibleDC(target); SelectObject(hdcBitmap,bitmap); StretchBlt(target,x,y, SCALEX(info.bmWidth),SCALEY(info.bmHeight), hdcBitmap,0,0,info.bmWidth,info.bmHeight,SRCCOPY); DeleteDC(hdcBitmap); 當(dāng)然,縮放肯定會(huì)衰減圖像的質(zhì)量,尤其是當(dāng)從一個(gè)小的分辨率放大到一個(gè)大分辨率的時(shí)候;而且縮小也有一些問(wèn)題,缺省是拉伸模式COLORONCOLOR,它運(yùn)算雖然快速,但是會(huì)丟失一些細(xì)節(jié),HALFTONE方式拉伸運(yùn)算速度很慢,但是質(zhì)量會(huì)更高,(GDI+提供了一個(gè)擴(kuò)展的選項(xiàng))。 SetStretchBltMode(hdc,HALFTONE); 需要特別指出的是ICO和.CUR文件是可以在一個(gè)單獨(dú)的文件中存儲(chǔ)多個(gè)圖片的文件,那么我們就需要在多種分辨率下設(shè)計(jì)不同的圖片,建議使用GetSystemMetrics()來(lái)解決,那么如果必須縮放的話,系統(tǒng)將會(huì)替我們選擇合適的圖片。但是BMP或其它很多種文件合適是不支持在一個(gè)單獨(dú)的文件中存儲(chǔ)多個(gè)文件的,但是我們可以通過(guò)判斷來(lái)確定在Load的時(shí)候選擇建立哪個(gè)文件。 If(GetDeviceCaps(hdc,LOGPIXELSX)130)Bitmap=LoadBitmap(hInstance,(char*)IDB_BITMAP1); ElseBitmap=LoadBitmap(hInstance,(char*)IDB_BITMAP2); 對(duì)于特殊的ICON和鼠標(biāo)指針,目前我們采用的是標(biāo)準(zhǔn)的1616pixel和3232pixel大小,高分辨率的應(yīng)用程序最大可以支持到6464pixel,當(dāng)然這是在不改動(dòng)注冊(cè)表的前提下。理想的情況是在每個(gè)主要的分辨率下都有相應(yīng)的大圖標(biāo)和小圖標(biāo)。如果使用Comctl2.0提供的圖片序列(HIMAGELIST),需要在放置到序列里面之前把它們縮放到合適大小,一個(gè)更好的選擇是使用最新的comctl6.0,但是這只在WindowsXP下支持,最新的控件支持會(huì)自動(dòng)縮放它們?cè)诓煌姆直媛氏拢╤alftonStrechBlt)。 界面布局 版面是另一個(gè)會(huì)導(dǎo)致在高分辨率下出現(xiàn)問(wèn)題的環(huán)節(jié),很多對(duì)話框都使用對(duì)話單位(DLU)作為規(guī)格設(shè)置單位,因?yàn)樗梢噪S著系統(tǒng)分辨率而自動(dòng)運(yùn)算縮放變化;但是一些自定義的界面上常常需要被我們重新手動(dòng)轉(zhuǎn)換并且設(shè)定,因?yàn)橛泻芏嘟缑婊驅(qū)υ捒蚶碚撋瞎ぷ髟谙袼叵?,我們可以重新?guī)劃界面和對(duì)話框的設(shè)定,比如說(shuō)完全使用對(duì)話單位,盡管我們也可以調(diào)用SetWindowPos()提供的方法,或者可以拋棄關(guān)于DPI的假設(shè)繼續(xù)工作,使用systemmetrics來(lái)自動(dòng)處理這些字體和控件之間的關(guān)聯(lián)。 重繪 重繪也是一樣,有些時(shí)候我們需要繪制屏幕或控件,需要計(jì)算不同的分辨率。如果我們開(kāi)發(fā)了一個(gè)自定義控件,那么它或許可以工作在像素環(huán)境下,但是我們需要使用systemmetrics來(lái)避免分辨率的問(wèn)題,如果我們?cè)诶L制一個(gè)復(fù)雜的圖形可以使用SetMapMode來(lái)使用圖形縮放引擎。GDI+ GDI+是微軟下一代的2D圖形解決方案,是對(duì)GDI的增強(qiáng)和延續(xù),GDI+提供了在高分辨率的解決方案,比如說(shuō)線性的文本縮放,和平滑圖片、縮放功能都被很好的改善,GDI+提供了許多針對(duì)速度和質(zhì)量等方面圖片縮放的運(yùn)算規(guī)則,但是相比較GDIStretchBlt的而言,對(duì)于小圖像InterpolationModeBilinear更快速質(zhì)量也不錯(cuò),對(duì)于會(huì)有一些質(zhì)量問(wèn)題,所以使用GDI+提供的InterpolationModeHighQuanlityBicubic是個(gè)不錯(cuò)的選擇。圖片和圖形的真實(shí)感增強(qiáng)OfficeXP采用改進(jìn)的圖形系統(tǒng)(GDI+),使用該圖形系統(tǒng),圖形和藝術(shù)字將具有更平滑的輪廓以及可調(diào)整的用真實(shí)顏色調(diào)和的透明度級(jí)別。在調(diào)整圖片大小時(shí),圖片的顯示將更加清晰。 另外GDI+圍繞分辨率的問(wèn)題還提供了(Image:GetPhysicalDimension和Bitmap:SetResolution)這樣的函數(shù),可以使用這些信息來(lái)恰當(dāng)?shù)目s放圖片,或者可以讓GDI+去作這些,如果在調(diào)用Graphics:DrawImage的時(shí)候沒(méi)有指定一個(gè)高度和寬度,GDI也會(huì)根據(jù)屏幕分辨率來(lái)計(jì)算圖像分辨率。 如何測(cè)試高分辨率下的應(yīng)用程序是否有問(wèn)題? 改變下面系統(tǒng)對(duì)于分辨率的設(shè)置: 1.在windo

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論