组合框选择加载以前的选择



我有一个包含"1,2,3,4,5"的组合框。当我在组合框中进行选择时,将加载上一个选择。例如,如果组合框中的值是"1"并且我选择"2","1"将加载到我的变量nApplication并且"2"将显示在我的组合框中。如果我想加载"2",我需要再次更改选择。示例从"2"更改为"3"。如何让它加载我选择的数字?我的代码如下所示。

void CAppDlg::DoDataExchange(CDataExchange* pDX)
{
DDX_Text(pDX, IDC_Application, nApplication);
.
.
void CAppDlg::OnCbnSelchangeapplication()
{
UpdateData(TRUE);
int j = nApplication-1;
for(int i=0; i<MAX_LABEL; i++){
bool bShow = i < arrLabel[j];
((CButton *)GetDlgItem(IDC_Label1+i))->ShowWindow(bShow);
}
}

任何帮助将不胜感激。谢谢。

正如我的评论中所解释的,我怀疑组合框的内容在处理CBN_SELCHANGE消息后会更新,这就是导致您出现问题的原因。因此,解决方法可能是发布自定义(应用程序定义的(消息,以便稍后处理。

函数的类型必须afx_msg LRESULT (CWnd::*)(WPARAM, LPARAM)(查看文档(。

因此,在您的类声明中,添加:

public:
afx_msg LRESULT OnComboSelChanged(WPARAM wParam, LPARAM lParam);

在您的消息映射中:

ON_MESSAGE(WM_APP+100, OnComboSelChanged)

最后实现:

void CAppDlg::OnCbnSelchangeapplication()
{
// Place a message in the message queue
PostMessage(WM_APP+100);
}
LRESULT CAppDlg::OnComboSelChanged(WPARAM wParam, LPARAM lParam)
{
UpdateData(TRUE);
int j = nApplication-1;
// I have simplified your code a little
for(int i=0; i<MAX_LABEL; i++)
GetDlgItem(IDC_Label1+i)->ShowWindow(i < arrLabel[j]);
return 0L;
}




但是,所有这些,即调用UpdateData(TRUE);,在那里获取字符串,将其转换为int并根据其值采取行动,可能只是矫枉过正,特别是如果组合框只包含一个连续的数字范围(在您的情况下为 1..5(。UpdateData(TRUE);将所有控件中的值传输到变量,这可能只是不需要。它似乎是一种控制其他控件外观的机制,它不是真正的"数据输入"(我猜组合框是一个不可编辑的下拉列表(。因此,您根本无法使用DDX/DDV,而是自己检查所选项目。这是一个从零开始的索引。这是代码:
void CAppDlg::OnCbnSelchangeapplication()
{
// Get selected item
int j = ((CComboBox *)GetDlgItem(DC_Application))->GetCurSel();
if (j == CB_ERR) return;
for(int i=0; i<MAX_LABEL; i++)
GetDlgItem(IDC_Label1+i)->ShowWindow(i < arrLabel[j]);
}

请注意,上面的代码片段尚未经过测试,这只是我要做的。

最新更新