这是在 20CN网络安全小组第一代论坛 的论坛 编程破解 中的主题 TreeView & ListView 编程技巧 (转载)


要查看这个主题,请使用这个 URL:
http://www.20cn.net/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic;f=5;t=000037

蓝色梦缘 发表于 :
 
TreeView & ListView 编程技巧

作者:病毒 发表于:绿色兵团


不少人来信问我C++ BUILDER中TreeView和ListView的使用方法,鉴于很多书中提到
TreeView和ListView便一代而过,CB列子中又没给出其示范代码,而帮助中介绍过于简
单等多种原因,我写了 列举磁盘目录(TreeView)和 抓取任意文件图标 (LISTVIEW)
两个非常详尽的列子,其中还包括了递归算法,SDK代码和重栽WIN消息等技巧,相信
初学者读了以下代码后会大有长进。


列举磁盘目录

//---------------------------------------------------------------------------
// TreeView 列举磁盘目录
// 作者: 贾佳
// E-Mail: jiasys@21cn.com
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Tree.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TreeSubNodes(TTreeNode *Node)
{
//此结构见WIN32 SDK帮助
WIN32_FIND_DATA wfd;
//文件句并
HANDLE File_Handle;
AnsiString Path;
TTreeNode *TempNode;

int i,iCount;
TempNode=Node;
Path=Node->Text;
//所有目录,文件
while(TempNode->Parent!=NULL)
{
TempNode=TempNode->Parent;
Path=TempNode->Text+"\\"+Path;
}
Path=Path+"\\*.*";
//开始查找
File_Handle=FindFirstFile(Path.c_str(),&wfd);
if(File_Handle!=INVALID_HANDLE_VALUE)
{
//找到则继续循环查找
while(FindNextFile(File_Handle,&wfd))
{
//判断是否为目录属性
if ((wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)&&
lstrcmp(wfd.cFileName,".")&&lstrcmp(wfd.cFileName,".."))
//是则添加子节点,并显示
TreeView1->Items->AddChild(Node,wfd.cFileName);
}
//递归遍历所有子目录
iCount=Node->Count;
for (i=iCount-1;i>=0;i--)
TreeSubNodes(Node->Item[i]);
}
//没有找到,释放句并
FindClose(File_Handle);
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
//遍历所有驱动器
UINT DriveType;
for(char Name='A';Name<='Z';Name++)
{
DriveType=GetDriveType((String(Name)+String(':')).c_str());
switch(DriveType)
{
//硬盘
case DRIVE_FIXED:
TreeView1->Items->Add(NULL,String(Name)+String(':'));
break;
//光驱
case DRIVE_CDROM:
TreeView1->Items->Add(NULL,String(Name)+String(':'));
break;
}
}
//驱动器个数
int iCount=TreeView1->Items->Count;
//调用TreeSubNodes函数查找
for (int i=iCount-1;i>=0;i--)
TreeSubNodes(TreeView1->Items->Item[i]);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::TreeView1GetImageIndex(TObject *Sender,
TTreeNode *Node)
{
if(Node->HasChildren)
{
//判断是否为展开状态
if(Node->Expanded)
//赋于相应图标
Node->ImageIndex=1;
else
Node->ImageIndex=0;
}
else Node->ImageIndex=2;
}
//---------------------------------------------------------------------------


void __fastcall TForm1::TreeView1GetSelectedIndex(TObject *Sender,
TTreeNode *Node)
{
//变化节点图标
Node->SelectedIndex=Node->ImageIndex;
}
//---------------------------------------------------------------------------


抓取任意文件图标

//---------------------------------------------------------------------------
// LISTVIEW 抓取任意文件图标
// 作者: 贾佳
// E-Mail: jiasys@21cn.com
//
//---------------------------------------------------------------------------

#include <vcl.h>
#include <ShellApi.hpp>
#pragma hdrstop

#include "ListV.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
//机构参见WIN32 SDK手册
SHFILEINFO SHFileInfo;

//让LISTVIEW的小图标列表指向系统的小图标列表
ListView1->SmallImages=new TImageList(16,16); //动态生成 TImageList 控件
ListView1->SmallImages->ShareImages=true;
ListView1->SmallImages->Handle=SHGetFileInfo("*.*",0,&SHFileInfo,sizeof(SHFileInfo),SHGFI_SMALLICON|SHGFI_ICON|SHGFI_SYSICONINDEX);

//让LISTVIEW的大图标列表指向系统的大图标列表
ListView1->LargeImages=new TImageList(NULL);
ListView1->LargeImages->ShareImages=true;
ListView1->LargeImages->Handle=SHGetFileInfo("*.*",0,&SHFileInfo,sizeof(SHFileInfo),SHGFI_LARGEICON|SHGFI_ICON|SHGFI_SYSICONINDEX);

}
//---------------------------------------------------------------------------

void __fastcall TForm1::On_DFile(TMessage &Message)
{
SHFILEINFO SHFileInfo;
UINT iCount;
TCHAR IcoFile[MAX_PATH],SFile[MAX_PATH];
TListItem *Item;
TIcon * ico=new TIcon();

if(Message.Msg==WM_DROPFILES)
{
//返回拖放文件个数
iCount=DragQueryFile((HDROP)Message.WParam,0xFFFFFFFF,NULL,NULL);
for(UINT i=0;i<iCount;i++)
{
Item=ListView1->Items->Add();
//得到文件名
DragQueryFile((HDROP)Message.WParam,i,IcoFile,MAX_PATH);
//利用API函数获取文件图标
SHGetFileInfo(IcoFile,0,&SHFileInfo,sizeof(SHFileInfo),SHGFI_ICON);
//指向ListView子节点的图标索引,以便正确显示
Item->ImageIndex=SHFileInfo.iIcon;
//只要文件名
Item->Caption=ExtractFileName(IcoFile);
//添加子节点,显示
Item->SubItems->Add(IcoFile);
//将以获取的文件另存为图标文件
ico->Handle=SHFileInfo.hIcon;
wsprintf(SFile,"C:\\DIcon\\%s.ico",Item->Caption);
ico->SaveToFile(SFile);
}
}
//释放动态资源
delete ico;
//拖放完成
DragFinish((HDROP)Message.WParam);

TForm::Dispatch(&Message);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
CreateDirectory("C:\\DIcon",NULL);
//允许接收拖放文件
DragAcceptFiles(Handle,TRUE);
}
//---------------------------------------------------------------------------


头文件

//---------------------------------------------------------------------------

#ifndef ListVH
#define ListVH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TListView *ListView1;
void __fastcall FormCreate(TObject *Sender);
private: // User declarations
//消息处理函数
void __fastcall TForm1::On_DFile(TMessage &Message);
public: // User declarations
__fastcall TForm1(TComponent* Owner);

//重载WM_DROPFILES消息
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_DROPFILES,TMessage,On_DFile)
END_MESSAGE_MAP(TForm)
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


 


小小瓶子 发表于 :
 
以后我再看吧~~~现在没时间学c++builder

------------------
沧海一声笑
滔滔两岸潮
浮沉随浪
只记今朝
苍天笑
纷纷世上潮
谁负谁胜出
天知晓
江山笑
烟雨遥
涛浪汹尽红尘俗世几多娇
 






Powered by Infopop Corporation
UBB.classic™ 6.5.0
NetDemon修改版 1.5.0, 20CN网络安全小组 版权所有。