Исходники
Статьи
Языки программирования
.NET Delphi Visual C++ Borland C++ Builder C/С++ и C# Базы Данных MySQL MSSQL Oracle PostgreSQL Interbase VisualFoxPro Веб-Мастеру PHP HTML Perl Java JavaScript Протоколы AJAX Технология Ajax Освоение Ajax Сети Беспроводные сети Локальные сети Сети хранения данных TCP/IP xDSL ATM Операционные системы Windows Linux Wap Книги и учебники
Скрипты
Магазин программиста
|
Ishodniki.Ru » Online книги » C++ Builder по шагам Шаг 14 - Извлечение иконки по расширению файла и ее загрузка из DLL или EXE Наверняка многие задумывались, как это сделать, на собственном опыте знаю. Это на самом деле не так сложно. В разделе Software/CLASSES раздела HKLM хранится информация по расширениям для всех общеиспользуемых файлов. Информация записывается как раздел с именем "."+расширение файла. Если не верите, сами можете в regedit'е посмотреть. Далее, параметр "" содержит строку, пересылающую нас на конкретный тип фацла, тоже являющимся разделом там же. Именно этот раздел хранит информацию о типе файла. "По умолчанию" в разделе прописан тип строкой, например "WinZip file". В подразделе DefaultIcon указан в том же параметре путь к иконке с файлом. Тут является еще одна проблема - иконки чаще всего хранятся в EXE или DLL файлах, а стандартными способами C++Builder ее оттуда не выудишь. Но с этим мы справимся. Еще есть раздел shell, тоже очень интересный, но пока он нам не нужен. Займемся иконками. Нужно создать новое приложение и положить на него компоненты TEdit , TImage , TButton и TLabel . Приблизительно форма должна выглядеть так: Свойство Center объекта Image1 лучше всего установить в true, тогда изображения автоматически будет центрироваться. Кодовый листинг будет такой: #include <registry.hpp> void __fastcall TForm1::Button1Click(TObject *Sender) { String s=Edit1->Text; if(s[1]!='.')s="."+s; TRegistry* reg=new TRegistry; reg->RootKey=HKEY_LOCAL_MACHINE; reg->OpenKey("Software\\CLASSES",false); if(!reg->OpenKey(s,false))return; bool open=false; s=reg->ReadString(""); open=reg->OpenKey("\\Software\\CLASSES\\"+s+"\\DefaultIcon",false); s=reg->ReadString(""); if(s=="%1")return; int pos=s.LastDelimiter(","); int index=s.SubString(pos+1,s.Length()-pos).ToInt(); s.Delete(pos,s.Length()-pos+1); Image1->Picture->Icon->Handle=ExtractIcon(HInstance,s.c_str(),index); } По-моему, по количеству появлений здесь главную роль играет строка s ;). Листинг вроде понятный. При неудаче открытия раздела OpenKey возвращает false. Единственное - для файлов ICO и EXE иконка задается внутри самого файла по индексу, то есть по умолчанию может не быть. Тогда параметр DefaultIcon содержит значение "%1". Естественно, что имени конкретного файла мы не знаем, для этого я возврат и вставил. Далее вычисляется путь к DLL или EXE и индекс иконки. Они идут через запятую, например "C\Мои документы\prog.exe, 1". Обратите внимание, что бэкслэш "\" пишется как "\\", потому что это ESC-комбинации. В последней строчке вызывается функция WinAPI ExtractIcon(). Первым параметром у нее идет HInstance, переменная приложения, затем NULL-term строка и индекс иконки. Она возвращает Handle иконки. Свойство Picture класса TImage имеет вложенное свойство TIcon, содержащее ICO файл. Его-то Handle мы и нашли этой функцией. Вот и все на этот раз. Это заготовка для создания файлового менеджера, как мне кажется, правда, очень уж базовая ;). |
Форум Программиста
Новости Обзоры Магазин Программиста Каталог ссылок Поиск Добавить файл Обратная связь Рейтинги
|