RT,有两个问题:
1,自己做了个TreeView窗口,但是鼠标右击消息死活不响应,WM_CONTEXTMENU和NM_RCLICK都试过,都不行。是不是建立窗口creatwindow的时候要加入支持右击的窗口风格或者其他原因?
2,已经添加了TVS_EDITLABELS,在notifyTV中也添加了TVN_BEGINLABELEDIT和TVN_ENDLABELEDIT,问题是,什么时候可以修改原有项,感觉有时候鼠标点着点着,突然就可以修改了。

解决方案 »

  1.   

    你TreeView类的基类是什么?CTreeView吗?
      

  2.   

    我是这样建立的:  hwndTV = CreateWindowEx(0, WC_TREEVIEW, TEXT(""),
    WS_VISIBLE|WS_CHILD|WS_VSCROLL|WS_BORDER|
    TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_EDITLABELS,
    prect->left(), prect->top(), 
    prect->right(), prect->bottom(),
    hwnd, (HMENU)ID_TREEV, app->instance(), NULL);
    其中,WC_TREEVIEW在wince中定义为#define WC_TREEVIEWW            L"SysTreeView32"
      

  3.   

    SDK啊,囧
    Sent by a list-view control when the user clicks an item with the right mouse button. This notification message is sent in the form of a WM_NOTIFY message.SyntaxNM_RCLICK    lpnmitem = (LPNMITEMACTIVATE) lParam;
      

  4.   

    请问Eleven:最后一句什么意思啊?NM_RCLICK试了也没捕捉到
      

  5.   

    case WM_NOTIFY:
    {
      NMHDR* lpnmh = (NMHDR*)lParam;
      switch(lpnmh->code)
      {
       case NM_RCLICK:
        break;   default:
        break;
      }
    }
    break;
      

  6.   

    我是这样做的,请帮忙看看有没有问题
      pnmh = (LPNMHDR)lParam;
      switch (pnmh->code) {
    case NM_CLICK:
    break;
    case NM_DBLCLK:
    break;
    case NM_RCLICK:
    idItem = idItem;
    break;
    左击和双击都可以,右击响应不了
       
      

  7.   

    自己debug下调试一下,NM_RCLICK处打个断点看看进入了没有?
      

  8.   

    需要:
    //子类化tree view过程 
    WNDPROC TVoldProc;
    LRESULT CALLBACK TVProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) 

    HWND     hwndTreeView = GetDlgItem(hWnd, IDC_TREEVIEW);
    LPNMTREEVIEW pnmv=(LPNMTREEVIEW)lParam;
    LPNMHDR  lpnmh = (LPNMHDR) lParam; 
    switch(Msg)
        {    
    case WM_LBUTTONDOWN:
    OutputDebugString("WM_LBUTTONDOWN\n");
    break;
    case WM_LBUTTONDBLCLK:
    OutputDebugString("WM_LBUTTONDBLCLK\n");
    break;
    }
    return CallWindowProc(TVoldProc, hWnd, Msg, wParam, lParam);
    }
    //
    LRESULT APIENTRY WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) 
    {...
    m_hTreeView=CreateTreeView((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), hwnd);
    //    TVoldProc = (WNDPROC)SetWindowLong(m_hTreeView, GWL_WNDPROC, (LONG)TVProc); 
    //
    #define TV_WIDTH  200
    #define TV_HEIGHT 200
    //VLISTVW.C
    HWND CreateTreeView(HINSTANCE hInstance, HWND hwndParent)
    {
    DWORD       dwStyle;
    HWND        hwndTreeView;
    BOOL        bSuccess = TRUE;dwStyle =   WS_TABSTOP | WS_CHILD | WS_BORDER | WS_VISIBLE ;//
                
    hwndTreeView = CreateWindowEx(   WS_EX_WINDOWEDGE,//WS_EX_CLIENTEDGE,// ex style
                                     WC_TREEVIEW, // class name defined in commctrl.h
                                     NULL,                      // window text
                                     dwStyle,                   // style
                                     300,                       // x position
                                     120,                       // y position
                                     TV_WIDTH,                  // width
                                     TV_HEIGHT,                 // height
                                     hwndParent,                // parent
                                     (HMENU)IDC_TREEVIEW,       // ID
                                     (HINSTANCE)GetWindowLong(hwndParent, GWL_HINSTANCE), // instance
                                     NULL);                     // no extra data
    //
    if(hwndTreeView)
    {
    InitTreeView(hwndTreeView);
    return hwndTreeView;
    }
    else
    {
    return NULL;
    }
    }
      

  9.   

    按楼上说的,如果需要子类话treeview的话,要想让消息进入CALLBACK TVProc消息处理函数,是不是还应该对窗口进行注册,不然进不了CALLBACK TVProc函数吧?
      

  10.   

    已经进行注册了,不必自己注册。
    WNDPROC TVoldProc;
    ...
    m_hTreeView=CreateTreeView((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), hwnd);
    TVoldProc = (WNDPROC)SetWindowLong(m_hTreeView, GWL_WNDPROC, (LONG)TVProc);  
      

  11.   

    LRESULT APIENTRY WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) 

    BOOL bl;
    HDC  hdc;
    HPEN  hPen;
    HPEN  hOldPen; HINSTANCE hInstance=(HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE);
    switch(message) 
    {
    case WM_CREATE:
    MessageBeep(48);
    m_hMain=hwnd;
    //
    m_hStatic=CreateStatic(hInstance,m_hMain);
    //Animate_Create ACS_AUTOPLAY m_hStatic
    m_hAnimate=Animate_Create(m_hStatic,IDC_AVI,WS_CHILD | WS_VISIBLE | WS_BORDER | ACS_AUTOPLAY |
          ACS_TRANSPARENT,//  | ACS_CENTER=0 
      hInstance);
    if(m_hAnimate) 
    bl=Animate_Open(m_hAnimate, MAKEINTRESOURCE(ID_AVI));
    // CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hwnd, DialogProc) ; DialogBox((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), 
    MAKEINTRESOURCE(IDD_DIALOG1), hwnd, DialogProc); 
    //
    m_hListView=CreateListView((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), hwnd) ;
    //    LVoldProc = (WNDPROC)SetWindowLong(m_hListView, GWL_WNDPROC, (LONG)LVProc); 
    //
    m_hListBox = CreateLB(hwnd);
    LBoldProc = (WNDPROC)SetWindowLong(m_hListBox, GWL_WNDPROC, (LONG)LBProc); 
    //
    m_hComboBox=CreateCB(hwnd);
    //
    m_hToolTip=CreateTT(m_hListView);
    LvAddTools();
    //
    m_hTreeView=CreateTreeView((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), hwnd);
       TVoldProc = (WNDPROC)SetWindowLong(m_hTreeView, GWL_WNDPROC, (LONG)TVProc); 
    ...
    break;
      

  12.   

    吧tree init 也给你吧//
    BOOL InitTreeView(HWND hwndTreeView)
    {
    // set tree style
    LONG NewStyle=GetWindowLong(hwndTreeView,GWL_STYLE);
    NewStyle=NewStyle|TVS_HASBUTTONS|TVS_HASLINES|TVS_INFOTIP|
                 TVS_LINESATROOT|TVS_SHOWSELALWAYS|TVS_EDITLABELS;
    SetWindowLong(hwndTreeView,GWL_STYLE,NewStyle);
    //
        HIMAGELIST  hImageList;
        SHFILEINFO  sfi;
        hImageList = (HIMAGELIST)SHGetFileInfo((LPCSTR)"C:\\",0,&sfi,sizeof(SHFILEINFO), 
                                               SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
        if (hImageList)
    {// Attach ImageList to TreeView
    TreeView_SetImageList(hwndTreeView,hImageList,TVSIL_NORMAL);
    }// draw tree "My Computer"
    TV_INSERTSTRUCT TreeCtrlItem;
    TreeCtrlItem.hParent = TVI_ROOT;
    TreeCtrlItem.hInsertAfter = TVI_LAST;// don't use TVI_SORT;
    TreeCtrlItem.item.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_CHILDREN;//|TVIF_STATE;
    TreeCtrlItem.item.pszText= m_MyComputer;//
    TreeCtrlItem.item.cchTextMax = MAX_PATH;
    TreeCtrlItem.item.cChildren=1;// has child show "+"
    //
        HRESULT hr;
    LPMALLOC lpMalloc;
        hr=::SHGetMalloc(&lpMalloc);
        if (FAILED(hr)) return TRUE;
    // get pidl of "My Computer"
        LPITEMIDLIST  lpidl=NULL;  // pidl of "My Computer"
    hr=SHGetSpecialFolderLocation(NULL,CSIDL_DRIVES,&lpidl);
        if (FAILED(hr)) return TRUE;
    // icons and "My Computer"
    SHGetFileInfo((LPCSTR)lpidl,0,&sfi,sizeof(SHFILEINFO), SHGFI_PIDL | 
    SHGFI_DISPLAYNAME | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
    TreeCtrlItem.item.iImage = sfi.iIcon;
    strcpy(m_MyComputer,sfi.szDisplayName);
    //
    SHGetFileInfo((LPCSTR)lpidl,0,&sfi,sizeof(SHFILEINFO),SHGFI_PIDL | 
    SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_OPENICON);
    TreeCtrlItem.item.iSelectedImage = sfi.iIcon;
    // insert root
    HTREEITEM hTreeItem1 = TreeView_InsertItem(hwndTreeView,&TreeCtrlItem);
    TreeCtrlItem.hParent = hTreeItem1;
    // Free
    lpMalloc->Free(lpidl);
    lpMalloc->Release();
    // under "My Computer"
    char buf[MAX_PATH];
    char *pDrv=buf;
    char drive[40];
    if(GetLogicalDriveStrings(260,buf))
    {// try all drive
    while(*pDrv)
    {
    strcpy(drive,pDrv);
    pDrv+=strlen(drive)+1;
    // no A:
    if(stricmp(drive,"A:\\")==0) continue;
    SHGetFileInfo(drive,FILE_ATTRIBUTE_DIRECTORY,&sfi,sizeof(sfi),
         SHGFI_DISPLAYNAME | SHGFI_USEFILEATTRIBUTES | SHGFI_TYPENAME | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
    TreeCtrlItem.hParent = hTreeItem1;
    TreeCtrlItem.item.pszText = sfi.szDisplayName;
    TreeCtrlItem.item.iImage=sfi.iIcon;
    TreeCtrlItem.item.iSelectedImage = sfi.iIcon;
    TreeCtrlItem.item.cChildren=1;// child show "+"
    // add in
    HTREEITEM hTreeItem2 = TreeView_InsertItem(hwndTreeView,&TreeCtrlItem);
    // TreeCtrlItem.hParent = hTreeItem2;
    }
    }
    // expand "My Computer"
    // TreeView_SelectItem(hwndTreeView,hTreeItem1);//m_Tree.SelectItem();// root
    TreeView_Expand(hwndTreeView,hTreeItem1,TVE_EXPAND);// root return TRUE;
    }
      

  13.   

    m_hTreeView=CreateTreeView((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), hwnd);
    TVoldProc = (WNDPROC)SetWindowLong(m_hTreeView, GWL_WNDPROC, (LONG)TVProc);  
    这两句怎么编译通不过呢,说GWL_HINSTANCE未定义,还有SetWindowLong()里的第3个参数,TVProc这个函数不能转换为LONG型?
      

  14.   

    不知道是不是和定义
    #define GetWindowLong  GetWindowLongW
    #define SetWindowLong  SetWindowLongW
    有关
      

  15.   

      是的,我是在WINCE下,上面的错误已经解决,(LONG)TVProc改成(LONG)@TVProc就可以了。可是在TVProc()的switch结构里,case WM_RUTTONDOWN和case WM_RUTTONUP还是不能响应。
      我想试下WM_NOTIFY消息里的NM_RCLICK,但是在switch(msg)里,捕捉不到WM_NOTIFY消息
      

  16.   

    所有消息都要经过:
    LRESULT CALLBACK TVProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) 
    的,
    你调试一下看看
      

  17.   

    调试过了,产生不了WM_NOTIFY,WM_LUTTONDOWN是可以捕捉的
      

  18.   

    WM_NOTIFY是发送给父窗口的,你应该在父窗口中处理WM_NOTIFY消息
      

  19.   

    PC上:
    case WM_NOTIFY:
    OutputDebugString("WM_NOTIFY\n");
    break;
    // 比click多!
      

  20.   

    不知道有哪些原因会使窗口产生不了WM_NOTIFY和右击消息呢
      

  21.   

    恩,应该是这样,那意思就是没办法在LRESULT CALLBACK TVProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) 中处理WM_NOTIFY消息了吗?WM_RUTTONDOWN又响应不了,悲剧了
      

  22.   

    我的:
    case WM_NOTIFY:
    OutputDebugString("WM_NOTIFY\n");
    break;
    在:
    LRESULT CALLBACK TVProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)  
    中!
      

  23.   

    在父窗口可以:
    LRESULT APIENTRY WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) 
    case WM_NOTIFY:
    if(wParam==IDC_LISTVIEW)
    {
    return (ListViewNotify(hwnd, lParam));
    }
    else if (wParam==IDC_TREEVIEW)
    {
    return (TreeViewNotify(hwnd, lParam));
    }
    break;
      

  24.   

    会不会是你的treeview对应的窗口上还有子窗口?
      

  25.   

    treeview对应的窗口上还有子窗口treectrl,用CTreeCtrl& GetTreeCtrl( ) const;可以得到它
      

  26.   

    我的也会有吗?我不是用mfc的
      

  27.   

    上面为什么还要有子窗口呢,我是trevie控件直接关联到WC_TREEVIEW窗口。
    hwndTV = CreateWindowEx(0, WC_TREEVIE, TEXT(""),
    WS_VISIBLE|WS_CHILD|WS_VSCROLL|WS_BORDER|
    TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_EDITLABE, prect->left(), prect->top(), 
    prect->right(), prect->bottom(),
    hwnd, (HMENU)ID_TREEV, app->instance()
    , NULL);
      // Create image list control for tree view icons.
      himl = ImageList_Create(16, 16, ILC_COLOR, 4, 0);
      // Load first two images from one bitmap.
      hBmp = LoadBitmap(app->instance(), MAKEINTRESOURCE(ID_BMPTV));  ImageList_Add(himl, hBmp, NULL);
      DeleteObject(hBmp);  TreeView_SetImageList(hwndTV, himl, TVSIL_NORMAL); 
      

  28.   

    调试了一下,确实在treeview的父窗口中能响应WM_NOTIFY消息,其中的NM_CLICK消息也能响应,但是右击的NM_RCLICK消息就是捕捉不到,是不是对treeview控件的右击操作有特定要求的?
      

  29.   

    在:
    LRESULT CALLBACK TVProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) 
    中直接:
    case WM_RBUTTONDOWN:
    OutputDebugString("WM_RBUTTONDOWN\n");
    break;
    就可以了
      

  30.   

    你的winCE(蜥蜴)有问题吧,PC上是好的!
      

  31.   

    按道理wince上是有右击的,系统桌面的右击菜单也能出来。可能是因为我的应用程序和wince之间通过一个库来连接,这个库哪里有点问题
      

  32.   

    在 LRESULT CALLBACK TVProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) 
    中只找到一个:
    case WM_NOTIFY:
    {
    char prom[80];
    NMHDR *lpnmh = (LPNMHDR)lParam;
    sprintf(prom,"%d\n",lpnmh->code);
    OutputDebugString(prom);//-530
    //
    switch(lpnmh->code)
    {
    case TTN_NEEDTEXTW:
    OutputDebugString("TTN_NEEDTEXTW \n");
    break;
    case NM_HOVER:
    OutputDebugString("NM_HOVER \n");
    break;
    case NM_NCHITTEST:
    OutputDebugString("NM_NCHITTEST \n");
    break;
    }
    }
    break;
    //剩下的要在 LRESULT APIENTRY WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) 
    中找。都有的
    LRESULT TreeViewNotify (HWND hWnd, LPARAM lParam)
    {
    LPNMHDR lpnmh = (LPNMHDR) lParam; // Contains data from a notification 
    switch (lpnmh->code)
    {
    case NM_CLICK:
    OutputDebugString("NM_CLICK\n");
    break;
    case NM_DBLCLK:
    OutputDebugString("NM_DBLCLK\n");
    break;
    case NM_RETURN:
    OutputDebugString("NM_RETURN\n");
    break;
    case NM_RCLICK:
    OutputDebugString("NM_RCLICK\n");
    break;
    case NM_RDBLCLK:
    OutputDebugString("NM_RDBLCLK\n");
    break;
    case NM_SETFOCUS:
    OutputDebugString("NM_RCLICK\n");
    break;
    case NM_KILLFOCUS:
    OutputDebugString("NM_KILLFOCUS\n");
    break;
    case NM_HOVER:
    OutputDebugString("NM_HOVER\n");
    break;
    case NM_CUSTOMDRAW:
    OutputDebugString("NM_CUSTOMDRAW\n");
    break;
    }
    ...