?? mainfrm.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 + -