如何检查十六进制中是否存在窗口样式?

时间:2009-08-14 20:53:01

标签: winapi window-style

我有一个关于窗口样式十六进制的问题。

根据http://support.microsoft.com/kb/111011/en-us 0x16CF0000 包含WS_VISIBLE,WS_CLIPSIBLINGS,WS_CLIPCHILDREN,WS_CAPTION,WS_SYSMENU,WS_THICKFRAME,WS_MINIMIZEBOX和WS_MAXIMIZEBOX的窗口样式。

如何检查窗口样式组合中是否存在窗口样式?例如,我想检查0x16CF0000中是否存在WS_BORDER(0x00800000)样式。

5 个答案:

答案 0 :(得分:4)

标准格式为:

if (value & WS_BORDER != 0) {  }

&将执行按位-AND并且仅当设置了WS_BORDER的位时结果才为非

答案 1 :(得分:2)

if(0x16CF0000 & WS_BORDER)

答案 2 :(得分:1)

检查IF((0x16CF0000 | WS_BORDER) == 0x16CF0000)

答案 3 :(得分:1)

基本上,您只需检查yourValue AND WS_BORDER = WS_BORDER

不幸的是,样式标志中的一些位被使用了两次,具体取决于上下文,因此例如WS_TABSTOPWS_MAXIMIZEBOX都是0x00010000,所以它取决于上下文(位置对象和其他标志)一个窗口是否真的具有该属性(显然,子控件不能有最大化框,并且父控件不能有制表符)...

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,

答案 4 :(得分:1)

过去,我已经定义了这样的东西定义的头文件,并编写了一个脚本将其转换为代码,该代码将采用标志所在的变量并将其转换为包含常量符号名称的文本字符串。

在我使用像AWK这样的东西的那一天解析#defines相当容易。现在,如果我在我当时正在使用的机器上使用Python,或者如果Python不可用,我会回到AWK。