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


    介绍 一个常见的用户失望是对话框不能调整大小。虽然有很多方法来解决这个问题,大多数是面向新代码,可以设计调整。这使得现有的身体不能调整大小的对话框。本文描述了一种方法,允许调整很容易改进的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

  • 相关阅读:
    解决python中write()函数向文件中写中文时出现乱码的问题
    解决Object() takes on paramenters的问题
    Flexbox
    node.js中的回调
    jQuery Mobile Api
    Sql Server总结
    文件夹和文件、Path类、流、序列化
    C# 字符串
    枚举|标志枚举+|(或)和&(与)运算|类型转换|值类型和引用类型|传参|异常|垃圾回收
    继承、多态、封装、接口
  • 原文地址:https://www.cnblogs.com/Dincat/p/13461172.html
Copyright © 2020-2023  润新知