我想使用原始winapi32检查按钮样式,无论是复选框按钮还是按钮。
bool isPushBtn(HWND hBtn, DWORD dwStyle)
{
return (0!=dwStyle | GetWindowLong(hBtn,GWL_STYLE));
}
但这总是返回false。你知道检查这个的方法吗?谢谢。
答案 0 :(得分: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
另一个重要的参考是Button Styles topic at MSDN。但是,该文档没有解释的是BS_PUSHBUTTON
到BS_OWNERDRAW
标志,类型标志是互斥的。其他标志可以与其中一个类型标志结合使用。这可以从值的位模式推断出来。
BS_TYPEMASK
州的文档:
Windows 2000:在BS_ *样式位上使用OR运算符产生的复合样式位。它可用于屏蔽来自给定位掩码的有效BS_ *位。请注意,这已过期,并未正确包含所有有效样式。因此,你不应该使用这种风格。
但我认为这是误导性的,并赞同ybungalobill在his answer中所说的话。遵循这一建议不会有任何伤害。
换句话说,你应该使用BS_TYPEMASK
掩盖样式,然后测试特定的按钮类型。
bool isButtonType(HWND hBtn, DWORD dwType)
{
assert(dwType<=BS_TYPEMASK);
return (GetWindowLong(hBtn, GWL_STYLE) & BS_TYPEMASK) == dwType;
}
答案 1 :(得分:4)
应该是:
return (GetWindowLong(hBtn,GWL_STYLE) & BS_TYPEMASK) == dwStyle;
答案 2 :(得分:2)
应该是
return (dwStyle == (GetWindowLongPtr(hBtn, GWL_STYLE) & dwStyle));