需要一个示例代码  ,不使用 mfc 的类,只使用 Tree-View Control  提供的消息或宏以及 api 来 操作 Tree-View Control 。需求 : 插入两个结点 , 比如命名为 item_00 , item_00_1 ,  item_00 是 item_00_1 的父结点 。运行后,我们应当看到 item_00 旁边有个小加号以及单击加号后显示出 子结点  item_00_1 。需求完毕。我想要示例代码,是因为我插入父子结点后,看不到什么加号 ,窗口风格我也指定了 TVS_HASBUTTONS TVS_HASLINES  。所以拜托朋友给出示例代码。                                  谢谢!!

解决方案 »

  1.   

    代码来了:
       HWND   hwndTreeView =  CreateWindowEx( 0 , // 新加的扩展风格  WS_EX_CLIENTEDGE
       WC_TREEVIEW ,  // 窗口类
       NULL, // 窗口名称,可以显示在标题栏 或者 按钮上
       WS_VISIBLE | WS_CHILD | WS_BORDER | TVS_HASLINES | TVS_LINESATROOT ,  // |LBS_EXTENDEDSEL|LBS_MULTIPLESEL|WS_VSCROLL|WS_HSCROLL|LBS_NOTIFY  , // 窗口风格    0  ,   80 ,  // 左上角坐标
       
       300 , 
       200 , // 宽 和 高
       
       this->GetSafeHwnd() , // 父窗口 
       (HMENU)1000,  // 菜单或者子窗口id
       0, //进程实例,xp下被忽略
       NULL //自定义的参数
       );         // 先插入一个作为 root ,后面的循环中插入子结点 TVITEMEX tcie00;     tcie00.mask = TVIF_TEXT ; // | TVIF_CHILDREN  ;     tcie00.pszText = "root001";        tcie00.cChildren = 1; // I_CHILDRENCALLBACK ;     //tcie00.iImage = 0;
        TVINSERTSTRUCT  item_000;      item_000.hParent = TVI_ROOT ; // 根节点     item_000.hInsertAfter = TVI_ROOT ;     item_000.itemex = tcie00;
    HTREEITEM   hti_root =  TreeView_InsertItem( hwndTreeView , &item_000 ); // 返回值是新item句柄 for( int i = 0; i < 10 ;i ++ )
    {
    TVITEMEX tcie00;     tcie00.mask = TVIF_TEXT ; // | TVIF_CHILDREN  ;     tcie00.pszText = "root001";        tcie00.cChildren = 1; // I_CHILDRENCALLBACK ;     //tcie00.iImage = 0;
        TVINSERTSTRUCT  item_000;      item_000.hParent = hti_root ; // 根节点     item_000.hInsertAfter = TVI_ROOT ;     item_000.itemex = tcie00;
    HTREEITEM   hti00 =  TreeView_InsertItem( hwndTreeView , &item_000 ); // 返回值是新item句柄
    }
      

  2.   


    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
                                     320,                       // 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;
    }
    }
    //
    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;
    }
      

  3.   


    case WM_CREATE:
    {
    HWND hTreeView = CreateWindow(WC_TREEVIEW, _T(""), 
    WS_CHILD | WS_BORDER | WS_VISIBLE | TVS_FULLROWSELECT | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS | TVS_SHOWSELALWAYS,
    10, 10, 200, 300, hWnd, (HMENU)0x11, hInst, NULL);
    if(hTreeView)
    {
    TVINSERTSTRUCT ti;
    ti.hParent = NULL;
    ti.hInsertAfter = TVI_LAST;
    ti.item.mask = TVIF_TEXT;
    TCHAR buf[32] = {0};
    _stprintf(buf, _T("%s"), _T("item_0"));
    ti.item.cchTextMax = _tcslen(buf);
    ti.item.pszText = buf;
    HTREEITEM hItem = TreeView_InsertItem(hTreeView, &ti);
    ti.hParent = hItem;
    _stprintf(buf, _T("%s"), _T("item_0_1"));
    ti.item.cchTextMax = _tcslen(buf);
    ti.item.pszText = buf;
    TreeView_InsertItem(hTreeView, &ti);
    }
    }
    break;