Сообщений 4    Оценка 1        Оценить  
Система Orphus

CIconDialog – Расширяем MFC

Класс диалога выборки иконок из исполняемых файлов

Автор: Армен Акопян
Опубликовано: 10.11.2002
Исправлено: 13.03.2005
Версия текста: 1.0

Предисловие
Справка по классу

Демонстрационная программа – 12Kb
Демонстрационный проект – 26Kb
Только исходные файлы класса – 3Kb

Предисловие

Как-то, разрабатывая одну Мастер-Программу (Wizard Application), мне понадобился диалог для выборки иконок из исполняемых файлов, какой можно видеть, если щелкнуть на кнопку “Change Icon…” из окна свойств любого ярлыка. ( См. Рисунок 1. )


Рисунок 1.

До этого дня я пребывал в уверенности, что если это и не реализовано в MFC или ATL в виде класса стандартных диалогов, то точно есть какая-либо Windows API функция, которая решит эту проблему. Представьте себе мое удивление, когда, обыскав весь MSDN, я не обнаружил никакого упоминания об этом. Перейдя на поиск в The CodeProject (где опубликован оригинал этой статьи), я случайно натолкнулся на статью Хэнка Девоса, и оказалось, что Microsoft не документировала эту API функцию. Она реализована в Shell32.dll под порядковым номером 62, и, соответсвенно, ее можно использовать, динамически загрузив эту библиотеку. Так как мой Мастер был написан с помощью MFC, то я написал класс CIconDialog наподобие стандартных классов MFC (CColorDialog и т.д.) на базе этой функции. Ее подробное описание можно найти по предпоследней ссылке выше.


Рисунок 2.

Пример использования:

//...
#ifndef __ICONDLG_H__
    #include "IconDialog.h"
#endif
//...

void CSomeDlg::OnBtnClickedBrowse( void )
{
    // If icon container file is not specified in the parameter
    // then by default it will open Shell32.dll file:
    // CIconDialog dlg( NULL, 0, this );
    //
    // You can specify any initial file name and icon index ( if exist ).
    // In this case will open shell icons with 149-th icon 
    // ( index is 0 – based, so 148 + 1 ) selected:

    CIconDialog dlg( _T( "%SystemRoot%\\system32\\SHELL32.dll" ), 148, this );

    if ( dlg.DoModal() == IDOK )
    {
        m_hIcon = dlg.GetIconHandle();
        SetIcon( m_hIcon, FALSE );

        // Or:
        // m_hIcon = ::ExtractIcon( AfxGetInstanceHandle(), 
        //		  dlg.GetIconFile(), dlg.GetIconIndex() );
    }
}

//...

Справка по классу

Базовый класс:

CCommonDialog

Конструктор/деструктор:

CIconDialog (
IN LPCTSTR lpszIconFile = NULL, - имя файла-контейнера иконок
IN DWORD dwIconIndex = 0, - индекс изначально выбранной из файла иконки
IN CWnd* pParentDlg = NULL - родительское окно диалога
)

Функции-члены класса:

DoModal() - Открывает диалог и позволяет пользователю выбрать иконку.
GetIconFile() - Возвращает имя выбранного файла.
GetIconCount() - Возвращает число иконок в выбранном файле.
GetIconIndex() - Возвращает индекс иконки выбранной пользователем в диалоге.
GetIconHandle() -Возвращает описатель иконки выбранной пользователем в диалоге.

Проверено под Windows 98/Me, Windows 2000/XP. Мне кажется, не должно быть проблем и под Windows 95 и NT 4.0. Если проверите, пожалуйста, сообщите.


Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.
    Сообщений 4    Оценка 1        Оценить