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

📄 mainfrm.cpp

📁 "MagicHouse框架"目录: 含有MagicHouse的原始框架
💻 CPP
字号:
// MainFrm.cpp : CMainFrame 类的实现
//

#include "stdafx.h"
#include "MagicHouse.h"

#include "MainFrm.h"

#include "MagicHouseDoc.h"
#include "MagicHouseView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	ON_WM_CREATE()
	ON_WM_SIZE()
	ON_NOTIFY(TVN_ITEMEXPANDED, IDC_MYTREECTRL, OnItemexpandedTree)
	ON_NOTIFY(TVN_SELCHANGED, IDC_MYTREECTRL, OnSelchangedTree)
	ON_COMMAND(ID_VIEW_CONTROL, &CMainFrame::OnViewControl)
	ON_UPDATE_COMMAND_UI(ID_VIEW_CONTROL, &CMainFrame::OnUpdateViewControl)
END_MESSAGE_MAP()

static UINT indicators[] =
{
	ID_INDICATOR_PICNUM,	// 图片数量
	ID_INDICATOR_PICNAME,	// 当前显示的图片文件名
	ID_SEPARATOR,           // 状态行指示器
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
};


// CMainFrame 构造/析构

CMainFrame::CMainFrame()
{
}

CMainFrame::~CMainFrame()
{
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE0("未能创建工具栏\n");
		return -1;      // 未能创建
	}

	if (!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		  sizeof(indicators)/sizeof(UINT)))
	{
		TRACE0("未能创建状态栏\n");
		return -1;      // 未能创建
	}

	// TODO: 如果不需要工具栏可停靠,则删除这三行
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_wndToolBar);

	CreateCtrlBar();

	return 0;
}

/******************************************************************************
*	作用:		创建控制窗口
*	备注:		控制窗口包括文件目录和位图浏览两个窗口,通过
******************************************************************************/
BOOL CMainFrame::CreateCtrlBar(void)
{
	if ( !m_wndCtrlBar.Create(L"控制窗口", this, 100) ) 
	{ 
		TRACE0("未能创建控制窗口\n"); 
		return -1; 
	}

	m_wndCtrlBar.SetBarStyle(m_wndCtrlBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); 

	m_wndCtrlBar.EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_wndCtrlBar, AFX_IDW_DOCKBAR_LEFT);	// 停靠在左边

	// 创建一个选项卡控件
	m_TabCtrl.Create(TCS_DOWN | WS_CHILD | WS_VISIBLE, CRect(0,0,100,100), &m_wndCtrlBar, 125);

	// 创建树型控件
	if (!m_TreeCtrl.Create(WS_CHILD|WS_VISIBLE|
		TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT,
		CRect(0, 0, 0, 0), &m_TabCtrl, IDC_MYTREECTRL))
	{
		TRACE0("创建失败!\n");
		return -1;
	}

	m_TreeCtrl.ModifyStyleEx(0, WS_EX_CLIENTEDGE);

	DWORD dwStyle = GetWindowLong(m_TreeCtrl.m_hWnd, GWL_STYLE);

	dwStyle |= TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT;
	SetWindowLong(m_TreeCtrl.m_hWnd, GWL_STYLE, dwStyle);

	m_hRoot = m_TreeCtrl.InsertItem(L"我的电脑");
	InsertLogicalDrives(m_hRoot);
	InsertDriveDir(m_hRoot);
	m_TreeCtrl.Expand(m_hRoot,TVE_EXPAND);

	// 将树型控件加入到TabCtrl中
	m_TabCtrl.AddPage(&m_TreeCtrl, L"文件目录", IDI_DIR);
	m_TabCtrl.AddPage(RUNTIME_CLASS(CPrevDlg), IDD_PREV, L"位图浏览", IDI_DIR);
	m_TabCtrl.UpdateWindow();

	return TRUE;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	// TODO: 在此处通过修改
	//  CREATESTRUCT cs 来修改窗口类或样式

	cs.style &= ~FWS_ADDTOTITLE;	// 取消MFC自动添加标题的风格

	return TRUE;
}


// CMainFrame 诊断

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG


// CMainFrame 消息处理程序

/******************************************************************************
*	作用:		在指定父节点下插入系统驱动器节点
******************************************************************************/
void CMainFrame::InsertLogicalDrives(HTREEITEM hParent)
{
	DWORD	szAllDriveStrings = GetLogicalDriveStrings(0,NULL);
	LPWSTR	pDriveStrings = new WCHAR[szAllDriveStrings + sizeof(_T(""))];
	LPWSTR	pDel = pDriveStrings;
	GetLogicalDriveStrings(szAllDriveStrings, pDriveStrings);
	size_t szDriveString = wcslen(pDriveStrings);
	while(szDriveString > 0)
	{
		m_TreeCtrl.InsertItem(pDriveStrings, hParent);
		pDriveStrings += szDriveString + 1;
		szDriveString = wcslen(pDriveStrings);
	}

	SAFE_DELETE_ARRAY (pDel);
}

/******************************************************************************
*	作用:		在指定父节点下插入驱动盘下的所有子项
******************************************************************************/
void CMainFrame::InsertDriveDir(HTREEITEM hParent)
{
	HTREEITEM hChild = m_TreeCtrl.GetChildItem(hParent);
	while(hChild)
	{
		CString strText = m_TreeCtrl.GetItemText(hChild);
		if(strText.Right(1) != L"\\")
			strText += L"\\";
		strText += L"*.*";
		CFileFind file;
		BOOL bContinue = file.FindFile(strText);
		while(bContinue)
		{
			bContinue = file.FindNextFile();
			if(!file.IsDots())
				m_TreeCtrl.InsertItem(file.GetFileName(), hChild);
		}
		InsertDriveDir(hChild);
		hChild = m_TreeCtrl.GetNextItem(hChild, TVGN_NEXT);
		file.Close();
	}	
}

/******************************************************************************
*	作用:		在指定父节点下插入目录下的所有子项
******************************************************************************/
void CMainFrame::AddSubDir(HTREEITEM hParent)
{
	CString strPath = GetFullPath(hParent);
	if(strPath.Right(1) != "\\")
		strPath += "\\";
	strPath += L"*.*";
	CFileFind file;
	BOOL bContinue = file.FindFile(strPath);
	while(bContinue)
	{
		bContinue = file.FindNextFile();
		if( !file.IsDots())
			m_TreeCtrl.InsertItem(file.GetFileName(), hParent);
	}
}

/******************************************************************************
*	作用:		获取指定节点的全路径
******************************************************************************/
CString CMainFrame::GetFullPath(HTREEITEM hCurrent)
{
	CString strTemp;
	CString strReturn = L"";
	while(hCurrent != m_hRoot)
	{
		strTemp = m_TreeCtrl.GetItemText(hCurrent);
		if(strTemp.Right(1) != "\\")
			strTemp += L"\\";
		strReturn = strTemp  + strReturn;
		hCurrent = m_TreeCtrl.GetParentItem(hCurrent);
	}

	return strReturn;
}

/******************************************************************************
*	作用:		展开树视图的某一项的响应函数
******************************************************************************/
void CMainFrame::OnItemexpandedTree(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	TVITEM item = pNMTreeView->itemNew;
	if(item.hItem == m_hRoot)
		return;
	HTREEITEM hChild = m_TreeCtrl.GetChildItem(item.hItem);
	while(hChild)
	{
		AddSubDir(hChild);
		hChild = m_TreeCtrl.GetNextItem(hChild,TVGN_NEXT);
	}
	*pResult = 0;
}

/******************************************************************************
*	作用:		获得指定目录下所有的图像文件名
*	参数:		
*		path	指定目录路径
*		ary		保存图像文件名的字符串容器
******************************************************************************/
void CMainFrame::GetAllFileNames(const CString& path, CStringArray& ary)
{
	ary.RemoveAll();

	CFileFind fileFind;
	CString filesPath = path + L"\\*.*";

	if (fileFind.FindFile(filesPath))
	{

		CString strPicPath;
		CString strExt;

		// 如果该目录还有文件
		while (fileFind.FindNextFile())
		{
			strPicPath = fileFind.GetFileName();
			// 获取后缀名
			strExt = strPicPath.Right(3);
			strExt.MakeLower();

			// 如果后缀名为bmp,jpg则判断是图片文件
			// 此处可以扩充功能
			if (strExt == "bmp" || strExt == "jpg")
				ary.Add(strPicPath);
		}

		strPicPath = fileFind.GetFileName();
		// 获取后缀名
		strExt = strPicPath.Right(3);
		strExt.MakeLower();

		// 如果后缀名为bmp,jpg则判断是图片文件
			// 此处可以扩充功能
		if (strExt == "bmp" || strExt == "jpg")
			ary.Add(strPicPath);
	}

	fileFind.Close();
}

/******************************************************************************
*	作用:		树视图选择改变的响应函数
******************************************************************************/
void CMainFrame::OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	TVITEM item = pNMTreeView->itemNew;
	if(item.hItem == m_hRoot)
		return;
	CString str = GetFullPath(item.hItem);
	str = str.Left(str.GetLength() - 1);
	CFileFind fileFile;

	if( fileFile.FindFile(str) )
	{
		CString strExt;

		fileFile.FindNextFile();
		if(!fileFile.IsDirectory() && !fileFile.IsDots())
		{
			strExt = str.Right(3);
			strExt.MakeLower();
		
			// 如果后缀名为bmp,jpg则判断是图片文件
			// 此处可以扩充功能
			if (strExt == "bmp" || strExt == "jpg")
			{
				CMagicHouseView* pView = (CMagicHouseView*)GetActiveView();

				pView->ClearOffset();
				pView->OpenFile(str);
				pView->FixOffset();
				pView->RefreshIndicator();
			}
		}
	}
	fileFile.Close();

	*pResult = 0;
}

/******************************************************************************
*	作用:		窗口大小改变的响应函数
******************************************************************************/
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
	CFrameWnd::OnSize(nType, cx, cy);
	CMagicHouseView* pView = (CMagicHouseView*)GetActiveView();

	if (pView != NULL)
	{
		pView->ClearOffset();
		pView->FixOffset();
	}
}


/******************************************************************************
*	作用:		显示/隐藏“控制窗口”
******************************************************************************/
void CMainFrame::OnViewControl()
{
	BOOL bVisible = ((m_wndCtrlBar.IsWindowVisible()) != 0);

	ShowControlBar(&m_wndCtrlBar, !bVisible, FALSE);
	RecalcLayout();
}

/******************************************************************************
*	作用:		“控制窗口”菜单项的命令更新函数
******************************************************************************/
void CMainFrame::OnUpdateViewControl(CCmdUI *pCmdUI)
{
	BOOL bVisible = ((m_wndCtrlBar.IsWindowVisible()) != 0);
	pCmdUI->SetCheck(bVisible);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -