解决方案 »

  1.   

    tree控件:http://blog.sina.com.cn/s/blog_45eaa01a0102ux7r.html
      

  2.   


    int Cini2View::listinTree(void* p,int nCount,char** pValue,char** pName)
    {//每次只能读出一行数据
       
     CString title;
     title.Format(_T("%s"),CStringW(*pValue));//解决乱码问题
     g_pTree->InsertItem(title,hCurItem,TVI_SORT);
    //上面一句应该怎么改?
     g_nitemCount++;
     return 0;
     }在回调函数中插入的。今天上午我也发现这个问题了,修改了回调函数,但是还是不能显示
      

  3.   

    int Cini2View::listinTree(void* p,int nCount,char** pValue,char** pName)
    {//每次只能读出一行数据
        
     CString title;
     title.Format(_T("%s"),CStringW(*pValue));//解决乱码问题
     g_pTree->InsertItem(title,hCurItem,TVI_SORT);
    //上面一句应该怎么改?
     g_nitemCount++;
     return 0;
     }
    在回调函数中插入的。今天上午我也发现这个问题了,修改了回调函数,但是还是不能显示
      

  4.   

    HTREEITEM InsertItem(
       LPCTSTR lpszItem,
       HTREEITEM hParent = TVI_ROOT,
       HTREEITEM hInsertAfter = TVI_LAST 
    );g_pTree->InsertItem(title,hCurItem,TVI_SORT);  这里的第二个参数, 直接决定了你插入的位置, 这个句柄从哪里来的, 怎么赋值的, 是否是你想要的父节点. 
    不上全部代码, 不能帮你.
    你的问题应该就是这个hCurItem有错, 总指向了根节点.
      

  5.   


    下面是初始化函数bool Cini2View::OnInitialUpdate()
    {
    //CFormView::OnInitialUpdate();

    //-------------Tree控件操作变量------------------------
     TVINSERTSTRUCT tvInsert;
         tvInsert.hParent=NULL;
        tvInsert.hInsertAfter=NULL;
        tvInsert.item.mask=TVIF_TEXT;
    //--------添加根目录----------------------------------------
        tvInsert.item.pszText=_T("实验");     g_pTree=(CTreeCtrl *)GetDlgItem(IDC_TREE1);
     g_hTreeRoot=g_pTree->InsertItem(&tvInsert);//根节点
     /////////////////////////////////////////////////
    sqlite3_stmt *pstmt = 0;
        const char *error = 0;    int ret = sqlite3_open("F:\\shuju\\fana.db", &m_pdb); //打开数据库,跟打开文本文件一样
    char *errmsg;
    g_nitemCount=0;
    ret=sqlite3_exec(m_pdb,"select lab_value from shiyan",listinTree,NULL,&errmsg);
    TRACE("ret=%d",ret);
        g_pTree->Expand(g_hTreeRoot,TVE_EXPAND);//展开*/
    //////////////////////////////////////////////////填充list control
    CListCtrl * pLC;
    pLC=( CListCtrl * ) GetDlgItem(IDC_LIST1);

        //禁止调整列宽
    CHeaderCtrl* pHeaderCtrl = (CHeaderCtrl*)(pLC->GetHeaderCtrl());   
        pHeaderCtrl->EnableWindow( FALSE );    
    pLC->InsertColumn(0,_T("变量名"),0,100);

    pLC->InsertColumn(1,_T("值"),0,150);
    pLC->InsertColumn(2,_T("格式"),0,150);
    pLC->InsertColumn(3,_T("描述"),0,200);
       
    DWORD dwExStyle = pLC->GetExStyle();/*getStyle 和 getexStyle不能混用*/
        dwExStyle |= LVS_EX_GRIDLINES;//|= LVS_EX_GRIDLINES//网线风格
    dwExStyle &=~LVS_EX_CHECKBOXES;
    dwExStyle |=LVS_EX_FULLROWSELECT ;
    pLC->SetExtendedStyle(dwExStyle);

     
        GetParentFrame()->RecalcLayout();
    ResizeParentToFit();
    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE


    }下面是树响应函数void Cini2View::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult)
    {
    hCurItem=g_pTree->GetSelectedItem();//   hCurItem指向所选择的节点
    LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
    // TODO: 在此添加控件通知处理程序代码
    if(pNMTreeView->itemNew.hItem==g_hTreeRoot)
    return;
    CString* pPath=(CString*)g_pTree->GetItemData(hCurItem);   CString str=g_pTree->GetItemText(pNMTreeView->itemNew.hItem);

    char *errmsg;
    int reta = sqlite3_open("F:\\shuju\\fana.db", &m_pdb); //打开数据库,跟打开文本文件一样 CString str1=_T("select * from buzhoubiao where step_name=\"");
    str=str1+str;
    str1=_T("\"");
    str=str+str1;

    int nlength=str.GetLength();
    char cmd[256];
    int nBytes = WideCharToMultiByte(CP_ACP,0,str,nlength,cmd,nlength,NULL,NULL);
    cmd[nlength]='\0';
    g_nitemCount=0;
    int ret=sqlite3_exec(m_pdb,cmd,listinTree1,NULL,&errmsg);
    TRACE("ret=%d",ret);
         *pResult = 0;
    }
    回调函数listinTree,这展开了一级子节点
    int Cini2View::listinTree(void* p,int nCount,char** pValue,char** pName)
    {//每次只能读出一行数据
     CString title;
     title.Format(_T("%s"),CStringW(*pValue));//解决乱码问题
     g_pTree->InsertItem(title,g_hTreeRoot,TVI_SORT);
     g_nitemCount++;
     return 0;
     }
    回调函数listinTree1中,hCurItem在回调函数中指向所选择的子节点,根节点是g_hTreeRoot。int Cini2View::listinTree1(void* p,int nCount,char** pValue,char** pName)
    {//每次只能读出一行数据
     
     CString title;
     title.Format(_T("%s"),CStringW(*pValue));//解决乱码问题
     g_pTree->InsertItem(title,hNewItem,TVI_SORT);
     g_pTree->Expand(hCurItem,TVE_EXPAND);
     g_nitemCount++;
     return 0;
     }
    下面都设置成了全局变量。
    int g_nitemCount;//读出数据计数器
    CTreeCtrl* g_pTree;
    HTREEITEM  g_hTreeRoot;//树形表根目录
    CString g_itemType;
    HTREEITEM hCurItem,hItem;
      

  6.   

    上面回调函数listinTree1中写错int Cini2View::listinTree1(void* p,int nCount,char** pValue,char** pName)
    {//每次只能读出一行数据 CString title;
     title.Format(_T("%s"),CStringW(*pValue));//解决乱码问题 g_pTree->InsertItem(title,hCurItem,TVI_SORT);
     g_pTree->Expand(hCurItem,TVE_EXPAND);
     g_nitemCount++;
     return 0;
     }
      

  7.   

    我知道是怎么回事了,我的数据库查询出问题
    title.Format(_T("%s"),CStringW(*pValue));//解决乱码问题
     g_pTree->InsertItem(title,hCurItem,TVI_SORT);
    这两句会出现一个问题,字符串转换的时候会使title前多一个空格,
    也就是
    CString str=g_pTree->GetItemText(pNMTreeView->itemNew.hItem);
    这一句里的str前面多一个制表符空格,经过删除就可以了
    str=str.TrimLeft(' ');