首页 > 解决方案 > 用于在两个组框之间切换的互斥单选按钮

问题描述

我想实现:

  1. 在 init () 上,两个组框都被隐藏,并且 GRP A 和 GRP B 单选按钮都启用了 [ACHIEVED]。
  2. 我单击 GRP A 单选按钮,GRP 框 1 显示 GRP B 单选按钮变灰。[达到]。
  3. 取消选中 GrP A 单选按钮 GRP Box 1 隐藏启用的 GRP A 和 B 单选按钮 [失败:无法取消选中所选单选按钮]。
  4. 选中 Group Box B 单选按钮的过程与上述相同。

在此处输入图像描述

标签: visual-studiovisual-c++mfc

解决方案


您正试图“打破”单选按钮的概念。“GRP A”和“GRP B”按钮(假设它们在同一个“组”中)将自动相互排斥,只要两者都启用- 您必须选中其中一个按钮(即使有 3或更多在同一组中)。因此,在您的情况下,要取消选中“GRP A”,您需要选中“GRP B”。

当然,除非您覆盖这些单选按钮的默认处理。

要覆盖默认处理,您可以为BN_CLICKED来自“GRP A”和“GRP B”按钮中的每个按钮的消息提供一个处理程序,并在该处理程序中将两个按钮的状态显式设置为未选中和启用。您还可以在该处理程序中放置代码以隐藏两个组(或在适当时显示一个)。

下面是可能的代码的大纲,假设您的父对话框来自CDialog并且两个单选按钮的 ID 是IDC_GRPAIDC_GRPB

BEGIN_MESSAGE_MAP(MyDialog, CDialog)
    ON_CONTROL(BN_CLICKED, IDC_GRPA, &MyDialog::OnClickA)
    ON_CONTROL(BN_CLICKED, IDC_GRPB, &MyDialog::OnClickB)
    //... other handlers and message map entries
END_MESSAGE_MAP()

// Handler for a "GRP A" button click:
void MyDialog::OnClickA()
{
    UINT checked = IsDlgButtonChecked(IDC_GRPA);
    if (checked == BST_CHECKED) {
        GetDlgItem(IDC_GRPB)->EnableWindow(TRUE); // ENABLE other button
        CheckDlgButton(IDC_GRPA, BST_UNCHECKED); // Clear this button
        CheckDlgButton(IDC_GRPB, BST_UNCHECKED); // and the other one
        // Now do the required stuff to HIDE the group boxes...
    }
    else {
        CheckDlgButton(IDC_GRPA, BST_CHECKED); // Check this button
        GetDlgItem(IDC_GRPB)->EnableWindow(FALSE); // DISABLE other button
        // Now do the required stuff to SHOW the "GrpBox 1" controls ...
    }
}

// The "OnClickB()" handler will be very similar to the above, but with the IDs 'reversed'.

请随时要求任何进一步的澄清和/或解释。


推荐阅读