![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
загрузка картинки из 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;