对话框大小与像素关系 转载

我们知道可以用记事本打开.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:虽然只能使用若干种有限的字体,但能给编程带来一些方便,还是值得的(相比字体效果的损失)

对话框大小与像素关系 转载

时间: 2024-08-02 02:04:45

对话框大小与像素关系 转载的相关文章

对话框大小与像素关系

转载▼ 我们知道可以用记事本打开.rc文件,然后改里面的坐标,来改变对话框大小,如: 以下是rc文件 ///////////////////////////////////////////////////////////////////////////// // // Dialog // IDD_ABOUTBOX DIALOGEX 0, 0, 170, 62 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTIO

MFC如何使控件大小随着对话框大小自动调整

对话框的大小变化后,假若对话框上的控件大小不变化,看起来会比较难看.下面就介绍怎么让对话框上的控件随着对话框的大小的变化自动调整. 首先明确的是Windows有一个WM_SIZE消息响应函数,这个函数在对话框大小发生变化的时候调用,所以我们可以记录下原来对话框的大小,还有当前对话框的大小(这个不用自己算,系统已给出),然后根据控件做出相应比例的调整. 比如原来对话框大小为a,现在为b,原来控件大小为c,那么现在的控件大小应该为c*b/a;(注意a不能为0). 看实例:(黑体字为添加的代码!!)

MFC控件随对话框大小改变而改变

这也是我项目中碰到的问题,要让对话框中的控件随着对话框大小的变化进行自动调整,一般的做法是在WM_SIZE的响应函数中对所有的控件用MoveWindow()或者SetWindowPos()设置其变化比例. 但是由于需要自己计算,并且还有各种系统引起的情况,比如WIN7里有个选项"拖动时显示窗口内容",选中与不选中导致对话框内容显示完全不一样,选中时错误,不选正确,确实让人头大. 如EasySize是一个很好解决方案,用一些宏封装了内部的实现机制,使用起来方便快捷.原文地址:http:/

MFC 根据需要调整对话框大小

通常在写图片或影像显示相关程序的时候需要先根据图像的分辨率来动态调整对话框和里面控件的大小和比例之后再进行显示.下面来介绍下做法,单单是调整对话框的大小和位置是很简单的,只需要下面的代码 int screenwidth = GetSystemMetrics(SM_CXFULLSCREEN);//获取屏幕分辨率宽度,不包括任务栏等区域 int screenheight = GetSystemMetrics(SM_CYFULLSCREEN);//获取屏幕分辨率高度,不包括任务栏等区域 CRect r

谈谈类之间的关联关系与依赖关系(转载)

(转载自:http://www.cnblogs.com/iyangyuan/archive/2013/06/16/3138463.html) 对于很多刚刚接触UML的童鞋,可能会对类之间的关联与依赖关系不太理解,今天小菜就浅薄的讲一下. 这块的确是有点乱,不过小菜突然找到了一个比较好的切入点,拿出来分享一下. 接触过设计模式的读者,会经常看到这样的场景:在实例化A类的时候,需要B类作为构造方法的参数,这说明A类需要持有一个B类的引用.比如代理模式.装饰模式等,都会这样做.例如Java中的IO流采

类与类之间的关系-----转载

类与类之间的几种关系 一.继承关系      继承指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力.在Java中继承关系通过关键字extends明确标识,在设计时一般没有争议性.在UML类图设计中,继承用一条带空心三角箭头的实线表示,从子类指向父类,或者子接口指向父接口. 二.实现关系      实现指的是一个class类实现interface接口(可以是多个)的功能,实现是类与接口之间最常见的关系.在Java中此类关系通过关键字impl

深入理解javascript原型和闭包(2)——函数和对象的关系 (转载)

深入理解javascript原型和闭包(2)--函数和对象的关系 上文(理解javascript原型和作用域系列(1)--一切都是对象)已经提到,函数就是对象的一种,因为通过instanceof函数可以判断. var fn = function () { }; console.log(fn instanceof Object); // true 对!函数是一种对象,但是函数却不像数组一样--你可以说数组是对象的一种,因为数组就像是对象的一个子集一样.但是函数与对象之间,却不仅仅是一种包含和被包含

动态改变dialog对话框大小

//在dialog.show()之后调用 public static void setDialogWindowAttr(Dialog dlg,Context ctx){     Window window = dlg.getWindow();     WindowManager.LayoutParams lp = window.getAttributes();     lp.gravity = Gravity.CENTER;     lp.width = LayoutParams.WRAP_CO

搞不清FastCgi与PHP-fpm之间是个什么样的关系(转载)

刚开始对这个问题我也挺纠结的,看了<HTTP权威指南>后,感觉清晰了不少. 首先,CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者. web server(比如说nginx)只是内容的分发者.比如,如果请求/index.html,那么web server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据.好了,如果现在请求的是/index.php,根据配置文件,nginx知道这个不是静态文件,需要去找PHP解析器来处理,那么他会