组合框选择加载上一个选择
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]);
}
请注意上面的代码片段没有经过测试,这只是我会做的。
我有一个包含“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]);
}
请注意上面的代码片段没有经过测试,这只是我会做的。