Имеется диалоговое окно, на котором находится ListCtrl, со стилем LVS_REPORT, в котором должна находиться информация о дисках. Строка должна содержать чекбокс, иконку диска, имя диска.
Проблема зыключается в том, что иконки дисков выводятся только при первом вызове диалога MyDrivesDlg. При втором и последующем вызовах иконки дисков упорно не хотят показываться. И так до перезапуска приложения.
Вызов диалога осуществляется так:
void CMainDlg::OnDrivesButton()
{
CMyDrivesDlg dlg;
int nRet = dlg.DoModal();
}
Код CMyDrivesDlg::OnInitDialog() приведен ниже. Из него правда выкинуто все, что не касается сути вопроса (типа определения количества дисковых устройств и т.д. — в данном случае это не существенно).
Переменные:
CListCtrl m_listDrives;
CImageList m_imlSmallDrives;
члены класса CMyDrivesDlg.
BOOL CMyDrivesDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_listDrives.ModifyStyle(LVS_TYPEMASK, LVS_REPORT);
m_listDrives.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT);
SHFILEINFO info;
DWORD dwRet;
HIMAGELIST hImgList;
UINT uFlags = SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON;
dwRet = SHGetFileInfo ( _T("C:\\"), FILE_ATTRIBUTE_NORMAL,
&info, sizeof(SHFILEINFO), uFlags );
hImgList = reinterpret_cast<HIMAGELIST>( dwRet );
ASSERT ( NULL != hImgList );
if ( NULL != m_imlSmallDrives.GetSafeHandle() )
{
m_imlSmallDrives.Detach();
}
VERIFY ( m_imlSmallDrives.Attach ( hImgList ));
m_listDrives.SetImageList(&m_imlSmallDrives, LVSIL_SMALL );
ASSERT(m_listDrives.GetImageList(LVSIL_SMALL) == &m_imlSmallDrives);
SHFILEINFO sfi;
UINT uFlags = SHGFI_ICON | SHGFI_DISPLAYNAME;
SHGetFileInfo (_T("C:\\"), 0, &sfi, sizeof(SHFILEINFO), uFlags);
m_listDrives.InsertItem(0, sfi.szDisplayName , sfi.iIcon);
}
Что я делаю не так? MSDN по этому поводу молчит как рыб. Google, отсылая на Codeproject рекомендует: If this isn't the first call, detach our CImageList object from the old image list and attach to the one whose handle we just got from SHGetFileInfo(). Вроде следую этой рекомендации, а все равно иконки дисков пропадают.