?? workspace.cpp
字號(hào):
{
if(strPathName.IsEmpty())//如果strPathName為空,則返回
{ ASSERT(FALSE); return;}
HTREEITEM hTreeItem = m_pTreeCtrl->GetSelectedItem();//得到當(dāng)前結(jié)點(diǎn)信息
CFolder* pFolder = (CFolder*)m_pTreeCtrl->GetItemData(hTreeItem);//獲取當(dāng)前結(jié)點(diǎn)數(shù)據(jù)
if(!pFolder->AddFileName(strPathName))//調(diào)用CFolder中的AddFileName函數(shù)。
return ; //文件沒有增加到m_FileNameArray則返回
TV_INSERTSTRUCT TreeCtrlItem;//定義TreeCtrlItem
TreeCtrlItem.hParent = hTreeItem;//父結(jié)點(diǎn)=hTreeItem
TreeCtrlItem.hInsertAfter = TVI_LAST;//最后一個(gè)結(jié)點(diǎn)
TreeCtrlItem.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE;
//激活上述iImage,iSelectedImage,lParam屬性
int nCount = strPathName.GetLength() - strPathName.ReverseFind('\\')-1;//求得文件庫路徑字符數(shù)
CString strFileName = strPathName.Right(nCount);//獲得文件名稱
TreeCtrlItem.hParent = hTreeItem;//父結(jié)點(diǎn)=hTreeItem
TreeCtrlItem.item.pszText = strFileName.GetBuffer(strFileName.GetLength());//結(jié)點(diǎn)上得到文件名
strFileName.ReleaseBuffer();//釋放GetBuffer
TreeCtrlItem.item.iImage = 2;//選取一個(gè)新建文件圖象
TreeCtrlItem.item.iSelectedImage = 2;//選中該節(jié)點(diǎn)時(shí)的圖象
TreeCtrlItem.item.lParam = (LPARAM)pFolder;
m_pTreeCtrl->InsertItem(&TreeCtrlItem);//插入結(jié)點(diǎn)
m_pTreeCtrl->Expand(hTreeItem, TVE_EXPAND);//擴(kuò)充列表
//AfxGetApp()->OpenDocumentFile(strFileName);
}
void CWorkSpace::OnLButtonUp(UINT nFlags, CPoint point)
{
TCHAR szFullPath[MAX_PATH];
int nSize = ::GetModuleFileName(AfxGetInstanceHandle(), szFullPath, MAX_PATH);//獲得應(yīng)用程序的路徑
if(nSize == 0)
{
Invalidate();
return;
}
CString strPath(szFullPath);
int n = strPath.ReverseFind( '\\' )+1;
strPath = strPath.Left(n);//去掉可執(zhí)行文件名
if(m_hDragItem)//如果拖動(dòng)文件
{
UINT uFlag = 0;
HTREEITEM hTreeItem = m_pTreeCtrl->HitTest(point, &uFlag);//獲取點(diǎn)擊的節(jié)點(diǎn)信息
BOOL bIsFolder = FALSE;//定義bIsFolder
CString strItemText, strDragItemText;//定義strItemText, strDragItemText
BOOL bAddSuccess = TRUE;//定義bAddSuccess
if(hTreeItem && (uFlag & TVHT_ONITEM))
{
CFolder* pFolder = (CFolder*)m_pTreeCtrl->GetItemData(hTreeItem);//獲取結(jié)點(diǎn)Data
if(CanBeDropTargert(hTreeItem, m_hDragItem))//如果是可以拖動(dòng)的目標(biāo)
{ //將被拖動(dòng)的目標(biāo)名稱賦給strDragItemText
strDragItemText = m_pTreeCtrl->GetItemText(m_hDragItem);
//獲取被拖動(dòng)的目標(biāo)結(jié)點(diǎn)Data賦給pDragFolder
CFolder* pDragFolder = (CFolder*)m_pTreeCtrl->GetItemData(m_hDragItem);
TV_INSERTSTRUCT TreeCtrlItem;//定義TreeCtrlItem
if(pDragFolder->IsFolder(strDragItemText))//選中文件夾
{
if(pDragFolder->m_pFather)
pDragFolder->m_pFather->RemoveFolder(pDragFolder, FALSE);
else
RemoveFolder(pDragFolder, FALSE);
pFolder->AddFolder(pDragFolder);//調(diào)用AddFolder函數(shù)在目標(biāo)結(jié)點(diǎn)增加文件夾
TreeCtrlItem.item.iImage = 0;//選取一個(gè)新建文件夾圖象
TreeCtrlItem.item.iSelectedImage = 1;//選中該節(jié)點(diǎn)時(shí)的圖象(為打開的文件夾)
bIsFolder = TRUE;//是文件夾
}
else//選中文件
{ //獲取文件完整路徑
CString strPathName = pDragFolder->FindFullFileName(strDragItemText);//獲取文件完整路徑
if(strPathName.IsEmpty())
{ //如果路徑為空則返回
ASSERT(FALSE);
return;
}
BOOL b = pDragFolder->RemoveFileName(strDragItemText);//刪除文件是否成功
ASSERT(b);
bAddSuccess = pFolder->AddFileName(strPathName);//增加文件是否成功
ASSERT(bAddSuccess);
TreeCtrlItem.item.iImage = 2;//選取一個(gè)新建文件圖象
TreeCtrlItem.item.iSelectedImage = 2;//選中該節(jié)點(diǎn)時(shí)的圖象
}
strItemText = m_pTreeCtrl->GetItemText(hTreeItem);//獲取鼠標(biāo)結(jié)點(diǎn)文件名稱
if(!pFolder->IsFolder(strItemText))//如果不是文件夾
hTreeItem = m_pTreeCtrl->GetParentItem(hTreeItem);//獲取父親結(jié)點(diǎn)信息
TreeCtrlItem.hParent = hTreeItem;
m_pTreeCtrl->DeleteItem(m_hDragItem);
TreeCtrlItem.hInsertAfter = TVI_LAST;//在最后位置插入結(jié)點(diǎn)
//激活上述iImage,iSelectedImage,lParam屬性
TreeCtrlItem.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE;
//得到文件名
TreeCtrlItem.item.pszText = strDragItemText.GetBuffer(strDragItemText.GetLength());
//釋放GetBuffer
strDragItemText.ReleaseBuffer();
TreeCtrlItem.item.lParam = (LPARAM)pFolder;
if(bIsFolder)//如果是文件夾
m_pTreeCtrl->FillItem(pDragFolder, hTreeItem);//填充文件夾下的目錄
else if(bAddSuccess)
m_pTreeCtrl->SelectDropTarget(m_pTreeCtrl->InsertItem(&TreeCtrlItem));
else
ASSERT(FALSE);
m_pTreeCtrl->SortChildren(hTreeItem);
m_pTreeCtrl->Expand(hTreeItem, TVE_EXPAND);//擴(kuò)充列表
::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));//拖動(dòng)時(shí)的箭頭Cursor
}
}
}
m_hDragItem = NULL;//沒有拖動(dòng)文件
CTreeView::OnLButtonUp(nFlags, point);
GetParent()->Invalidate();
}
void CWorkSpace::OnHideWorkSpace()
{
((CMainFrame*)AfxGetMainWnd())->m_wndWorkSpaceBar.ShowWindow(SW_HIDE);
((CMainFrame*)AfxGetMainWnd())->RecalcLayout();
}
void CWorkSpace::OnUpdateWorkspceBar(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
}
void CWorkSpace::OnDelWorkspaceItem()
{
HTREEITEM hCurItem = m_pTreeCtrl->GetSelectedItem();//獲得當(dāng)前結(jié)點(diǎn)信息
if(!hCurItem)//當(dāng)前結(jié)點(diǎn)為空則返回
return;
if(AfxMessageBox(IDS_DEL_IT, MB_YESNO) != IDYES)//彈出“確定刪除”對(duì)話框判斷是否刪除
return;
CFolder* pFolder = (CFolder*)m_pTreeCtrl->GetItemData(hCurItem);//獲取結(jié)點(diǎn)Data
ASSERT(pFolder);
CString strItemText = m_pTreeCtrl->GetItemText(hCurItem);//獲取當(dāng)前結(jié)點(diǎn)名
if(pFolder->IsFolder(strItemText))//刪除的是否文件夾
{
/**/ if(pFolder->m_pFather)
pFolder->m_pFather->RemoveFolder(pFolder); //調(diào)用RemoveFolder函數(shù),調(diào)用父親結(jié)點(diǎn)的m_FolderList中刪除。
else
RemoveFolder(pFolder);//刪除文件夾
}
else//刪除文件
pFolder->RemoveFileName(strItemText, FALSE);//調(diào)用RemoveFileName函數(shù)
m_pTreeCtrl->DeleteItem(hCurItem);//刪除結(jié)點(diǎn)
Invalidate();
}
void CWorkSpace::RemoveFolder(CFolder* pFolder, BOOL bDelete/*=TRUE*/)//刪除文件夾,
{ //在OnDelWorkspaceItem()等函數(shù)中調(diào)用
ASSERT(pFolder != NULL);//如果文件夾存在
POSITION pos;//定義索引指針
pos = m_FolderLi.Find(pFolder);//指針指向要?jiǎng)h除的文件夾
if(!pos)//指針為空則返回
return;
m_FolderLi.RemoveAt(pos);//刪除指針
if(bDelete)
delete pFolder;//釋放指針指向的對(duì)象
Invalidate();
}
void CWorkSpace::Serialize(CArchive& ar)
{
m_FolderLi.Serialize(ar);
if (ar.IsStoring())
{ // storing code
}
else
{ // loading code
}
}
BOOL CWorkSpace::OpenStockFile()//打開存儲(chǔ)的文件函數(shù)(from文件庫)
{
// int nPos = m_strStockName.ReverseFind(_T('\\'));//返回路徑字符個(gè)數(shù)
CFile file;
if(!file.Open(m_strStockName, CFile::modeRead))//如果不是以只讀方式打開或路徑不對(duì)則返回
{
return FALSE;
}
CArchive ar(&file, CArchive::load);//定義CArchive對(duì)象(地址file,類型為讀取文件)
Serialize(ar);//完成序列化打開文件
ar.Close(); //關(guān)閉CArchive緩沖區(qū)
file.Close();//關(guān)閉文件
return TRUE;
}
void CWorkSpace::SaveStockFile()//保存文件
{
CString m_strPath;
CFile file;
if(!file.Open(m_strStockName, CFile::modeCreate|CFile::modeWrite))
return;
CArchive ar(&file, CArchive::store);
Serialize(ar);
ar.Close();
file.Close();
}
void CWorkSpace::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
m_hDragItem = pNMTreeView->itemNew.hItem; //獲取選定被拖動(dòng)結(jié)點(diǎn)的消息
*pResult = 0;
}
void CWorkSpace::OnMouseMove(UINT nFlags, CPoint point)
{
if(!(MK_LBUTTON & nFlags))
return;
UINT uFlag = 0;
HTREEITEM hTreeItem = m_pTreeCtrl->HitTest(point , &uFlag);//獲取點(diǎn)擊的節(jié)點(diǎn)信息
if(hTreeItem && (uFlag & TVHT_ONITEM))
{
CFolder* pFolder = (CFolder*)m_pTreeCtrl->GetItemData(hTreeItem);//獲取結(jié)點(diǎn)Data
if(CanBeDropTargert(hTreeItem, m_hDragItem))//如果是可以拖動(dòng)的結(jié)點(diǎn)
{
CString strItemText = m_pTreeCtrl->GetItemText(hTreeItem);//得到當(dāng)前結(jié)點(diǎn)名
if(pFolder->IsFolder(strItemText))//選中文件夾
m_pTreeCtrl->SelectDropTarget(hTreeItem);//重畫結(jié)點(diǎn)的樣式
else//選中文件
m_pTreeCtrl->SelectDropTarget(m_pTreeCtrl->GetParentItem(hTreeItem));//父親一定為文件夾
}//重畫結(jié)點(diǎn)的樣式
else
m_pTreeCtrl->SelectDropTarget(m_hDragItem);//重畫結(jié)點(diǎn)的樣式
}
if(m_hDragItem)
::SetCursor(AfxGetApp()->LoadCursor(IDC_DRAG_FOLDER)); //獲取光標(biāo)拖動(dòng)時(shí)狀態(tài)
}
BOOL CWorkSpace::CanBeDropTargert(HTREEITEM hTreeItem, HTREEITEM hDragItem)//判斷是否是可以拖動(dòng)的函數(shù)
{
if(hTreeItem == hDragItem)//如果拖動(dòng)到的結(jié)點(diǎn)與被拖動(dòng)結(jié)點(diǎn)是同一結(jié)點(diǎn)則返回
return FALSE;
while(hTreeItem != NULL)//如果拖動(dòng)到的結(jié)點(diǎn)不為空
{
if(hTreeItem == hDragItem)//如果拖動(dòng)到的結(jié)點(diǎn)與被拖動(dòng)結(jié)點(diǎn)是同一結(jié)點(diǎn)則返回
return FALSE;
hTreeItem = m_pTreeCtrl->GetParentItem(hTreeItem);//獲取拖動(dòng)到的結(jié)點(diǎn)的父親結(jié)點(diǎn)的信息
}
return TRUE;//是可以拖動(dòng)的目標(biāo)
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -