从 CComboBox 获取文本

Posted

技术标签:

【中文标题】从 CComboBox 获取文本【英文标题】:Get text from CComboBox 【发布时间】:2012-08-06 19:01:58 【问题描述】:

我有一个 CDialog (myDialogBox),它有一个 CComboBox 成员 (myComboBox)。我的目标是从下拉样式CComboBox 的编辑部分获取用户输入的文本(最好是CString)。但是,我似乎无法让它工作。

我尝试过使用myComboBox.GetWindowText(myString)。但是每当我在调试模式下运行它时,我的代码在CWnd::GetWindowText() 函数内的ASSERT(::IsWindow(m_hWnd)) 处中断。

我也试过myDialogBox.GetDlgItemText(MY_COMBOBOX_ID, myString),它以类似的方式分解。

另外,我试过了:

    COMBOBOXINFO info;
    memset(&info,0,sizeof(info));
    myComboBox.GetComboBoxInfo(&info);
    LPTSTR str = new TCHAR[::GetWindowTextLength(info.hwndItem)];
    ::GetWindowText(info.hwndItem,str,::GetWindowTextLength(info.hwndItem));

但是,它似乎没有正确填充我的 info 变量。

请有人指出我正确的方向吗?我究竟做错了什么?有什么建议么?

编辑:以防万一它可能有助于理解我的最终目标,我试图有一个组合框,它可以帮助用户拍照并从字符串列表中进行选择。尽管如此,如果他/她不想要下拉列表中的任何内容,他可以想出自己的字符串。我想要一种方法来接收他的用户键入的字符串。

【问题讨论】:

您应该在对话框的DoDataExchange() 方法映射MY_COMBOBOX_IDmyComboBox 中有一个自动生成的DDX_Control 行。 MY_COMBOBOX_ID 在 resource.h 中也应该有一个唯一的数值。如果没有这些,您会得到您所描述的行为。 参考下面我对 Mark Ransom 的第二次回复......我相信我有这些要求。 (包括resource.h中的值) 【参考方案1】:

您需要在对话框被销毁之前调用GetWindowText。这样做的好地方是对话框的DoDataExchange 成员函数。

编辑:如果 CComboBox 对象尚未附加到实际窗口,您也会收到错误消息。这通常也发生在DoDataExchange

【讨论】:

奇怪的是,即使我没有销毁对话框,它也会发生。为了检查,我创建了一个发生在OnEditChangeMyComboBox 的函数,它只执行以下操作:UpdatesData(TRUE),然后它会尝试获取文本。它不会破坏对话框或任何东西。 至于DoDataExchange,我有CDialog::DoDataExchange(pDX); DDX_Control(pDX, MY_COMBOBOX_ID, myComboBox);。将其附加到对话框就足够了吗? @JHowzer,是的,应该就足够了。但是,您得到的错误是对象没有附加窗口。我不知道这是怎么发生的。 确保对话框编辑器中控件的 ID 属性实际上仍然是 MY_COMBOBOX_ID 并且它没有被意外更改。如果 ID 现在不同,那么解决方案仍将构建,但组合框将没有有效的窗口句柄。 我意识到我缺少与组合框相关的 CString 变量。这也需要将DDX_CBString(pDX, MY_COMBO_ID, myComboString); 添加到DoDataExchange。之后,我UpdateData(TRUE); 在选择或编辑更改事件时发生。谢谢你们的帮助。【参考方案2】:

您可以使用以下代码内嵌组合框文本:

CString cStr;
CWnd* Pfield = GetDlgItem(MY_COMBOBOX_ID);
Pfield->GetWindowText(cStr);

【讨论】:

以上是关于从 CComboBox 获取文本的主要内容,如果未能解决你的问题,请参考以下文章

CCombobox使用大全

VS2008中 项目--属性--设置属性--常规--字符集选择""Unicode"有啥用?

如何获取combobox的内容

MFC ComboBox 下拉列表太短

Qt Quick:如何从 ComboBox 获取当前文本

Qt Quick:如何从ComboBox获取当前文本