對話框大小與像素關系


 
我們知道可以用記事本打開.rc文件,然后改里面的坐標,來改變對話框大小,如: 以下是rc文件 ///////////////////////////////////////////////////////////////////////////// // // Dialog // IDD_ABOUTBOX DIALOGEX 0, 0, 170, 62 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "關於 Server" FONT 9, "MS Shell Dlg", 0, 0, 0x1 BEGIN ICON IDR_MAINFRAME,IDC_STATIC,14,14,21,20 LTEXT "Server,1.0 版",IDC_STATIC,42,14,114,8,SS_NOPREFIX LTEXT "Copyright (C) 2010",IDC_STATIC,42,26,114,8 DEFPUSHBUTTON "確定",IDOK,113,41,50,14,WS_GROUP END 只要把“IDD_ABOUTBOX DIALOGEX 0, 0, 170, 62”最后兩個數改一下就可以改變about窗口的大小。
對話框資源中的尺寸數值是對話框單位,該大小的單位不是像素而是DLU(dialog logical units),它是與分辨率無關的坐標單位。它與像素之間的轉換關系與當前對話框字體有關。不是像素,要轉換成像素,可以借助於 MapDialogRect 來轉換。 
如果想手動計算,用下面的算法: 
  pixelX = MulDiv(dialogX, 對話框水平基本單位, 4) 
  pixelY = MulDiv(dialogY, 對話框垂直基本單位, 8) 
 
DialogLayout類是一個簡單的布置管理器,用來配合Win32 API中的對話框邏輯單位(dialog logical units = DLU)工作。對話框邏輯單位是與分辨率無關的坐標單位,它對於對話框中控制部件的布置很有作用。從DLU到象素有一個映射,此映射是基於對話框所用的字體的。DLU的一個X方向的坐標單位相當於對話框中所用字體的平均寬度的1/4,Y方向的坐標單位相當於對話框對話框所用字體高度的1/8。注意字體平均寬度的計算並非是所有字符的平均,而是字母a…z(包括大寫)的寬度的平均,換句話說,它等於字符串”a…zA…Z”的長度除以52。
 
使用Visual Studio 6.0(Visual C++ 6.0)開發的過程中,對話框中的控件在資源編輯器中的尺寸和其實際的像素尺寸之間的對應問題非常的令人煩惱。特別是在要求對話框控件大小隨屏幕分辨率或程序窗口大小變化而變化時就更加令人撓頭。

原因就在於,資源編輯器中的單位(DLU)與屏幕像素之間的對應關系隨着對話框字體種類和大小的變化而變化。(1)在水平方向1 DLU == 1/4 字體平均寬度;(2)在垂直方向1 DLU == 1/8 字體平均高度。這一對應關系由於所使用字體的多變而難以確定。在絕大多數情況下,通過上面公式所計算的DLU甚至不會是整數像素。
為了在資源編輯器編輯的過程中就比較好的把握做出來的控件在屏幕上的像素尺寸,根據(1),思路:在對話框資源編輯器中應該采用等寬字體;根據(2),思路:最好采用所謂“系統”字體,這樣字體高度也是固定的。
驗證一下:在對話框資源編輯器中打開“Dialog Properties”,單擊“Font...”按鈕,為對話框選擇字體。考察“FixedSys”和“System”兩種,首先,從網上搜索得知,它們是等寬字體;其次,這兩種字體只有一種尺寸大小“12”,這說明字體高度是固定的。
實地測試一下,在VC對話框工程中,將對話框的字體改為“FixedSys”或“System”,字號大小改為“12(即小四)”,並在對話框中創建一個100*100 DLU的按鈕。在按鈕單擊響應函數里,用GetWindowRect()或GetClientRect()取得按鈕尺寸。設置斷點調試觀察結果:按鈕的像素尺寸是200*200!這表明對話框資源編輯器中的1 DLU現在等於2 Pixels。這樣對於我們的設計就方便很多了。
如果屏幕分辨率改變了,結果如何呢?在不同的顯示器上進行測試,結果都一樣,仍然是1 DLU == 2 Pixels。
還有沒有別的字體有這樣的效果呢?“Terminal”字體也可以,選擇字號為12,測試結果也是水平方向/垂直方向1 DLU == 2 Pixels。不過有個毛病:選擇了該字體的對話框在資源編輯器里看起來怪怪的,水平方向1 DLU和垂直方向1 DLU的長度不同,好像被壓扁了一樣。但程序運行起來則沒問題。另外,選擇不同的“Terminal”字體大小,則對應關系也會改變。
到這里,索性對其他幾種常用的字體也測試了一下,發現Verdana和宋體效果比較好(雖然對於英文來說這兩種都不是等寬字體。而對於漢字,一般使用的漢字字體都是等寬的,方塊字嘛)。下面是測試結果(仍然用100*100的按鈕來測試):
字體 / 字號 / 水平尺寸 / 垂直尺寸
Verdana / 8 / 175 / 163
        / 9 / 200 / 175
        / 10 / 200 / 200
         / 11 / 225 / 225
        / 12 / 250 / 225
宋體 / 8 / 150 / 138
     / 9 / 150 / 150
     / 10 / 175 / 163
     / 11 / 200 / 188
     / 12 / 200 / 200
結論1:如果對FixedSys和System字體的效果不滿意,選用12號宋體/10號Verdana是比較好的
結論2:雖然只能使用若干種有限的字體,但能給編程帶來一些方便,還是值得的(相比字體效果的損失)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM