Теряется 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(). Вроде следую этой рекомендации, а все равно иконки дисков пропадают.
Re: Теряется system image list
От: Patalog Россия  
Дата: 05.12.04 12:56
Оценка:
Здравствуйте, Dmitry V., Вы писали:

[]

m_imlSmallDrives.Detach();

— далай это при закрытии диалога. Или даже в деструкторе диалога.
Почетный кавалер ордена Совка.
Re[2]: Теряется system image list
От: Dmitry V. Россия  
Дата: 05.12.04 13:08
Оценка:
Здравствуйте, Patalog, Вы писали:

P>Здравствуйте, Dmitry V., Вы писали:


P>[]


P>
P>m_imlSmallDrives.Detach();
P>

P>- далай это при закрытии диалога. Или даже в деструкторе диалога.


Спасибо, помогло.
Только возник еще один вопрос.

если детаю в деструкторе диалога так:

1)
if ( NULL != m_imlSmallDrives.GetSafeHandle() )
    {
        m_imlSmallDrives.Detach();
    }


то ничего не работает
если же просто написать в деструкторе диалога

2)
m_imlSmallDrives.Detach();

то все нормально.

Опять же, если делать
3)
m_imlSmallDrives.Detach();

при закрытии диалога, иконки так и не появляются.

Почему в случае 2) все нормально, а в случаях 1) и 3) нет? Проблема решена, вопрос чисто академический уже, но все же интересно. Может кто-нибудь пояснит ситуацию?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.