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
原文地址:https://www.cnblogs.com/greenleaf1976/p/15362573.html