Windows 如何设置SetDialogDpiChangeBehavior的掩码和值参数

Windows 如何设置SetDialogDpiChangeBehavior的掩码和值参数,windows,winapi,Windows,Winapi,我需要在我的应用程序中使用此API调用: 文档中说,mask是“指定要更改的标志子集的掩码”。values是“为指定的标志子集设置的所需值。”在备注中说“为了扩展性,DIALOG_DPI_CHANGE_行为被建模为一组表示不同行为的位标志。此函数遵循典型的双参数方法设置标志,其中掩码指定要更改的标志子集。” 我找不到任何显示此方法实际调用方式的代码示例。如果函数只有一个flags参数,我会觉得有意义,但我不知道如何使用这两个mask和values参数来处理它。mask:只设置要更改的值,例如:D

我需要在我的应用程序中使用此API调用:

文档中说,
mask
是“指定要更改的标志子集的掩码”。
values
是“为指定的标志子集设置的所需值。”在备注中说“为了扩展性,DIALOG_DPI_CHANGE_行为被建模为一组表示不同行为的位标志。此函数遵循典型的双参数方法设置标志,其中掩码指定要更改的标志子集。”


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

mask:只设置要更改的值,例如:
DDC\u DISABLE\RE大小| DDC_禁用_控制_重新启动

值:包含新值。例如,如果值=0,
DDC\u DISABLE\u RESIZE
DDC\u DISABLE\u CONTROL\u RELAYOUT
将设置为0,所有其他值保持不变。如果值=
DDC\u DISABLE\u RESIZE
使用相同的掩码,
DDC\u DISABLE\u RESIZE
将设置为1,并且
DDC\u DISABLE\u CONTROL\u RELAYOUT
到0

另一个示例。如果要启用
DDC\u DISABLE\u RESIZE
,请使用mask=
DDC\u DISABLE\u RESIZE
,值
DDC\u DISABLE\u RESIZE
。如果要禁用
DDC\u DISABLE\u RESIZE
,请使用mask
DDC\u DISABLE\u RESIZE
和值0

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

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

掩码:仅设置要更改的值,例如:
DDC\u禁用\u调整大小

值:包含新值。例如,如果值=0,
DDC\u DISABLE\u RESIZE
DDC\u DISABLE\u CONTROL\u RELAYOUT
将设置为0,所有其他值保持不变。如果值=
DDC\u DISABLE\u RESIZE
使用相同的掩码,
DDC\u DISABLE\u RESIZE
将设置为1,并且
DDC\u DISABLE\u CONTROL\u RELAYOUT
到0

另一个示例。如果要启用
DDC\u DISABLE\u RESIZE
,请使用mask=
DDC\u DISABLE\u RESIZE
,值
DDC\u DISABLE\u RESIZE
。如果要禁用
DDC\u DISABLE\u RESIZE
,请使用mask
DDC\u DISABLE\u RESIZE
和值0

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

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

文档中存在错误。
DIALOG\u DPI\u CHANGE\u行为
定义自
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 );
如果
掩码
位等于0,则保留
标志
中的旧位值,如果
掩码
位等于1
标志
位根据
中的位进行更改

// 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 );

要设置
标志
位,您可以在
掩码
中设置位。要清除,您可以在
掩码
中设置位,但不要在
中设置位

// 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 );

文档中存在错误。
DIALOG\u DPI\u CHANGE\u行为
定义自
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 );
如果
掩码
位等于0,则保留
标志
中的旧位值,如果
掩码
位等于1
标志
位根据
中的位进行更改

// 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 );

要设置
标志
位,您可以在
掩码
中设置位。要清除,您可以在
掩码
中设置位,但不要在
中设置位

// 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 );

因此,如果我想确保设置了DDC_DEFAULT(并且只有DDC_DEFAULT),我会用mask=DDC_DEFAULT和values=1调用它一次,然后用mask=DDC_DISABLE_RESIZE | DDC_DISABLE_CONTROL_RELAYOUT和values=0调用它第二次?我会尝试一下,但我不明白为什么第三个参数会是
values
(复数)而不是
value
。或者你说的不是value=1,而是value=DDC\u DEFAULT等等?我对这种设置标志的方式感到非常困惑。文件说“设置标志的典型双参数方法“但我在任何地方都找不到这样的例子。有什么可以直接解释这种方法吗?第三个参数被称为
values
,因为它可能包含多个值,在本例中最大值为4。如果要在一次调用中设置所有值,请使用mask=
DDC\u DEFAULT | DDC\u DISABLE\u all | DDC\u DISABLE\u RESIZE | DC\u DISABLE\u CONTROL\u relayat
。在这种情况下,新标志将在
参数中定义。您要确保设置了DDC\U默认值。mask=DDC\u DEFAULT,values=DDC\u DEFAULT。对不起,我仍然没有得到这个。你介意在你的答案中附上一两个完整的例子吗?我通常只是通过一些实验快速尝试一下,但我陷入了一个只能在服务器上构建更改(30分钟的过程)并部署到测试笔记本电脑的过程。因此,如果我想确保设置了DDC_默认值(并且只有DDC_默认值),我会用mask=DDC\u DEFAULT和value=1调用它一次,然后用mask=DDC\u DISABLE\u RESIZE、DDC\u DISABLE\u CONTROL\u relayat和value=0调用它第二次?我会试试这个,但是我不明白为什么第三个参数是
(复数)而不是
。或者你说的不是值=1而是值=DDC\u默认值等等。?我真的被这种设置旗帜的方式弄糊涂了。文档上说“设置标志的典型双参数方法”,但我在任何地方都找不到这方面的例子。有什么可以直接解释这种方法吗?第三个参数是cal