win32 TreeCtrl控制元件通知訊息, LVN_SELCHANGED和LVN_ITEMCHANGED用法
阿新 • • 發佈:2021-10-02
今天出了個奇怪的問題,當我在主視窗上建立一個用模板對話方塊的子視窗時,
在子視窗上放的TreeCtrl控制元件不響應LVN_SELCHANGED訊息,也是暈死了,
我以為是訊息捕獲的問題,我在主視窗上也捕獲不到,子視窗上也捕獲不到,
最後跑到全域性訊息迴圈中也捕獲不到,就這樣消失了,不知道去哪去了.
好奇怪哦.
最後在網上找了半天,就用TVN_ITEMCHENGED訊息碼就能捕獲了,暈菜了,
好吧,就用這個訊息也可以,就不糾結哪些問題了.
1.TVN_ITEMCHENGED訊息在WM_NOTIFY訊息中的應用
在測試的時候,要獲取兩次資料,一次是原來選中的資料,一次是新選中的資料,
所以要用
if(tv->uChanged&TVIF_STATE&&tv->uStateNew&TVIS_SELECTED)
來判斷是新選中的資料,還是原來選中的資料
int TreeDlg::OnTvnSelChanged_Tree1(UINT id, LPNMHDR lpNMHdr) { NMTVITEMCHANGE* tv = (NMTVITEMCHANGE*)lpNMHdr; if(tv->uChanged&TVIF_STATE && tv->uStateNew&TVIS_SELECTED) {
TCHAR itemText[32] = { 0 };
TVITEM tvItem = { 0 };
tvItem.mask = TVIF_TEXT;
tvItem.hItem = tv->hItem;
tvItem.cchTextMax = 32;
tvItem.pszText = itemText;
TreeView_GetItem(lpNMHdr->hwndFrom, &tvItem);
} return 0; }
2.LVN_SELCHANGED訊息在WM_NOTIFY中的應用
INT_PTR QTreeDlg::OnNotify(WPARAM wParam, LPARAM lParam) { LPNMHDR lpHdr = (LPNMHDR)lParam; if (lpHdr->idFrom == IDC_TREE1 && lpHdr->code == TVN_SELCHANGED) { TCHAR itemText[32] = { 0 }; NMTREEVIEW* pNMtv = (NMTREEVIEW*)lParam; TVITEM tv = { 0 }; tv.mask = TVIF_TEXT; tv.hItem = pNMtv->itemNew.hItem; tv.cchTextMax = 32; tv.pszText = itemText; TreeView_GetItem(lpHdr->hwndFrom, &tv); int n = 9; } return 0; }
只要能讀出資料,用哪個訊息都不存在,
但我又另弄了個工程,專門來測試這問題,新工程式中卻又能捕獲到LVN_SELCHANGED訊息了,
卻不能捕獲LVN_ITEMCHANGED訊息........................
再次暈菜了,
最後的最後,兩個工程來回的試,不能兩個訊息都捕獲,能捕獲LVN_SETCHANGED,就不能捕獲LVN_ITEMCHANGED,
問題是什麼情況下用什麼訊息就弄不明白了,也就只好這樣了,能捕獲哪個就用哪個.........
簽名:GreenLeaf1976