📄 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 + -