2009-08-14 25 views
2

Ich habe eine Frage bezüglich eines Fensterstils hexadezimal.Wie überprüft man, ob ein Fensterstil in einem Hexadezimalformat existiert?

Nach http://support.microsoft.com/kb/111011/en-us, 0x16CF0000 enthält Fenster Stil WS_VISIBLE, WS_CLIPSIBLINGS, WS_CLIPCHILDREN, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX und WS_MAXIMIZEBOX.

Wie überprüfe ich, ob ein Fensterstil in einer Kombination von Fensterstilen vorhanden ist? Zum Beispiel möchte ich prüfen, ob WS_BORDER (0x00800000) in 0x16CF0000 existiert.

Antwort

4

Die Standardform ist:

if (value & WS_BORDER != 0) { } 

Die & wird eine bitweise UND-Verknüpfung tun und nur dann, wenn das Bit von WS_BORDER gesetzt ist, wird das Ergebnis nicht Null

+0

+1. Macht ein wenig mehr Sinn als meiner, denke ich. – JamesMLV

2
if(0x16CF0000 & WS_BORDER) 
1

prüfen sein IF((0x16CF0000 | WS_BORDER) == 0x16CF0000)

1

Grundsätzlich können Sie einfach überprüfen, ob yourValue AND WS_BORDER = WS_BORDER.

Leider werden einige der Bits innerhalb der Style-Flags je nach Kontext zweimal verwendet, also zum Beispiel WS_TABSTOP und WS_MAXIMIZEBOX sind 0x00010000, also hängt es vom Kontext (Position des Objekts und möglicherweise anderen Flags) ab ein Fenster hat wirklich diese Eigenschaft (offensichtlich ein Steuer Kind kann keine Maximierungs Box haben, und ein Steuer Elternteil kann nicht einen Tabstopp haben) ...

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

In der Vergangenheit habe ich die Header-Datei genommen haben, wo solche Dinge wurden definiert und schrieben ein Skript, um es in Code zu verwandeln, der die Variable, die die Flags waren, in eine Textzeichenfolge mit dem symbolischen Namen der Konstanten umwandeln würde.

Parsing #defines ist ziemlich einfach an dem Tag, an dem ich sowas wie AWK benutzte, um dies zu tun. Jetzt, Tage, wenn ich es auf der Maschine habe, die ich zu der Zeit verwende, Python oder wenn Python nicht sofort verfügbar ist, würde ich zurück zu AWK gehen.

Verwandte Themen