Теряется system image list
От: Dmitry V. Россия  
Дата: 05.12.04 11:16
Оценка:
Имеется диалоговое окно, на котором находится 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(). Вроде следую этой рекомендации, а все равно иконки дисков пропадают.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.