Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Стандартные иконки Windows


Visual C++ - расширенное программирование

Выпуск      : 22
Подписчиков : 6091
Cайт        : codeguru.ru
Архив       : Visual C++ - расширенное программирование (архив)
В этом выпуске
От автора

Здравствуйте уважаемые подписчики !

Сегодня перед вами еще один выпуск рассылки "Visual C++ - расширенное программирование".

Признаю, что, к сожалению, рассылка не выходила очень долго. Виной всему - катастрофическая нехватка времени. Дело в том, что ваш покорный слуга, ведущий данной рассылки пишет книгу, посвященную программированию на JavaScript. Книга уже почти готова, осталось пара последних, самых сложных глав. Да, к сожалению, работая над книгой я совсем забыл о рассылке. Однако очень скоро, обещаю, она будет выходить гораздо более часто и периодично.

Напоминаю, что, как обычно, вы можете отправить свои пожелания (замечания, предложения, сообщения об ошибках) по поводу рассылки и сайта по этому адресу.
Если вы хотите создать и вести какой либо раздел в этой рассылке - также пишите мне.

И, как всегда, вы можете задать свои вопросы по программированию на сайте в форуме.
Или обсудить их в дискуссионном листе "Программирование. форум !!!".

Многим может быть также интересна рассылка: C/C++ Вопрос-Ответ, содержимое которой формируется из писем читателей. Здесь Вы можете задать вопрос по программированию на C/C++ и ответить на вопросы других подписчиков.

С уважением, Вахтуров Виктор.

Статьи

Стандартные иконки Windows

Введение

При решении задач прикладного программирования в Windows иногда возникает необходимость отображения пиктограмм (иконок), семантически связанных с некоторым объектом графической среды. Такими иконками являются, например, иконки, ассоциированные с расширениями файлов и стандартные иконки оболочки (иконки папок, устройств). Эти пиктограммы обычно отображаются в проводнике, на рабочем столе, в диалоге открытия/сохранения файла. Но, если вы пишете, к примеру, файловый менеджер, задача отображения иконок данного типа встанет и перед вами.
В этой скромной статье приводится несколько способов получения дескрипторов иконок упомянутого типа.

Получение иконки, ассоциированной с файлом

Давайте рассмотрим только что упомянутую задачу отображения иконок, ассоциированных с файлами в панели файлового менеджера. Особенностью данного случая является то, что файлы, для которых необходимо получить ассоциированные пиктограммы, физически присутствуют в файловой системе. В данном случае уместно применение API-функций ExtractAssociatedIcon или ExtractAssociatedIconEx. Далее приведен листинг их прототипов.

HICON ExtractAssociatedIcon(
    HINSTANCE hInst,
    LPTSTR lpIconPath,
    LPWORD lpiIcon
);

HICON ExtractAssociatedIconEx(
    HINSTANCE hInst,
    LPTSTR lpIconPath,
    LPWORD lpiIconIndex,
    LPWORD lpiIconId
);

Данные функции (полное их описание см. в MSDN) возвращают дескриптор иконки, ассоциированной с файлом, путь к которому передан в качестве строкового параметра lpIconPath. Параметр lpIconPath должен содержать полный путь к файлу, включающий имя файла.

Стоит заметить, что для исполняемого модуля эти функции возвращают дескриптор пиктограммы, содержащейся в нем самом, а для файлов документов ассоциациированных с определенным приложением - дескриптор иконки данного приложения (исполняемого файла, ассоциированного с файлом, для которого получается пиктограмма). К слову, получить дескриптор иконки, содержащейся в исполняемом модуле или DLL можно при помощи функции ExtractIconEx.

Однако допустим, что Вам необходимо находить иконки, опираясь только на информацию о расширении файла. То есть, получить иконку, ассоциированную с файлами, имеющими определенное расширение. Тогда вы вполне можете применить API-функцию SHGetFileInfo.

Вообще, функция SHGetFileInfo предназначена для более широкого круга задач - она возвращает информацию о некотором объекте файловой системы (таком как файл, папка, корень логического диска). Прототип данной функции приведен далее.

DWORD_PTR SHGetFileInfo(
    LPCTSTR pszPath,
    DWORD dwFileAttributes,
    SHFILEINFO *psfi,
    UINT cbFileInfo,
    UINT uFlags
);

В качестве первого параметра функции необходимо передать путь к файлу, информация о котором должна быть найдена. Путь может быть как абсолютным, так и относительным. Функция возвращает информацию в структуре SHFILEINFO, указатель на которую передается в качестве третьего параметра, а ее размер - в качестве четвертого. Во втором параметре передается комбинация флагов атрибутов файла, а в пятом - флаги, указывающие, какую конкретно информацию необходимо получать. За более подробным описанием данной функции вы можете обратиться к MSDN. Здесь же я приведу только пример ее использования для получения дескриптора иконки, ассоциированной с файлами с определенным расширением.

Итак. Перед нами стоит задача получения иконки, ассоциированной с файлами определенного типа. При этом мы не имеем представления о подобных файлах, расположенных в файловой системе. Поэтому, для использования функции SHGetFileInfo нам необходимо сформировать любое произвольное имя, имеющее выбранное расширение. Далее приводится листинг функции, принимающей в качестве параметра строку расширения, и возвращающей дескриптор пиктограммы, ассоциированной с файлами, имеющими данное расширение.

HICON GetIconByExtension(LPCTSTR lpszExtension)
{
    CString strFakeName = CString("fake.") + lpszExtension;

    SHFILEINFO sFileInfo;

    memset(&sFileInfo, 0, sizeof(sFileInfo));

    SHGetFileInfo(
        (LPCTSTR) strFakeName,
        FILE_ATTRIBUTE_NORMAL,
        &sFileInfo,
        sizeof(sFileInfo),
        SHGFI_ICON | SHGFI_USEFILEATTRIBUTES);

    return sFileInfo.hIcon;
}

Обратите внимание, что воизбежание возникновения утечки ресурсов, иконку, полученную в результате вызова данной функции необходимо удалять при помощи DestroyIcon.

Получение стандартных иконок оболочки

Кроме описанных ранее случаев, при разработке прикладных программ, может возникнуть необходимость отображения пиктограмм, имеющих графическое представление, идентичное различным элементам оболочки windows (например, иконок открытых и закрытых папок, иконки корзины, и.т.д.). Получение этих иконок становится достаточно простым делом, если знать, что они содержатся в виде ресурсов в модуле динамической библиотеки SHELL32.DLL.

Для загрузки пиктограммы из исполняемого модуля можно применить упоминавшуюся ранее API-функцию ExtractIconEx. Листинг ее прототипа приведен далее.

UINT ExtractIconEx(
    LPCTSTR lpszFile,
    int nIconIndex,
    HICON *phiconLarge,
    HICON *phiconSmall,
    UINT nIcons
);

Данная функция создает массив больших, либо маленьких иконок, полученных из исполняемого файла, либо файла иконок (обычно имеют расширение ico). Параметр lpszFile определяет путь к файлу, содержащему пиктограммы. Параметр nIconIndex указывает индекс первой получаемой иконки, а параметр nIcons - количество получаемых иконок. Параметры phiconLarge и phiconSmall являются указателями на массивы, которые будут заполнены дескрипторами больших и малых пиктограмм, соответственно. Более подробно о функции ExtractIconEx можно узнать в MSDN.

Возникает вопрос - какие же именно иконки содержатся в модуле SHELL32.DLL и какие они имеют индексы ? Ответ на него можно легко получить, открыв библиотеку SHELL32.DLL в любом редакторе ресурсов (благо, таких программ полно в сети). Так, иконка с индексом 3 является иконкой закрытой, а иконка с индексом 4 - открытой папки. Иконка с индексом 11 содержит изображение диска CD-ROM, а иконка с индексом 37 - изображение принтера. Таким образом, получение дескриптора малой пиктограммы открытой папки, может выглядеть, например, так:

HICON hIcon;

ExtractIconEx("SHELL32.DLL", 4, NULL, &hIcon, 1);

Полученные данным способом иконки также надо удалять при помощи DestroyIcon.

Как видите, данный способ получения иконок достаточно прост. И его можно было бы смело применять, если бы не одно обстоятельство. Дело в том, что стандартные иконки оболочки могут быть заменены на произвольные путем перечисления их в ключе реестра [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons]. Например, добавив в данный раздел реестра параметр с именем 4 и строковым значением "D:\__tmp\test.ico,0", можно изменить иконку, отображающуюся в качестве пиктограммы открытой папки в оболочке. Таким образом, для получения стандартных иконок, соответствующих различным элементам графической среды, неплохо было бы проверять указанный ключ реестра, и, если в нем есть параметр, имеющий имя, соответствующее индексу получаемой иконки, пытыться загрузить ее из источника, указанного в качестве значения данного параметра.

На этом позвольте закончить данную статью.

Автор статьи: Вахтуров Виктор.

Книги по C/C++
Microsoft Visual C++ .NET
Microsoft Visual C++ .NET

Автор: Гюнтер Штайнер

Книга предназначена для программистов, имеющих опыт программирования на процедурных языках, и представляет собой справочник по программному продукту Visual C++ .NET.

Подробно рассматривается интегрированная среда разработки, методика разработки и отладки программ (средства управления проектом, мастера, редакторы ресурсов, инструментарий отладки, утилиты разработки справочной системы). Значительная часть книги посвящена программированию с MFC, причем практическая тематика дополнена основополагающими теоретическими сведениями по программированию в среде Windows. Уделено внимание программированию баз данных, программированию в среде Интернета, использованию рабочих библиотек С и C++.

Страница книги на Озоне
Интерактивная компьютерная графика. Вводный курс на базе OpenGL, 2-е изд.
Интерактивная компьютерная графика. Вводный курс на базе OpenGL, 2-е изд.

Автор: Эдвард Энджел

Книга представляет собой вводный курс компьютерной графики, в котором основной упор сделан на вопросах прикладного программирования. Она включает описание структуры графических систем и обсуждение основных концепции формирования изображений трехмерных объектов и сцен. Рассматривается взаимодействие освещения и материалов, также приводятся основные сведения о методах тонирования освещенных поверхностей, принципах иерархической организации графических моделей и новых возможностях современных аппаратных графических средств. В книгу включены те разделы линейной алгебры и геометрии, которые необходимы для понимания основ компьютерной графики. Обсуждаются методы построения кривых и поверхностей, языковые модели, фракталы и системы частиц, а также методика применения графических средств для визуализации результатов научных расчетов.

Весь теоретический материал в книге иллюстрируется программами на OpenGL.

Книга адресована в основном студентам старших курсов и аспирантам первого года обучения, специализирующимся в области информатики и вычислительной техники, но будет также полезна и многим профессионалам.

Страница книги на Озоне
Рассылки и дискуссионные листы компьютерной тематики
Рассылки
C/C++ Вопрос-Ответ

Это - интерактивная рассылка !
Здесь Вы можете задать свой вопрос по программированию на C и C++, а также ответить на вопросы других подписчиков.


Программирование на JavaScript

Все аспекты программирования на JavaScript - нестандартные приемы, ОРИГИНАЛЬНЫЕ скрипты, авторские статьи и наработки. "JavaScript solutions" - в каждом выпуске готовый к применению ИНТЕРЕСНЫЙ скрипт (исходный код с комментариями).

Дискуссионные листы
Программирование. Форум !!!

Самый популярный дискуссионный лист по программированию на subscribe.ru, существующий с момента открытия сервиса дискуссионных листов !

Задайте здесь любой вопрос по программированию - и Вы получите ответ. Участвуйте в оживленных дискуссиях, обсуждайте интересные темы. Давайте ответы сами. Ведь это форум !!! Здесь просто интересно ! Присоединяйтесь !

Вебстроительство. Форум !!!

В дискуссионном листе ведется обсуждение различных аспектов создания сайтов - написание скриптов, использование, настройка портальных движков, и многое другое. Присоединяйтесь !

Поисковые системы. Форум !!!

Этот дискуссионный лист посвящен обсуждению поиковых систем, методов индексации сайтов поисковиками, способам оптимизации сайта под поисковые системы.

Хостинг. Обзоры и обсуждения платного и бесплатного хостинга.

Вы ищете хостинг (платный, бесплатный) ? Хотите спросить совета в выборе ? Можете обсудить это здесь. Поделитесь советом, если знаете. Или узнайте больше. Все о хостинге.


Всего доброго. До встречи в следующем номере.

В избранное