圖像
圖像是以光柵為基礎(chǔ)的文件,(比如說BMP、JPEG和GIF),如圖標(biāo)和鼠標(biāo)指針等。圖像相對于字體來說要更難處理一些,因為圖像是由離散的像素組成,如果當(dāng)前顯示分辨率和圖像設(shè)計時的分辨率不一致,那么圖像就需要根據(jù)正確的物理尺寸縮放,我們可以通過StrectchBlt() 函數(shù)縮放一個位圖而不是BitBlt(),當(dāng)圖像被Load時它可以輕易的幫助應(yīng)用系統(tǒng)縮放圖像,而且更準(zhǔn)確些。
BITMAP info; GetObject (bitmap, sizeof (info), (PTSTR) &info); HDC hdcBitmap = 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)然,縮放肯定會衰減圖像的質(zhì)量,尤其是當(dāng)從一個小的分辨率放大到一個大分辨率的時候;而且縮小也有一些問題,缺省是拉伸模式COLORONCOLOR,它運算雖然快速,但是會丟失一些細(xì)節(jié),HALFTONE方式拉伸運算速度很慢,但是質(zhì)量會更高,(GDI+提供了一個擴(kuò)展的選項)。
SetStretchBltMode (hdc, HALFTONE); 需要特別指出的是ICO和.CUR文件是可以在一個單獨的文件中存儲多個圖片的文件,那么我們就需要在多種分辨率下設(shè)計不同的圖片,建議使用GetSystemMetrics()來解決,那么如果必須縮放的話,系統(tǒng)將會替我們選擇合適的圖片。但是BMP或其它很多種文件合適是不支持在一個單獨的文件中存儲多個文件的,但是我們可以通過判斷來確定在Load的時候選擇建立哪個文件。
If (GetDeviceCaps (hdc, LOGPIXELSX) < 130) Bitmap = LoadBitmap (hInstance, (char*) IDB_BITMAP1); Else Bitmap = LoadBitmap (hInstance, (char*) IDB_BITMAP2);
對于特殊的ICON和鼠標(biāo)指針,目前我們采用的是標(biāo)準(zhǔn)的16×16 pixel 和 32×32 pixel大小,高分辨率的應(yīng)用程序最大可以支持到64×64 pixel,當(dāng)然這是在不改動注冊表的前提下。理想的情況是在每個主要的分辨率下都有相應(yīng)的大圖標(biāo)和小圖標(biāo)。
如果使用Comctl2.0提供的圖片序列(HIMAGELIST),需要在放置到序列里面之前把它們縮放到合適大小,一個更好的選擇是使用最新的comctl6.0,但是這只在Windows XP下支持,最新的控件支持會自動縮放它們在不同的分辨率下(halfton StrechBlt)。
界面布局
版面是另一個會導(dǎo)致在高分辨率下出現(xiàn)問題的環(huán)節(jié),很多對話框都使用對話單位(DLU)作為規(guī)格設(shè)置單位,因為它可以隨著系統(tǒng)分辨率而自動運算縮放變化;但是一些自定義的界面上常常需要被我們重新手動轉(zhuǎn)換并且設(shè)定,因為有很多界面或?qū)υ捒蚶碚撋瞎ぷ髟谙袼叵,我們可以重新?guī)劃界面和對話框的設(shè)定,比如說完全使用對話單位,盡管我們也可以調(diào)用SetWindowPos()提供的方法,或者可以拋棄關(guān)于DPI的假設(shè)繼續(xù)工作,使用system metrics來自動處理這些字體和控件之間的關(guān)聯(lián)。
出處:UI花園
責(zé)任編輯:moby
上一頁 高分辨率下界面布局的解決方案 [2] 下一頁 高分辨率下界面布局的解決方案 [4]
|