如何设置SetDialogDpiChangeBehavior的mask和values参数

时间:2018-08-15 11:02:27

标签: 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
} ;

文档说mask是“指定要更改的标志子集的掩码”。 values是“为指定的标志子集设置的期望值”。在备注中说:“出于扩展性,DIALOG_DPI_CHANGE_BEHAVIORS被建模为一组代表独立行为的位标志。此函数遵循典型的两参数方法设置标志,其中掩码指定要更改的标志子集。”

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

2 个答案:

答案 0 :(得分:5)

文档中有错误。 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位根据{{1 }}。

changing flags depending on mask and values

要设置values位,请同时设置flagmask中的位。要清除,请在values中设置位,但不要在mask中设置位。

values

答案 1 :(得分:1)

掩码:仅设置要更改的值,例如:Languageconnection conn = new Languageconnection(); conn.Contact_id = contact; conn.Language_id = language; conn.Mainlanguage = true; _dao.AddObject(conn); _dao.SaveChanges(SaveChangesOptions.PostOnlySetProperties);

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

另一个例子。如果要启用DDC_DISABLE_CONTROL_RELAYOUT,请使用mask = DDC_DISABLE_RESIZE,值DDC_DISABLE_RESIZE。如果要禁用DDC_DISABLE_RESIZE,请使用掩码DDC_DISABLE_RESIZE,并将其值设置为0。

如果有帮助,则伪代码为:

DDC_DISABLE_RESIZE