资源文件中的大小与像素转换

资源文件中的大小

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_VSCROLLWS_HSCROLL样式。 若要考虑滚动条,请使用SM_CXVSCROLLSM_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复制

#include <windows.h>

ErrorDialog 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的值则鼠标左右键交换,否则没有。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 您可以使用Python的PIL库(Python Imaging Library)来导入图像。首先,要安装PIL库,可以使用以下命令: ``` pip install pillow ``` 然后,您可以使用以下代码将图像加载到Python文件: ```python from PIL import Image img = Image.open("image.jpg") ``` 其,"image.jpg"是您要加载的图像文件的路径。现在,您可以对该图像执行各种操作,例如裁剪、调整大小等。 ### 回答2: 要将图片导入Python文件,首先需要使用Python的PIL库(Pillow库的一个分支)来处理图像。下面是导入图片的基本步骤: 1. 首先,需要确保PIL库已经被安装。可以使用以下命令来安装PIL库: ``` pip install pillow ``` 2. 在Python文件导入PIL库: ```python from PIL import Image ``` 3. 使用`open()`函数打开图片文件,并将其赋值给一个变量: ```python image = Image.open('image.jpg') ``` 这里的`'image.jpg'`是图片文件的路径和名称,可以根据实际情况进行修改。 4. 可以对图像进行一些处理,例如调整大小、裁剪、旋转等等。以下是一些常见的图像处理方法的示例: ```python resized_image = image.resize((200, 200)) # 调整大小为200x200像素 cropped_image = image.crop((100, 100, 300, 300)) # 裁剪出100x100到300x300的区域 rotated_image = image.rotate(45) # 旋转45度 ``` 5. 最后,可以保存处理后的图像文件: ```python resized_image.save('resized_image.jpg') # 保存调整大小后的图像 ``` 同样,`'resized_image.jpg'`是保存图像的路径和名称,可以根据实际情况进行修改。 这样就完成了将图片导入到Python文件的操作。可以根据具体的需求来使用PIL库提供的更多功能来处理和操作图像。 ### 回答3: 在Python,我们可以使用PIL库(Python Imaging Library)来处理图片。首先,确保已经安装了PIL库。如果没有安装,可以使用命令`pip install pillow`来安装。 首先,我们需要使用PIL库的`Image`模块,其的`open()`函数用于打开图片文件。例如,如果图片文件名为`image.jpg`,可以使用以下代码将图片导入到Python文件: ```python from PIL import Image image = Image.open("image.jpg") ``` 在导入图像之后,你可以使用PIL库的各种函数来对图像进行各种操作,例如调整大小转换颜色空间等。 如果你想要对图像进行显示,可以使用`show()`函数: ```python image.show() ``` 导入的图像在程序以`Image`对象的形式存在,你可以根据需要使用对象的各种属性和方法对图像进行处理。例如,可以使用`size`属性来获取图像的尺寸: ```python width, height = image.size print("图像宽度:", width) print("图像高度:", height) ``` 最后,记得在程序结束时关闭图像文件,以释放源: ```python image.close() ``` 总之,通过PIL库的`Image`模块,我们可以方便地将图片导入到Python文件并对其进行各种处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

衢州大白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值