1. 程式人生 > 其它 >win32 TreeCtrl控制元件通知訊息, LVN_SELCHANGED和LVN_ITEMCHANGED用法

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