WEB开发网
开发学院软件开发VC 控制CComboBox中ListBox的DropDown及Back 阅读

控制CComboBox中ListBox的DropDown及Back

 2008-04-19 20:29:08 来源:WEB开发网   
核心提示:问题背景这是UE的一个要求,是在CComboBox下拉出ListBox的时候,控制CComboBox中ListBox的DropDown及Back,弹出一个选择窗口,然后选中一项,作如下处理1. 在消息响应函数结束的地方调用Combobox.PostMessage( WM_KILLFOCUS),注意是PostMessag

问题背景

这是UE的一个要求,是在CComboBox下拉出ListBox的时候,弹出一个选择窗口,然后选中一项,显示在CComboBox的Edit中

同事的做法是在ComboBox的父窗口捕捉ComboBox的CBN_DROPDOWN通知消息,在消息响应函数中弹出选择窗口,然后为ComboBox设置Strings和选中项。但是不好的现象是,因为是在处理下拉的消息,故此函数结束的时候,下拉ListBox没有收回。

开始的做法

开始想当然的在通知消息响应函数结束的地方调用

Combobox.SendMessage( CB_SHOWDROPDOWN, (WPARAM)FALSE, 0)

来将下拉框收回,但是失败,于是又尝试了

Combobox.SendMessage( WM_KILLFOCUS)和

Combobox.SendMessage( WM_KEYDOWN, VK_ESCAPE, 0)

全部失败。

有些进步了

经过上面的失败,写了一个简单的对话框程序来测试CComboBox,发现其ListBox不是在CBN_DROPDOWN的通知消息响应函数之中/之前下拉出来的,我们准备下拉ListBox的时候就已经发出了这个通知消息,然后通知消息处理了之后才真正下拉出来。故此我们在通知消息响应函数中做的收回ListBox的函数实际上都被过早的调用了,没有起作用。

于是在测试程序中,作如下处理

1. 在消息响应函数结束的地方调用

Combobox.PostMessage( WM_KILLFOCUS),注意是PostMessage

2. 在KillFocus的响应函数中调用

Combobox.SendMessage( CB_SHOWDROPDOWN, (WPARAM)FALSE, 0)

测试项目成功通过

但是回到原来的项目中还是不行,发现原来是弹出选择窗口时就已经发出了KillFocus消息

最终解决方案

很简单,在CBN_DROPDOWN通知消息的响应函数最后加入

Combobox.PostMessage( WM_KEYDOWN, VK_ESCAPE, 0)

Tags:控制 CComboBox ListBox

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接