CButton myButton;
// Create a radio button.
myButton.Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_RADIOBUTTON,
CRect(10,10,100,30), pParentWnd, 1);
// Change the button style to use one of the "auto" styles; for
// push button, change to def push button.
UINT uStyle = myButton.GetButtonStyle();
if (uStyle == BS_PUSHBUTTON)
uStyle = BS_DEFPUSHBUTTON;
else if (uStyle == BS_RADIOBUTTON)
uStyle = BS_AUTORADIOBUTTON;
else if (uStyle == BS_CHECKBOX)
uStyle = BS_AUTOCHECKBOX;
else if (uStyle == BS_3STATE)
uStyle = BS_AUTO3STATE;
-------------------------------------------------------------------
上面的代码摘自MSDN,另外从按钮风格的定义也可看出,判断风格不能用&,要用==判断:
#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_OWNERDRAW 0x0000000BL
#define BS_LEFTTEXT 0x00000020L
......
对比一下三种方法:
UINT uiStyle = m_check1.GetButtonStyle();
uiStyle = m_btnOK.GetButtonStyle();
uiStyle = m_radio1.GetButtonStyle();
uiStyle = ((CButton *)GetDlgItem(IDC_RADIO1))->GetButtonStyle();
uiStyle = ((CButton *)GetDlgItem(IDC_CHECK1))->GetButtonStyle();
uiStyle = ((CButton *)GetDlgItem(IDOK))->GetButtonStyle();
uiStyle = GetWindowLong((HWND)GetDlgItem(IDC_RADIO1),GWL_EXSTYLE);
uiStyle = GetWindowLong((HWND)GetDlgItem(IDC_CHECK1),GWL_EXSTYLE);
uiStyle = GetWindowLong((HWND)GetDlgItem(IDOK),GWL_EXSTYLE);
前两种可以得到正确结果,第三种都不行,所以不要用。
1
if(!(GetWindowLong((HWND)GetDlgItem(IDC_BUTTON),GWL_EXSTYLE)&BS_RADIOBUTTON))
{
MessageBox("RadioButton");
}
>>
这里应该使用 GWL_STYLE 而不是 GWL_EXSTYLE。
有些风格是 GWL_STYLE ,有些 风格是 GWL_EXSTYLE,这个要查看MSDN。
2
上面的代码摘自MSDN,另外从按钮风格的定义也可看出,判断风格不能用&,要用==判断:
#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_OWNERDRAW 0x0000000BL
#define BS_LEFTTEXT 0x00000020L
>>
这个需要补充一下,就是判断低16位的时候是用 == 的。
必须把高16位先去掉。
3 那你为什么没有判断对呢,有原因:
A1:一个 Style 是32位的。CWnd 风格占了高16位。低16位属于button的风格。如果 低16为0,就是 BS_PUSHBUTTON。
A2:所以在判断风格的时候,& 的时候需要把 button的风格分离开来。
DWORD Style = GetWindowLong((HWND)GetDlgItem(IDC_BUTTON),GWL_STYLE);
WORD button_style = Style & 0x0000ffff;
然后再判断。
4 我的示例:
void CButtonStyleDlg::DebugTest()
{
//CButton m_Button;
//CButton m_Check;
//CButton m_Rad;
long style[3] = {0};
style[0] = GetWindowLong(m_Button.m_hWnd, GWL_STYLE);
style[1] = GetWindowLong(m_Check.m_hWnd, GWL_STYLE);
style[2] = GetWindowLong(m_Rad.m_hWnd, GWL_STYLE);
short button_style[3] = {0};
button_style[0] = style[0] & 0x0000ffff;
button_style[1] = style[1] & 0x0000ffff;
button_style[2] = style[2] & 0x0000ffff;
if(button_style[0] == BS_PUSHBUTTON)
{
MessageBox("BS_PUSHBUTTON");
}
if(button_style[1] == BS_AUTOCHECKBOX)
{
MessageBox("BS_AUTOCHECKBOX");
}
if(button_style[2] == BS_AUTORADIOBUTTON)
{
MessageBox("BS_RADIOBUTTON");
}
}
这样就好了。
阅读(1605) | 评论(0) | 转发(0) |