如何为SetDialogDpiChangeBehavior设置掩码和值参数

Mus*_*sis 0 windows winapi

我需要在我的应用程序中使用此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
} ;
Run Code Online (Sandbox Code Playgroud)

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

我找不到任何显示如何实际调用此方法的代码示例.如果功能只是有一个flags参数,它将使感给我,但我不知道如何使用这两种处理它maskvaluesPARAMS.

Dan*_*Sęk 5

文档中有bug.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;
Run Code Online (Sandbox Code Playgroud)

除了DDC_DEFAULT这些是简单的比特标志,可以用|.

SetDialogDpiChangeBehavior(
    hwnd,
    DDC_DISABLE_RESIZE | DDC_DISABLE_CONTROL_RELAYOUT,
    DDC_DISABLE_CONTROL_RELAYOUT );
Run Code Online (Sandbox Code Playgroud)

基本上这适用于:

flags = ( flags & ~mask ) | ( values & mask );
Run Code Online (Sandbox Code Playgroud)

如果mask位等于0则保留旧位值flags,如果mask位相等flags则根据位改变1 位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 );
Run Code Online (Sandbox Code Playgroud)