windows - Hvordan indstiller jeg parametrene for maske og værdier for SetDialogDpiChangeBehavior

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skal bruge dette API-opkald i min app: https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setdialogdpichangebehavior[36]


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
} ;


Dokumentationen siger, at mask er 'en maske, der angiver delsæt af flag, der skal ændres.' og values er 'den ønskede værdi, der skal indstilles for den angivne delmængde af flag.' I bemærkningerne hedder det: 'For udvidelighed blev DIALOG\_DPI\_CHANGE\_BEHAVIORS modelleret som et sæt bit-flag, der repræsenterer separate adfærd. Denne funktion følger den typiske toparameter tilgang til indstilling af flag, hvor en maske angiver delmængden af ​​de flag, der skal ændres.'


Jeg kan ikke finde nogen kodeprøver, der viser, hvordan denne metode faktisk hedder. Hvis funktionen bare havde en enkelt flags parameter, ville det være fornuftigt for mig, men jeg ved ikke hvordan man skal håndtere det med disse to mask og values params.

Bedste reference


Der er fejl i dokumentation. DIALOG\_DPI\_CHANGE\_BEHAVIORS definition fra c:Program Files (x86)Windows Kits10Include10.0.17134.0umwinuser.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;


Bortset fra DDC\_DEFAULT er disse enkle bitflags, der kunne ordnes med |.


SetDialogDpiChangeBehavior(
    hwnd,
    DDC\_DISABLE\_RESIZE | DDC\_DISABLE\_CONTROL\_RELAYOUT,
    DDC\_DISABLE\_CONTROL\_RELAYOUT );


I det væsentlige virker dette som:


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


Hvis mask bit er lig 0, bevarer den den gamle bitværdi i flags, hvis mask bit er lig 1 flags bit ændres efter bit i values.


skiftende flag afhængigt af maske og værdier [37]


For at indstille flag bit sætter du bit i både mask og values. For at slette dig indstilles bit i mask, men sæt den ikke ind i 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 );

Andre referencer 1


maske: Indstil kun de værdier, du vil ændre, for eksempel: DDC\_DISABLE\_RESIZE | DDC\_DISABLE\_CONTROL\_RELAYOUT.


værdier: indeholder nye værdier. Hvis værdier=0, DDC\_DISABLE\_RESIZE og DDC\_DISABLE\_CONTROL\_RELAYOUT f.eks. Bliver sat til 0, forbliver alle andre værdier uændrede. Hvis værdier=DDC\_DISABLE\_RESIZE med samme maske, vil DDC\_DISABLE\_RESIZE blive indstillet til 1 og DDC\_DISABLE\_CONTROL\_RELAYOUT til 0.


Et andet eksempel. Hvis du vil aktivere DDC\_DISABLE\_RESIZE, brug maske=DDC\_DISABLE\_RESIZE, værdier DDC\_DISABLE\_RESIZE. Hvis du vil deaktivere DDC\_DISABLE\_RESIZE, brug maske DDC\_DISABLE\_RESIZE og værdier 0.


Hvis dette hjælper, er funktionen pseudo-kode:


for each flag from enum DIALOG\_DPI\_CHANGE\_BEHAVIORS
{
    if flag is set in mask
    {
       set flag value from values
    }
}