【问题标题】:Radio button selection change in MFCMFC 中的单选按钮选择更改
【发布时间】:2012-06-09 05:47:55
【问题描述】:

使用 MFC,我创建了一个包含 5 个单选按钮的对话框。我想在选择其他单选按钮时收到通知。

现在,只要单击任何单选按钮,我都会收到通知。但只有当单选按钮发生变化时,我才需要收到这些通知。

ON_BN_CLICKED(IDC_RADIO1, &CMyDlg::OnRadioButtonClicked)
ON_BN_CLICKED(IDC_RADIO1, &CMyDlg::OnRadioButtonClicked)
ON_BN_CLICKED(IDC_RADIO1, &CMyDlg::OnRadioButtonClicked)
ON_BN_CLICKED(IDC_RADIO1, &CMyDlg::OnRadioButtonClicked)
ON_BN_CLICKED(IDC_RADIO1, &CMyDlg::OnRadioButtonClicked)

谢谢

【问题讨论】:

    标签: mfc


    【解决方案1】:

    我想最简单的方法是将当前按钮状态(布尔值)存储为对话框类的成员变量(每个按钮一个),然后在 OnRadioButtonClicked 中检查状态是否已更改。

    如果您需要在多个地方执行此操作,您可以创建自己的 CButton 派生类来封装此功能。

    【讨论】:

      【解决方案2】:

      如果我正确理解您的问题,您想知道某个特定单选按钮 (IDC_RADIO1) 的选中状态何时发生变化。

      然后将此状态作为成员变量存储在您的对话框类中。 int m_radio1Checked; 在构造函数中根据需要初始化为 0 或 1,并在 OnInitDialog() 中适当地使用 SetCheckRadioButton()

      然后处理消息映射中每个单选按钮的点击:

      ON_BN_CLICKED(IDC_RADIO1, &CMyDlg::OnRadioButtonClicked)
      ON_BN_CLICKED(IDC_RADIO2, &CMyDlg::OnRadioButtonClicked)
      ON_BN_CLICKED(IDC_RADIO3, &CMyDlg::OnRadioButtonClicked)
      ON_BN_CLICKED(IDC_RADIO4, &CMyDlg::OnRadioButtonClicked)
      ON_BN_CLICKED(IDC_RADIO5, &CMyDlg::OnRadioButtonClicked)
      

      并在处理程序中检查更改。

      void CMyDlg::OnRadioButtonClicked()
      {
        int oldState = m_radio1Checked;
        int newState = GetDlgItem(IDC_RADIO1)->GetChecked();
        m_radio1Checked = newState;
        if (oldState != newState)
          // do something ...
      }
      

      【讨论】:

        【解决方案3】:

        首先创建所有单选按钮的组。 使用向导添加整数类型的成员变量。 在通用处理程序中调用 UpdateData() 并检查变量的值。它应该设置为组中按钮的值(从零开始),从组中的第一个按钮为 0 开始。 确保按连续的 Z 顺序(Tab 顺序)设置按钮。

        【讨论】:

        • 感谢提示通过调用 UpdateData() 解决变量 keep 的值保持默认值
        【解决方案4】:

        可以使用 ON_CONTROL_RANGE(BN_CLICKED, firstctrlid, lastcntrlid, memberfx)

        【讨论】:

          【解决方案5】:

          每个单选按钮都有一个单独的消息映射,但有一个私有方法,所有这些都调用以检查所选单选按钮是否已更改。

          void CDlg::OnRadioBtn1Clicked()
          {
              if (!RadioSelectionChanged())
              return;
          
              //Add other code here
          }
          
          //Returns true if the selected radio button has changed
          Boolean CDlg::RadioSelectionChanged()
          {
              int previousBtnSelected = m_selectedRadioButton;
              UpdateData();
          
              if (previousBtnSelected != m_selectedRadioButton)
                  return true;
          
              else
                  return false;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-04-09
            • 1970-01-01
            • 2020-05-17
            • 1970-01-01
            • 2014-07-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多