📄 mainfrm.cpp
字号:
if(strFileExt == "dpr"){ bIsDelphiProj = TRUE; m_bIsVCProjFlag = FALSE; }
if(bIsVCProj && bIsDelphiProj)
{
m_lstProjFile.RemoveAll();
MessageBox("本软件此版本不支持Delphi/VC混合工程的解析!", "", MB_OK | MB_ICONERROR);
return;
}
}
//对N个工程都做更新操作
if(m_bIsVCProjFlag == TRUE)
UpdateVCFileTreeView(lpTree);
else
UpdateDelphiFileTreeView(lpTree);
}
//根据文件树来更新类目录树
void CMainFrame::UpdateClassTreeView(CTreeCtrl* lpClassTree, CTreeCtrl* lpFileTree)
{
ASSERT(lpClassTree->GetSafeHwnd() && lpFileTree->GetSafeHwnd());
/************************************如果是Delphi工程******************************/
if(m_bIsVCProjFlag == FALSE)
{
//类目录根结点
HTREEITEM hClassRootNode = lpClassTree->InsertItem(LPCTSTR("Delphi类目录"), 1, 1);
HTREEITEM hFileNode = lpFileTree->GetRootItem();
int nCurFileIndex = 0, //得到解析文件进度信息
nTotalClassCount = 0; //总的类个数
while(hFileNode != NULL)
{
if(lpFileTree->ItemHasChildren(hFileNode))
{
CString str = lpFileTree->GetItemText(hFileNode);
hFileNode = lpFileTree->GetChildItem(hFileNode);
continue;
}
CString strPasFileName = lpFileTree->GetItemText(lpFileTree->GetRootItem());
int nIndex = strPasFileName.ReverseFind('\\');
strPasFileName = strPasFileName.Left(nIndex + 1);
strPasFileName += lpFileTree->GetItemText(hFileNode);
CFileFind* ffFinder = new CFileFind;
if(ffFinder->FindFile((LPCTSTR)strPasFileName) != 0)
{
//设置进度信息
++nCurFileIndex;
//解析该文件内的类结构[!!!打开文件操作在内部实现]
CParseDelphiFile file;
CClassInfoList* cilClassList = file.GetClassNames(strPasFileName.GetBuffer(0));
if(cilClassList == NULL) return;
POSITION pos = cilClassList->GetHeadPosition();
while(pos != NULL)
{
++nTotalClassCount; //类计数器
LPCLASSANDFILEREL lpItem = cilClassList->GetNext(pos);
HTREEITEM hClassItem = lpClassTree->InsertItem((LPCTSTR)lpItem->strClassName, 6, 6, hClassRootNode);
ASSERT(hClassItem != NULL);
if(hClassItem != NULL)
{
lpClassFilename = (char*)malloc(sizeof(lpItem->strFileName));
memset(lpClassFilename, 0x0, sizeof(lpClassFilename));
strcpy(lpClassFilename, lpItem->strFileName);
lpClassTree->SetItemData(hClassItem, (DWORD)lpClassFilename);
}
CString strTipInfo = "";
strTipInfo.Format("[当前正在解析第%d个单元文件::%s]----请稍侯...", nCurFileIndex, strPasFileName);
m_wndStatusBar.SetPaneText(0, strTipInfo);
//加入类内部函数结点
for(int i = 0; i < lpItem->nFuncCounts; ++i)
{
//并且根据不同类型来对应不同的结点图标[private/protected/public]
int nSecuTypeImage = 7;
if(lpItem->cfaClassFunsArray[i]->cfType == CLS_FUNS_PRIVATE ||
lpItem->cfaClassFunsArray[i]->cfType == CLS_FUNS_PROTECTED )
nSecuTypeImage = 8;
lpClassTree->InsertItem((LPCTSTR)lpItem->cfaClassFunsArray[i]->strFunctionName,
nSecuTypeImage, nSecuTypeImage, hClassItem);
}
}
}
delete ffFinder;
//
hFileNode = lpFileTree->GetNextItem(hFileNode, TVGN_NEXT);
}
CString strTipInfo = "";
strTipInfo.Format("解析完毕----[共分析%d个单元文件,解析出%d个类]",
nCurFileIndex, nTotalClassCount);
m_wndStatusBar.SetPaneText(0, strTipInfo);
lpClassTree->Expand(hClassRootNode, TVE_EXPAND);
}
/*************************************如果是C++工程*********************************/
else
{
//类目录根结点
HTREEITEM hClassRootNode = lpClassTree->InsertItem(LPCTSTR("C++类目录"), 0, 0);
HTREEITEM hFileNode = lpFileTree->GetRootItem();
int nCurFileIndex = 0, //得到解析文件进度信息
nTotalClassCount = 0; //总的类个数
while(hFileNode != NULL)
{
if(lpFileTree->ItemHasChildren(hFileNode))
{
CString str = lpFileTree->GetItemText(hFileNode);
hFileNode = lpFileTree->GetChildItem(hFileNode);
continue;
}
CString strVCFileName = lpFileTree->GetItemText(lpFileTree->GetRootItem());
int nIndex = strVCFileName.ReverseFind('\\');
strVCFileName = strVCFileName.Left(nIndex + 1);
strVCFileName += lpFileTree->GetItemText(hFileNode);
CFileFind* ffFinder = new CFileFind;
if(ffFinder->FindFile((LPCTSTR)strVCFileName) != 0)
{
//设置进度信息
++nCurFileIndex;
//解析该文件内的类结构[!!!打开文件操作在内部实现]
CParseVCFile file;
CClassInfoList* cilClassList = file.GetClassNames(strVCFileName.GetBuffer(0));
if(cilClassList == NULL) return;
POSITION pos = cilClassList->GetHeadPosition();
while(pos != NULL)
{
++nTotalClassCount; //类计数器
LPCLASSANDFILEREL lpItem = cilClassList->GetNext(pos);
HTREEITEM hClassItem = lpClassTree->InsertItem((LPCTSTR)lpItem->strClassName, 6, 6, hClassRootNode);
ASSERT(hClassItem != NULL);
if(hClassItem != NULL)
{
lpClassFilename = (char*)malloc(sizeof(lpItem->strFileName));
memset(lpClassFilename, 0x0, sizeof(lpClassFilename));
strcpy(lpClassFilename, lpItem->strFileName);
lpClassTree->SetItemData(hClassItem, (DWORD)lpClassFilename);
}
CString strTipInfo = "";
strTipInfo.Format("[当前正在解析第%d个源文件::%s]----请稍侯...", nCurFileIndex, strVCFileName);
m_wndStatusBar.SetPaneText(0, strTipInfo);
//加入类内部函数结点
for(int i = 0; i < lpItem->nFuncCounts; ++i)
{
//并且根据不同类型来对应不同的结点图标[private/protected/public]
int nSecuTypeImage = 7;
if(lpItem->cfaClassFunsArray[i]->cfType == CLS_FUNS_PRIVATE ||
lpItem->cfaClassFunsArray[i]->cfType == CLS_FUNS_PROTECTED )
nSecuTypeImage = 8;
lpClassTree->InsertItem((LPCTSTR)lpItem->cfaClassFunsArray[i]->strFunctionName,
nSecuTypeImage, nSecuTypeImage, hClassItem);
}
}
}
delete ffFinder;
//
hFileNode = lpFileTree->GetNextItem(hFileNode, TVGN_NEXT);
}
CString strTipInfo = "";
strTipInfo.Format("解析完毕----[共分析%d个源文件,解析出%d个类]", nCurFileIndex, nTotalClassCount);
m_wndStatusBar.SetPaneText(0, strTipInfo);
lpClassTree->Expand(hClassRootNode, TVE_EXPAND);
}
}
//关闭工程信息树
void CMainFrame::CloseSysTree()
{
CCoolTabCtrl::CPageItem* lpPageItem = (CCoolTabCtrl::CPageItem*)m_wndTabCtrl.GetPageItem(0);
//关闭类目录树
CClassViewForm* lpClassViewForm = (CClassViewForm*)lpPageItem->GetPageWnd();
ASSERT(lpClassViewForm->m_wndClassTree.GetSafeHwnd());
if(lpClassViewForm->m_wndClassTree.GetCount() > 0)
lpClassViewForm->m_wndClassTree.DeleteAllItems();
//关闭文件树
lpPageItem = (CCoolTabCtrl::CPageItem*)m_wndTabCtrl.GetPageItem(1);
CFileViewForm* lpFileViewForm = (CFileViewForm*)lpPageItem->GetPageWnd();
ASSERT(lpFileViewForm->m_wndFileTree.GetSafeHwnd());
//更新文件树
if(lpFileViewForm->m_wndFileTree.GetCount() > 0)
lpFileViewForm->m_wndFileTree.DeleteAllItems();
}
//清空系统客户多页内容
void CMainFrame::CloasContentTabCtrl()
{
m_wndRichEdit.Clear();
}
//移去所有Tools菜单下的Item
void CMainFrame::RemoveAllToolsMenuItem()
{
CMenu* lpMenu;
lpMenu = this->GetMenu();
if(lpMenu->m_hMenu != NULL)
{
lpMenu = lpMenu->GetSubMenu(ID_TOOLS_MENU_INDEX);
if(lpMenu->m_hMenu != NULL)
{
int nToolsMenuItemCount = lpMenu->GetMenuItemCount();
for(int i = nToolsMenuItemCount - 1; i >= 0; --i)
{
UINT uID = lpMenu->GetMenuItemID(i);
if(uID >= ID_TOOLS_MENU_BASEMENUID && uID <= ID_TOOLS_MENU_ENDMENUID)
lpMenu->DeleteMenu(i, MF_BYPOSITION);
}
}
}
}
//根据配置文件来更新系统主菜单
BOOL CMainFrame::UpdateToolsMenu()
{
CFileEx file;
CString strFildpath = this->GetAppPath() + GLOBAL_TOOLS_INFO_FILE_NAME;
if( file.Open((LPCTSTR)strFildpath, CFile::modeRead) )
{
int nMenuItemCount = 0; //计数器
while(!file.IsEof())
{
CString strLine = "";
strLine = file.ReadALine();
strLine.Remove('\n');
strLine.TrimLeft(); strLine.TrimRight();
int nIndex = strLine.Find(']');
//菜单名称
CString str1 = strLine.Left(nIndex);
str1 = str1.Right(str1.GetLength() - 1);
//菜单对应的程序路径
CString str2 = strLine.Right(strLine.GetLength() - nIndex - 2);
str2 = str2.Left(str2.GetLength() - 1);
//新增菜单
CMenu* lpMenu;
lpMenu = this->GetMenu();
if(lpMenu->m_hMenu != NULL)
{
lpMenu = lpMenu->GetSubMenu(ID_TOOLS_MENU_INDEX);
if(lpMenu->m_hMenu != NULL)
{
UINT uItemID = ID_TOOLS_MENU_BASEMENUID + nMenuItemCount;
++nMenuItemCount;
lpMenu->AppendMenu(MF_STRING, uItemID, (LPCTSTR)str2);
//把每个菜单对应的程序名加入到菜单信息中
MENUITEMINFO mii;
mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask = MIIM_DATA;
mii.fType = MFT_STRING;
mii.dwTypeData = str2.GetBuffer(0);
mii.cch = str2.GetLength();
mii.fState = MFS_UNCHECKED;
mii.wID = uItemID;
mii.hSubMenu = NULL;
mii.hbmpChecked = NULL;
mii.hbmpUnchecked = NULL;
char* lpszExepath = NULL;
lpszExepath = (char*)malloc(MAX_PATH);
strcpy(lpszExepath, str1);
mii.dwItemData = (DWORD)lpszExepath;
::SetMenuItemInfo(lpMenu->m_hMenu, uItemID, FALSE, &mii);
}
}
}
file.Close();
}
return TRUE;
}
/*********************结束自定义函数************************/
//DEBUG部分
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CFrameWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
void CMainFrame::OnDestroy()
{
CFrameWnd::OnDestroy();
m_sysTrayIcon.SetActive(FALSE);
::UnregisterHotKey(this->m_hWnd, GLOBAL_SYSHOTKEY_ID);
}
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_HOTKEY)
{
switch(pMsg->wParam)
{
case GLOBAL_SYSHOTKEY_ID:
RecalcLayout();
BOOL bIsShow = m_sysTrayIcon.GetActivity();
if( !bIsShow && m_wndLeftBar.IsFloating() )
{
DockControlBar(&m_wndLeftBar, AFX_IDW_DOCKBAR_LEFT);
RecalcLayout();
}
m_sysTrayIcon.SetActive(!bIsShow);
break;
}
}
return CFrameWnd::PreTranslateMessage(pMsg);
}
//处理系统消息
void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
{
//如果鼠标点击最小化按钮
if(nID == SC_MINIMIZE)
m_sysTrayIcon.SetActive(TRUE);
else
CFrameWnd::OnSysCommand(nID, lParam);
}
//伸缩主框架内的窗体
void CMainFrame::RecalcLayout(BOOL bNotify)
{
CFrameWnd::RecalcLayout(bNotify); //先后次序不能改变
if( m_wndContentTab.GetSafeHwnd() )
{
CSize sizeSB = GetStatusBarSize();
CSize sizeTB = GetToolBarSize();
CRect rect;
this->GetClientRect(rect);
rect.bottom -= sizeSB.cy;
rect.top += sizeTB.cy + 1;
//减去CLeftBar区域
BOOL bFloating = m_wndLeftBar.IsFloating();
BOOL bVisible = m_wndLeftBar.IsWindowVisible();
if( this->IsWindowVisible() )
{
if( bVisible && bFloating == FALSE )
{
CRect rcBarWin;
m_wndLeftBar.GetWindowRect(rcBarWin);
ScreenToClient(rcBarWin);
rect.left = rcBarWin.right - 2;
}
//
::SetWindowPos(m_wndContentTab.m_hWnd, NULL, rect.left, rect.top,
rect.Width(), rect.Height(), SWP_SHOWWINDOW);
}
}
}
/*********************打开一个VC/Delphi工程文件(允许多选)*******************/
void CMainFrame::OnVcfileOpen()
{
if(!m_lstProjFile.IsEmpty()) m_lstProjFile.RemoveAll();
static char szFilter[] = "VC Project File (*.dsp)|*.dsp|Delphi Project File (*.dpr)|*.dpr||";
CFileDialog ofdVCFileDlg(TRUE, "dsp", NULL,
OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT | OFN_OVERWRITEPROMPT,
(LPCTSTR)szFilter, this);
if(ofdVCFileDlg.DoModal() == IDOK)
{
//先关闭已打开的工程文件
OnVcfileClose();
CString szProjFileName = "";
//处理多选情况
POSITION pos = ofdVCFileDlg.GetStartPosition();
if(pos != NULL)
{
while(pos)
{
CString str = ofdVCFileDlg.GetNextPathName(pos);
str = str + szProjFileName;
//加入主框架的全局变量工程列表中
if(m_lstProjFile.IsEmpty())
m_lstProjFile.AddHead(str);
else
m_lstProjFile.AddTail(str);
}
//[更新树型目录节点]
UpdateSysTrees();
}
}
}
//关闭所打开的工程文件
void CMainFrame::OnVcfileClose()
{
//清空树目录内容
CloseSysTree();
//清空系统多页内容
CloasContentTabCtrl();
}
//查看系统树型目录
void CMainFrame::OnViewSystree()
{
BOOL bFlag = ::IsWindowVisible(m_wndLeftBar.m_hWnd);
DockControlBar(&m_wndLeftBar, AFX_IDW_DOCKBAR_LEFT);
m_wndLeftBar.ShowWindow(bFlag ? SW_HIDE : SW_SHOW);
RecalcLayout();
}
//查看系统硬件配置信息
void CMainFrame::OnViewSysinfo()
{
CSystemInfoForm dlg;
dlg.DoModal();
}
//系统外围测试工具的配置[消息影射函数]
void CMainFrame::OnExecToolApp(UINT nID)
{
CMenu* lpMenu = this->GetMenu();
if(lpMenu->m_hMenu != NULL)
{
lpMenu = lpMenu->GetSubMenu(ID_TOOLS_MENU_INDEX);
if(lpMenu->m_hMenu != NULL)
{
MENUITEMINFO mii;
mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask = MIIM_DATA;
VERIFY(lpMenu->GetMenuItemInfo(nID, &mii));
CString strExePath = (char*)mii.dwItemData;
::ShellExecute(this->m_hWnd, "open",
strExePath, NULL, NULL, SW_SHOWNORMAL);
}
}
}
void CMainFrame::OnToolsCustom()
{
CToolsConDlg dlg;
if(dlg.DoModal() == IDOK)
{
//移去所有Tools菜单下的Item
RemoveAllToolsMenuItem();
//根据配置文件来更新系统主菜单
UpdateToolsMenu();
}
}
/****************************开始更新菜单状态*************************************/
void CMainFrame::OnUpdateViewSystree(CCmdUI* pCmdUI)
{
BOOL bFlag = ::IsWindowVisible(m_wndLeftBar.m_hWnd);
pCmdUI->SetCheck(bFlag);
}
/****************************结束更新菜单状态*************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -