组合框选择加载上一个选择

Combobox selection loading previous selection

我有一个包含“1,2,3,4,5”的组合框。当我在组合框中创建 selection 时,会加载之前的 selection。例如,如果组合框中的值为“1”,而我 select “2”,“1”将加载到我的变量 nApplication 中,并且“2”将显示在我的组合框中。如果我想加载“2”,我需要再更改一次 selection。示例从“2”更改为“3”。我如何让它加载我select的号码?我的代码看起来像这样。

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 消息处理后更新,这就是导致您出现问题的原因。因此,解决方法可以是 post 自定义(应用程序定义的)消息,稍后处理。

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

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

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); 将所有控件中的值传输到变量,这可能只是不需要。它似乎是一种控制其他控件外观的机制,实际上并不是 "data-entry"(我猜组合框是一个不可编辑的下拉列表)。因此,您可以根本不使用 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]);
}

请注意上面的代码片段没有经过测试,这只是我会做的。