需求:点击左侧树,右侧根据点击的对象显示对应的窗口,如果选择叶子节点的话,右侧直接显示叶子所在位置
.h文件里
public: CTreeCtrl m_tabTree; //声明这个树
protected CDevInfo *m_devInfo; //声明右侧要显示的dialog类型的窗口
初始化树,给树添加数据
HTREEITEM hRoot;
hRoot = m_tabTree.InsertItem(getStringTab(IDS_ROOT_MOBILE_INFO), TVI_ROOT, TVI_LAST);
m_tabTree.InsertItem(getStringTab(IDS_ITEM_DEV_PARM), hRoot, TVI_LAST);
m_tabTree.InsertItem(getStringTab(IDS_ITEM_SECURITY_PARM), hRoot, TVI_LAST);
m_tabTree.InsertItem(getStringTab(IDS_ITEM_DEV_MANAGE), hRoot, TVI_LAST);
m_tabTree.Expand(hRoot, TVE_EXPAND);
初始化右边的窗口
CRect rc;
int dlg_width;
int dlg_height;
GetClientRect(rc);
dlg_width = rc.right - 500- 20; //自己调的位置
dlg_height = rc.bottom - 10; //自己调的位置
if (m_devInfo == NULL)
{
m_devInfo = new CDevInfo(this);
m_devInfo->Create(IDD_DEV_INFO_CFG,this);
}
m_devInfo->SetWindowPos(NULL,165,20,dlg_width,dlg_height,SWP_NOACTIVATE);//设置窗口的位置
重写树的 OnNMClickTree方法,**为什么不用OnTvnSelchangedTree**,因为这个方法只有在树的节点改变才会被调用,就是当左侧选中要看的树节点后,在窗口处滚动屏幕,把目标滚出视野,再去点击左侧的同一个树节点,界面上会没有反应。
void CCarCpsDlg::OnNMClickTree(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
TRACE(" OnNMClickTree \r\n");
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
*pResult = 0;
CString itemname;
CString parentname;
CPoint pt;
GetCursorPos(&pt);
m_tabTree.ScreenToClient(&pt);
UINT uFlags;
HTREEITEM hitem = m_tabTree.HitTest(pt, &uFlags); //这里获取所点击的项必须用这个方法,否则达不到我们想要的效果
HTREEITEM parentitem = m_tabTree.GetParentItem(hitem);
parentname = m_tabTree.GetItemText(parentitem);
itemname = m_tabTree.GetItemText(hitem);
if (itemname == getStringTab(IDS_ROOT_MOBILE_INFO)
) {
ShowDlg(itemname, _T(""));
return;
}
if (parentname == getStringTab(IDS_ROOT_MOBILE_INFO)
) {
ShowDlg(parentname, itemname);
}
}
void CCarCpsDlg::ShowDlg(CString Name, CString ChildName) {
if (Name == getStringTab(IDS_ROOT_MOBILE_INFO))
{
m_devInfo->ShowWindow(TRUE);
m_devInfo->ShowSelectTab(ChildName);
}
}
最后去CDevInfo里面实现一下ShowSelectTab方法
void CDevInfo::ShowSelectTab(CString childName) {
SCROLLINFO scrollinfo;
GetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
RECT rectCtr;
if (childName == getStringTab(IDS_ITEM_DEV_PARM))
{
ScrollWindow(0, (scrollinfo.nPos - scrollinfo.nMin) * 10 - 300);//这个300是自己调的值,正好使屏幕滚动到指定位置
scrollinfo.nPos = scrollinfo.nMin +30 ;
SetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
}
}
至此,就实现了点击树,能显示对应的界面并定位到对应的位置。