Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > "Can only modify an image if it contains a bitmap"


Автор: quard 16.4.2006, 12:54
 dll:
Код

library cnv;

uses
  ExtCtrls, Graphics;

procedure dllMain(Img: TImage);
begin
  Img.Canvas.Brush.Color := clGreen;
  Img.Canvas.FillRect(Img.ClientRect);
end;

exports
  dllMain;

begin
end.


прога:

Код

// ...

procedure dllMain(Img: TImage); external 'cnv.dll';

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  dllMain(Image1);
  Image1.Canvas.Brush.Color := clRed;
  Image1.Canvas.FillRect(Image1.ClientRect);
end;

end.



При нажатии на кнопку ругается: "Can only modify an ... " smile(((
 smile  smile  

Автор: Alexeis 17.4.2006, 10:13
Ругается он потому что не заданы размеры изображения.
Вообщем я это обошел так.
Код

procedure dllMain(Img :TImage); external 'cnv.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
  dllMain(Image1);
end;


Код

library cnv;
uses
  Classes, Controls, ExtCtrls, Graphics;


procedure dllMain(Img : TImage);
begin
  Img.picture.Bitmap.Width  := Img.ClientWidth;
  Img.Picture.Bitmap.Height := Img.ClientHeight;
  Img.Picture.Bitmap.Canvas.Brush.Color := 0;
  Img.Picture.Bitmap.Canvas.FillRect(Img.ClientRect);
end;
    
exports    
  dllMain;

begin

end.
 

Автор: quard 17.4.2006, 18:32
Гм... Получилось! Сэнк..)) smilesmile
Но получается что рисовать можно только на канве битмапа smile((... 

Автор: z-END 17.4.2006, 18:50
Цитата(quard @  17.4.2006,  19:32 Найти цитируемый пост)
Но получается что рисовать можно только на канве битмапа

именно так.. а чтобы рисовать на чем угодно нужно использовать промежуточную канаву..
т.е. например есть картинка JPEG загружаем ее в picture_1 далее канаве_1 задаем теже размеры что и у picture_1, после чего делаем канава_1.Draw(0,0,picture_1.graphic); и уже канаву_1 отображаем в TImage, где уже спокойно рисуемsmile 

Автор: quard 18.4.2006, 00:45
Спасибо. Работает. Но я столкнулся с новой проблемой:

Изображения не накладываются др. на др.:
Если после того как на битмапе нарисовала dll вызвать 
какой-нить метод канвы битмапа (даже, собственно, не рисуя 
 например Image1.Picture.Bitmap.Canvas.Brush.Color) из главной программы то Bitmap.Canvas очищается... Чё делать?(( smile 

ЗЫ: Даа не разрисуешься тут ... smile smile  

Автор: Alexeis 18.4.2006, 09:07
quard, я тоже это заметил когда тестил, более того теряются даже размеры канвы заданные в основной програмее. smile  

Автор: quard 18.4.2006, 17:22
Гм. неужели с этим никто никогда не сталкивался и не решил эту траблу... 
А ведь так нужно.... smile  

Автор: Snowy 18.4.2006, 18:28
Попробуй переделать на procedure dllMain(var Img : TImage);
Если не поможет, то передавай не TImage, а TBitmap. А при выходе из процедуры, делай Image1.Picture.Assign(bmp).  

Автор: quard 19.4.2006, 00:10
Snowy  Пробовал. Бесполезно... smile smile  smile 

Автор: quard 21.4.2006, 11:39
Кароче единственный выход который я нашел это передача DC.
Походу запрещено передвать Image как параметр а потом рисовать на нем....
При передаче DC вроде все норм. но опять трабла:

Так рисует:
Код

procedure dllMain(var DC: HDC);
begin
  SelectObject(DC, CreateSolidBrush(Random($00FFFFFF)));
  Rectangle(DC, 0, 0, 70, 70);
end;


Так а так нет:
Код

procedure dllMain(var DC: HDC);
begin
  ShowMessage('sdfgsdhhfghgh');
  SelectObject(DC, CreateSolidBrush(Random($00FFFFFF)));
  Rectangle(DC, 0, 0, 70, 70);
end;


Помогите плз. А то я уже совсем не знаю чё делать...  smile  

Автор: Alexeis 21.4.2006, 11:56
quard, может дело в том что у длл нет с программой общего менеджера памяти, может просто подключить и в проект и в длл fastsharemem ??? 

Автор: quard 21.4.2006, 14:26
Цитата

 может дело в том что у длл нет с программой общего менеджера памяти, может просто подключить и в проект и в длл fastsharemem ??? 


alexeis1,
да даже если прога без всяких длл... Просто процедура

Код

procedure Proc1(DC: HDC);
begin
  MessageBox(0, nil, nil, 0); // Если это убрать то все пашет
  SelectObject(DC, CreateSolidBrush(Random($00FFFFFF)));
  Rectangle(DC, 0, 0, 50, 50);
end;


не работает (где бы она не находилась/ будь то длл или основная прога) сам проверь...
 

Автор: Alexeis 21.4.2006, 14:34
Есть вариант - передавать указатель на реальный битовый массив и присваивать затем значения реальных цветов один раз по входе в функцию другой раз в программе после получения результата, а вообще лучше устанавливать pixelformat в pf24bit. 

Автор: quard 21.4.2006, 16:15
Гм.. а можно пример?
smile 

Автор: Alexeis 25.4.2006, 09:14
здесь я писал как получать адреса
http://forum.vingrad.ru/index.php?showtopic=91640 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)