【问题标题】:Programmatically change combobox以编程方式更改组合框
【发布时间】:2010-09-08 17:25:36
【问题描述】:
我需要使用新值更新combobox,以便更改其中的反射文本。最简洁的方法是在 combobox 已初始化并带有消息之后。
所以我正在尝试为包含 combobox 的 hwnd 制作一个 postmessage。
所以如果我想向它发送消息,将当前选中的项目更改为第 n 个项目,postmessage 会是什么样子?
我猜它会涉及ON_CBN_SELCHANGE,但我无法让它正常工作。
【问题讨论】:
标签:
c++
winapi
mfc
combobox
postmessage
【解决方案1】:
如果您想更改标题 - 这是组合框关闭时显示的行,那么您可以执行以下操作:
m_ComboBox.DeleteString(0); // 如果有的话,首先删除前一个,0 = 可视字符串
m_ComboBox.AddString(_T("你好"));
把它放在 fx.在 OnCloseupCombo - 当事件关闭时触发下拉框
ON_CBN_CLOSEUP(IDC_COMBO1, OnCloseupCombo)
此更改是一个新字符串,而不是已分配的组合框元素的选择
【解决方案2】:
可能出错的是选择更改消息处理程序内部正在更改选择,这会导致另一个选择更改消息。
绕过这个不需要的反馈循环的一种方法是向选择更改消息处理程序添加一个标记,如下所示:
void onSelectChangeHandler(HWND hwnd)
{
static bool fInsideSelectChange = 0;
//-- ignore the change message if this function generated it
if (fInsideSelectChange == 0)
{
//-- turn on the sentinel
fInsideSelectChange = 1;
//-- make the selection changes as required
.....
//-- we are done so turn off the sentinel
fInsideSelectChange = 0;
}
}
【解决方案3】:
简洁版:
const int index = 0;
m_comboBox.PostMessage(CBN_SELCHANGE, index);
【解决方案4】:
你想要ComboBox_SetCurSel:
ComboBox_SetCurSel(hWndCombo, n);
或者如果它是一个 MFC CComboBox 控件,您可能可以这样做:
m_combo.SetCurSel(2);
我想如果您手动执行此操作,您还需要 SendMessage 而不是 PostMessage。 CBN_SELCHANGE is the notification that the control sends back to you when the selection is changed.
最后,您可能想在这个问题中添加 c++ 标签。