MFC中Tree控件子节点如何展开? mfc数据库sqlite3Tree 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 tree控件:http://blog.sina.com.cn/s/blog_45eaa01a0102ux7r.html 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; }在回调函数中插入的。今天上午我也发现这个问题了,修改了回调函数,但是还是不能显示 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; }在回调函数中插入的。今天上午我也发现这个问题了,修改了回调函数,但是还是不能显示 HTREEITEM InsertItem( LPCTSTR lpszItem, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST );g_pTree->InsertItem(title,hCurItem,TVI_SORT); 这里的第二个参数, 直接决定了你插入的位置, 这个句柄从哪里来的, 怎么赋值的, 是否是你想要的父节点. 不上全部代码, 不能帮你.你的问题应该就是这个hCurItem有错, 总指向了根节点. 下面是初始化函数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; 上面回调函数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; } 我知道是怎么回事了,我的数据库查询出问题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(' '); 请问BCGControlBar里面CBCGPRibbonBar如何更改默认字体? 怎么在一个程序里同时打开两个串口 如何更新正在使用得文件 高分求一个HTTP下载的程序代码 我的vc2002无法调出设置控件的对话框了。怎么办? VC中怎么多人协同编写程序 请问不同打印机器大小不同的问题 利用HOOK抓取对话框内容的问题 我的软件:个人理财之股市风云出来了,现在开始赠送 初学者送分来了!我的提问内容怎么变成了别的贴子了?版主请密切关注! recvfrom的参数buf为什么是char FAR *型的 求救!如何用VC实现计算串口误码率
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;
}在回调函数中插入的。今天上午我也发现这个问题了,修改了回调函数,但是还是不能显示
{//每次只能读出一行数据
CString title;
title.Format(_T("%s"),CStringW(*pValue));//解决乱码问题
g_pTree->InsertItem(title,hCurItem,TVI_SORT);
//上面一句应该怎么改?
g_nitemCount++;
return 0;
}
在回调函数中插入的。今天上午我也发现这个问题了,修改了回调函数,但是还是不能显示
LPCTSTR lpszItem,
HTREEITEM hParent = TVI_ROOT,
HTREEITEM hInsertAfter = TVI_LAST
);g_pTree->InsertItem(title,hCurItem,TVI_SORT); 这里的第二个参数, 直接决定了你插入的位置, 这个句柄从哪里来的, 怎么赋值的, 是否是你想要的父节点.
不上全部代码, 不能帮你.
你的问题应该就是这个hCurItem有错, 总指向了根节点.
下面是初始化函数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;
{//每次只能读出一行数据 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;
}
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(' ');