📄 driveview.cpp
字号:
/****************************************************
The followinf Member Functions were copied from
an article by Jeff Prosise available on the
MSDN CD.
1) AddDrives
2) AddDirectoryNodes
3) AddDumyNodes
4) DeleteChildren
5) GetDriveNode
6) GetPathFromItem
7) HasSubDirectory
8) InitTree
9) IsDriveNode
10) IsMediaValid
11) SetButtonState
*****************************************************/
// DriveView.cpp : implementation file
//
#include "stdafx.h"
#include "MultiDrives.h"
#include "DriveView.h"
#include "MultiDrivesDoc.h"
#include "MultiDrivesView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//#define ICO_CLSDFLD 0
//#define ICO_OPENFLD 1
//#define ICO_GENERALFILE 2
//#define ICO_DRIVE 3
//#define ICO_CDDRV 4
/////////////////////////////////////////////////////////////////////////////
// CDriveView
IMPLEMENT_DYNCREATE(CDriveView, CView)
CDriveView::CDriveView()
{
bControlsCreated = FALSE;
DeviceName = "";
}
CDriveView::~CDriveView()
{
}
BEGIN_MESSAGE_MAP(CDriveView, CView)
//{{AFX_MSG_MAP(CDriveView)
ON_WM_DESTROY()
ON_WM_SIZE()
ON_WM_CREATE()
ON_NOTIFY(TVN_ITEMEXPANDING, ID_TREECTRL, OnItemexpanding)
ON_NOTIFY(TVN_SELCHANGING, ID_TREECTRL, OnSelchanging)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDriveView drawing
void CDriveView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
}
/////////////////////////////////////////////////////////////////////////////
// CDriveView diagnostics
#ifdef _DEBUG
void CDriveView::AssertValid() const
{
CView::AssertValid();
}
void CDriveView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDriveView message handlers
void CDriveView::OnDestroy()
{
CView::OnDestroy();
// TODO: Add your message handler code here
m_FlatButton.DestroyWindow();
m_ImageHolder->DestroyWindow();
m_DriveLetter->DestroyWindow();
CStatusBarCtrl* sb = (CStatusBarCtrl*)FromHandle(hwndStatusBar);
sb->DestroyWindow();
m_TreeCtrl.DestroyWindow();
}
void CDriveView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
}
void CDriveView::CreateImageList()
{
m_TreeCtrl.SetImageList(NULL, 0);
m_img.Create(16, 16, ILC_COLOR8 | ILC_MASK, 9, 9);
}
void CDriveView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if( bControlsCreated )
{
int BORDER = 20;
m_FlatButton.MoveWindow(-1,0,cx+2,20);
m_ImageHolder->MoveWindow(5,2,15,15);
m_DriveLetter->MoveWindow(25,2,cx-25,16);
m_TreeCtrl.MoveWindow(0,BORDER,cx, cy-(BORDER*2)-2);
CStatusBarCtrl* sb = (CStatusBarCtrl*)FromHandle(hwndStatusBar);
sb->MoveWindow(0,cy-BORDER,cx,BORDER);
int strPartDim[2]= {cx/2, -1};
sb->SetParts(2, strPartDim);
}
}
int CDriveView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
// m_TreeCtrl = new CTreeCtrl;
m_TreeCtrl.Create(WS_CHILD|
WS_VISIBLE|
TVS_HASLINES|
TVS_LINESATROOT|
TVS_HASBUTTONS,
CRect(0,0,0,0),
this ,
ID_TREECTRL);
CreateImageList();
m_FlatButton.Create("", WS_CHILD |
WS_VISIBLE|
WS_DISABLED|
BS_PUSHBUTTON,
CRect(0,0,0,0),
this,
0);
m_ImageHolder = new CStatic;
m_ImageHolder->Create("",
SS_ICON|
WS_CHILD|
WS_VISIBLE,
CRect(0,0,0,0),
this,
0xffff);
m_DriveLetter = new CStatic;
m_DriveLetter->Create("",
WS_CHILD|WS_VISIBLE|SS_LEFT,
CRect(0,0,0,0),
this,
0xffff);
LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT)); // Clear out structure.
lf.lfHeight = 12; // Request a 20-pixel-high font
strcpy(lf.lfFaceName, "MS SANS SERIF"); // with face name "Arial".
m_font.CreateFontIndirect(&lf); // Create the font.
// Use the font to paint a control. This code assumes
// a control named IDC_TEXT1 in the dialog box.
m_DriveLetter->SetFont(&m_font);
hwndStatusBar = CreateWindowEx(
0L, // no extended styles
STATUSCLASSNAME, // status bar
"", // no text
SBARS_SIZEGRIP | WS_CHILD | WS_BORDER | WS_VISIBLE | TBSTYLE_FLAT, // styles
0,0,0,0, // x, y, cx, cy
this->m_hWnd , // parent window
(HMENU)0, // window ID
NULL, // instance
NULL);
bControlsCreated = TRUE;
return 0;
}
CString CDriveView::GetPathFromItem(HTREEITEM hItem)
{
CString strPathName, string;
while (hItem != NULL)
{
if(hItem == m_drives_root)
{
string = m_TreeCtrl.GetItemText(hItem);
string = string.Mid(string.Find('(', 0)+1,2) + _T("\\");
}
else
{
string = m_TreeCtrl.GetItemText (hItem);
if ((string.Right (1) != "\\") && !strPathName.IsEmpty ())
string += "\\";
}
strPathName = string + strPathName;
hItem = m_TreeCtrl.GetParentItem (hItem);
}
return strPathName;
}
void CDriveView::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
TV_ITEM itm= pNMTreeView->itemNew;
HTREEITEM hItem = pNMTreeView->itemNew.hItem;
SetStatusText(m_TreeCtrl.GetItemText(hItem));
// if (itm.state & TVIS_EXPANDED)
if((hItem == m_drives_root)) // && itm.state & TVIS_EXPANDED);
{
CString strPathName = m_TreeCtrl.GetItemText(hItem);
strPathName = strPathName.Mid(strPathName.Find('(', 0)+1,2) + _T("\\");
ExpandBranch(itm.hItem, strPathName);
}
else
{
CString strPathName;
strPathName = GetPathFromItem(hItem) + _T("\\");
ExpandBranch(itm.hItem, strPathName);
}
// else
// {
// DeleteAllChild(itm.hItem);
// }
*pResult = 0;
return;
}
void CDriveView::OnSelchanging(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
HTREEITEM hItem = pNMTreeView->itemNew.hItem;
SetStatusText(m_TreeCtrl.GetItemText(hItem));
// CString cItemText = m_TreeCtrl->GetItemText(hItem);
// CString strPathName = GetPathFromItem (hItem);
// *pResult = FALSE;
// CWaitCursor wait;
// if (!AddDirectoryNodes (hItem, strPathName))
// *pResult = TRUE;
// SetStatusText(cItemText);
// *pResult = 0;
}
void CDriveView::SetStatusText(CString strPathName)
{
CStatusBarCtrl* sb = (CStatusBarCtrl*)FromHandle(hwndStatusBar);
sb->SetText(strPathName, 0, 0);
}
void CDriveView::InitializeView(CString strDrive, UINT nType)
{
m_drives_root = AddItem(strDrive, NULL, TRUE, -1, -1 );
m_DriveLetter->SetWindowText(DeviceName);
m_ImageHolder->SetIcon(m_img.ExtractIcon(0));
}
BOOL CDriveView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Add your specialized code here and/or call the base class
return CView::PreCreateWindow(cs);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -