使用DialogBox()和对话框资源调整Win32对话框的大小

下载source - 15.46 KB

介绍

一个常见的用户失望是对话框不能调整大小。虽然有很多方法来解决这个问题,大多数是面向新代码,可以设计调整。这使得现有的身体不能调整大小的对话框。本文描述了一种方法,允许调整很容易改进的Win32对话框。通过对话框,特别注意,这指的是对话框资源脚本中定义实例化的对话框()(或相似的)Win32函数。

背景

传统的Win32对话框中定义资源脚本定义对话框内的存在和位置控制。然而,一个典型的方法来实现调整,涉及到编写代码来改变位置定义的资源脚本。遵循现代编程实践,本文不建议使用的资源脚本定义调整规范,代码本身很少改变。主要目标是最小改变现有代码,改造尽可能简单。

调整可以为开发人员和设计人员创建许多陷阱。对话框必须测试不仅仅是工作在一个预先配置的大小,但在每一个潜在的大小。最小化测试要求,本文建议的方法包括在其最小尺寸,设计一个对话框创建对话框在这个最小尺寸,但是用户保留扩大对话框的选项。新空间由该调整操作然后认为控制标记后的资源模板。

此外,约束可以可选地对调整操作。这可能阻止对话框被无限扩大,或可以防止一个对话框的大小在一个特定的方向(例如,对话框可以调整大小垂直但不是水平。)

使用的代码

include“ResizeDialog。h”成资源脚本包含定义的对话框。在对话框的DialogProc()函数,调用所提供的调整函数ResizeDialogProc()。这将处理消息标记的相关调整。在实例化任何resizeable对话框之前,使用的自定义控件模板必须注册。这是通过调用ResizeDialogInitialize()当应用程序初始化。修改对话框的风格(在资源脚本)支持调整。例如,改变对话框的风格:

隐藏,复制CodeSTYLE WS_POPUPWINDOW | WS_CAPTION

:

隐藏,复制CodeSTYLE WS_OVERLAPPED | WS_THICKFRAME | WS_CAPTION | WS_SYSMENU
定义如何将新空间分配给个人控制对话框中通过添加DIALOGRESIZECONTROL辅助标记每个控件之前。这个标记包括四个0到100之间的整数值,定义新空间的百分比分配转移对象离开,将下来,使它更广泛,并让它更高的分别。例如,如果一个对象应该生长在对话框的大小比例缩放,值将{0,0,100,100}。左上的对象对齐,而不是规模增长,将{0,0,0,0}。右下角对齐的对象,而不是规模增长,将是{100、100、0、0}。如果约束应该对对话框的大小,如何添加单个DIALOGRESIZE助手在对话框的开始标记。这个标记包含两个整数的值应该是0,表明没有限制,或100和更大,显示对话框的最大百分比可以长从原来的大小。例如,定义一个对话框,可以无限增长水平,垂直,但只有25%使用{0,125}。

提供一个说明的变化要求,考虑以下non-resizable对话框资源。

隐藏,复制CodeTESTDIALOG4A DIALOGEX 10, 10, 140, 165
STYLE WS_POPUPWINDOW | WS_CAPTION
FONT 8, “MS Shell Dlg”
CAPTION “TestDialog4”
{
LTEXT “Description of &first list:”, 1, 5, 5, 130, 10
LISTBOX 2, 5, 15, 130, 60, WS_TABSTOP
LTEXT “Description of &second list:”, 3, 5, 75, 130, 10
LISTBOX 4, 5, 85, 130, 60, WS_TABSTOP
DEFPUSHBUTTON “&Close”, 5, 5, 145, 60, 15, WS_TABSTOP
}

这个对话框中定义了两个列表,垂直分离,和一个按钮在对话框的底部。当更改为新空间分配给这些列表,并重新定位第二个列表给新空间分配给第一,resizeable对话框资源的样子:

隐藏,复制CodeTESTDIALOG4B DIALOGEX 10, 10, 140, 165
STYLE WS_OVERLAPPED | WS_THICKFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, “MS Shell Dlg”
CAPTION “TestDialog4”
{
LTEXT “Description of &first list:”, 1, 5, 5, 130, 10
DIALOGRESIZECONTROL { 0, 0, 100, 50 }
LISTBOX 2, 5, 15, 130, 60, WS_TABSTOP
DIALOGRESIZECONTROL { 0, 50, 0, 0 }
LTEXT “Description of &second list:”, 3, 5, 75, 130, 10
DIALOGRESIZECONTROL { 0, 50, 100, 50 }
LISTBOX 4, 5, 85, 130, 60, WS_TABSTOP
DIALOGRESIZECONTROL { 0, 100, 0, 0 }
DEFPUSHBUTTON “&Close”, 5, 5, 145, 60, 15, WS_TABSTOP
}

此外,该对话框回调函数必须最低限度改变过程的调整。pResizeState值低于所分配的内存,和维护,调整对话框模块记录的初始状态控制和应该如何处理它们。

隐藏,复制CodePVOID pResizeState = NULL;

BOOL CALLBACK
TestDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
ResizeDialogProc( hDlg, uMsg, wParam, lParam, &pResizeState );

最后,该模块调用对话框之前,必须初始化:

隐藏,复制Codeint WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
ResizeDialogInitialize( hInst );

    DialogBox( hInst, MAKEINTRESOURCE(TESTDIALOG4B), NULL, TestDialogProc );
    ...

的兴趣点

为了实现标记,扩展数据记录在自定义控件。这些数据被定义的格式很长一段时间,然而:

Windows 95及其继任者不支持这个扩展信息,所以本文提供的方法不会工作在这些系统和Windows NT-based系统是有限的。代码试图发现这种情况,防止调整时不能支持。Alt脚腕微软的资源编译器支持这种语法,其他资源编译器(特别是GNU windres)。这个语法只是DIALOGEX资源可用。它将产生编译错误对话框资源资源。一定要将任何对话框资源转换成DIALOGEX之前使用这段代码。

工作的代码处理弹出式消息发送到对话框,并列举所有控件的对话框找到对话框调整辅助控制的实例。每个辅助控制发送WM_RESIZEPARENT消息表明它需要调整。辅助控制发现直接下一个控制对话框(“伙伴”控制)和执行适当的转换的数据附加到指定的调整辅助控制。

因为所有值百分比,代码也必须捕获的初始大小对话框,以及每个控件的初始大小调整。捕获这些值创建对话框时,分别处理,当第一个弹出。然后计算这些值与值百分比以生成最终的大小控制对话框的大小。

历史

2 2011年1月,最初的创造

本文转载于:http://www.diyabc.com/frontweb/news3586.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值