控制CComboBox中ListBox的DropDown & Back

前几天帮同事解决了个问题,挺好玩的,随手记到blog上
问题背景
这是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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值