win32 TreeCtrl控件通知消息, LVN_SELCHANGED和LVN_ITEMCHANGED用法
今天出了个奇怪的问题,当我在主窗口上创建一个用模板对话框的子窗口时,
在子窗口上放的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