DriverCombo.cpp
上传用户:tjfeida
上传日期:2013-03-10
资源大小:1917k
文件大小:13k
源码类别:

Ftp客户端

开发平台:

Visual C++

  1. // DriverCombo.cpp : implementation file
  2. //
  3. /*********************************************
  4. **该文件是属于WolfFTP工程中的。如果有什么问题
  5. **请联系
  6. **         tablejiang@21cn.com
  7. **或者访问
  8. **         http://wolfftp.51.net
  9. **以得到最新的支持。
  10. *********************************************/
  11. #include "stdafx.h"
  12. #include "DriverCombo.h"
  13. #include "shlwapi.h"
  14. #ifdef _DEBUG
  15. #define new DEBUG_NEW
  16. #undef THIS_FILE
  17. static char THIS_FILE[] = __FILE__;
  18. #endif
  19. /////////////////////////////////////////////////////////////////////////////
  20. // CDriverCombo
  21. CDriverCombo::CDriverCombo()
  22. {
  23. //empty buffer .
  24. m_NowDisplayPath.Empty( ) ;
  25. }
  26. CDriverCombo::~CDriverCombo()
  27. {
  28. m_ImageList.Detach( ) ;
  29. m_ImageList.m_hImageList = NULL ;
  30. }
  31. BEGIN_MESSAGE_MAP(CDriverCombo, CComboBoxEx)
  32. //{{AFX_MSG_MAP(CDriverCombo)
  33. ON_WM_CREATE()
  34. //}}AFX_MSG_MAP
  35. END_MESSAGE_MAP()
  36. /////////////////////////////////////////////////////////////////////////////
  37. // CDriverCombo message handlers
  38. int CDriverCombo::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  39. {
  40. if (CComboBoxEx::OnCreate(lpCreateStruct) == -1)
  41. return -1;
  42. // TODO: Add your specialized creation code here
  43. InitCombox( ) ;
  44. //if count > 0 select the item .
  45. return 0;
  46. }
  47. /***********************************************************
  48. ** @Description:
  49. ** this protected function is used for init the 
  50. combobox.
  51. ** @Note:
  52. ** void
  53. ** @return :if init success return true ,else return false .
  54. ** @Author :Table.JHM.太子
  55. ** e-mail :tablejiang@21cn.com
  56. ** Date :2001 3 26
  57. *************************************************************/
  58. BOOL CDriverCombo::InitCombox()
  59. {
  60. //get system image list .
  61. GetSysImgList() ;
  62. //add driver item .
  63. AddDriver( );
  64. //add directroy item .
  65. AddDirectory( m_NowDisplayPath ) ;
  66. return true ;
  67. }
  68. /***********************************************************
  69. ** @Description:
  70. ** Get system default image list.
  71. ** @Note:
  72. ** void
  73. ** @Return: if get success return true ,else return false . 
  74. ** @Author :Table.JHM.太子
  75. ** e-mail :tablejiang@21cn.com
  76. ** Date :2001 3 26
  77. *************************************************************/
  78. BOOL CDriverCombo::GetSysImgList()
  79. {
  80. SHFILEINFO shFinfo;
  81. HIMAGELIST hImgList = NULL;
  82. if ( GetImageList( ) )
  83. m_ImageList.Detach();
  84. //get system image list handle .
  85. hImgList = (HIMAGELIST)SHGetFileInfo( "C:\",
  86.   0,
  87.   &shFinfo,
  88.   sizeof( shFinfo ),
  89.   SHGFI_SYSICONINDEX | 
  90.   SHGFI_SMALLICON );
  91. if ( !hImgList )
  92. {
  93. return FALSE;
  94. }
  95. //attach .
  96. m_ImageList.m_hImageList = hImgList ;
  97. SetImageList( &m_ImageList ) ;
  98. return TRUE; 
  99. }
  100. /***********************************************************
  101. ** @Description:
  102. ** use add the system drivers into combo box.
  103. ** @Note:
  104. ** void
  105. ** @Return: if add success return true , else return false .
  106. ** @Author :Table.JHM.太子
  107. ** e-mail :tablejiang@21cn.com
  108. ** Date :2001 3 26
  109. *************************************************************/
  110. BOOL CDriverCombo::AddDriver()
  111. {
  112. char  szDrives[128];
  113. char* pDrive;
  114. ZeroMemory( szDrives , 128 ) ;
  115. //get the system logical driver info .
  116. //the result string such as "A:\0B:\0C:\0" .
  117. if ( !GetLogicalDriveStrings( sizeof(szDrives), szDrives ) )
  118. {
  119. return FALSE;
  120. }
  121. pDrive = szDrives;
  122. //Convert string to uppercase.
  123. pDrive = strupr( pDrive ) ;
  124. int nItem = 0 ;
  125. CString DisplayPath = m_NowDisplayPath ;
  126. CString driver ;
  127. DisplayPath.MakeLower() ;
  128. //add all driver .
  129. while( *pDrive )
  130. {
  131. AddItem( pDrive , 0 , nItem );
  132. pDrive += strlen( pDrive ) + 1;
  133. nItem ++ ;
  134. }
  135. return true ;
  136. }
  137. /***********************************************************
  138. ** @Description:
  139. ** this function is add the specify path item in combo.
  140. ** @Note:
  141. ** CString strPath : the specify path .
  142. ** @Return: if add success return true , else return false .
  143. ** @Author :Table.JHM.太子
  144. ** e-mail :tablejiang@21cn.com
  145. ** Date :2001 3 26
  146. *************************************************************/
  147. BOOL CDriverCombo::AddDirectory( CString strPath  )
  148. {
  149. //find the directroy item insert pos 
  150. int iPos = FindInsertPos( strPath ) ;
  151. //insert .
  152. if( InsertPathItem( iPos ) )
  153. return true ;
  154. else
  155. return false ;
  156. }
  157. /***********************************************************
  158. ** @Description:
  159. ** the function find the directory will insert in 
  160. which driver .
  161. ** @Note:
  162. ** CString strPath : the display path .
  163. ** @Return: the driver index in combo.
  164. ** @Author :Table.JHM.太子
  165. ** e-mail :tablejiang@21cn.com
  166. ** Date :2001 3 26
  167. *************************************************************/
  168. int CDriverCombo::FindInsertPos( CString strPath )
  169. {
  170. char  szDrives[128];
  171. char* pDrive;
  172. //get driver info.
  173. if ( !GetLogicalDriveStrings( sizeof(szDrives), szDrives ) )
  174. {
  175. return FALSE;
  176. }
  177. pDrive = szDrives;
  178. pDrive = strupr( pDrive ) ;
  179. m_nItem = 0 ;
  180. int iPos = 0 ;
  181. CString DisplayPath = m_NowDisplayPath ;
  182. CString driver ;
  183. DisplayPath.MakeLower() ;
  184. while( *pDrive )
  185. {
  186. driver = pDrive ;
  187. driver.GetLength() ;
  188. driver.SetAt( 2 , '' ) ;
  189. driver.MakeLower( ) ;
  190. //if this driver same to display path drvier.
  191. if( strcmp( driver , DisplayPath.Left( 2 ) ) == 0 )
  192. {
  193. return iPos ;
  194. break ;
  195. }
  196. //compare next driver.
  197. pDrive += strlen( pDrive ) + 1;
  198. iPos ++ ;
  199. }
  200. return true ;
  201. }
  202. /***********************************************************
  203. ** @Description:
  204. ** this protected function is add the item to combo.
  205. ** @Note:
  206. **
  207. ** @Return: 
  208. ** @Author :Table.JHM.太子
  209. ** e-mail :tablejiang@21cn.com
  210. ** Date :2001 3 26
  211. *************************************************************/
  212. BOOL CDriverCombo::AddItem(LPCTSTR pDriver , int level , int iPos )
  213. {
  214. SHFILEINFO shFileInfo ;
  215. int iIcon , iSelIcon ;
  216. CString strTemp = pDriver ;
  217. //add the char ''
  218. if ( strTemp.Right(1) != '\' )
  219.  strTemp += "\";
  220. //get the item icon index from system image list.
  221. if ( !SHGetFileInfo( strTemp,
  222. 0,
  223. &shFileInfo,
  224. sizeof( shFileInfo ),
  225. SHGFI_ICON | SHGFI_SMALLICON | 
  226. SHGFI_TYPENAME |SHGFI_DISPLAYNAME ) )
  227. {
  228. return false ;
  229. }
  230. iIcon = shFileInfo.iIcon;
  231. // we only need the index from the system image list
  232. DestroyIcon( shFileInfo.hIcon );
  233. //get the item selected icon index from system image list .
  234. if ( !SHGetFileInfo( strTemp,
  235. 0,
  236. &shFileInfo,
  237. sizeof( shFileInfo ),
  238. SHGFI_ICON | SHGFI_SMALLICON  
  239.  ) )
  240. {
  241. return false ;
  242. }
  243. iSelIcon = shFileInfo.iIcon ;
  244. // we only need the index from the system image list
  245. DestroyIcon( shFileInfo.hIcon ) ;
  246. if ( strTemp.Right(1) == "\" )
  247. strTemp.SetAt( strTemp.GetLength() - 1, '' );
  248. //insert item .
  249. COMBOBOXEXITEM cbi;
  250. CString DisplayString ;
  251. DisplayString = GetDisplayPath( strTemp );
  252. cbi.mask = CBEIF_IMAGE | CBEIF_INDENT | CBEIF_OVERLAY |
  253.  CBEIF_SELECTEDIMAGE | CBEIF_TEXT;
  254. if( level == 0 )
  255. DisplayString.MakeUpper() ;
  256. cbi.iItem = iPos ;
  257. cbi.pszText = (LPTSTR)(LPCTSTR)DisplayString ;
  258. cbi.cchTextMax = DisplayString.GetLength() ;
  259. cbi.iImage = iIcon ;
  260. cbi.iSelectedImage = iSelIcon ;
  261. cbi.iOverlay = 0 ;
  262. //make indent .
  263. cbi.iIndent = ( level*0x0002 ) ;  
  264. InsertItem( &cbi ) ;
  265. return true ;
  266. }
  267. /***********************************************************
  268. ** @Description:
  269. ** insert the directory item under the specify driver item .
  270. ** @Note:
  271. ** int iPos : the driver index .
  272. ** @Return: 
  273. ** @Author :Table.JHM.太子
  274. ** e-mail :tablejiang@21cn.com
  275. ** Date :2001 3 26
  276. *************************************************************/
  277. BOOL CDriverCombo::InsertPathItem( int iPos )
  278. {
  279. m_nLevel = 0 ;
  280. CString strDisPath ;
  281. CString strNowPath ;
  282. char cBackup ;
  283. //get now display path 
  284. strNowPath = m_NowDisplayPath ;
  285. //check the path is exist ?
  286. if( !PathFileExists( (LPCTSTR)m_NowDisplayPath ) )
  287. return false ;
  288. //check the path is directory ?
  289. if( !PathIsDirectory( (LPCTSTR)m_NowDisplayPath ) )
  290. {
  291. //if not , get it parent directory 
  292. strDisPath = GetDisplayPath ( strNowPath ) ;
  293. strNowPath.SetAt( strNowPath.GetLength() - strDisPath.GetLength() , 0 ) ;
  294. }
  295. //now , split the path .
  296. int iStart = 0 ;
  297. int iEnd = strNowPath.GetLength() ;
  298. int iLevel = 1 ;
  299. int nItem = iPos + 1;
  300. if( strNowPath.Right(1) != "\" )
  301. strNowPath += "\" ;
  302. iStart = strNowPath.Find( "\" , iStart+1 );
  303. while( true )
  304. {
  305. iStart = strNowPath.Find( "\" , iStart+1 );
  306. if( iStart == -1 )
  307. {
  308. break ;
  309. }
  310. cBackup = strNowPath.GetAt( iStart ) ;
  311. strNowPath.SetAt( iStart , 0 ) ;
  312. AddItem( strNowPath , iLevel , nItem ) ;
  313. iLevel ++ ;
  314. nItem ++ ;
  315. strNowPath.SetAt( iStart , cBackup ) ;
  316. }
  317. //select the path end item .
  318. SetCurSel( nItem - 1 ) ;
  319. return true ;
  320. }
  321. /***********************************************************
  322. ** @Description:
  323. ** getting the last SubPath from a PathString
  324. e.g. C:tempreadme.txt
  325. the result = readme.txt
  326. ** @Note:
  327. ** LPCTSTR strPath : the path.
  328. ** @Return:  the result path
  329. ** @Author :Table.JHM.太子
  330. ** e-mail :tablejiang@21cn.com
  331. ** Date :2001 3 26
  332. *************************************************************/
  333. CString CDriverCombo::GetDisplayPath(LPCTSTR strPath)
  334. {
  335. //
  336. // getting the last SubPath from a PathString
  337. // e.g. C:tempreadme.txt
  338. // the result = readme.txt
  339. static CString strTemp;
  340. int     iPos;
  341. strTemp = strPath;
  342. if ( strTemp.Right(1) == '\' )
  343.  strTemp.SetAt( strTemp.GetLength() - 1, '' );
  344. iPos = strTemp.ReverseFind( '\' );
  345. if ( iPos != -1 )
  346.     strTemp = strTemp.Mid( iPos + 1);
  347. return (LPCTSTR)strTemp;
  348. }
  349. /***********************************************************
  350. ** @Description:
  351. ** Delete all combo item .
  352. ** @Note:
  353. ** void 
  354. ** @Return: true ;
  355. ** @Author :Table.JHM.太子
  356. ** e-mail :tablejiang@21cn.com
  357. ** Date :2001 3 26
  358. *************************************************************/
  359. BOOL CDriverCombo::DeleteAllItem()
  360. {
  361. int iNum ;
  362. iNum = GetCount() ;
  363. for( int i = 0 ; i < iNum ; i ++ )
  364. {
  365. DeleteItem( 0 ) ;
  366. }
  367. return true ;
  368. }
  369. /***********************************************************
  370. ** @Description:
  371. ** the function return the combo current display path.
  372. ** @Note:
  373. ** void 
  374. ** @Return: current display path .
  375. ** @Author :Table.JHM.太子
  376. ** e-mail :tablejiang@21cn.com
  377. ** Date :2001 3 26
  378. *************************************************************/
  379. CString CDriverCombo::GetNowPath()
  380. {
  381. COMBOBOXEXITEM cbi;
  382. int iSel = GetCurSel() ;
  383. //if get error return NULL ;
  384. if( iSel == CB_ERR )
  385. return "" ;
  386. CString strPath ;
  387. char szName[MAX_PATH] ;
  388. strPath.Empty() ;
  389. int iLevel = 0 ;
  390. //get the path item.
  391. do
  392. {
  393. cbi.mask = CBEIF_IMAGE | CBEIF_INDENT | CBEIF_OVERLAY |
  394.  CBEIF_SELECTEDIMAGE | CBEIF_TEXT;
  395. cbi.iItem = iSel ;
  396. szName[0] = 0 ;
  397. cbi.pszText = szName ;
  398. cbi.cchTextMax = MAX_PATH ;
  399. if( GetItem( &cbi ) )
  400. {
  401. iLevel = cbi.iIndent / 2 ;
  402. strPath.Insert( 0 , "\" ) ;
  403. strPath.Insert( 0 , cbi.pszText ) ;
  404. }
  405. else
  406. break ;
  407. iSel -- ;
  408. }
  409. while( iLevel != 0 ) ;
  410. if( strPath.Right(1) == "\" )
  411. strPath.SetAt( strPath.GetLength() - 1, '' );
  412. return strPath ;
  413. }
  414. /***********************************************************
  415. ** @Description:
  416. ** Delete the directory item .
  417. ** @Note:
  418. ** void
  419. ** @Return: true ; 
  420. ** @Author :Table.JHM.太子
  421. ** e-mail :tablejiang@21cn.com
  422. ** Date :2001 3 26
  423. *************************************************************/
  424. BOOL CDriverCombo::DeleteDirectory()
  425. {
  426. int iNum ;
  427. int iLevel ;
  428. int iPos = 0 ;
  429. COMBOBOXEXITEM cbi;
  430. char szName[MAX_PATH] ;
  431. iNum = GetCount() ;
  432. for( int i = 0 ; i < iNum ; i ++ )
  433. {
  434. cbi.mask = CBEIF_IMAGE | CBEIF_INDENT | CBEIF_OVERLAY |
  435.  CBEIF_SELECTEDIMAGE | CBEIF_TEXT;
  436. cbi.iItem = iPos ;
  437. szName[0] = 0 ;
  438. cbi.pszText = szName ;
  439. cbi.cchTextMax = MAX_PATH ;
  440. if( GetItem( &cbi ) )
  441. {
  442. iLevel = cbi.iIndent / 2 ;
  443. }
  444. else
  445. return false ;
  446. //if the item is Indent , delete it!
  447. if( iLevel != 0 )
  448. {
  449. //MessageBox( szName ) ;
  450. DeleteItem( iPos ) ;
  451. }
  452. else
  453. iPos ++ ;
  454. }
  455. return true ;
  456. }
  457. /***********************************************************
  458. ** @Description:
  459. ** display the specify path.
  460. ** @Note:
  461. ** LPCTSTR szPath : the path .
  462. ** @Return: true ;
  463. ** @Author :Table.JHM.太子
  464. ** e-mail :tablejiang@21cn.com
  465. ** Date :2001 3 26
  466. *************************************************************/
  467. BOOL CDriverCombo::SetDisplayStr(LPCTSTR szPath)
  468. {
  469. m_NowDisplayPath = szPath ;
  470. DeleteDirectory( ) ;
  471. AddDirectory( m_NowDisplayPath ) ;
  472. return true ;
  473. }