Авторизация

Логин: Пароль:
Регистрация Забыли свой пароль?

Извлечение иконок из dll

Страницы: 1
Извлечение иконок из dll
В user32.dll есть функция loadicon. Подскажите, как её можно использовать и что ей передавать в качестве параметра
Читайте описание функции здесь http://www.pinvoke.net/default.aspx/user32/LoadIcon.html
Спасибо, не сильно помогло. Может быть, у кого есть пример использования? И еще вопрос можно ли загрузить эти иконки в ImageList?
Основная сложность здесь в преобразовании winapi-объекта в .NET
Код
 #reference 'System.Windows.Forms.dll'
#reference 'System.Drawing.dll'
 
uses System, System.Windows.Forms, System.Drawing;
 
function LoadIcon(Instance: IntPtr; IconName: IntPtr): IntPtr; external 'user32.dll' name 'LoadIcon';
function DestroyIcon(hIcon: IntPtr): boolean; external 'user32.dll' name 'DestroyIcon';
 
var
  x, inst: IntPtr;
  f: Form;
  icon1: Icon;
 
begin
  x := LoadIcon(IntPtr.Zero, IntPtr(32516)); //грузим иконку; 32516 - идентификатор системной иконки "информация".
  icon1 := Icon(Icon.FromHandle(x).Clone()); //копируем иконку себе
  DestroyIcon(x); //освобождаем winapi-ресурсы (правильно, т.к. иконка уже скопирована к нам)
 
  //Теперь иконку можно использовать. Например, так.
  f := new Form();
  f.Visible := true;
  f.Icon := icon1;
  Sleep(2000);
end.
Спасибо, уже намного понятнее. А можно извлечь иконку, если известно её имя
Можно
Код
 #reference 'System.Windows.Forms.dll'
#reference 'System.Drawing.dll'
 
uses System, System.Windows.Forms, System.Drawing, System.Runtime.InteropServices;
 
function LoadIcon(Instance: IntPtr; IconName: integer): IntPtr; external 'user32.dll' name 'LoadIcon';
function DestroyIcon(hIcon: IntPtr): boolean; external 'user32.dll' name 'DestroyIcon';
function LoadLibrary(libName: string): IntPtr; external 'kernel32.dll' name 'LoadLibrary';
 
var
  x, inst, lib: IntPtr;
  f: Form;
  icon1: Icon;
 
begin
  lib := LoadLibrary('shell32.dll'); //грузим библиотеку
  x := LoadIcon(lib, 47); //грузим иконку
  icon1 := Icon(Icon.FromHandle(x).Clone()); //копируем иконку себе
  DestroyIcon(x); //освобождаем winapi-ресурсы (правильно, т.к. иконка уже скопирована к нам)
 
  //Теперь иконку можно использовать. Например, так.
  f := new Form();
  f.Visible := true;
  f.Icon := icon1;
  Sleep(2000);
end.
Еще раз спасибо, но у меня снова проблема. Суть в том, что я сейчас загружаю значки размером 32х32, а мне нужно отображать 16х16. При масштабировании изображение сильно портиться. Это можно как-то исправить
Да, вот так
Код
 #reference 'System.Windows.Forms.dll'
#reference 'System.Drawing.dll'
 
uses System, System.Windows.Forms, System.Drawing, System.Runtime.InteropServices;
 
function DestroyIcon(hIcon: IntPtr): boolean; external 'user32.dll' name 'DestroyIcon';
function ExtractIconExA(fileName: string; iconIndex: integer; var iconLarge, iconSmall: IntPtr; nIcons: integer): IntPtr; external 'shell32.dll' name 'ExtractIconExA';
 
 
var
  x, i1, i2: IntPtr;
  f: Form;
  icon1: Icon;
 
begin
  x := ExtractIconExA('shell32.dll', 4, i1, i2, 1); //грузим иконку
  icon1 := Icon(Icon.FromHandle(i2).Clone()); //копируем иконку себе
  DestroyIcon(i1); DestroyIcon(i2);//освобождаем winapi-ресурсы (правильно, т.к. иконка уже скопирована к нам)
 
  //Теперь иконку можно использовать. Например, так.
  writeln(icon1.Height);
  writeln(icon1.Width);
  f := new Form();
  f.Visible := true;
  f.Icon := icon1;
  Sleep(2000);
end.
Вот, теперь то, что нужно. Еще бы знать, как можно получать имена всех иконок в dll, было бы замечательно
Изменено: Sergeiv - 30.12.2009 22:38:54
Воспользуйтесь редактором ресурсов
Для этого нужно использовать ту же функцию ExtractIconExA.
Код
 #reference 'System.Windows.Forms.dll'
#reference 'System.Drawing.dll'
 
uses System, System.Windows.Forms, System.Drawing, System.Runtime.InteropServices;
 
function DestroyIcon(hIcon: IntPtr): boolean; external 'user32.dll' name 'DestroyIcon';
function ExtractIconExA(fileName: string; iconIndex: integer; var iconLarge, iconSmall: IntPtr; nIcons: integer): IntPtr; external 'shell32.dll' name 'ExtractIconExA';
 
var
  x, i1, i2: IntPtr;
  f: Form;
  icon1: Icon;
 
begin
  x:= ExtractIconExA('shell32.dll', -1, i1, i2, 0);
  writeln(x.ToInt32);
end.
Страницы: 1
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)