2009-08-14 7 views
2

J'ai une question concernant un style de fenêtre hexadécimal.Comment vérifier si un style de fenêtre existe dans un hexadécimal?

Selon http://support.microsoft.com/kb/111011/en-us, 0x16CF0000 contient des styles de fenêtre de WS_VISIBLE, WS_CLIPSIBLINGS, WS_CLIPCHILDREN, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX et WS_MAXIMIZEBOX.

Comment vérifier si un style de fenêtre existe dans une combinaison de styles de fenêtres? Par exemple, je voudrais vérifier si le style WS_BORDER (0x00800000) existe dans 0x16CF0000.

Répondre

4

Le formulaire standard est:

if (value & WS_BORDER != 0) { } 

Le & fera une logique binaire et seulement si le bit de WS_BORDER est réglé sera le résultat non nul

+0

+1. Fait un peu plus de sens que le mien, je pense. – JamesMLV

2
if(0x16CF0000 & WS_BORDER) 
1

Vérifier IF((0x16CF0000 | WS_BORDER) == 0x16CF0000)

1

Fondamentalement, vous pouvez simplement vérifier si yourValue AND WS_BORDER = WS_BORDER. Malheureusement, certains des bits à l'intérieur des drapeaux de style sont utilisés deux fois, selon le contexte, par exemple WS_TABSTOP et WS_MAXIMIZEBOX sont 0x00010000, donc cela dépend du contexte (position de l'objet et peut-être d'autres drapeaux) si une fenêtre a vraiment cette propriété (évidemment un contrôle enfant ne peut pas avoir une boîte de Maximize, et un contrôle parent ne peut pas avoir un onglet arrêt) ...

WS_OVERLAPPED  = 0x00000000, 
WS_POPUP   = 0x80000000, 
WS_CHILD   = 0x40000000, 
WS_MINIMIZE  = 0x20000000, 
WS_VISIBLE   = 0x10000000, 
WS_DISABLED  = 0x08000000, 
WS_CLIPSIBLINGS = 0x04000000, 
WS_CLIPCHILDREN = 0x02000000, 
WS_MAXIMIZE  = 0x01000000, 
WS_BORDER   = 0x00800000, 
WS_DLGFRAME  = 0x00400000, 
WS_VSCROLL   = 0x00200000, 
WS_HSCROLL   = 0x00100000, 
WS_SYSMENU   = 0x00080000, 
WS_THICKFRAME  = 0x00040000, 
WS_GROUP   = 0x00020000, 
WS_TABSTOP   = 0x00010000, 

WS_MINIMIZEBOX  = 0x00020000, 
WS_MAXIMIZEBOX  = 0x00010000, 

WS_CAPTION   = WS_BORDER | WS_DLGFRAME, 
WS_TILED   = WS_OVERLAPPED, 
WS_ICONIC   = WS_MINIMIZE, 
WS_SIZEBOX   = WS_THICKFRAME, 
WS_TILEDWINDOW  = WS_OVERLAPPEDWINDOW, 

WS_OVERLAPPEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | 
         WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, 
WS_POPUPWINDOW  = WS_POPUP | WS_BORDER | WS_SYSMENU, 
WS_CHILDWINDOW  = WS_CHILD, 
1

Dans le passé, j'ai pris le fichier d'en-tête où ces choses ont été définis et ont écrit un script pour le transformer en code qui prendrait la variable dont les drapeaux étaient et le convertissent en une chaîne de texte contenant le nom symbolique des constantes.

L'analyse #defines est assez facile dans la journée, j'ai utilisé quelque chose comme AWK pour le faire. De nos jours, si je l'ai sur la machine que j'utilise à ce moment-là, Python ou si Python n'est pas facilement disponible, je retournerais à AWK.

Questions connexes