首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >它是MFC C++中用于单个选择的组合框的事件处理程序。

它是MFC C++中用于单个选择的组合框的事件处理程序。
EN

Stack Overflow用户
提问于 2019-05-09 05:14:32
回答 2查看 951关注 0票数 0

在选择特定的组合框时,我在启用或禁用某些文本框时遇到了问题。

我试过使用OnCbnSelChangeLvLayers() & OnCbnDropdownLvLayers()。第一个事件处理程序的问题是,我必须点击相同的值两次,并选择在组合框中的频率。第二个事件处理程序解决了冻结问题,但为了使事件发生,我必须单击combobox的下拉列表。我还为combobox尝试了一些其他事件处理程序,但没有成功。m_d_layers是组合框选择的字符串变量(1,2,3,4)

DDX:

代码语言:javascript
复制
void CThermalToolDlg::DoDataExchange(CDataExchange* pDX)
{
    DDX_CBString(pDX, IDC_LV_LAYERS, m_d_lvlayers);
}

信息地图:

代码语言:javascript
复制
BEGIN_MESSAGE_MAP(CThermalToolDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_CBN_DROPDOWN(IDC_LV_LAYERS, &CThermalToolDlg::OnCbnDropdownLvLayers)
ON_CBN_DROPDOWN(IDC_HV_LAYERS, &CThermalToolDlg::OnCbnDropdownHvLayers)
ON_CBN_DROPDOWN(IDC_LVDUCTTYPE1, &CThermalToolDlg::OnCbnDropdownLvducttype1)
ON_CBN_DROPDOWN(IDC_LVDUCTTYPE2, &CThermalToolDlg::OnCbnDropdownLvducttype2)
ON_CBN_DROPDOWN(IDC_LVDUCTTYPE3, &CThermalToolDlg::OnCbnDropdownLvducttype3)
ON_CBN_DROPDOWN(IDC_HVDUCTTYPE1, &CThermalToolDlg::OnCbnDropdownHvducttype1)
ON_CBN_DROPDOWN(IDC_HVDUCTTYPE2, &CThermalToolDlg::OnCbnDropdownHvducttype2)
ON_CBN_DROPDOWN(IDC_HVDUCTTYPE3, &CThermalToolDlg::OnCbnDropdownHvducttype3)
ON_BN_CLICKED(IDCANCEL, &CThermalToolDlg::OnBnClickedCancel)
ON_BN_CLICKED(ID_CALCULATE, &CThermalToolDlg::OnCalculate)
//ON_CBN_EDITUPDATE(IDC_LV_LAYERS,&CThermalToolDlg::OnCbnEditupdateLvLayers)
//ON_CBN_SELENDOK(IDC_LV_LAYERS, &CThermalToolDlg::OnCbnSelendokLvLayers)

END_MESSAGE_MAP()

事件处理程序:

代码语言:javascript
复制
void CThermalToolDlg::OnCbnDropdownLvLayers()
{
    // TODO: Add your control notification handler code here
    UpdateData();

    if (m_d_lvlayers == "1")
    {
        GetDlgItem(IDC_LV2_CU)->EnableWindow(0);
        GetDlgItem(IDC_LV2_ICI)->EnableWindow(0);
            //and so on
    }
    else if (m_d_lvlayers == "2")
    {
        GetDlgItem(IDC_LV2_CU)->EnableWindow(1);
        GetDlgItem(IDC_LV2_ICI)->EnableWindow(1);
            //and so on

    }
    else if (m_d_lvlayers == "3")
    {
        GetDlgItem(IDC_LV2_CU)->EnableWindow(1);
        GetDlgItem(IDC_LV2_ICI)->EnableWindow(1);
            //and so on
    }
    else
    {
        GetDlgItem(IDC_LV2_CU)->EnableWindow(1);
        GetDlgItem(IDC_LV2_ICI)->EnableWindow(1);
            //and so on
    }
}

我希望在不冻结组合框的情况下,在一次单击中获得所需的启用/禁用。对于同样的方法,还有其他方法或更快的方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-14 04:18:28

由于@BarmakShemirani,我使用了他的代码来检索正确的字符串,而不是在UpdateData()事件处理程序中使用ON_CBN_SELENDOK,现在它的工作就像一种魅力

DDX:

代码语言:javascript
复制
void CThermalToolDlg::DoDataExchange(CDataExchange* pDX)
{
  DDX_CBString(pDX, IDC_LV_LAYERS, m_d_lvlayers);
}

信息地图:

代码语言:javascript
复制
BEGIN_MESSAGE_MAP(CThermalToolDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_CBN_SELENDOK(IDC_LV_LAYERS, &CThermalToolDlg::OnCbnSelendokLvLayers)
ON_BN_CLICKED(IDCANCEL, &CThermalToolDlg::OnBnClickedCancel)
ON_BN_CLICKED(ID_CALCULATE, &CThermalToolDlg::OnCalculate)
END_MESSAGE_MAP()

事件处理程序:

代码语言:javascript
复制
void CThermalToolDlg::OnCbnSelendokLvLayers()
{
    // TODO: Add your control notification handler code here
    CComboBox *cb = (CComboBox*)GetDlgItem(IDC_LV_LAYERS);
    if (cb)
    {
        int sel = cb->GetCurSel();
        if (sel >= 0)
            cb->GetLBText(sel, m_d_lvlayers);
    }
    TRACE(_T("[%s]\n"), m_d_lvlayers.GetString());

    /*UpdateData();*/

    if (m_d_lvlayers == "1")
    {
        GetDlgItem(IDC_LV2_CU)->EnableWindow(0);
        GetDlgItem(IDC_LV2_ICI)->EnableWindow(0);
        GetDlgItem(IDC_LV2_PC)->EnableWindow(0);
        GetDlgItem(IDC_LV2_RESIN)->EnableWindow(0);
        GetDlgItem(IDC_LV2_RESO)->EnableWindow(0);
        GetDlgItem(IDC_LV2_INST)->EnableWindow(0);
        GetDlgItem(IDC_LV3_CU)->EnableWindow(0);
        GetDlgItem(IDC_LV3_ICI)->EnableWindow(0);
        GetDlgItem(IDC_LV3_PC)->EnableWindow(0);
        GetDlgItem(IDC_LV3_RESIN)->EnableWindow(0);
        GetDlgItem(IDC_LV3_RESO)->EnableWindow(0);
        GetDlgItem(IDC_LV3_INST)->EnableWindow(0);
        GetDlgItem(IDC_LV4_CU)->EnableWindow(0);
        GetDlgItem(IDC_LV4_ICI)->EnableWindow(0);
        GetDlgItem(IDC_LV4_PC)->EnableWindow(0);
        GetDlgItem(IDC_LV4_RESIN)->EnableWindow(0);
        GetDlgItem(IDC_LV4_RESO)->EnableWindow(0);
        GetDlgItem(IDC_LV4_INST)->EnableWindow(0);
        GetDlgItem(IDC_LVDUCTTYPE1)->EnableWindow(0);
        GetDlgItem(IDC_LVDUCTTYPE2)->EnableWindow(0);
        GetDlgItem(IDC_LVDUCTTYPE3)->EnableWindow(0);
        GetDlgItem(IDC_LV_D_NO_12)->EnableWindow(0);
        GetDlgItem(IDC_LV_D_NO_23)->EnableWindow(0);
        GetDlgItem(IDC_LV_D_NO_34)->EnableWindow(0);
    }
    else if (m_d_lvlayers == "2")
    {
        GetDlgItem(IDC_LV2_CU)->EnableWindow(1);
        GetDlgItem(IDC_LV2_ICI)->EnableWindow(1);
        GetDlgItem(IDC_LV2_PC)->EnableWindow(1);
        GetDlgItem(IDC_LV2_RESIN)->EnableWindow(1);
        GetDlgItem(IDC_LV2_RESO)->EnableWindow(1);
        GetDlgItem(IDC_LV2_INST)->EnableWindow(1);
        GetDlgItem(IDC_LV3_CU)->EnableWindow(0);
        GetDlgItem(IDC_LV3_ICI)->EnableWindow(0);
        GetDlgItem(IDC_LV3_PC)->EnableWindow(0);
        GetDlgItem(IDC_LV3_RESIN)->EnableWindow(0);
        GetDlgItem(IDC_LV3_RESO)->EnableWindow(0);
        GetDlgItem(IDC_LV3_INST)->EnableWindow(0);
        GetDlgItem(IDC_LV4_CU)->EnableWindow(0);
        GetDlgItem(IDC_LV4_ICI)->EnableWindow(0);
        GetDlgItem(IDC_LV4_PC)->EnableWindow(0);
        GetDlgItem(IDC_LV4_RESIN)->EnableWindow(0);
        GetDlgItem(IDC_LV4_RESO)->EnableWindow(0);
        GetDlgItem(IDC_LV4_INST)->EnableWindow(0);
        GetDlgItem(IDC_LVDUCTTYPE1)->EnableWindow(1);
        GetDlgItem(IDC_LVDUCTTYPE2)->EnableWindow(0);
        GetDlgItem(IDC_LVDUCTTYPE3)->EnableWindow(0);
        GetDlgItem(IDC_LV_D_NO_12)->EnableWindow(1);
        GetDlgItem(IDC_LV_D_NO_23)->EnableWindow(0);
        GetDlgItem(IDC_LV_D_NO_34)->EnableWindow(0);
    }
    else if (m_d_lvlayers == "3")
    {
        GetDlgItem(IDC_LV2_CU)->EnableWindow(1);
        GetDlgItem(IDC_LV2_ICI)->EnableWindow(1);
        GetDlgItem(IDC_LV2_PC)->EnableWindow(1);
        GetDlgItem(IDC_LV2_RESIN)->EnableWindow(1);
        GetDlgItem(IDC_LV2_RESO)->EnableWindow(1);
        GetDlgItem(IDC_LV2_INST)->EnableWindow(1);
        GetDlgItem(IDC_LV3_CU)->EnableWindow(1);
        GetDlgItem(IDC_LV3_ICI)->EnableWindow(1);
        GetDlgItem(IDC_LV3_PC)->EnableWindow(1);
        GetDlgItem(IDC_LV3_RESIN)->EnableWindow(1);
        GetDlgItem(IDC_LV3_RESO)->EnableWindow(1);
        GetDlgItem(IDC_LV3_INST)->EnableWindow(1);
        GetDlgItem(IDC_LV4_CU)->EnableWindow(0);
        GetDlgItem(IDC_LV4_ICI)->EnableWindow(0);
        GetDlgItem(IDC_LV4_PC)->EnableWindow(0);
        GetDlgItem(IDC_LV4_RESIN)->EnableWindow(0);
        GetDlgItem(IDC_LV4_RESO)->EnableWindow(0);
        GetDlgItem(IDC_LV4_INST)->EnableWindow(0);
        GetDlgItem(IDC_LVDUCTTYPE1)->EnableWindow(1);
        GetDlgItem(IDC_LVDUCTTYPE2)->EnableWindow(1);
        GetDlgItem(IDC_LVDUCTTYPE3)->EnableWindow(0);
        GetDlgItem(IDC_LV_D_NO_12)->EnableWindow(1);
        GetDlgItem(IDC_LV_D_NO_23)->EnableWindow(1);
        GetDlgItem(IDC_LV_D_NO_34)->EnableWindow(0);
    }
    else
    {
        GetDlgItem(IDC_LV2_CU)->EnableWindow(1);
        GetDlgItem(IDC_LV2_ICI)->EnableWindow(1);
        GetDlgItem(IDC_LV2_PC)->EnableWindow(1);
        GetDlgItem(IDC_LV2_RESIN)->EnableWindow(1);
        GetDlgItem(IDC_LV2_RESO)->EnableWindow(1);
        GetDlgItem(IDC_LV2_INST)->EnableWindow(1);
        GetDlgItem(IDC_LV3_CU)->EnableWindow(1);
        GetDlgItem(IDC_LV3_ICI)->EnableWindow(1);
        GetDlgItem(IDC_LV3_PC)->EnableWindow(1);
        GetDlgItem(IDC_LV3_RESIN)->EnableWindow(1);
        GetDlgItem(IDC_LV3_RESO)->EnableWindow(1);
        GetDlgItem(IDC_LV3_INST)->EnableWindow(1);
        GetDlgItem(IDC_LV4_CU)->EnableWindow(1);
        GetDlgItem(IDC_LV4_ICI)->EnableWindow(1);
        GetDlgItem(IDC_LV4_PC)->EnableWindow(1);
        GetDlgItem(IDC_LV4_RESIN)->EnableWindow(1);
        GetDlgItem(IDC_LV4_RESO)->EnableWindow(1);
        GetDlgItem(IDC_LV4_INST)->EnableWindow(1);
        GetDlgItem(IDC_LVDUCTTYPE1)->EnableWindow(1);
        GetDlgItem(IDC_LVDUCTTYPE2)->EnableWindow(1);
        GetDlgItem(IDC_LVDUCTTYPE3)->EnableWindow(1);
        GetDlgItem(IDC_LV_D_NO_12)->EnableWindow(1);
        GetDlgItem(IDC_LV_D_NO_23)->EnableWindow(1);
        GetDlgItem(IDC_LV_D_NO_34)->EnableWindow(1);
    }
}

谢谢大家!

票数 0
EN

Stack Overflow用户

发布于 2019-05-10 15:16:59

这似乎是一个错误的下拉列表组合框和简单的组合框(而不是下拉)。DDX_CBStringDDX_CBStringExact没有检索响应于ON_CBN_DROPDOWN的正确值。

您可以使用自己的代码检索正确的字符串:

代码语言:javascript
复制
void CThermalToolDlg::OnCbnDropdownLvLayers() 
{ 
    //UpdateData();
    CComboBox *cb = (CComboBox*)GetDlgItem(IDC_LV_LAYERS);
    if(cb)
    {
        int sel = cb->GetCurSel();
        if(sel >= 0)
            cb->GetLBText(sel, m_d_lvlayers);
    }
    TRACE(L"%s\n", m_d_lvlayers.GetString());
}

为了调试目的,请注释除ON_CBN_DROPDOWN(IDC_LV_LAYERS...)以外的其他消息。在继续前进之前,请确保有正确的字符串。

不要像你在上一个问题中所做的那样调用UpdateData(FALSE)。如果没有检索到正确的字符串,这可能会导致问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56052618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档