相信用过VB的人都对那些驱动器,目录,文件列表控件有兴趣,VC中没有,只好自己做了。以下是我自己写的驱动器组合框控件代码。
/// DriveBox.h
class CDriveBox : public CComboBoxEx{public: CDriveBox(); virtual ~CDriveBox();
// Generated message map functionsprotected: // {{AFX_MSG(CDriveBox) afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); // }}AFX_MSG
DECLARE_MESSAGE_MAP()public: int GetSelDrive(); bool SetSelDrive(char drive); void Initialize();private: void AddItem(char *path,int index); CImageList m_img; char m_drivers[50];};
// DriveBox.cpp : implementation file//
#include "stdafx.h"#include "DriveBox.h"
CDriveBox::CDriveBox(){ }
CDriveBox::~CDriveBox(){}
BEGIN_MESSAGE_MAP(CDriveBox, CComboBoxEx) // {{ AFX_MSG_MAP(CDriveBox) ON_WM_CREATE() // }}AFX_MSG_MAPEND_MESSAGE_MAP()
/// CDriveBox message handlers
int CDriveBox::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CComboBoxEx::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here Initialize(); return 0;}
void CDriveBox::Initialize(){ m_img.Create( GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_MASK|ILC_COLORDDB, 50, 50); m_img.SetBkColor( GetSysColor(COLOR_WINDOW) ); SetImageList(&m_img); char *ptr,drivename[500]; GetLogicalDriveStrings(500,drivename); ptr=drivename;int index=0; while (*ptr) { m_drivers[index]=*ptr; AddItem(ptr,index++); ptr+=strlen(ptr)+1; } SetSelDrive('c');}
void CDriveBox::AddItem(char *path,int index){ SHFILEINFO pathInfo,path_SelInfo; SHGetFileInfo( path, NULL, &pathInfo, sizeof(pathInfo), SHGFI_DISPLAYNAME | SHGFI_ICON | SHGFI_SMALLICON); SHGetFileInfo( path, NULL, &path_SelInfo, sizeof(path_SelInfo), SHGFI_DISPLAYNAME | SHGFI_ICON | SHGFI_OPENICON | SHGFI_SMALLICON); int icon=m_img.Add(pathInfo.hIcon); int icon_sel=m_img.Add(path_SelInfo.hIcon); COMBOBOXEXITEM item; item.mask=CBEIF_TEXT|CBEIF_IMAGE|CBEIF_SELECTEDIMAGE; item.pszText=pathInfo.szDisplayName; item.iSelectedImage=icon; item.iImage=icon;//正常图标 item.iItem=index; InsertItem(&item);}
int CDriveBox::GetSelDrive()//返回所选磁盘{ int sel=GetCurSel(); char driver=m_drivers[sel]; driver=toupper(driver); return (driver-65);//返回数字索引,如0为A盘,2为C盘 // return driver;//返回盘符}
bool CDriveBox::SetSelDrive(char drive)//设置磁盘{ if(!isalpha(drive))return FALSE; drive=toupper(drive);int index=0; while(drive!=toupper(m_drivers[index]))index++; SetCurSel(index);return TRUE;}
//
如何使用?
建立一个对话框工程CTestDlg,用ResourceEditor加入一个ComboBoxEx控件,用ClassWizard加入一个Control成员m_box, 然后在CTestDlg.h中将CComboBoxEx改为CDriveBox,在CTestDlg.h开始处加一句#include "CDriveBox.h",在CTestDlg::OnInitDialog()中加上m_box.Initialize()就OK了。用m_box.GetSelDrive()返回当前选择驱动器.如0为A盘,2为C盘。