📄 dlgtreectrl.cpp
字号:
// DlgTreeCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "Server.h"
#include "DlgTreeCtrl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "ServerView.h"
/////////////////////////////////////////////////////////////////////////////
// CDlgTreeCtrl
CDlgTreeCtrl::CDlgTreeCtrl()
{
m_bUpdate = FALSE;
m_contextMenu.LoadMenu(IDR_TREEDLG_MENU);
}
CDlgTreeCtrl::~CDlgTreeCtrl()
{
}
BEGIN_MESSAGE_MAP(CDlgTreeCtrl, CTreeCtrl)
//{{AFX_MSG_MAP(CDlgTreeCtrl)
ON_NOTIFY_REFLECT(TVN_BEGINLABELEDIT, OnBeginlabeledit)
ON_WM_RBUTTONDOWN()
ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
ON_NOTIFY_REFLECT(TVN_ENDLABELEDIT, OnEndlabeledit)
ON_COMMAND(IDM_TREE_DELETE, OnTreeDeleteItem)
ON_COMMAND(IDM_TREE_NEW_REGION, OnTreeNewRegion)
ON_COMMAND(IDM_TREE_RENAME, OnTreeRename)
//}}AFX_MSG_MAP
ON_COMMAND_RANGE(WM_USER, WM_USER+100, OnChangeRegion)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDlgTreeCtrl message handlers
void CDlgTreeCtrl::OnRButtonDown(UINT nFlags, CPoint point)
{
SetFocus();
HTREEITEM hCurrSel = GetSelectedItem();
HTREEITEM hNewSel = HitTest(point, &nFlags);
if(hNewSel == NULL)
{
SelectItem(NULL);
}
else
{
if((hCurrSel != hNewSel) && (TVHT_ONITEM & nFlags))
{
SelectItem(hNewSel);
}
if(TVHT_ONITEM & nFlags)
{
CMenu* pSubMenu = m_contextMenu.GetSubMenu(0);
CMenu* pPopMenu = pSubMenu->GetSubMenu(3);
int nCount = pPopMenu->GetMenuItemCount();
for(int i = 0; i < nCount; i++)
{
pPopMenu->DeleteMenu(0, MF_BYPOSITION);
}
HTREEITEM hChildItem = GetChildItem(GetRootItem());
if(hNewSel != GetRootItem())
{
i = 0;
if(!ItemHasChildren(hNewSel) && GetParentItem(hNewSel) != GetRootItem())
hNewSel = GetParentItem(hNewSel);
while(hChildItem)
{
if(hChildItem == hNewSel)
{
hChildItem = GetNextSiblingItem(hChildItem);
continue;
}
pPopMenu->AppendMenu(MF_STRING, WM_USER+i, GetItemText(hChildItem));
i++;
hChildItem = GetNextSiblingItem(hChildItem);
}
}
ClientToScreen(&point);
pSubMenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
point.x, point.y, this);
}
}
CTreeCtrl::OnRButtonDown(nFlags, point);
}
void CDlgTreeCtrl::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
static BOOL bSelectedRoot = TRUE;
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
HTREEITEM hRootItem = GetRootItem();
CServerView * pServerView = (CServerView*)((CMainFrame*)AfxGetMainWnd())->GetActiveView();
*pResult = 1;
CPoint point;
CRect rect;
GetClientRect(&rect);
::GetCursorPos(&point);
ScreenToClient(&point);
if(rect.PtInRect(point))
pServerView->m_bUpdate = FALSE;
if(pServerView->m_bUpdate)
{
pServerView->m_bUpdate = FALSE;
return;
}
m_bUpdate = TRUE;
if(!ItemHasChildren(pNMTreeView->itemNew.hItem))
{
if(bSelectedRoot)
{
pServerView->SetSelectState(GetItemText(pNMTreeView->itemNew.hItem));
}
else
{
if(!ItemHasChildren(pNMTreeView->itemOld.hItem))
{
if(GetParentItem(pNMTreeView->itemOld.hItem) == GetParentItem(pNMTreeView->itemNew.hItem))
{
pServerView->SetSelectState(GetItemText(pNMTreeView->itemNew.hItem));
}
else
{
pServerView->AddViewItem(GetItemText( GetParentItem(pNMTreeView->itemNew.hItem) ) );
pServerView->SetSelectState(GetItemText(pNMTreeView->itemNew.hItem));
}
}
else
{
if(pNMTreeView->itemOld.hItem == GetParentItem(pNMTreeView->itemNew.hItem))
{
pServerView->SetSelectState(GetItemText(pNMTreeView->itemNew.hItem));
}
else
{
pServerView->AddViewItem(GetItemText(GetParentItem(pNMTreeView->itemNew.hItem)));
pServerView->SetSelectState(GetItemText(pNMTreeView->itemNew.hItem));
}
}
}
}
else
{
if(pNMTreeView->itemNew.hItem == hRootItem)
{
pServerView->AddViewItem(NULL);
//pServerView->SetSelectState(NULL);
bSelectedRoot = TRUE;
}
else
{
if(!ItemHasChildren(pNMTreeView->itemOld.hItem))
{
if(GetParentItem(pNMTreeView->itemOld.hItem) == pNMTreeView->itemNew.hItem)
{
if(bSelectedRoot)
pServerView->AddViewItem(GetItemText(pNMTreeView->itemNew.hItem));
//pServerView->SetSelectState(NULL);
}
else
{
pServerView->AddViewItem(GetItemText(pNMTreeView->itemNew.hItem));
//pServerView->SetSelectState(NULL);
}
}
else
{
pServerView->AddViewItem(GetItemText(pNMTreeView->itemNew.hItem));
//pServerView->SetSelectState(NULL);
}
bSelectedRoot = FALSE;
}
}
}
void CDlgTreeCtrl::OnChangeRegion(UINT nID)
{
HTREEITEM hCurrSel = GetSelectedItem();
HTREEITEM hChildItem = GetChildItem(GetRootItem());
CServerView * pServerView = (CServerView*)((CMainFrame*)AfxGetMainWnd())->GetActiveView();
CListCtrl& clc = pServerView->GetListCtrl();
if(!ItemHasChildren(hCurrSel) && GetParentItem(hCurrSel) == GetRootItem())
return;
if(ItemHasChildren(hCurrSel))
{
UINT i = WM_USER;
while(hChildItem)
{
if(hChildItem == hCurrSel)
{
hChildItem = GetNextSiblingItem(hChildItem);
continue;
}
if(i == nID)
break;
i++;
hChildItem = GetNextSiblingItem(hChildItem);
}
CString strNewName(GetItemText(hChildItem));
CString strOldName(GetItemText(hCurrSel));
pServerView->m_pDaoRecord->MoveFirst();
while(!pServerView->m_pDaoRecord->IsEOF())
{
if(pServerView->m_pDaoRecord->m_strRegion == strOldName)
{
pServerView->m_pDaoRecord->Edit();
pServerView->m_pDaoRecord->m_strRegion = strNewName;
pServerView->m_pDaoRecord->Update();
InsertItem( pServerView->m_pDaoRecord->m_strName, 3, 4, hChildItem);
}
pServerView->m_pDaoRecord->MoveNext();
}
clc.DeleteAllItems();
hChildItem = GetChildItem(hCurrSel);
while(hChildItem)
{
hCurrSel = GetNextSiblingItem(hChildItem);
DeleteItem(hChildItem);
hChildItem = hCurrSel;
}
}
else
{
UINT i = WM_USER;
HTREEITEM hCurrSelParent = GetParentItem(hCurrSel);
while(hChildItem)
{
if(hChildItem == hCurrSelParent)
{
hChildItem = GetNextSiblingItem(hChildItem);
continue;
}
if(i == nID)
break;
i++;
hChildItem = GetNextSiblingItem(hChildItem);
}
CString strNewName(GetItemText(hChildItem));
CString strFilter("[计算机名]=\"");
strFilter += GetItemText(hCurrSel);
strFilter += '\"';
if(!pServerView->m_strRegion.IsEmpty())
{
LVFINDINFO info;
info.flags = LVFI_PARTIAL|LVFI_STRING;
info.psz = GetItemText(hCurrSel);
clc.DeleteItem(clc.FindItem(&info));
}
pServerView->m_pDaoRecord->FindFirst(strFilter);
pServerView->m_pDaoRecord->Edit();
pServerView->m_pDaoRecord->m_strRegion = strNewName;
pServerView->m_pDaoRecord->Update();
InsertItem( pServerView->m_pDaoRecord->m_strName, 3, 4, hChildItem);
DeleteItem(hCurrSel);
}
}
void CDlgTreeCtrl::OnTreeDeleteItem()
{
HTREEITEM hCurrSel = GetSelectedItem();
if(ItemHasChildren(hCurrSel) || GetParentItem(hCurrSel) != GetRootItem())
{
CString str("<");
str += GetItemText(hCurrSel);
str += ">不能被删除!";
AfxMessageBox(str);
return;
}
DeleteItem(hCurrSel);
return;
}
void CDlgTreeCtrl::OnTreeRename()
{
HTREEITEM hCurrSel = GetSelectedItem();
if(GetParentItem(hCurrSel) != GetRootItem())
{
CString str("<");
str += GetItemText(hCurrSel);
str += ">不能被更名!";
AfxMessageBox(str);
return;
}
CEdit* pEdit = EditLabel(hCurrSel);
}
void CDlgTreeCtrl::OnTreeNewRegion()
{
HTREEITEM hCurrItem = InsertItem( "请输入名称", 2, 1, GetRootItem());
EditLabel(hCurrItem);
}
void CDlgTreeCtrl::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult)
{
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
HTREEITEM hChildItem = GetChildItem(GetRootItem());
CString strNewName;
GetEditControl()->GetWindowText(strNewName);
if(strNewName.IsEmpty())
{
AfxMessageBox("不能为空!");
EditLabel(pTVDispInfo->item.hItem);
*pResult = 0;
return;
}
while(hChildItem)
{
if(hChildItem == pTVDispInfo->item.hItem)
{
hChildItem = GetNextSiblingItem(hChildItem);
continue;
}
if(GetItemText(hChildItem) == strNewName)
{
AfxMessageBox("名称重复!");
EditLabel(pTVDispInfo->item.hItem);
*pResult = 0;
return ;
}
hChildItem = GetNextSiblingItem(hChildItem);
}
*pResult = 1;
CServerView * pServerView = (CServerView*)((CMainFrame*)AfxGetMainWnd())->GetActiveView();
pServerView->m_pDaoRecord->MoveFirst();
while(!pServerView->m_pDaoRecord->IsEOF())
{
if(pServerView->m_pDaoRecord->m_strRegion == m_strOldName)
{
pServerView->m_pDaoRecord->Edit();
pServerView->m_pDaoRecord->m_strRegion = strNewName;
pServerView->m_pDaoRecord->Update();
}
pServerView->m_pDaoRecord->MoveNext();
}
}
void CDlgTreeCtrl::OnBeginlabeledit(NMHDR* pNMHDR, LRESULT* pResult)
{
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
HTREEITEM hItem = GetRootItem();
if(pTVDispInfo->item.hItem == hItem || GetParentItem(pTVDispInfo->item.hItem) != hItem)
{
*pResult = 1;
return ;
}
m_strOldName = pTVDispInfo->item.pszText;
CEdit * pEdit = GetEditControl();
if(pEdit)
{
pEdit->LimitText(20);
*pResult = 0;
return;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -