支持数据项查找功能的CTreeCtrl类(2)
item= GetNextSiblingItem(GetParentItem(item));
}
}
else
{
item = GetNextSiblingItem(item);
if(item==NULL)
return NULL;
}
}
return item;
}
四、示例程序
我们创建一个对话框程序。
(1) 通过“FILE->NEW->PROJECTS->MFC AppWizard(EXE)”建立名为MyTreeCtr的
工程,在建立过程中选择基于对话框(Dialog based)的应用;
(2) 将对话框中的默认按钮控件“确定”删除,并将所有对话框&&属性中的Language域设置为Chinese(P.R.C.),以使应用程序支持中文;在对话框窗口中添加树控制对象(TREE CONTROL),并设置一个按钮“新建数据项”,其对应标识分别如下:
控制名称 标题名称 标识符号 对应成员变量或&&函数
树控制 IDC_MYTREE CTreeCtrl m_ctrlTree
按钮 新建数据项 IDC_ NEWITEM OnNewitem()
树控制项目 HTREEITEM m_hInsertItem
(3) 处理树控制的TVN _BEGINLABELEDIT和TVN _ENDLABELEDIT消息,CMyTreeCtrlDlg增加OnBeginlabeleditMytree和OnEndlabeleditMytree两个处理&&函数。
void CMyTreeCtrlDlg::OnBeginlabeleditMytree(NMHDR* pNMHDR, LRESULT* pResult)
{
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
// TOD Add your control notification handler code here
m_ctrlTree.GetEditControl()->LimitText(16);
*pResult = 0;
}
void CMyTreeCtrlDlg::OnEndlabeleditMytree(NMHDR* pNMHDR, LRESULT* pResult)
{
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
// TOD Add your control notification handler code here
CString strName;
m_ctrlTree.GetEditControl()->GetWindowText(strName);
if(strName.IsEmpty())
{
AfxMessageBox(_T("数据项名称不能为空,请重新输入!"));
CEdit* pEdit = m_ctrlTree.EditLabel(m_hInsertItem);
ASSERT(pEdit != NULL);
return;
}
HTREEITEM hRoot = m_ctrlTree.GetRootItem();
HTREEITEM hFind = m_ctrlTree.FindItem(hRoot,strName);
if(hFind==NULL)
{
char msg[64]={0};
sprintf(msg,"新添加数据项名称 %s ,确定吗?",strName);
if(MessageBox(msg,_T("提示"),MB_OKCANCEL) == IDOK)
*pResult = TRUE;
else
m_ctrlTree.DeleteItem(m_hInsertItem);
}
else
{
AfxMessageBox(_T("该数据项已存在,请重新输入!"));
CEdit* pEdit = m_ctrlTree.EditLabel(m_hInsertItem);
ASSERT(pEdit != NULL);
*pResult = 0;
}
}
五、结束语
CTreeCtrlEx类的FindItem&&函数实现数据项查找的功能。测试程序在Win98+VC6.0环境下测试通过。
- 上一篇:VC程序设计中可序列化类的实现
- 下一篇:vc中如何使用设备描述表