Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

загрузка картинки из DLL [D7, WinXP]


Creative_ltd ©   (2006-06-07 12:49:00) 

использовала стандартный пример для хранения ресурсов с ДЛЛ (все, кто с ДЛЛ работает, его наверное знают):

procedure TForm1.Button1Click(Sender: TObject);
var
h: THandle;
Icon: THandle;
begin
h := LoadLibrary('RESTEST.DLL');

if h <= BadDllLoad then
  ShowMessage('Bad Dll Load')
else
begin
  Icon := LoadIcon(h, 'ICON_1');
  DrawIcon(Form1.Canvas.Handle, 10, 10, Icon);
  FreeLibrary(h);
end;
end;


А можно ли грузить из ДЛЛ не только иконки, но и картинки в формате bmp? Я написала вот тако код, но похоже он не работает, по крайней мере ничего не происходит. Не могли бы указать мне, в чем я ошиблась?

procedure TForm1.Button1Click(Sender: TObject);
var
h: THandle;
Icon: THandle;
B: TBitmap;
begin
B:=TBitmap.Create;
h := LoadLibrary(RESTEST.dll');

if h <= BadDllLoad then
  ShowMessage('Bad Dll Load')
else
begin
  B.Handle:= LoadBitmap(h, 'BITMAP1');
  Form1.Canvas.Draw(10,10, B);
  FreeLibrary(h);
end;
end;


Starik   (2006-06-08 13:02:00) [1]

Кста кто ответит на вопрос - а почему делфевый ресэдит такой кривой, что не держит больше 256 цветов, не вставляет музыку и т.д.? Борладн обленился? Или какие-то серьезные причины е?


Starik   (2006-06-08 09:15:00) [2]

>>Как избежать этого?
Избежать, говоришь, надо? Ну так давай избежим. Если ты, конечно, не против поработать ручками.
Сама проблема кроется в том, что у дельфи гнилой редактор ресурсов. Именно он не дает поддержку ресурсов больше определенного кол-ва цветов. Значит, его надо послать и создавать свои ресурсные файлы самому.

Первый шаг заключается в том, что нужно подготовить все необходимые битмапы для будущего ресурса. Нарисуй их, сохрани все в одну папку.
Затем создай в этой же папке просто текстовый документ. Переименуй его в BITMAPS.RC
Это скрипт-файл для компиляции ресура. Открой его в блокноте и напиши там следующее:

B1 BITMAP MYBMP1.BMP
B2 BITMAP MYBMP2.BMP
...
Bn BITMAP MYBMPn.BMP

важно - все писать БОЛЬШИМИ БУКВАМИ. Не знаю почему, но знаю, что надо.

Что здесь такое? B1, B2 и т.д. - это идентификаторы твоих битмапов в ресурсе. Именно по этим именам ты в будущем будешь вызывать их из длл-ки.

BITMAP - это указывает тип ресурса.
ну и последний параметр скрипт-строки указывает собственно имя файла, который будет загружен.

Далее полезай в папку C:\Program Files\Borland\Delphi7\Bin
вытаскивай оттуда файл brcc32.exe и копируй его туда же, где у тебя лежат битмапы и ресурс-скрипт.
Создай в этой же папке еще один текстовый документ, переименуй его в START.BAT.
Открой в блокноте и напиши одну единственную строчку:
brcc32 BITMAPS.RC
Сохрани и закрой. Теперь просто дважды щелкни по этому БАТу - он скомпилирует тебе твой ресурсный файл, который ты и будешь цеплять к длл-ке.

Код длл-ки:

library MULTYRES;

{$R BITMAPS.res}

begin
end.


А вот код твоего проекта, который будет грузить твою библиотеку с ресурсами:

var
 h: THandle;
 B : TBitmap;
begin
 h := LoadLibrary('MULTYRES.DLL');
 b := TBitmap.Create;
 if h <= 32 then
   ShowMessage('Bad Dll Load')
 else
 begin
   b.LoadFromResourceName(h, 'B1');
   Image1.Picture.Bitmap.Assign(b);
   FreeLibrary(h);
 end;

Соответственно, на форме должен лежать уже готовый Image1 : TImage.

var
 h: THandle;
 B : TBitmap;
begin
 h := LoadLibrary('MULTYRES.DLL');
 b := TBitmap.Create;
 if h <= 32 then
   ShowMessage('Bad Dll Load')
 else
 begin
   b.LoadFromResourceName(h, 'B1');
   Image1.Picture.Bitmap.Assign(b);
   FreeLibrary(h);
 end;

Соответственно, на форме у тебя уже должен лежать готовый Image1 : TImage.

А вообще мой тебе совет - написала бы ты свой ресурс-эдитор на основе того, что я тебе наговорил.


Creative_ltd   (2006-06-07 15:20:00) [3]

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


esVer   (2006-06-07 14:59:00) [4]

var
 bm: TBitmap;
begin
 bm := TBitmap.Create;
 bm.LoadFromResourceName(HInstance, 'BITMAP1');
 ...
 bm.Free;


Наверх

Титульная страница Поиск, карта сайта Написать письмо