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