操纵Visual C++计划自己的资源浏览器[VC/C++编程]
本文“操纵Visual C++计划自己的资源浏览器[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
Windows的资源管理器想必大家都用过,该程序的窗口一分为二,左边的窗口显示本机当前全部驱动器以及驱动器中的全部文件夹,当用户单击文件夹后,假如该文件夹下面还有子文件夹,则上层文件夹展开显示下级的文件夹;不然,右边的窗口显示挑选文件夹下的文件.那么这个程序是若何实现的呢?为了阐明这个问题,本实例打造了一个简易的资源管理器,它实现了Windows资源管理器的主要功效,在显示文件的属性(如文件的文件名、文件的大小、文件的成立时间)的同时,还可以改变文件显示的方法,如大小图标方法、列表方法等.关于Visual C++初学者来说,这个实例和《实例2:打造自己的IE浏览器》要结合起来细细的学习、消化,这两个实例包含了Visual C++编程中的很多细节知识,如工具栏的处理、树型控件/列表控件的利用、窗口的拆分、字符串的处理等,相信读者朋友可以从中学到很多知识点.
步骤/办法
实现办法
从上面的界面效果图可以看出,在程序中利用了拆分窗口,在拆分的历程中,左边窗口为CTreeView 类的子类CLeftView,右边的窗口为CListView类的子类CdriveExplorerView.窗口的拆分和CTreeView、 CListView类不是本实例报告的重点,相关的知识在本书的实例中都有介绍,读者朋友可以参阅上述内容及实例的原代码,这里主要介绍程序中一些具体的细节知识.
资源管理器中一个重要的问题是若何得到本机中的驱动器信息,微软供应的有关驱动器的API函数有GetLogicalDrives(),GetDriveType().
关于喜好操作位和字节的汇编语言利用者来说,GetLogicalDrives()是个很好用的API函数.它以位掩码的情势返回逻辑驱动器.即在一个 DWORD范例的返回值中,位0(最小的一位)表示驱动器A,位1表示驱动器B,以此类推.每一个位的状况假如是on,则表示对应的逻辑驱动器存在;不然状况为off,表示对应的逻辑驱动器不存在.大家知道DWORD是一个32位的值,足以包含全部的英文字母,也就是说最多可有26个盘符.
为了肯定某个逻辑驱动器的范例,必须调用GetDriveType()函数.它以途径名作为参数(如C:\),返回DRIVE_FIXED,DRIVE_REMOVABLE,或DRIVE_UNKNOWN.下面列出了全部大概返回的值:这些值在winbase.h定义
#define DRIVE_UNKNOWN 0 // 无效途径名
#define DRIVE_NO_ROOT_DIR 1 // 无效路经,如无法找到的卷标
#define DRIVE_REMOVABLE 2 // 可移动驱动器(如磁盘驱动器,光驱等)
#define DRIVE_FIXED 3 // 固定的驱动器 (如 普通的硬盘)
#define DRIVE_REMOTE 4 // 网络驱动器
#define DRIVE_CDROM 5 // CD-ROM
#define DRIVE_RAMDISK 6 // 随机存取(RAM) 磁盘
有了驱动器的信息,便可以利用FindFirstFile()、FindNextFile()等函数来获得驱动器下面的文件或文件夹信息(相关内容参与《实例:改正文件或文件夹的属性》),然后辨别增添到树型视图和列表视图中.
最后要阐明的一点是需求按照差别的状况和文件范例在视图中显示差别的图表,这些可以通过设置列表视图的窗口吻概、树状视图的项目条的图标来实现,具体拜见代码部份.编程步骤
启动Visual C++6.0,生成一个单文档视图的利用程序,视图类的基类挑选CListView,项目命名为"DriveExplorer",同时在项目中增添图标资源、菜单和菜单呼应函数(具体内容拜见原代码);
利用Class Wizard为项目增添新类CLeftView类,其基类挑选CtreeView;
增添代码,编译运路程序.程序代码
/////////////////////////////////////////////////////// LeftView.h : interface of the CLeftView class
#if !defined(AFX_LEFTVIEW_H__29F66875_4E46_11D6_9693_B383368EF622__INCLUDED_)
#define AFX_LEFTVIEW_H__29F66875_4E46_11D6_9693_B383368EF622__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CDriveExplorerDoc;
class CLeftView : public CTreeView
{
protected: // create from serialization only
CLeftView();
DECLARE_DYNCREATE(CLeftView)
// Attributes
public:
CDriveExplorerDoc* GetDocument();
CImageList* m_pImageList;
CString m_LocalPath;
// Operations
public:
BOOL HasSubdirectory(CString &strPathName);
BOOL IsDriveNode(HTREEITEM hItem);
void SetButtonState(HTREEITEM hItem, CString &strPathName);
UINT AddDirectoryNodes(HTREEITEM hItem, CString &strPathName);
BOOL IsMediaValid(CString &strPathName);
HTREEITEM GetDriveNode(HTREEITEM hItem);
UINT DeleteChildren(HTREEITEM hItem);
BOOL IsPathValid(CString &strPathName);
CString GetPathFromItem(HTREEITEM hItem);
void AddDummyNode(HTREEITEM hItem);
void InitTreeView(HTREEITEM hParent);
BOOL AddDrives(CString strDrive, HTREEITEM hParent);
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CLeftView)
public:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnInitialUpdate(); // called first time after construct
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CLeftView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// Generated message map functions
protected:
//{{AFX_MSG(CLeftView)
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code !
afx_msg void OnDestroy();
afx_msg void OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnSelchanging(NMHDR* pNMHDR, LRESULT* pResult);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
#ifndef _DEBUG // debug version in LeftView.cpp
inline CDriveExplorerDoc* CLeftView::GetDocument()
{ return (CDriveExplorerDoc*)m_pDocument; }
#endif
#endif
////////////////////////////////////////////////////////// CLeftView
#include "stdafx.h"
#include "DriveExplorer.h"
#include "DriveExplorerDoc.h"
#include "LeftView.h"
#include "DriveExplorerView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define ILI_CDDRV 0
#define ILI_CLSDFLD 1
#define ILI_DRIVE 2
#define ILI_FLOPPYDRV 3
#define ILI_MYCOMP 4
#define ILI_OPENFLD 5
#define ILI_TEXTFILE 6
#define MYCOMPUTER "My Computer"
IMPLEMENT_DYNCREATE(CLeftView, CTreeView)
BEGIN_MESSAGE_MAP(CLeftView, CTreeView)
//{{AFX_MSG_MAP(CLeftView)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
ON_WM_DESTROY()
ON_NOTIFY_REFLECT(TVN_ITEMEXPANDING, OnItemexpanding)
ON_NOTIFY_REFLECT(TVN_SELCHANGING, OnSelchanging)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CTreeView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CTreeView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CTreeView::OnFilePrintPreview)
END_MESSAGE_MAP()
///////////////////////////////////// CLeftView construction/destruction
CLeftView::CLeftView()
{
// TODO: add construction code here
}
CLeftView::~CLeftView()
{}
BOOL CLeftView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying the CREATESTRUCT cs
cs.style |= TVS_HASBUTTONS | TVS_LINESATROOT | TVS_HASLINES;
return CTreeView::PreCreateWindow(cs);
}
void CLeftView::OnDraw(CDC* pDC)
{
CDriveExplorerDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
BOOL CLeftView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CLeftView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CLeftView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
void CLeftView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
m_pImageList = new CImageList();
CWinApp* pApp = AfxGetApp();
// ASSERT(m_pImageList != NULL); // serious allocation failure checking
m_pImageList->Create(16, 16, ILC_COLOR8 | ILC_MASK, 9, 9);
m_pImageList->Add(pApp->LoadIcon(ICO_CDDRV));
m_pImageList->Add(pApp->LoadIcon(ICO_CLSDFLD));
m_pImageList->Add(pApp->LoadIcon(ICO_DRIVE));
m_pImageList->Add(pApp->LoadIcon(ICO_FLOPPYDRV));
m_pImageList->Add(pApp->LoadIcon(ICO_MYCOMP));
以上是“操纵Visual C++计划自己的资源浏览器[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |