⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainfrm.cpp

📁 Visual C++编写的工程解析器源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -