資源文件中的大小與像素轉(zhuǎn)換-創(chuàng)新互聯(lián)

資源文件中的大小

創(chuàng)新互聯(lián)建站是由多位在大型網(wǎng)絡(luò)公司、廣告設(shè)計(jì)公司的優(yōu)秀設(shè)計(jì)人員和策劃人員組成的一個(gè)具有豐富經(jīng)驗(yàn)的團(tuán)隊(duì),其中包括網(wǎng)站策劃、網(wǎng)頁(yè)美工、網(wǎng)站程序員、網(wǎng)頁(yè)設(shè)計(jì)師、平面廣告設(shè)計(jì)師、網(wǎng)絡(luò)營(yíng)銷(xiāo)人員及形象策劃。承接:網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)、網(wǎng)站改版、網(wǎng)頁(yè)設(shè)計(jì)制作、網(wǎng)站建設(shè)與維護(hù)、網(wǎng)絡(luò)推廣、數(shù)據(jù)庫(kù)開(kāi)發(fā),以高性?xún)r(jià)比制作企業(yè)網(wǎng)站、行業(yè)門(mén)戶(hù)平臺(tái)等全方位的服務(wù)。

IDD_MAINDLG DIALOG DISCARDABLE ?0, 0, 343, 199

0, 0, 343, 199

表示的意思是,0,0, width,height

這個(gè)單位是DLU?

轉(zhuǎn)換成pix?使用??? ?
RECT r1 ={0,0,343,199};

MapDialogRect(&r1);

雖然轉(zhuǎn)換成了pix,但是這個(gè)數(shù)據(jù)是client區(qū)域的大小

如何計(jì)算標(biāo)題欄的大小,還是邊框的大小呢,

真是一個(gè)麻煩的事情 。

//設(shè)定窗口的WindowRect使用

long width? ?=?r1.right + 3D邊框

long? height =??r1.bottom?
SetWindowPos(NULL,0,0,width ,height ,SWP_NOZORDER|SWP_NOMOVE|SWP_FRAMECHANGED);

但是這并不包括?標(biāo)題欄,3D邊框的大小。?

快速獲取系統(tǒng)信息的函數(shù)為GetSystemMetrics,傳入SM_CYCAPTION即可返回標(biāo)題欄的高度。代碼如下:

rect.bottom = GetSystemMetrics(SM_CYCAPTION);

//要根據(jù)窗口的style,來(lái)設(shè)定標(biāo)題欄的大小,和border大小,才能真正的得到資源文件中一樣的窗口大小。

long width???=?r1.right + GetSystemMetrics(SM_CXDLGFRAME) * 2

long??height =??r1.bottom? + GetSystemMetrics(SM_CYCAPTION)? +??GetSystemMetrics(SM_CYDLGFRAME) ?* 2
SetWindowPos(NULL,0,0,width ,height ,SWP_NOZORDER|SWP_NOMOVE|SWP_FRAMECHANGED);

其中?GetSystemMetrics(SM_CXDLGFRAME)

這個(gè)索引值不是固定的,要根據(jù)窗口的boder? style,設(shè)置參數(shù)的內(nèi)容。

我在這里使用的的Dialog風(fēng)格。

判斷窗口是否含有指定的style

DWORD dwStyle = GetWindowLong(GWL_STYLE) ; 

if(dwStyle & WS_CAPTION)
{

}

不同的窗口風(fēng)格,標(biāo)題欄和border的大小都是不一樣的。

真是麻煩,
對(duì)于窗口的創(chuàng)建理解還是不夠明了。稀里湖涂的在寫(xiě)代碼。

另外,還有對(duì)應(yīng)的api?可以根據(jù)client區(qū)的大小,重新計(jì)算窗口的大小值 :

MFC的方法則更加簡(jiǎn)單
在Create()或者CreateEx()創(chuàng)建窗口以后, 用下面的代碼調(diào)整窗口的大小。
CRect rect(0, 0, w, h);
CalcWindowRect(&rect);
SetWindowPos(NULL, 0, 0, rect.Width(), rect.Height(),?? SWP_NOMOVE | SWP_NOZORDER | SWP_NOREDRAW);

?//設(shè)定客戶(hù)區(qū)大小為800*600
rect(0,0,800,600);
::AdjustWindowRectEx(&rect,cs.style,TRUE,cs.dwExStyle);
cs.cx=rect.Width();
cs.cy=rect.Height();
//改變視窗的位置讓它固定在屏幕中間
CRect rcArea;
SystemParametersInfo( SPI_GETWORKAREA, NULL, &rcArea, NULL );
cs.x = rcArea.left + ( rcArea.Width() - cs.cx ) / 2;
cs.y = rcArea.top + ( rcArea.Height() - cs.cy ) / 2;

根據(jù)所需的客戶(hù)端矩形大小計(jì)算窗口矩形的所需大小。 然后,窗口矩形可以傳遞給?CreateWindow?函數(shù),以創(chuàng)建其工作區(qū)為所需大小的窗口。

若要指定擴(kuò)展窗口樣式,請(qǐng)使用?AdjustWindowRectEx?函數(shù)。

語(yǔ)法

C++復(fù)制

BOOL AdjustWindowRect(
  [in, out] LPRECT lpRect,
  [in]      DWORD  dwStyle,
  [in]      BOOL   bMenu
);
參數(shù)

[in, out] lpRect

類(lèi)型:?LPRECT

指向?RECT?結(jié)構(gòu)的指針,該結(jié)構(gòu)包含所需工作區(qū)左上角和右下角的坐標(biāo)。 函數(shù)返回時(shí),結(jié)構(gòu)包含窗口左上角和右下角的坐標(biāo),以適應(yīng)所需的工作區(qū)。

[in] dwStyle

類(lèi)型:DWORD

要計(jì)算所需大小的窗口的?窗口樣式?。 請(qǐng)注意,不能指定?WS_OVERLAPPED?樣式。

[in] bMenu

類(lèi)型:?BOOL

指示窗口是否具有菜單。

返回值

類(lèi)型:?BOOL

如果該函數(shù)成功,則返回值為非零值。

如果函數(shù)失敗,則返回值為零。 要獲得更多的錯(cuò)誤信息,請(qǐng)調(diào)用 GetLastError。

注解

客戶(hù)端矩形是完全封閉工作區(qū)的最小矩形。 窗口矩形是完全封閉窗口的最小矩形,包括工作區(qū)和非封閉區(qū)域。

當(dāng)菜單欄換行到兩行或更多行時(shí),?AdjustWindowRect?函數(shù)不會(huì)增加額外的空間。

AdjustWindowRect?函數(shù)不考慮WS_VSCROLL或WS_HSCROLL樣式。 若要考慮滾動(dòng)條,請(qǐng)使用SM_CXVSCROLL或SM_CYHSCROLL調(diào)用?GetSystemMetrics?函數(shù)。

假設(shè)我們用CreateWindow(..., 0, 0, w, h, ...); 創(chuàng)建一個(gè)窗口, 我們將獲得一個(gè)w x h大小的窗口, 通常我們需要的是客戶(hù)區(qū)大小為w x h, 如何做呢?

一個(gè)方法是調(diào)用API函數(shù)SetWindowPos, 通常我們需要提供3個(gè)參數(shù):窗口句柄hwnd,窗口寬度w,窗口高度h。下面是一個(gè)示例:
SetWindowPos(hwnd, NULL, 0, 0, w, h, SWP_NOMOVE | SWP_NOZORDER);

現(xiàn)在的問(wèn)題是我們只知道客戶(hù)區(qū)的大小w x h, 如何獲取窗口大小呢?

這里的關(guān)鍵是
wWindow = wClient + wFrame * 2
hWindow = hClient + hCaption + hMenu + hFrame * 2
其中wFrame, hCaption, hMenu, hFrame取值則需要根據(jù)窗口樣式而定了。
如果窗口提供了Caption, 則hCaption=GetSystemMetrics(SM_CYCAPTION); 否則為0
如果窗口提供了菜單, 則hMenu=GetSystemMetrics(SM_CYMENU); 否則為0
如果窗口提供了Border, 則wFrame=GetSystemMetrics(SM_CXFRAME),hFrame=GetSystemMetrics(SM_CYFRAME); 否則為0

綜合起來(lái),如果窗口具有標(biāo)題欄,具有菜單,具有border,我們可以這樣創(chuàng)建一個(gè)指定客戶(hù)區(qū)w x h大小的窗口:
CreateWindow(..., 0, 0, w, h, ...);
w = w + GetSystemMetrics(SM_CXFRAME) * 2;
h = h + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYFRAME) * 2;
SetWindowPos(hwnd, NULL, 0, 0, w, h, SWP_NOMOVE | SWP_NOZORDER);

以下為搜羅的資料:

GetDialogBaseUnits?函數(shù)以像素為單位返回對(duì)話(huà)框基單位。 坐標(biāo)的確切含義取決于?STYLE?選項(xiàng)語(yǔ)句定義的樣式。 對(duì)于子樣式對(duì)話(huà)框,坐標(biāo)相對(duì)于父窗口的原點(diǎn),除非對(duì)話(huà)框具有樣式?DS_ABSALIGN;在這種情況下,坐標(biāo)相對(duì)于顯示屏幕的原點(diǎn)。

不要將?WS_CHILD?樣式與模式對(duì)話(huà)框一起使用。?DialogBox?函數(shù)始終禁用新創(chuàng)建的對(duì)話(huà)框的父/所有者。 禁用父窗口時(shí),將隱式禁用其子窗口。 由于禁用子樣式對(duì)話(huà)框的父窗口,因此子樣式對(duì)話(huà)框也處于禁用狀態(tài)。

如果對(duì)話(huà)框具有?DS_ABSALIGN?樣式,則其左上角的對(duì)話(huà)框坐標(biāo)相對(duì)于屏幕原點(diǎn)而不是父窗口左上角。 如果希望對(duì)話(huà)框在特定部分開(kāi)始顯示,無(wú)論父窗口位于屏幕上的位置,通常都會(huì)使用此樣式。

名稱(chēng)?DIALOG?還可以用作?CreateWindow?函數(shù)的類(lèi)名稱(chēng)參數(shù),以使用對(duì)話(huà)框?qū)傩詣?chuàng)建窗口。

示例

下面演示?了 DIALOG?語(yǔ)句的用法:

syntax復(fù)制

#includeErrorDialog DIALOG  10, 10, 300, 110
STYLE WS_POPUP | WS_BORDER
CAPTION "Error!" 
{
    CTEXT "Select One:", 1, 10, 10, 280, 12
    PUSHBUTTON "&Retry", 2, 75, 30, 60, 12
    PUSHBUTTON "&Abort", 3, 75, 50, 60, 12
    PUSHBUTTON "&Ignore", 4, 75, 80, 60, 12
}

GetDialogBaseUnits?返回的水平基單位等于系統(tǒng)字體中字符的平均寬度(以像素為單位):垂直基單位等于字體的高度(以像素為單位)。

僅當(dāng)對(duì)話(huà)框模板無(wú)法指定字體時(shí),才會(huì)使用系統(tǒng)字體。 大多數(shù)對(duì)話(huà)框模板指定字體;因此,此函數(shù)不適用于大多數(shù)對(duì)話(huà)框。

對(duì)于不使用系統(tǒng)字體的對(duì)話(huà)框,基本單位是對(duì)話(huà)框字體中字符的平均寬度和高度(以像素為單位)。 可以使用?GetTextMetrics?和?GetTextExtentPoint32?函數(shù)計(jì)算所選字體的這些值。 但是,通過(guò)使用?MapDialogRect?函數(shù),可以避免在計(jì)算與系統(tǒng)執(zhí)行的計(jì)算不同時(shí)可能導(dǎo)致的錯(cuò)誤。

每個(gè)水平基單位等于 4 個(gè)水平對(duì)話(huà)模板單位;每個(gè)垂直基單位等于 8 個(gè)垂直對(duì)話(huà)模板單位。 因此,若要將對(duì)話(huà)框模板單位轉(zhuǎn)換為像素,請(qǐng)使用以下公式:

復(fù)制

pixelX = MulDiv(templateunitX, baseunitX, 4);
pixelY = MulDiv(templateunitY, baseunitY, 8);

同樣,若要從像素轉(zhuǎn)換為對(duì)話(huà)模板單位,請(qǐng)使用以下公式:

復(fù)制

templateunitX = MulDiv(pixelX, 4, baseunitX);
templateunitY = MulDiv(pixelY, 8, baseunitY);

下面是GetSystemMetrics函數(shù)參數(shù)nIndex的定義:

SM_ARRANGE 返回是否預(yù)備最小化.
SM_CLEANBOOT 返回系統(tǒng)啟動(dòng)方式:
0 正常啟動(dòng)
1 安全模式啟動(dòng)
2 網(wǎng)絡(luò)安全模式啟動(dòng)
SM_CMOUSEBUTTONS 返回值為系統(tǒng)支持的鼠標(biāo)鍵數(shù),返回0,則系統(tǒng)中沒(méi)有安裝鼠標(biāo)。
SM_CXBORDER,
SM_CYBORDER 返回以相素值為單位的Windows窗口邊框的寬度和高度,如果Windows的為3D形態(tài),則
等同于SM_CXEDGE參數(shù)
SM_CXCURSOR,
SM_CYCURSOR 返回以相素值為單位的標(biāo)準(zhǔn)光標(biāo)的寬度和高度
SM_CXDLGFRAME,
SM_CYDLGFRAME 等同與SM_CXFIXEDFRAME and SM_CYFIXEDFRAME
SM_CXDOUBLECLK,
SM_CYDOUBLECLK 以相素值為單位的雙擊有效的矩形區(qū)域
SM_CXEDGE,SM_CYEDGE 以相素值為單位的3D邊框的寬度和高度
SM_CXFIXEDFRAME,
SM_CYFIXEDFRAME 圍繞具有標(biāo)題但無(wú)法改變尺寸的窗口(通常是一些對(duì)話(huà)框)的邊框的厚度
SM_CXFRAME,SM_CYFRAME 等同于SM_CXSIZEFRAME and SM_CYSIZEFRAME
SM_CXFULLSCREEN,
SM_CYFULLSCREEN 全屏幕窗口的窗口區(qū)域的寬度和高度
SM_CXHSCROLL,
SM_CYHSCROLL 水平滾動(dòng)條的高度和水平滾動(dòng)條上箭頭的寬度
SM_CXHTHUMB 以相素為單位的水平滾動(dòng)條上的滑動(dòng)塊寬度
SM_CXICON,SM_CYICON 系統(tǒng)缺省的圖標(biāo)的高度和寬度(一般為32*32)
SM_CXICONSPACING,
SM_CYICONSPACING 以大圖標(biāo)方式查看Item時(shí)圖標(biāo)之間的間距,這個(gè)距離總是大于等于
SM_CXICON and SM_CYICON.
SM_CXMAXIMIZED,
SM_CYMAXIMIZED 處于頂層的大化窗口的缺省尺寸
SM_CXMAXTRACK,
SM_CYMAXTRACK 具有可改變尺寸邊框和標(biāo)題欄的窗口的缺省大尺寸,如果窗口大于這個(gè)
尺寸,窗口是不可移動(dòng)的。
SM_CXMENUCHECK,
SM_CYMENUCHECK 以相素為單位計(jì)算的菜單選中標(biāo)記位圖的尺寸
SM_CXMENUSIZE,
SM_CYMENUSIZE 以相素計(jì)算的菜單欄按鈕的尺寸
SM_CXMIN,SM_CYMIN 窗口所能達(dá)到的最小尺寸
SM_CXMINIMIZED,
SM_CYMINIMIZED 正常的最小化窗口的尺寸
SM_CXMINTRACK,
SM_CYMINTRACK 最小跟蹤距離,當(dāng)使用者拖動(dòng)窗口移動(dòng)距離小于這個(gè)值,窗口不會(huì)移動(dòng)。
SM_CXSCREEN,
SM_CYSCREEN 以相素為單位計(jì)算的屏幕尺寸。
SM_CXSIZE,SM_CYSIZE 以相素計(jì)算的標(biāo)題欄按鈕的尺寸
SM_CXSIZEFRAME,
SM_CYSIZEFRAME 圍繞可改變大小的窗口的邊框的厚度
SM_CXSMICON,
SM_CYSMICON 以相素計(jì)算的小圖標(biāo)的尺寸,小圖標(biāo)一般出現(xiàn)在窗口標(biāo)題欄上。
M_CXVSCROLL,
SM_CYVSCROLL 以相素計(jì)算的垂直滾動(dòng)條的寬度和垂直滾動(dòng)條上箭頭的高度
SM_CYCAPTION 以相素計(jì)算的普通窗口標(biāo)題的高度
SM_CYMENU 以相素計(jì)算的單個(gè)菜單條的高度
SM_CYSMCAPTION 以相素計(jì)算的窗口小標(biāo)題欄的高度
SM_CYVTHUMB 以相素計(jì)算的垂直滾動(dòng)條中滾動(dòng)塊的高度
SM_DBCSENABLED 如果為T(mén)RUE或不為0的值表明系統(tǒng)安裝了雙字節(jié)版本的USER.EXE,為FALSE或0則不是。
SM_DEBUG 如果為T(mén)RUE或不為0的值表明系統(tǒng)安裝了debug版本的USER.EXE,為FALSE或0則不是。
SM_MENUDROPALIGNMENT 如果為T(mén)RUE或不為0的值下拉菜單是右對(duì)齊的否則是左對(duì)齊的。
SM_MOUSEPRESENT 如果為T(mén)RUE或不為0的值則安裝了鼠標(biāo),否則沒(méi)有安裝。
SM_MOUSEWHEELPRESENT 如果為T(mén)RUE或不為0的值則安裝了滾輪鼠標(biāo),否則沒(méi)有安裝。(Windows NT only)
SM_SWAPBUTTON 如果為T(mén)RUE或不為0的值則鼠標(biāo)左右鍵交換,否則沒(méi)有。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)頁(yè)題目:資源文件中的大小與像素轉(zhuǎn)換-創(chuàng)新互聯(lián)
新聞來(lái)源:http://bm7419.com/article34/gocpe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、用戶(hù)體驗(yàn)建站公司、App開(kāi)發(fā)、品牌網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化