?? workspace.cpp
字號:
// WorkSpace.cpp : implementation file
//
#include "stdafx.h"
#include "MyFolder.h"
#include "WorkSpace.h"
#include "FolderNameDialog.h"
#include "OpenMultiFileDlg.h"
//#include "Folder.h"
//#include "FolderTree.h"
#include "Mainfrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#define IDS_PROJECT_COUNT 61205
#endif
/////////////////////////////////////////////////////////////////////////////
// CWorkSpace
IMPLEMENT_DYNCREATE(CWorkSpace, CTreeView)
CWorkSpace::CWorkSpace()
{
m_hDragItem = 0;//拖動文件變量 (根據約定,mfc庫非靜態類數據成員以m_開頭)
}
CWorkSpace::~CWorkSpace()
{
SaveStockFile();
// DeleteContents();
}
BEGIN_MESSAGE_MAP(CWorkSpace, CTreeView)
//{{AFX_MSG_MAP(CWorkSpace)
ON_WM_RBUTTONDOWN()
ON_COMMAND(ID_NEW_ROOT_FOLDER, OnNewRootFolder)
ON_WM_CREATE()
ON_COMMAND(ID_NEW_FOLDER, OnNewFolder)
ON_COMMAND(ID_ADD_FILE, OnAddFile)
ON_WM_LBUTTONUP()
ON_COMMAND(ID_WORKSPCE_BAR, OnHideWorkSpace)
ON_UPDATE_COMMAND_UI(ID_WORKSPCE_BAR, OnUpdateWorkspceBar)
ON_COMMAND(ID_DEL_WORKSPACE_ITEM, OnDelWorkspaceItem)
ON_NOTIFY_REFLECT(TVN_BEGINDRAG, OnBegindrag)
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CWorkSpace drawing
void CWorkSpace::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
}
/////////////////////////////////////////////////////////////////////////////
// CWorkSpace diagnostics
#ifdef _DEBUG
void CWorkSpace::AssertValid() const
{
CTreeView::AssertValid();
}
void CWorkSpace::Dump(CDumpContext& dc) const
{
CTreeView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CWorkSpace message handlers
void CWorkSpace::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
UINT uFlag = 0;
HTREEITEM hTreeItem = m_pTreeCtrl->HitTest(point, &uFlag);//獲取點擊的節點信息(handle)
CMenu menu;
if(hTreeItem && (uFlag & TVHT_ONITEM))//如果結點存在
{
m_pTreeCtrl->Select(hTreeItem, TVGN_CARET);//將結點信息賦給hTreeItem
CString strFileName = m_pTreeCtrl->GetItemText(hTreeItem);//將節點名稱賦給strFileName
CFolder* pFolder= (CFolder*)m_pTreeCtrl->GetItemData(hTreeItem);//獲取結點Data
if(pFolder->IsFolder(strFileName))//選中文件夾
VERIFY(menu.LoadMenu(IDR_WORKSPACE_FOLDER));//右鍵彈出IDR_WORKSPACE_FOLDER菜單
else//選中File
VERIFY(menu.LoadMenu(IDR_WORKSPACE_FILE));//右鍵彈出IDR_WORKSPACE_FILE菜單
}
else//選中空白
VERIFY(menu.LoadMenu(IDR_WORKSPACE));//右鍵IDR_WORKSPACE菜單
CMenu* pPopup = menu.GetSubMenu(0);//彈出右鍵菜單
ASSERT(pPopup != NULL);
ClientToScreen(&point);//邏輯坐標轉為屏幕坐標
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
point.x, point.y, AfxGetMainWnd());//彈出右鍵
}
void CWorkSpace::OnNewRootFolder()
{
CString strFolderName;
int nCount = m_FolderLi.GetCount();//獲取“工程”個數
strFolderName.Format(IDS_PROJECT_COUNT, nCount + 1);
CFolderNameDialog Dlg;//彈出CFolderNameDlg對話框
Dlg.m_strFolderName = strFolderName; //給m_strFolderName賦值
if(Dlg.DoModal() == IDCANCEL)//點擊“取消”則返回
return;
strFolderName = Dlg.m_strFolderName;
CFolder* pChileFolder = new CFolder(strFolderName);
m_FolderLi.AddTail(pChileFolder);
m_pTreeCtrl->FillItem(pChileFolder);
// m_bIsDirty = TRUE;//文件修改
}
BOOL CWorkSpace::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style |= TVS_HASBUTTONS | TVS_HASLINES |
TVS_LINESATROOT |TVS_SHOWSELALWAYS | TVS_TRACKSELECT;
return CTreeView::PreCreateWindow(cs);
}
int CWorkSpace::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CTreeView::OnCreate(lpCreateStruct) == -1)
return -1;
m_pTreeCtrl = (CFolderTree*)&GetTreeCtrl();
m_ImageList.Create(IDB_FOLDER_BMP, 16, 1, RGB(0,255,0));
m_pTreeCtrl->SetImageList(&m_ImageList, TVSIL_NORMAL);
CFolder* pFolder = NULL;
if(m_strStockName.IsEmpty())
{
CString m_strPath;
HINSTANCE hInst = ::AfxGetInstanceHandle();
TCHAR szMyPath[_MAX_PATH];
::GetModuleFileName(hInst, szMyPath, _MAX_PATH);//取得應用程序的全部路徑文件名稱,如:“F:\ReportTable\ReportTable.exe”
m_strPath = CString(szMyPath);
//去掉模塊的文件名
int nPos = m_strPath.ReverseFind(_T('\\'));
m_strPath = m_strPath.Left(nPos+1);//求得應用程序所在目錄,如:“C:\ReportTable\”
m_strStockName = m_strPath+"stock.sto";
}
OpenStockFile();
POSITION pos = m_FolderLi.GetHeadPosition();
while (pos != NULL)
{
pFolder = (CFolder*)m_FolderLi.GetNext(pos);
m_pTreeCtrl->FillItem(pFolder);
}
return 0;
}
void CWorkSpace::OnNewFolder()
{
CString strFolderName;//定義CString對象strFolderName(文件夾路徑)
strFolderName.LoadString(IDS_NEW_FOLDER);//存儲ID號(表示“新文件夾”)
HTREEITEM hTreeItem = m_pTreeCtrl->GetSelectedItem();//得到當前點擊節點信息(沒獲得返回0)(handl)
//if(!hTreeItem)
// strFolderName = CString("Project");//如果不是節點,則strFolderName=工程,建立新工程
CFolderNameDialog Dlg;
Dlg.m_strFolderName = strFolderName;//彈出CFolderNameDlg對話框
if(Dlg.DoModal() == IDCANCEL)//不建立新文件夾
return;
// m_bIsDirty = TRUE;//文件修改
strFolderName = Dlg.m_strFolderName;//strFolderName為對話框中m_strFolderName名字
CFolder* pFolder = NULL;//pFolder指針清空
CFolder* pChileFolder = new CFolder(strFolderName);//為strFolderName動態分配內存
/**if(!hTreeItem)
{
m_FolderList.AddTail(pChileFolder);
m_pTreeCtrl->FillItem(pChileFolder, NULL);
return;
}
**/
pFolder = (CFolder*)m_pTreeCtrl->GetItemData(hTreeItem);//獲取結點Data
pFolder->AddFolder(pChileFolder);
TV_INSERTSTRUCT TreeCtrlItem;//定義TreeCtrlItem
TreeCtrlItem.hParent = hTreeItem;//定義父親節點(父親結點為鼠標選中的文件夾)
TreeCtrlItem.hInsertAfter = TVI_LAST;//在最后位置插人節點
TreeCtrlItem.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE;
//激活上述屬性
TreeCtrlItem.hParent = hTreeItem;
TreeCtrlItem.item.pszText = strFolderName.GetBuffer(strFolderName.GetLength());//得到文件名
strFolderName.ReleaseBuffer();//釋放GetBuffer
TreeCtrlItem.item.iImage = 0;//選取一個新建文件夾圖象
TreeCtrlItem.item.iSelectedImage = 1;//選中該節點時的圖象
TreeCtrlItem.item.lParam = (LPARAM)pChileFolder;
m_pTreeCtrl->InsertItem(&TreeCtrlItem);//插入節點
m_pTreeCtrl->Expand(hTreeItem, TVE_EXPAND); //擴充列表
}
void CWorkSpace::OnAddFile()
{
COpenMultiFileDlg dlgFile(TRUE);//打開COpenMultiFileDlg對話框選取增加的文件
CString title,strFilter;//定義title,strFilter,strDefault
VERIFY(title.LoadString(AFX_IDS_OPENFILE));//將AFX_IDS_OPENFILE讀進title
strFilter+="MyFolder 文件(*.my)";
strFilter+=(TCHAR)'\0';//next string please
strFilter+=_T("*.ost");
strFilter+=(TCHAR)'\0';//last string
strFilter+="所有文件(*.*)";
strFilter+=(TCHAR)'\0';//next string please
strFilter+=_T("*.*");
strFilter+=(TCHAR)'\0';//last string
dlgFile.m_ofn.nMaxCustFilter++;
dlgFile.m_ofn.lpstrFilter=strFilter;
dlgFile.m_ofn.lpstrTitle=title;
dlgFile.m_ofn.hwndOwner=AfxGetMainWnd()->GetSafeHwnd();
if(dlgFile.DoModal()==IDOK)//如果點擊對話眶中“ok”按鈕
{
POSITION pos=dlgFile.GetStartPosition();//獲取當前的路徑
CString strName;//定義strName
while (pos!=NULL)//如果當前路徑不為空,即有文件存在
{
strName = dlgFile.GetNextPathName(pos);//獲取文件完整路徑
AddFileName(strName);//增加文件名到目錄樹,將路徑傳遞給AddFileName函數
}
}
}
void CWorkSpace::AddFileName(CString strPathName) //增加文件名到目錄樹函數
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -