在选择特定的组合框时,我在启用或禁用某些文本框时遇到了问题。
我试过使用OnCbnSelChangeLvLayers() & OnCbnDropdownLvLayers()。第一个事件处理程序的问题是,我必须点击相同的值两次,并选择在组合框中的频率。第二个事件处理程序解决了冻结问题,但为了使事件发生,我必须单击combobox的下拉列表。我还为combobox尝试了一些其他事件处理程序,但没有成功。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
}
}我希望在不冻结组合框的情况下,在一次单击中获得所需的启用/禁用。对于同样的方法,还有其他方法或更快的方法吗?
发布于 2019-05-14 04:18:28
由于@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);
}
}谢谢大家!
发布于 2019-05-10 15:16:59
这似乎是一个错误的下拉列表组合框和简单的组合框(而不是下拉)。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)。如果没有检索到正确的字符串,这可能会导致问题。
https://stackoverflow.com/questions/56052618
复制相似问题