📄 mytreectrl.cpp
字号:
// MytreeCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "../resource.h"
#include "MytreeCtrl.h"
#include "IPicture.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMytreeCtrl
/*CMytreeCtrl::~CMytreeCtrl()
{
HTREEITEM hitem[50] ;
HTREEITEM hMitem ;
int num = GetCount() ;
hitem[0] = GetFirstVisibleItem() ;
int i = 1 ;
BOOL bChild ;
while (i<num)
{
bChild = ItemHasChildren(hitem[i-1]) ;
if (bChild)
{
hitem[i] = GetChildItem(hitem[i-1]) ;
i++ ;
}
else
{
hitem[i] = GetNextSiblingItem(hitem[i-1]) ;
hMitem = hitem[i-1]
while (hitem[i] ==NULL)
{
hMitem = GetParentItem(hMitem) ;
hitem[i] = GetNextSiblingItem(hMitem) ;
}
i++ ;
}
}
for (i = 0;i<num;i++)
{
DWORD lPtr ;
lPtr = GetItemData(hitem[i]) ;
delete (char*)lPtr ;
}
}*/
BEGIN_MESSAGE_MAP(CMytreeCtrl, CTreeCtrl)
//{{AFX_MSG_MAP(CMytreeCtrl)
ON_WM_RBUTTONDOWN()
ON_COMMAND(ID_CONTEXTMENU_ADD, OnContextmenuAdd)
ON_COMMAND(ID_CONTEXTMENU_RENAME, OnContextmenuRename)
ON_WM_LBUTTONDOWN()
ON_COMMAND(ID_CONTEXTMENU_DELETE, OnContextmenuDelete)
ON_WM_CLOSE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMytreeCtrl message handlers
BOOL CMytreeCtrl::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
BOOL bHandledMsg = FALSE;
switch (pMsg->message)
{
case WM_KEYDOWN:
{
switch (pMsg->wParam)
{
case VK_ESCAPE:
case VK_RETURN:
if (::GetKeyState(VK_CONTROL) & 0x8000)
{
break;
}
if (GetEditControl())
{
::TranslateMessage(pMsg);
::DispatchMessage(pMsg);
bHandledMsg = TRUE;
}
break;
default: break;
} // switch (pMsg->wParam)
} // WM_KEYDOWN
break;
default: break;
} // switch (pMsg->message)
// continue normal translation and dispatching
return (bHandledMsg ? TRUE : CTreeCtrl::PreTranslateMessage(pMsg));
}
void CMytreeCtrl::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
SetFocus();
ClientToScreen(&point);
HTREEITEM hCurrSel = GetSelectedItem();
CPoint pt(0, 0);
::GetCursorPos(&pt);
ScreenToClient (&pt);
HTREEITEM hNewSel = HitTest(pt, &nFlags);
if (NULL == hNewSel)
{
SelectItem(NULL);
}
else if (hCurrSel != hNewSel)
{
SelectItem(hNewSel);
SetFocus();
}
CMenu Menu;
if (Menu.LoadMenu(IDM_CONTEXT_MENU))
{
CMenu* pSubMenu = Menu.GetSubMenu(0);
if (pSubMenu!=NULL)
{
pSubMenu->TrackPopupMenu(
TPM_LEFTALIGN | TPM_RIGHTBUTTON,
point.x, point.y, this);
}
}
}
void CMytreeCtrl::OnContextmenuAdd()
{
// TODO: Add your command handler code here
CMapAddDlg dlg ;
HTREEITEM hitemParent = GetSelectedItem();
HTREEITEM hTree[50] ;
HTREEITEM hMitem,hitem ;
if (dlg.DoModal()==IDOK)
{
int num = GetCount() ;
hTree[0] = GetFirstVisibleItem() ;
int i = 1 ;
BOOL bChild ;
while (i<num)
{
bChild = ItemHasChildren(hTree[i-1]) ;
if(bChild)
{
hTree[i] = GetChildItem(hTree[i-1]) ;
i++ ;
}
else
{
hTree[i] = GetNextSiblingItem(hTree[i-1]) ;
hMitem = hTree[i-1] ;
while (hTree[i] == NULL)
{
hMitem = GetParentItem(hMitem) ;
hTree[i] = GetNextSiblingItem(hMitem) ;
}
i++ ;
}
}
for(i=0;i<num;i++)
{
CString strAddr = (char*)GetItemData(hTree[i]) ;
// CString strName = GetItemText(hTree[i]) ;
if(dlg.m_FileAddr == strAddr)// || dlg.m_FileName == strName)
{
AfxMessageBox(afx_box_2);
return ;
}
}
hitem = InsertItem(dlg.m_FileName, hitemParent);
char* str = NULL ;
int m_length = dlg.m_FileAddr.GetLength() ;
str = dlg.m_FileAddr.GetBuffer(m_length) ;
char *pPass = new char[200] ;
memcpy(pPass,str,200) ;
SetItemData(hitem,(DWORD)pPass) ;
SelectItem(hitem) ;
}
}
void CMytreeCtrl::OnContextmenuRename()
{
// TODO: Add your command handler code here
HTREEITEM hitem = GetSelectedItem();
HTREEITEM hParent = GetParentItem(hitem) ;
if (hitem == NULL)
return ;
CRenameDlg dlg ;
if (dlg.DoModal()==IDOK)
{
// if (DoesItemExist(hParent, dlg.m_Name))
// {
// AfxMessageBox(afx_box_1) ;
// return ;
// }
CString str = dlg.m_Name ;
SetItemText(hitem,str) ;
}
}
void CMytreeCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
SetFocus();
ClientToScreen(&point);
CPoint pt(0, 0);
::GetCursorPos(&pt);
ScreenToClient (&pt);
HTREEITEM hNewSel = HitTest(pt, &nFlags);
if (NULL == hNewSel)
{
SelectItem(NULL);
}
else
{
DWORD fileaddr = GetItemData(hNewSel);
SetItemState(hNewSel,NULL,TVIS_BOLD);
SelectItem(hNewSel);
HTREEITEM hChild = GetChildItem(hNewSel);
if(hChild)
{
EnsureVisible(hChild);
}
if (fileaddr == NULL)
{
// AfxMessageBox(afx_box_7);
return ;
}
GetParent()->SendMessage(WM_MY_SHOW,0,fileaddr) ;
}
}
void CMytreeCtrl::OnContextmenuDelete()
{
// TODO: Add your command handler code here
DWORD pPtr ;
HTREEITEM hitemD = GetSelectedItem() ;
HTREEITEM hitem,hitemM;
if (hitemD == NULL)
return ;
////////////////////////////////
BOOL bChild ;
bChild = ItemHasChildren(hitemD) ;
if(bChild)
{
hitem = GetChildItem(hitemD) ;
while (hitem != hitemD)
{
bChild = ItemHasChildren(hitem) ;
if(bChild)
{
hitem = GetChildItem(hitem) ;
}
else
{
pPtr = GetItemData(hitem) ;
GetParent()->SendMessage(WM_MY_MAPDELETE,0,pPtr) ;
delete (char*)pPtr ;
hitemM = hitem ;
hitem = GetNextSiblingItem(hitem) ;
while (hitem == NULL)
{
hitem = GetParentItem(hitemM) ;
}
DeleteItem(hitemM) ;
}
}
}
pPtr = GetItemData(hitemD) ;
DeleteItem(hitemD) ;
GetParent()->SendMessage(WM_MY_MAPDELETE,0,pPtr) ;
delete (char*)pPtr ;
}
void CMytreeCtrl::OnClose()
{
// TODO: Add your message handler code here and/or call default
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -