介绍 一个常见的用户失望是对话框不能调整大小。虽然有很多方法来解决这个问题,大多数是面向新代码,可以设计调整。这使得现有的身体不能调整大小的对话框。本文描述了一种方法,允许调整很容易改进的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对话框资源。 隐藏,复制Code
TESTDIALOG4A 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对话框资源的样子: 隐藏,复制Code
TESTDIALOG4B 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值低于所分配的内存,和维护,调整对话框模块记录的初始状态控制和应该如何处理它们。 隐藏,复制Code
PVOID pResizeState = NULL; BOOL CALLBACK TestDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { ResizeDialogProc( hDlg, uMsg, wParam, lParam, &pResizeState ); ...
最后,该模块调用对话框之前,必须初始化: 隐藏,复制Code
int 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