MFC中资源视图中对话框大小和实际像素尺寸显示问题

在使用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:虽然只能使用若干种有限的字体,但能给编程带来一些方便,还是值得的(相比字体效果的损失)

转自:http://hi.baidu.com/wuweihua_0115/item/7bb3c23baad61405ceb9feed

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC ,CFormView 类派生自 CScrollView 类,因此它可以支持滚动视图的功能。默认情况下,CFormView 对话框是根据对话框模板的大小来创建的,而不是根据视图大小来创建的。如果你想要让对话框视图一样大小,可以按照以下步骤操作: 1. 打开 CFormView 对应的类文件,找到 OnInitialUpdate 函数。 2. 在 OnInitialUpdate 函数添加以下代码: ``` CRect rect; GetClientRect(&rect); m_pDialog->SetWindowPos(nullptr, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOZORDER); ``` 其,m_pDialog 是 CFormView 对话框指针,可以通过以下代码获取: ``` CDialog* pDlg = GetDlgItem(IDC_MY_DIALOG); m_pDialog = dynamic_cast<MyDialog*>(pDlg); ``` 这里的 IDC_MY_DIALOG 是对话框模板对话框控件的 ID,MyDialog 是对话框类的名称,可以根据你的实际情况进行修改。 3. 在 CFormView 的 OnInitialUpdate 函数添加以下代码: ``` CSize sizeTotal; // TODO: 计算视图大小 sizeTotal.cx = /* 视图宽度 */; sizeTotal.cy = /* 视图的高度 */; SetScrollSizes(MM_TEXT, sizeTotal); ``` 其,TODO 后面的代码需要根据你的具体需求进行修改,计算视图大小,并将其赋值给 sizeTotal。这里的 MM_TEXT 表示使用像素作为单位,如果你使用的是其他的单位,可以根据需要进行修改。 这样,对话框就会根据视图大小来进行调整,从而实现和视图一样大小的效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值