GetWindowlong检查按钮样式

Ses*_*ame 0 c++ windows winapi visual-studio-2010

我想使用原始winapi32检查按钮样式,无论是复选框按钮还是按钮.

bool isPushBtn(HWND hBtn, DWORD dwStyle)
{
   return (0!=dwStyle | GetWindowLong(hBtn,GWL_STYLE));
}
Run Code Online (Sandbox Code Playgroud)

但这总是返回错误.你知道检查这个的方法吗?谢谢.

ybu*_*ill 5

它应该是:

return (GetWindowLong(hBtn,GWL_STYLE) & BS_TYPEMASK) == dwStyle;
Run Code Online (Sandbox Code Playgroud)

  • `BS_TYPEMASK` 的文档指出:“请注意,这已经过时了,并且没有正确包含所有有效的样式。因此,您不应使用此样式。” (2认同)

Dav*_*nan 5

为了理解按钮样式的工作原理,我们需要查看样式常量使用的值:

#define BS_PUSHBUTTON       0x00000000L
#define BS_DEFPUSHBUTTON    0x00000001L
#define BS_CHECKBOX         0x00000002L
#define BS_AUTOCHECKBOX     0x00000003L
#define BS_RADIOBUTTON      0x00000004L
#define BS_3STATE           0x00000005L
#define BS_AUTO3STATE       0x00000006L
#define BS_GROUPBOX         0x00000007L
#define BS_USERBUTTON       0x00000008L
#define BS_AUTORADIOBUTTON  0x00000009L
#define BS_PUSHBOX          0x0000000AL
#define BS_OWNERDRAW        0x0000000BL
#define BS_TYPEMASK         0x0000000FL
#define BS_LEFTTEXT         0x00000020L

#define BS_TEXT             0x00000000L
#define BS_ICON             0x00000040L
#define BS_BITMAP           0x00000080L
#define BS_LEFT             0x00000100L
#define BS_RIGHT            0x00000200L
#define BS_CENTER           0x00000300L
#define BS_TOP              0x00000400L
#define BS_BOTTOM           0x00000800L
#define BS_VCENTER          0x00000C00L
#define BS_PUSHLIKE         0x00001000L
#define BS_MULTILINE        0x00002000L
#define BS_NOTIFY           0x00004000L
#define BS_FLAT             0x00008000L
#define BS_RIGHTBUTTON      BS_LEFTTEXT
Run Code Online (Sandbox Code Playgroud)

另一个重要的参考是MSDN上Button Style主题.但是,该文档没有解释的是BS_PUSHBUTTONto BS_OWNERDRAW标志,类型标志是互斥的.其他标志可以与其中一个类型标志结合使用.这可以从值的位模式推断出来.

BS_TYPEMASK各州的文件:

Windows 2000:在BS_*样式位上使用OR运算符产生的复合样式位.它可用于屏蔽来自给定位掩码的有效BS_*位.请注意,这已过期,并未正确包含所有有效样式.因此,您不应该使用此样式.

不过,我认为这是误导性的,并赞同ybungalobill在答案中所说的话.遵循该建议不会有任何伤害.

换句话说,你应该使用它来掩盖样式,BS_TYPEMASK然后测试特定的按钮类型.

bool isButtonType(HWND hBtn, DWORD dwType)
{
     assert(dwType<=BS_TYPEMASK);
     return (GetWindowLong(hBtn, GWL_STYLE) & BS_TYPEMASK) == dwType;
}
Run Code Online (Sandbox Code Playgroud)