【问题标题】:How do I set the mask and values parameters for SetDialogDpiChangeBehavior如何设置 SetDialogDpiChangeBehavior 的掩码和值参数
【发布时间】:2019-01-22 06:12:46
【问题描述】:

我需要在我的应用中使用这个 API 调用:https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setdialogdpichangebehavior

BOOL SetDialogDpiChangeBehavior(
  HWND                        hDlg,
  DIALOG_DPI_CHANGE_BEHAVIORS mask,
  DIALOG_DPI_CHANGE_BEHAVIORS values
);

typedef enum DIALOG_DPI_CHANGE_BEHAVIORS {
  DDC_DEFAULT                   ,
  DDC_DISABLE_ALL               ,
  DDC_DISABLE_RESIZE            ,
  DDC_DISABLE_CONTROL_RELAYOUT
} ;

文档说mask 是“指定要更改的标志子集的掩码”。 values 是“为指定的标志子集设置的期望值”。在评论中它说“为了可扩展性,DIALOG_DPI_CHANGE_BEHAVIORS 被建模为一组表示单独行为的位标志。这个函数遵循典型的两参数设置标志的方法,其中掩码指定要更改的标志的子集。”

我找不到任何显示此方法实际调用方式的代码示例。如果函数只有一个 flags 参数,这对我来说很有意义,但我不知道如何使用这两个 maskvalues 参数来处理它。

【问题讨论】:

  • “如果函数只有一个 flags 参数,这对我来说很有意义” - 该假设函数如何区分应该重置的位和一点不应该完全改变?传递单个值(如0)是不够的。您需要一个掩码来消除这些操作之间的歧义。
  • @IInspectable 我不确定为什么我需要区分在这种情况下应该重置的位和不应该更改的位。我只想在我的应用程序中明确设置表单的行为,我不关心之前设置的任何内容。或者也许我是,我不知道 - 这就是为什么我说“这对我有意义”而不是“它会更好”。
  • 它是全新的,样品需要一段时间,甚至文档都是错误的。可能是什么让你失望,枚举实际上并没有这样声明。它们具有真正的位掩码值,分别为 0、1、2 和 4。
  • I just want to explicitly set the behavior of a form in my app and I'm not concerned with whatever it was set to before 在这种情况下设置 mask = DDC_DEFAULT | DDC_DISABLE_ALL | DDC_DISABLE_RESIZE | DC_DISABLE_CONTROL_RELAYOUT 并且您有所需的行为。
  • 它需要 Windows 10 版本 1703 或更新版本,并且至少需要 Windows SDK 10 v1703。如果您必须支持早期的Windows版本,请使用GetProcAddress动态获取函数地址。

标签: windows winapi


【解决方案1】:

文档中存在错误。 DIALOG_DPI_CHANGE_BEHAVIORS 定义来自c:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\um\winuser.h

typedef enum DIALOG_DPI_CHANGE_BEHAVIORS {
    DDC_DEFAULT                     = 0x0000,
    DDC_DISABLE_ALL                 = 0x0001,
    DDC_DISABLE_RESIZE              = 0x0002,
    DDC_DISABLE_CONTROL_RELAYOUT    = 0x0004,
} DIALOG_DPI_CHANGE_BEHAVIORS;

除了DDC_DEFAULT,这些都是简单的位标志,可以用 | 进行运算。

SetDialogDpiChangeBehavior(
    hwnd,
    DDC_DISABLE_RESIZE | DDC_DISABLE_CONTROL_RELAYOUT,
    DDC_DISABLE_CONTROL_RELAYOUT );

基本上这是这样的:

flags = ( flags & ~mask ) | ( values & mask );

如果mask 位等于0,则保留flags 中的旧位值,如果mask 位等于1,则flags 位根据values 中的位进行更改。

要设置flag 位,您可以在maskvalues 中设置位。要清除您在mask 中设置的位,但不要在values 中设置它。

// Sets DDC_DISABLE_RESIZE bit
SetDialogDpiChangeBehavior( hwnd, DDC_DISABLE_RESIZE, DDC_DISABLE_RESIZE );
// Clears DDC_DISABLE_RESIZE bit
SetDialogDpiChangeBehavior( hwnd, DDC_DISABLE_RESIZE, 0 );
// Sets DDC_DISABLE_CONTROL_RELAYOUT and clears DDC_DISABLE_RESIZE
SetDialogDpiChangeBehavior(
    hwnd,
    DDC_DISABLE_RESIZE | DDC_DISABLE_CONTROL_RELAYOUT,
    DDC_DISABLE_CONTROL_RELAYOUT );

【讨论】:

    【解决方案2】:

    掩码:仅设置您想要更改的值,例如:DDC_DISABLE_RESIZE | DDC_DISABLE_CONTROL_RELAYOUT

    values:包含新值。例如,如果 values = 0,DDC_DISABLE_RESIZEDDC_DISABLE_CONTROL_RELAYOUT 将设置为 0,则所有其他值保持不变。如果 values = DDC_DISABLE_RESIZE 具有相同的掩码,DDC_DISABLE_RESIZE 将设置为 1,DDC_DISABLE_CONTROL_RELAYOUT 将设置为 0。

    另一个例子。如果要启用DDC_DISABLE_RESIZE,请使用掩码=DDC_DISABLE_RESIZE,值DDC_DISABLE_RESIZE。如果要禁用 DDC_DISABLE_RESIZE,请使用掩码 DDC_DISABLE_RESIZE 和值 0。

    如果有帮助,函数伪代码是:

    for each flag from enum DIALOG_DPI_CHANGE_BEHAVIORS
    {
        if flag is set in mask
        {
           set flag value from values
        }
    }
    

    【讨论】:

    • 因此,如果我想确保设置了 DDC_DEFAULT(并且只有 DDC_DEFAULT),我会使用 mask = DDC_DEFAULT 和 values = 1 调用它一次,然后使用 mask = DDC_DISABLE_RESIZE | 调用它第二次。 DDC_DISABLE_CONTROL_RELAYOUT 和值 = 0?我会试试这个,但我不明白为什么第三个参数是values(复数)而不是value
    • 或者你说的不是 values = 1 而是 values = DDC_DEFAULT 等等?我真的对这种设置标志的方式感到困惑。该文档说“设置标志的典型双参数方法”,但我在任何地方都找不到任何示例。有什么可以直截了当地解释这种方法的吗?
    • 第三个参数称为values,因为它可能包含多个值,在这种情况下最多为 4。如果您想在一次调用中设置所有值,请使用 mask = DDC_DEFAULT | DDC_DISABLE_ALL | DDC_DISABLE_RESIZE | DC_DISABLE_CONTROL_RELAYOUT。在这种情况下,新标志将在 values 参数中定义。
    • 您要确保设置了 DDC_DEFAULT。掩码 = DDC_DEFAULT,值 = DDC_DEFAULT。
    • 对不起,我仍然没有得到这个。您介意在答案中发布一两个完整的示例吗?我通常会通过一些实验快速尝试一下,但我被困在一个过程中,我只能在我的服务器上构建更改(30 分钟的过程)并部署到我的测试笔记本电脑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 2020-10-02
    相关资源
    最近更新 更多