Какой обработчик событий для Combobox для одиночного выбора в MFC C ++ - PullRequest
0 голосов
/ 09 мая 2019

У меня проблемы с включением или отключением определенных текстовых полей при выборе определенного комбинированного списка.

Я пытался использовать OnCbnSelChangeLvLayers() & OnCbnDropdownLvLayers(). Проблема с первым обработчиком событий заключается в том, что мне нужно дважды щелкнуть одно и то же значение, и выбор в поле со списком отмечен. Второй обработчик событий решает проблему зависания, но я должен нажать на выпадающий список, чтобы событие произошло. Я также попробовал несколько других обработчиков событий для выпадающего списка, но безуспешно. m_d_layers - строковая переменная для выбора в выпадающем списке (1,2,3,4)

DDX:

void CThermalToolDlg::DoDataExchange(CDataExchange* pDX)
{
    DDX_CBString(pDX, IDC_LV_LAYERS, m_d_lvlayers);
}

Карта сообщений:

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()

Обработчик событий:

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
    }
}

Я хочу получить желаемое включение / отключение в один клик без зависания комбинированного списка. Есть ли другой способ или более быстрый метод для того же?

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Благодаря @BarmakShemirani я использовал его код получения правильной строки вместо UpdateData() в ON_CBN_SELENDOK обработчике событий, и теперь он работает как талисман

DDX:

void CThermalToolDlg::DoDataExchange(CDataExchange* pDX)
{
  DDX_CBString(pDX, IDC_LV_LAYERS, m_d_lvlayers);
}

Карта сообщений:

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()

Обработчик событий:

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 голосов
/ 10 мая 2019

Кажется, это ошибка для выпадающего списка и простого выпадающего списка (не выпадающего).DDX_CBString или DDX_CBStringExact не получают правильное значение в ответ на ON_CBN_DROPDOWN.

Вы можете использовать свой собственный код для получения правильной строки:

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), как вы это делали в предыдущем вопросе.Это может вызвать проблемы, особенно если правильная строка не извлекается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...