资源文件中的大小与像素转换-创新互联

资源文件中的大小

创新互联建站是由多位在大型网络公司、广告设计公司的优秀设计人员和策划人员组成的一个具有丰富经验的团队,其中包括网站策划、网页美工、网站程序员、网页设计师、平面广告设计师、网络营销人员及形象策划。承接:网站设计制作、网站设计、网站改版、网页设计制作、网站建设与维护、网络推广、数据库开发,以高性价比制作企业网站、行业门户平台等全方位的服务。

IDD_MAINDLG DIALOG DISCARDABLE  0, 0, 343, 199

0, 0, 343, 199

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

这个单位是DLU 

转换成pix 使用     
RECT r1 ={0,0,343,199};

MapDialogRect(&r1);

虽然转换成了pix,但是这个数据是client区域的大小

如何计算标题栏的大小,还是边框的大小呢,

真是一个麻烦的事情 。

//设定窗口的WindowRect使用

long width   = r1.right + 3D边框

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

但是这并不包括 标题栏,3D边框的大小。 

快速获取系统信息的函数为GetSystemMetrics,传入SM_CYCAPTION即可返回标题栏的高度。代码如下:

rect.bottom = GetSystemMetrics(SM_CYCAPTION);

//要根据窗口的style,来设定标题栏的大小,和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)

这个索引值不是固定的,要根据窗口的boder  style,设置参数的内容。

我在这里使用的的Dialog风格。

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

DWORD dwStyle = GetWindowLong(GWL_STYLE) ; 

if(dwStyle & WS_CAPTION)
{

}

不同的窗口风格,标题栏和border的大小都是不一样的。

真是麻烦,
对于窗口的创建理解还是不够明了。稀里湖涂的在写代码。

另外,还有对应的api 可以根据client区的大小,重新计算窗口的大小值 :

MFC的方法则更加简单
在Create()或者CreateEx()创建窗口以后, 用下面的代码调整窗口的大小。
CRect rect(0, 0, w, h);
CalcWindowRect(&rect);
SetWindowPos(NULL, 0, 0, rect.Width(), rect.Height(),   SWP_NOMOVE | SWP_NOZORDER | SWP_NOREDRAW);

 //设定客户区大小为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;

根据所需的客户端矩形大小计算窗口矩形的所需大小。 然后,窗口矩形可以传递给 CreateWindow 函数,以创建其工作区为所需大小的窗口。

若要指定扩展窗口样式,请使用 AdjustWindowRectEx 函数。

语法

C++复制

BOOL AdjustWindowRect(
  [in, out] LPRECT lpRect,
  [in]      DWORD  dwStyle,
  [in]      BOOL   bMenu
);
参数

[in, out] lpRect

类型: LPRECT

指向 RECT 结构的指针,该结构包含所需工作区左上角和右下角的坐标。 函数返回时,结构包含窗口左上角和右下角的坐标,以适应所需的工作区。

[in] dwStyle

类型:DWORD

要计算所需大小的窗口的 窗口样式 。 请注意,不能指定 WS_OVERLAPPED 样式。

[in] bMenu

类型: BOOL

指示窗口是否具有菜单。

返回值

类型: BOOL

如果该函数成功,则返回值为非零值。

如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。

注解

客户端矩形是完全封闭工作区的最小矩形。 窗口矩形是完全封闭窗口的最小矩形,包括工作区和非封闭区域。

当菜单栏换行到两行或更多行时, AdjustWindowRect 函数不会增加额外的空间。

AdjustWindowRect 函数不考虑WS_VSCROLL或WS_HSCROLL样式。 若要考虑滚动条,请使用SM_CXVSCROLL或SM_CYHSCROLL调用 GetSystemMetrics 函数。

假设我们用CreateWindow(..., 0, 0, w, h, ...); 创建一个窗口, 我们将获得一个w x h大小的窗口, 通常我们需要的是客户区大小为w x h, 如何做呢?

一个方法是调用API函数SetWindowPos, 通常我们需要提供3个参数:窗口句柄hwnd,窗口宽度w,窗口高度h。下面是一个示例:
SetWindowPos(hwnd, NULL, 0, 0, w, h, SWP_NOMOVE | SWP_NOZORDER);

现在的问题是我们只知道客户区的大小w x h, 如何获取窗口大小呢?

这里的关键是
wWindow = wClient + wFrame * 2
hWindow = hClient + hCaption + hMenu + hFrame * 2
其中wFrame, hCaption, hMenu, hFrame取值则需要根据窗口样式而定了。
如果窗口提供了Caption, 则hCaption=GetSystemMetrics(SM_CYCAPTION); 否则为0
如果窗口提供了菜单, 则hMenu=GetSystemMetrics(SM_CYMENU); 否则为0
如果窗口提供了Border, 则wFrame=GetSystemMetrics(SM_CXFRAME),hFrame=GetSystemMetrics(SM_CYFRAME); 否则为0

综合起来,如果窗口具有标题栏,具有菜单,具有border,我们可以这样创建一个指定客户区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 函数以像素为单位返回对话框基单位。 坐标的确切含义取决于 STYLE 选项语句定义的样式。 对于子样式对话框,坐标相对于父窗口的原点,除非对话框具有样式 DS_ABSALIGN;在这种情况下,坐标相对于显示屏幕的原点。

不要将 WS_CHILD 样式与模式对话框一起使用。 DialogBox 函数始终禁用新创建的对话框的父/所有者。 禁用父窗口时,将隐式禁用其子窗口。 由于禁用子样式对话框的父窗口,因此子样式对话框也处于禁用状态。

如果对话框具有 DS_ABSALIGN 样式,则其左上角的对话框坐标相对于屏幕原点而不是父窗口左上角。 如果希望对话框在特定部分开始显示,无论父窗口位于屏幕上的位置,通常都会使用此样式。

名称 DIALOG 还可以用作 CreateWindow 函数的类名称参数,以使用对话框属性创建窗口。

示例

下面演示 了 DIALOG 语句的用法:

syntax复制

#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 返回的水平基单位等于系统字体中字符的平均宽度(以像素为单位):垂直基单位等于字体的高度(以像素为单位)。

仅当对话框模板无法指定字体时,才会使用系统字体。 大多数对话框模板指定字体;因此,此函数不适用于大多数对话框。

对于不使用系统字体的对话框,基本单位是对话框字体中字符的平均宽度和高度(以像素为单位)。 可以使用 GetTextMetrics 和 GetTextExtentPoint32 函数计算所选字体的这些值。 但是,通过使用 MapDialogRect 函数,可以避免在计算与系统执行的计算不同时可能导致的错误。

每个水平基单位等于 4 个水平对话模板单位;每个垂直基单位等于 8 个垂直对话模板单位。 因此,若要将对话框模板单位转换为像素,请使用以下公式:

复制

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

同样,若要从像素转换为对话模板单位,请使用以下公式:

复制

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

下面是GetSystemMetrics函数参数nIndex的定义:

SM_ARRANGE 返回是否预备最小化.
SM_CLEANBOOT 返回系统启动方式:
0 正常启动
1 安全模式启动
2 网络安全模式启动
SM_CMOUSEBUTTONS 返回值为系统支持的鼠标键数,返回0,则系统中没有安装鼠标。
SM_CXBORDER,
SM_CYBORDER 返回以相素值为单位的Windows窗口边框的宽度和高度,如果Windows的为3D形态,则
等同于SM_CXEDGE参数
SM_CXCURSOR,
SM_CYCURSOR 返回以相素值为单位的标准光标的宽度和高度
SM_CXDLGFRAME,
SM_CYDLGFRAME 等同与SM_CXFIXEDFRAME and SM_CYFIXEDFRAME
SM_CXDOUBLECLK,
SM_CYDOUBLECLK 以相素值为单位的双击有效的矩形区域
SM_CXEDGE,SM_CYEDGE 以相素值为单位的3D边框的宽度和高度
SM_CXFIXEDFRAME,
SM_CYFIXEDFRAME 围绕具有标题但无法改变尺寸的窗口(通常是一些对话框)的边框的厚度
SM_CXFRAME,SM_CYFRAME 等同于SM_CXSIZEFRAME and SM_CYSIZEFRAME
SM_CXFULLSCREEN,
SM_CYFULLSCREEN 全屏幕窗口的窗口区域的宽度和高度
SM_CXHSCROLL,
SM_CYHSCROLL 水平滚动条的高度和水平滚动条上箭头的宽度
SM_CXHTHUMB 以相素为单位的水平滚动条上的滑动块宽度
SM_CXICON,SM_CYICON 系统缺省的图标的高度和宽度(一般为32*32)
SM_CXICONSPACING,
SM_CYICONSPACING 以大图标方式查看Item时图标之间的间距,这个距离总是大于等于
SM_CXICON and SM_CYICON.
SM_CXMAXIMIZED,
SM_CYMAXIMIZED 处于顶层的大化窗口的缺省尺寸
SM_CXMAXTRACK,
SM_CYMAXTRACK 具有可改变尺寸边框和标题栏的窗口的缺省大尺寸,如果窗口大于这个
尺寸,窗口是不可移动的。
SM_CXMENUCHECK,
SM_CYMENUCHECK 以相素为单位计算的菜单选中标记位图的尺寸
SM_CXMENUSIZE,
SM_CYMENUSIZE 以相素计算的菜单栏按钮的尺寸
SM_CXMIN,SM_CYMIN 窗口所能达到的最小尺寸
SM_CXMINIMIZED,
SM_CYMINIMIZED 正常的最小化窗口的尺寸
SM_CXMINTRACK,
SM_CYMINTRACK 最小跟踪距离,当使用者拖动窗口移动距离小于这个值,窗口不会移动。
SM_CXSCREEN,
SM_CYSCREEN 以相素为单位计算的屏幕尺寸。
SM_CXSIZE,SM_CYSIZE 以相素计算的标题栏按钮的尺寸
SM_CXSIZEFRAME,
SM_CYSIZEFRAME 围绕可改变大小的窗口的边框的厚度
SM_CXSMICON,
SM_CYSMICON 以相素计算的小图标的尺寸,小图标一般出现在窗口标题栏上。
M_CXVSCROLL,
SM_CYVSCROLL 以相素计算的垂直滚动条的宽度和垂直滚动条上箭头的高度
SM_CYCAPTION 以相素计算的普通窗口标题的高度
SM_CYMENU 以相素计算的单个菜单条的高度
SM_CYSMCAPTION 以相素计算的窗口小标题栏的高度
SM_CYVTHUMB 以相素计算的垂直滚动条中滚动块的高度
SM_DBCSENABLED 如果为TRUE或不为0的值表明系统安装了双字节版本的USER.EXE,为FALSE或0则不是。
SM_DEBUG 如果为TRUE或不为0的值表明系统安装了debug版本的USER.EXE,为FALSE或0则不是。
SM_MENUDROPALIGNMENT 如果为TRUE或不为0的值下拉菜单是右对齐的否则是左对齐的。
SM_MOUSEPRESENT 如果为TRUE或不为0的值则安装了鼠标,否则没有安装。
SM_MOUSEWHEELPRESENT 如果为TRUE或不为0的值则安装了滚轮鼠标,否则没有安装。(Windows NT only)
SM_SWAPBUTTON 如果为TRUE或不为0的值则鼠标左右键交换,否则没有。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


本文名称:资源文件中的大小与像素转换-创新互联
网站路径:http://azwzsj.com/article/gocpe.html