對CXListCtrl的項ComboBox顯示值改變的響應方法
文章目錄
前言
在開發過程中,使用XListCtrl來豐富列表的使用,從而發現對項ComboBox的改變響應沒有好的方法入手,既有一下問題過程,現解決記錄互相分享,下拉到底直接檢視解決方法。
一、開發需求
如上圖所示,當資料型別改變時需要改變內容中的顯示方式(可選框或者輸入框)。
二、尋找解決方法
1.用ComboBox的CBN_SELCHANGE訊息進行嘗試
程式碼如下(示例):
//CXListCtrl列表的變數 CXListCtrl m_list;
DDX_Control(pDX, IDC_LIST2, m_list);
//訊息繫結函式 嘗試繫結在列表上
ON_CBN_SELCHANGE(IDC_LIST2, &CModelConfigDlg::OnSelchangeComboStyle)
//Combox控制元件的生成方式如下,所以沒有物件可以直接繫結
m_list.SetComboBox(nItem, 4,
TRUE, // enable combobox
&(CStringArray), // pointer to persistent CStringArray
5, // size of dropdown
0, // initial combo selection
FALSE); // sort CStringArray
結果:此方法沒有響應
2.考慮XListCtrl是否有自帶的響應訊息
A.獲得WM_XLISTCTRL_COMBO_SELECTION訊息
百度查詢到以下內容:
XListCtrl中自定義了訊息WM_XLISTCTRL_COMBO_SELECTION,寫個該訊息的響應函式就可以了。
來自此CSDN問答:如何獲取CXListCtrl中ComboBox的下拉事件
B.嘗試進行訊息繫結和獲取
//響應介面宣告
afx_msg LRESULT OnXlistCombo(WPARAM wParam, LPARAM lParam);
//訊息繫結
ON_MESSAGE(WM_XLISTCTRL_COMBO_SELECTION, &CModelConfigDlg::OnXlistCombo)
結果:此方法沒有響應
C.對CXListCtrl原始碼分析
上述步驟不能實現,考慮是否CListCtrl對此訊息有特殊處理,以下貼出部分原始碼追蹤過程
//在XListCtrl.cpp註冊了此訊息
XLISTCTRLLIBDLLEXPORT UINT WM_XLISTCTRL_COMBO_SELECTION = ::RegisterWindowMessage(_T("WM_XLISTCTRL_COMBO_SELECTION"));
//查詢此訊息的傳送位置
void CXListCtrl::OnTimer(UINT nIDEvent)
{
//忽略部分原始碼.......
else if (nIDEvent == 3) // get combo listbox selection, then close combo listbox
{
//忽略部分原始碼.......
CWnd *pWnd = GetParent();
if (!pWnd)
pWnd = GetOwner();
if (pWnd && ::IsWindow(pWnd->m_hWnd))
pWnd->SendMessage(WM_XLISTCTRL_COMBO_SELECTION,
m_nComboItem, m_nComboSubItem);
//忽略部分原始碼.......
}
//可知在定時器中 去當接收到3的觸發條件進行傳送訊息 接著檢視定時器啟動位置
// OnComboReturn
LRESULT CXListCtrl::OnComboComplete(WPARAM, LPARAM)
{
XLISTCTRL_TRACE(_T("in CXListCtrl::OnComboComplete\n"));
SetTimer(3, 50, NULL);
return 0;
}
//查到一個訊號相應函式 繫結介面如下
ON_REGISTERED_MESSAGE(WM_XCOMBOLIST_COMPLETE, OnComboComplete)
//去查詢訊號WM_XCOMBOLIST_COMPLETE未有發現從而對ON_REGISTERED_MESSAGE這個不常見的繫結方法進行分析
D.ON_REGISTERED_MESSAGE自定義訊息繫結介面
通過百度查詢得到如下
注意事項:
傳送訊息的-MyMessageDlg.cpp前也要定義
static UINT WM_MY_MESSAGE=RegisterWindowMessage(“Message”);
接受訊息的-MessageTestView.cpp前也要定義
static UINT WM_MY_MESSAGE=RegisterWindowMessage(“Message”);
RegisterWindowMessage(“Message”)中""的內容是什麼不重要,寫什麼都可以,單必須
傳送者與接受者是一樣的內容,例如:“Message”
來自此部落格 傳送自定義訊息:ON_MESSAGE和ON_REGISTERED_MESSAGE的差別(轉)
解決方法
涉及程式碼如下
//先在接收訊息所在的CPP進行訊息註冊
static UINT WM_MY_MESSAGE = RegisterWindowMessage(_T("WM_XLISTCTRL_COMBO_SELECTION"));
//繫結訊息
ON_REGISTERED_MESSAGE(WM_MY_MESSAGE, OnXlistCombo)
//訊息響應函式
afx_msg LRESULT CModelConfigDlg::OnXlistCombo(WPARAM wParam, LPARAM lParam)
{
CString strTittle;
strTittle.Format(_T("自定義訊息引數:x=%d,y=%d"), wParam, lParam);
SetWindowText(strTittle);
return LRESULT();
}
至此,每次ComboBox的改變,都可以在響應函式中得到在XListCtrl上對應的行列位置,即可在響應函式中實現對應功能要求
相關文章
- react native拖動上方顯示值,改變背景顏色的sliderReact NativeIDE
- vue-element 選擇框 選擇值改變,顯示不變Vue
- IHS Markit:COVID-19對顯示皮膚需求變化的影響
- Easy UI Combobox顯示拼接欄位UI
- 論資訊顯示對我生活的影響
- 解決easyui combobox賦值boolean型別的值時,經常出現的內容顯示的value而不是text的bugUI賦值Boolean型別
- js 選項卡 【滑鼠懸停標題,顯示對應內容,改變其他標題顏色並隱藏內容】...JS
- 顯示器響應時間是什麼?顯示器響應時間5ms和1ms差別對比
- python例項屬性的顯示方法-dir、__dict__Python
- debug下每行行尾顯示變數的值 idea設定變數Idea
- UIBarButtonItem 在 iOS 11 上的改變及應對方案UIiOS
- easyUI combobox 新增空白項UI
- python2 http響應中文顯示unicode uXXX的問題PythonHTTPUnicodeUX
- vue 變數賦值同時改變的問題Vue變數賦值
- Polygon:暴雪過去的6個月 顯示出一個正在迅速改變的公司Go
- 【WPF】根據選項值顯示不同的編輯控制元件(使用DataTemplateSelector)控制元件
- js 改變 控制元件的屬性值JS控制元件
- 新冠肺炎對汽車顯示市場的影響:3月更新
- C# 顯示、隱藏視窗對應的工作列C#
- 在使用python matplotlib和Axes3D繪製曲面時,改變facecolors的顯示範圍使其表示真實值。PythonS33D
- LOGO!自帶螢幕顯示文字和變數值Go變數
- 改變IP地址的三種方法
- Vue響應式—-陣列變異方法Vue陣列
- 19、Overload和Override的區別。Overloaded的方法是否可以改變返回值的型別?IDE型別
- javascript 將變數值作為物件屬性 獲取物件對應的值JavaScript變數物件
- 新資料顯示WhatsApp的隱私問題對Facebook影響有多大APP
- python改變單通道圖片的畫素值Python
- select通過onchange獲取每次改變的值
- Flutter之根據執行的platform顯示對應風格的widgetFlutterPlatform
- Java靜態變數在靜態方法內部無法改變值Java變數
- 使用RestTemplate,顯示請求資訊,響應資訊REST
- win10驅動停止響應如何處理_win10電腦顯示驅動停止響應修復方法Win10
- 對通用骨架提取方法的改進
- win10應用程式的圖示顯示不出來怎麼辦_win10軟體圖示不顯示的解決方法Win10
- div固定顯示的幾種方法
- 使用ant design of vue的下拉框來選擇性別,性別的值為0、1,被選中的選項顯示的是value值,即0、1,不顯示男、女Vue
- anki 模板cloze 多次挖空 點選一次顯示一次 點對應的顯示一個(自帶的會全部顯示出來)
- php 迴圈陣列引用傳值改變陣列本身的值PHP陣列