首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

控制 CComboBox 下拉列表的收起與彈出

     編輯:關於VC++

場景

需求:下拉時彈出自定義選擇對話框,選中後顯示在編輯區,並自動收起下拉列表。

嘗試失敗的方法

  • 在 CBN_DROPDOWN 處理函數中直接 SendMessage(CB_SHOWDROPDOWN, FALSE) → 無效
  • SendMessage(WM_KILLFOCUS)、SendMessage(WM_KEYDOWN, VK_ESCAPE) → 均失效

原因分析

CBN_DROPDOWN 通知在列表**即將**彈出**前**發送,處理函數返回後列表才真正彈出。此時發送收起消息過早,被後續彈出動作覆蓋。

成功方案

// 在 CBN_DROPDOWN 處理函數末尾
m_Combo.PostMessage(WM_KEYDOWN, VK_ESCAPE, 0);
  • 使用 PostMessage 而非 SendMessage,消息進入隊列,在當前消息處理完成、列表彈出**後**被處理
  • VK_ESCAPE 為 ComboBox 內部識別的收起鍵,模擬用戶按 Esc 鍵

替代方案 (若不想用 PostMessage)

// 在父窗口的 OnKillFocus 中
m_Combo.SendMessage(CB_SHOWDROPDOWN, FALSE, 0);
// 注意:若彈出選擇對話框已導致 KillFocus,則不可行
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved