對話框大小與像素關係 轉載

咱們知道能夠用記事本打開.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:雖然只能使用若干種有限的字體,但能給編程帶來一些方便,仍是值得的(相比字體效果的損失)
相關文章
相關標籤/搜索