Сообщений 4 Оценка 1 Оценить |
Демонстрационная программа – 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 Оценить |