📄 cooltreectrl.cpp
字号:
// CoolTreeCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "CodeManager.h"
#include "CoolTreeCtrl.h"
#include "MainFrm.h"
#include "CodeManagerDoc.h"
#include "CodeManagerView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCoolTreeCtrl
CCoolTreeCtrl::CCoolTreeCtrl()
{
InitImageList();
}
CCoolTreeCtrl::~CCoolTreeCtrl()
{
}
BEGIN_MESSAGE_MAP(CCoolTreeCtrl, CTreeCtrl)
//{{AFX_MSG_MAP(CCoolTreeCtrl)
ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
ON_NOTIFY_REFLECT(TVN_ITEMEXPANDED, OnItemexpanded)
ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
ON_WM_CONTEXTMENU()
ON_COMMAND(ID_NEWTITLE, OnNewtitle)
ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
ON_COMMAND(ID_EDITTITLE, OnEdittitle)
ON_NOTIFY_REFLECT(TVN_ENDLABELEDIT, OnEndlabeledit)
ON_COMMAND(ID_NEWCHILDTITLE, OnNewchildtitle)
ON_NOTIFY_REFLECT(TVN_SELCHANGING, OnSelchanging)
ON_COMMAND(ID_DELETETITLE, OnDeletetitle)
ON_COMMAND(ID_FILE_FILEIMPORT, OnFileFileimport)
ON_COMMAND(ID_FILE_DIRIMPORT, OnFileDirimport)
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCoolTreeCtrl message handlers
void CCoolTreeCtrl::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
// MessageBox("double click");
*pResult = 0;
}
void CCoolTreeCtrl::OnItemexpanded(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
TVITEM item = pNMTreeView->itemNew;
if(item.hItem == GetRootItem())
return;
HTREEITEM hChild = GetChildItem(item.hItem);
while(hChild)
{
if(!ItemHasChildren(hChild))
{
CMainFrame* pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd();
pFrame->AddSubDir(hChild);
}
hChild = GetNextItem(hChild,TVGN_NEXT);
}
*pResult = 0;
}
void CCoolTreeCtrl::OnRclick(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
// MessageBox("asdfdfhfj");
SendMessage(WM_CONTEXTMENU, (WPARAM) m_hWnd, GetMessagePos());
*pResult = 0;
}
void CCoolTreeCtrl::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler code here
CPoint tp = point;
if (point.x == -1 && point.y == -1)
tp = (CPoint) GetMessagePos();
ScreenToClient(&tp);
UINT uFlags;
HTREEITEM htItem;
htItem = HitTest(tp, &uFlags);
if( htItem == NULL )
return;
SelectItem(htItem);
// CString str = GetItemText(htItem);
CMenu menuPopup;
menuPopup.LoadMenu(IDR_RIGHTMENU);
// menuPopup.TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this);
CMenu* pPopup = menuPopup.GetSubMenu(0);
pPopup->TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this);
/*if(menuPopup.CreatePopupMenu())
{
// menuPopup.LoadMenu(IDR_RIGHTMENU);
menuPopup.AppendMenu(MF_STRING, ID_NEWTITLE, "新增标题(&A)");
menuPopup.AppendMenu(MF_STRING, ID_NEWCHILDTITLE, "新增子标题(&S)");
menuPopup.AppendMenu(MF_STRING, ID_EDITTITLE, "编辑当前标题(&A)");
menuPopup.AppendMenu(MF_STRING, ID_DELETETITLE, "删除当前标题(&A)");
menuPopup.AppendMenu(MF_SEPARATOR);
menuPopup.AppendMenu(MF_STRING, ID_EXPORT, "导出...");
menuPopup.TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this);
}*/
}
void CCoolTreeCtrl::OnNewtitle()
{
// TODO: Add your command handler code here
// MessageBox("new title");
HTREEITEM hs, hp, hc;
hs = GetSelectedItem();
hp = GetParentItem(hs);
/* TVINSERTSTRUCT tvInsert;
tvInsert.hParent = hp;
tvInsert.hInsertAfter = TVI_LAST;
tvInsert.item.mask = TVIF_TEXT;
tvInsert.item.pszText = _T("");
InsertItem(&tvInsert);*/
CString str = GetItemText(hp), str1 = GetItemText(hs);
hCurrentItem = InsertItem("", hp);
SetItemImage(hCurrentItem, 6, 6);
/* ASSERT(m_hInsertItem!=NULL);*/
m_dbType = 1;
EditLabel(hCurrentItem);
}
BOOL CCoolTreeCtrl::OnAmbientProperty(COleControlSite* pSite, DISPID dispid, VARIANT* pvar)
{
// TODO: Add your specialized code here and/or call the base class
return CTreeCtrl::OnAmbientProperty(pSite, dispid, pvar);
}
void CCoolTreeCtrl::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
CMainFrame *pFrame = (CMainFrame *)AfxGetApp()->GetMainWnd();
CCodeManagerView *EditView;
HTREEITEM hs = GetSelectedItem();
// SetItemImage(hs,1,true );
CString strvalue = "select * from CodeTable where CodeID = ", strdata;
long lvalue = GetItemData(hs);
strdata.Format("%ld", lvalue);
strvalue = strvalue + "" + strdata +"";
pFrame->m_DbObject.GetValue(strvalue);
_variant_t vcount;
vcount = pFrame->m_DbObject.m_pRecordset->GetCollect("IsDir");
long bl = (long)vcount;
/* CString str;
str = (LPCTSTR)(_bstr_t)vcount;
MessageBox(str);*/
// pFrame->m_DbObject.m_pRecordset->
// if(!bl)
{
try
{
long nSize = pFrame->m_DbObject.m_pRecordset->GetFields()->GetItem("CodeData")->ActualSize;
if(nSize > 0)
{
_variant_t varBLOB;
varBLOB = pFrame->m_DbObject.m_pRecordset->GetFields()->GetItem("CodeData")->GetChunk(nSize);
if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{
if(BYTE *pBuffer = new BYTE [nSize+1]) ///重新申请必要的存储空间
{
char *pBuf = NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
memcpy(pBuffer,pBuf,nSize); ///复制数据到缓冲区m_pBMPBuffer
SafeArrayUnaccessData (varBLOB.parray);
// int nSize = lDataSize;
CString str;
str.Format("%s", pBuf);
//strcpy(str,pBuffer);
EditView = (CCodeManagerView *)pFrame->GetActiveView();
EditView->LoadText(str);
EditView->SelectLanguage(_CPP);
delete [] pBuffer;
pBuf=0;
}
}
}
else
{
CString str;
EditView = (CCodeManagerView *)pFrame->GetActiveView();
EditView->LoadText(str);
// EditView->SelectLanguage(_CPP);
}
}
catch (_com_error e) {
}
}
*pResult = 0;
}
void CCoolTreeCtrl::OnEdittitle()
{
// TODO: Add your command handler code here
hCurrentItem = GetSelectedItem();
m_dbType = 0;
EditLabel(hCurrentItem);
}
void CCoolTreeCtrl::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult)
{
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
// TODO: Add your control notification handler code here
CString strName;
GetEditControl()->GetWindowText(strName);
// HTREEITEM hs = GetSelectedItem();
SetItemText(hCurrentItem, strName);
if(!ItemHasChildren(hCurrentItem))
SetMyItemImage(hCurrentItem, strName);
/*数据库更新代码*/
CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd();
if(m_dbType == 0)//编辑当前标题
{
CString strvalue = "select * from CodeTable where CodeID = ", strdata;
long lvalue = GetItemData(hCurrentItem);
strdata.Format("%ld", lvalue);
strvalue = strvalue + "" + strdata +"";
pFrame->m_DbObject.GetValue(strvalue);
CString dbstr = "CodeName";
pFrame->m_DbObject.UpdataRecord(&dbstr, &strName, 1);
}
else if(m_dbType == 1 || m_dbType ==2)//新增标题
{
HTREEITEM hp = GetParentItem(hCurrentItem);
CString strParent;
if(hp != NULL)
{
long lvalue = GetItemData(hp);
strParent.Format("%ld", lvalue);
}
pFrame->m_DbObject.AddRecord();
pFrame->m_DbObject.SetData("CodeName", strName);
pFrame->m_DbObject.SetData("CollectTime", "2005-7-29");
if(hp != NULL)
pFrame->m_DbObject.SetData("ParentID", strParent);
pFrame->m_DbObject.Update();
_variant_t vtemp;
vtemp = pFrame->m_DbObject.m_pRecordset->GetCollect("CodeID");
SetItemData(hCurrentItem, long(vtemp));
if(m_dbType == 2)
{
SetItemImage(hp, 0, 0);
CString strvalue = "select * from CodeTable where CodeID = ", strdata;
long lvalue = GetItemData(hp);
strdata.Format("%ld", lvalue);
strvalue = strvalue + "" + strdata +"";
pFrame->m_DbObject.GetValue(strvalue);
pFrame->m_DbObject.SetData("IsDir", "1");
pFrame->m_DbObject.Update();
}
}
/* else if(m_dbType == 2)//新增子标题
{
HTREEITEM hp = GetParentItem(hCurrentItem);
long lvalue = GetItemData(hp);
CString strParent;
strParent.Format("%ld", lvalue);
pFrame->m_DbObject.AddRecord();
pFrame->m_DbObject.SetData("CodeName", strName);
pFrame->m_DbObject.SetData("CollectTime", "2005-7-29");
pFrame->m_DbObject.SetData("ParentID", strParent);
pFrame->m_DbObject.Updata();
}*/
*pResult = 0;
}
void CCoolTreeCtrl::OnNewchildtitle()
{
// TODO: Add your command handler code here
HTREEITEM hp;
hp = GetSelectedItem();
hCurrentItem = InsertItem("", hp);
SetItemImage(hCurrentItem, 6, 6);
Expand(hp, TVE_EXPAND);
m_dbType = 2;
EditLabel(hCurrentItem);
}
void CCoolTreeCtrl::OnSelchanging(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd();
if(m_IsDbType)
{
CCodeManagerView *EditView = (CCodeManagerView *)pFrame->GetActiveView();
CRichEditCtrl &edit = EditView->GetRichEditCtrl();
if(edit.GetModify())
{
if(MessageBox("文件已修改!是否保存修改?", "保存", MB_ICONQUESTION|MB_YESNO) == IDYES)
{
CString strText;
edit.GetWindowText(strText);
BYTE *pBuf = (BYTE*)strText.GetBuffer(strText.GetLength());
CString strvalue = "select * from CodeTable where CodeID = ", strdata;
long lvalue = GetItemData(GetSelectedItem());
strdata.Format("%ld", lvalue);
strvalue = strvalue + "" + strdata +"";
pFrame->m_DbObject.GetValue(strvalue);
pFrame->m_DbObject.SetDataChunk(pBuf);
pFrame->m_DbObject.Update();
strText.ReleaseBuffer();
}
edit.SetModify(FALSE);
}
}
*pResult = 0;
}
void CCoolTreeCtrl::OnDeletetitle()
{
// TODO: Add your command handler code here
if(MessageBox("此操作将会删除该项下所有文件,是否继续?", "删除", MB_ICONQUESTION|MB_YESNO) == IDYES)
{
HTREEITEM hs = GetSelectedItem();
Expand(hs, TVE_EXPAND);
DeleteChildItem(hs);//删除其下所有子节点
DeleteDbItem(hs);//删除其数据库中的记录;
//如果父其下已无子节点,则改变父节点为文件
HTREEITEM hp = GetParentItem(hs);
DeleteItem(hs);
if((hp != NULL) && (!ItemHasChildren(hp)))
{
CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd();
CString strvalue = "select * from CodeTable where CodeID = ", strdata;
long lvalue = GetItemData(hp);
strdata.Format("%ld", lvalue);
strvalue = strvalue + "" + strdata +"";
pFrame->m_DbObject.GetValue(strvalue);
long ldir = (long)pFrame->m_DbObject.m_pRecordset->GetCollect("IsDir");
if(ldir)
{
pFrame->m_DbObject.SetData("IsDir", "0");
pFrame->m_DbObject.Update();
CString itemStr = GetItemText(hp);
SetMyItemImage(hp, itemStr);
}
}
MessageBox("成功删除记录!","源码利器");
}
}
int CCoolTreeCtrl::DeleteChildItem(HTREEITEM hp)
{
HTREEITEM hChild = GetChildItem(hp), htemp;
while(hChild)
{
Expand(hChild, TVE_EXPAND);
int lv = GetItemData(hChild);
if(ItemHasChildren(hChild))
{
DeleteChildItem(hChild);
// DeleteItem(hChild);
}
// else
// DeleteItem(hChild);
htemp = hChild;
hChild = GetNextItem(hChild, TVGN_NEXT);
DeleteDbItem(htemp);
DeleteItem(htemp);
}
/* HTREEITEM hChild = m_wndTree.GetChildItem(NULL);
s = m_wndTree.GetItemText(hChild);
while(hChild)
{
AddSubDir(hChild);
HTREEITEM hhChild = m_wndTree.GetChildItem(hChild);
while(hhChild)
{
AddSubDir(hhChild);
hhChild = m_wndTree.GetNextItem(hhChild,TVGN_NEXT);
}
hChild = m_wndTree.GetNextItem(hChild,TVGN_NEXT);
s = m_wndTree.GetItemText(hChild);
}*/
return 0;
}
int CCoolTreeCtrl::DeleteDbItem(HTREEITEM htree)
{
CString strvalue = "delete from CodeTable where CodeID = ", strdata;
long lvalue = GetItemData(htree);
strdata.Format("%ld", lvalue);
strvalue = strvalue + "" + strdata +"";
CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd();
pFrame->m_DbObject.DeleteValue(strvalue);
// MessageBox("该记录已被删除");
// DeleteItem(htree);
return 0;
}
void CCoolTreeCtrl::OnFileFileimport()
{
// TODO: Add your command handler code here
CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd();
// pFrame->OnFileFileimport();
pFrame->ImportFile();
// MessageBox("asdgdfhg");
}
int CCoolTreeCtrl::InitImageList()
{
m_TreeImage.Create(16,16,ILC_COLOR16, 0, 0);
HICON hIcon = AfxGetApp()->LoadIcon(IDI_CDIR);
m_TreeImage.Add(hIcon);
hIcon = AfxGetApp()->LoadIcon(IDI_SC);
m_TreeImage.Add(hIcon);
hIcon = AfxGetApp()->LoadIcon(IDI_SCPP);
m_TreeImage.Add(hIcon);
hIcon = AfxGetApp()->LoadIcon(IDI_SDSW);
m_TreeImage.Add(hIcon);
hIcon = AfxGetApp()->LoadIcon(IDI_SH);
m_TreeImage.Add(hIcon);
hIcon = AfxGetApp()->LoadIcon(IDI_SCR);
m_TreeImage.Add(hIcon);
hIcon = AfxGetApp()->LoadIcon(IDI_OTHER);
m_TreeImage.Add(hIcon);
return 1;
}
int CCoolTreeCtrl::SetMyItemImage(HTREEITEM htItem, CString strName)
{
int r = JudgeType(strName);
if(r == -1 || r > 5)
SetItemImage(htItem, 6, 6);
else
{
if(r == 4 || r == 5)
SetItemImage(htItem, 5, 5);
else
SetItemImage(htItem, r + 1, r + 1);
}
return 0;
}
int CCoolTreeCtrl::JudgeType(CString& CodeName)
{ //用引用参数以加快速度
/* if(CodeName.GetLength() == 0)
return -1;
char *pt = new char[CodeName.GetLength() + 1], *p;
p = pt;
int index, i;
strcpy(p, CodeName);*/
int index, i;
char *p = CodeName.GetBuffer(CodeName.GetLength());
p += CodeName.GetLength() - 1;
for(index = CodeName.GetLength() - 1; index >=0; index--, p--)
if(*p == '.')
break;
if(index < 0)
{
// delete []pt;
return -1;
}
for(i = 0; i < 8; i++)
{
if(FileExp[i] == p)
{
// delete []pt;
return i;
}
}
// delete []pt;
return -1;
}
int CCoolTreeCtrl::SetMyImageList()
{
SetImageList(&m_TreeImage, TVSIL_NORMAL);
return 0;
}
void CCoolTreeCtrl::OnFileDirimport()
{
// TODO: Add your command handler code here
CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd();
pFrame->ImportDir();
}
void CCoolTreeCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd();
if(pFrame->m_bdType == TRUE)
m_IsDbType = TRUE;
else
m_IsDbType = FALSE;
pFrame->m_bdType = TRUE;
CTreeCtrl::OnLButtonDown(nFlags, point);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -