MFC切换单选按钮被延迟

时间:2015-01-13 02:30:08

标签: mfc radio-button cdialog cbutton

我有一个单选按钮,它是CDialog中的CButton。 当用户单击单选按钮时,将调用函数OnClickedRadioButton

OnClickedRadioButton内我通过调用此函数来切换按钮:

void toggleButton(CButton& theButton)
{
    switch(theButton.GetCheck())
    {
        case BST_UNCHECKED:
        {
            theButton.SetCheck(BST_CHECKED);
            break;
        }
        case BST_CHECKED:
        {
            theButton.SetCheck(BST_UNCHECKED);
            break;
        }
        default:
        {
            theButton.SetCheck(BST_UNCHECKED);
        }
    }
}

当我编译&运行程序: (i)如果选中单选按钮,我可以单击它以清除它。 (ii)如果单选按钮未选中,我点击它并没有任何反应。但是,如果我点击另一个程序(即visual studio),然后再点击CDialog,单选按钮就会检查。

我看了&尝试过函数Cwnd::UpdateDialogControlsCwnd::UpdateData,但我无法解决这个问题。

1 个答案:

答案 0 :(得分:0)

我认为问题与@rrirower评论相关,即SetCheck将导致另一个OnClickedRadioButton事件。

无论根本原因如何,允许我的实现在BST_CHECKEDBST_UNCHECKED之间切换单选按钮的快速修复方法是将单选按钮的Auto属性设置为False。

要做到这一点: 1)在visual studio中打开资源 2)右键单击单选按钮,然后选择“属性” 3)在Appearance部分中,将Auto属性设置为False。

以下是切换CDialog子类中单个单选按钮的整体解决方案(假设您已添加带有ID IDC_RADIO的单选按钮的Dialog资源):

1)通过放置此行

,将单选按钮IDC_RADIO添加到消息映射中
ON_BN_CLICKED(IDC_RADIO, OnBnClickedRadioButton)

在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间。

2)将处理函数添加到CDialog的子类

void OnBnClickedRadioButton()
{
    toggleButton(*(CButton*)GetDlgItem(IDC_RADIO));
}

3)将切换功能添加到CDialog的子类

void toggleButton(CButton& theButton)
{
    switch(theButton.GetCheck())
    {
        case BST_UNCHECKED:
        {
            theButton.SetCheck(BST_CHECKED);
            break;
        }
        case BST_CHECKED:
        {
            theButton.SetCheck(BST_UNCHECKED);
            break;
        }
        default:
        {
            theButton.SetCheck(BST_UNCHECKED);
        }
    }
}