DrvListBox.cpp
上传用户:davidcaozc
上传日期:2007-01-01
资源大小:13k
文件大小:5k
源码类别:

组合框控件

开发平台:

Visual C++

  1. // ==========================================================================
  2. // DrvListBox.cpp : implementation file
  3. // ==========================================================================
  4. #include "stdafx.h"
  5. #include "DrvListBox.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. // ==========================================================================
  12. // Construction/Destruction
  13. // ==========================================================================
  14. CDrvListBox::CDrvListBox() :
  15.   m_pDriveStrings( NULL ),
  16. m_pImageList( NULL )
  17. {
  18. }
  19. CDrvListBox::~CDrvListBox()
  20. {
  21.   // detach system image list before deleting it: otherwise when I delete the 
  22. // list I'd be deallocating the system-wide image list
  23. if( m_pImageList != NULL )
  24. {
  25. m_pImageList->Detach();
  26. delete m_pImageList;
  27. }
  28. // this should be safe since all pointers into that buffer are destroyed
  29. // at the "same" time
  30. if( m_pDriveStrings != NULL )
  31. delete[] m_pDriveStrings;
  32. }
  33. // ==========================================================================
  34. // Message Map
  35. // ==========================================================================
  36. BEGIN_MESSAGE_MAP(CDrvListBox, CComboBoxEx)
  37. //{{AFX_MSG_MAP(CDrvListBox)
  38. //}}AFX_MSG_MAP
  39. END_MESSAGE_MAP()
  40. // ==========================================================================
  41. // Load Items - collects all drive information and place it into the listbox,
  42. // return number of items added to the list: a negative value is an error;
  43. // ==========================================================================
  44. int CDrvListBox::LoadItems( const bool bLargeIcons )
  45. {
  46. if( m_pDriveStrings != NULL )
  47. return -1; // duplicate calls are not implemented
  48. // allocate buffer for the drive strings: GetLogicalDriveStrings will tell
  49. // me how much is needed (minus the trailing zero-byte)
  50. size_t lAllDriveStrings = GetLogicalDriveStrings( 0, NULL );
  51.   _ASSERT( m_pDriveStrings == NULL );
  52. m_pDriveStrings = new _TCHAR[ lAllDriveStrings + sizeof( _T("")) ]; // + for trailer
  53.   if( GetLogicalDriveStrings( lAllDriveStrings, m_pDriveStrings ) != lAllDriveStrings - 1 )
  54. return -2;
  55. _ASSERT( m_pDriveStrings != NULL );
  56.   // this structure is used to enter items into the CComboBoxEx, preset
  57. // some parts before loop to fill box starts; I need to set both 
  58. // standard and selected images or I won't see an icon when an entry
  59. // is selected; the lParam is set so I can have direct access to the
  60. // selected root path.
  61. COMBOBOXEXITEM CBEItem;
  62. CBEItem.mask = CBEIF_IMAGE | 
  63. CBEIF_SELECTEDIMAGE | CBEIF_TEXT | CBEIF_LPARAM;
  64. CBEItem.cchTextMax = 0; // is ignored
  65. CBEItem.iItem = -1; // insert at end
  66.   
  67. // now loop over each drive (string)
  68. _TCHAR *pDriveString = m_pDriveStrings;
  69. size_t  lDriveString = strlen( pDriveString );
  70. DWORD dIconSize    = bLargeIcons ? SHGFI_LARGEICON : SHGFI_SMALLICON;
  71. while( lDriveString > 0 )
  72. {
  73.     // retrieve display string and icon handle
  74. SHFILEINFO FileInfo;
  75. DWORD r = SHGetFileInfo( pDriveString, 0, &FileInfo, sizeof( FileInfo ),
  76. SHGFI_DISPLAYNAME | SHGFI_SYSICONINDEX | dIconSize );
  77. if( r == 0 ) // failure - which can be ignored 
  78. {
  79. TRACE0( "SHGetFileInfo failed, no more details availablen" );
  80. }
  81. else
  82. {
  83. // insert icon and string into list box
  84. CBEItem.pszText = FileInfo.szDisplayName;
  85. CBEItem.lParam  = ( LPARAM )pDriveString;
  86. CBEItem.iSelectedImage =
  87.       CBEItem.iImage = FileInfo.iIcon; // index into system image list
  88. VERIFY( InsertItem( &CBEItem ) >= 0 );
  89. }
  90.     // setup for next drive string (next round in loop)
  91.     pDriveString += lDriveString + 1;
  92. lDriveString = strlen( pDriveString );
  93. }
  94.   // have items in list, now provide image list: it seems I cannot just
  95. // pass the system image list (see notes on System Image List by Marc
  96. // Otway) so I create a copy on the fly (code based also on Marc's)
  97. _ASSERT( m_pImageList == NULL );
  98.   m_pImageList = new CImageList;
  99. // load the system image list - use an arbitrary file extension for the
  100. // call to SHGetFileInfo (we don't want to touch the disk, so use
  101. // FILE_ATTRIBUTE_NORMAL && SHGFI_USEFILEATTRIBUTES)
  102. SHFILEINFO FileInfo;
  103. VERIFY( m_pImageList->Attach(( HIMAGELIST )SHGetFileInfo( _T(".txt"),
  104. FILE_ATTRIBUTE_NORMAL, &FileInfo, sizeof( FileInfo ),
  105. SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | dIconSize )));
  106.   // make the background colour transparent, works better for lists etc.
  107. m_pImageList->SetBkColor( CLR_NONE );
  108. // don't forget to set it up!
  109. VERIFY( SetImageList( m_pImageList ) == NULL );
  110. // done.
  111. return GetCount();
  112. }