Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.02;
Скачать: CL | DM;

Вниз

Как получить реальное изображение компонента   Найти похожие ветки 

 
Krants   (2006-05-22 21:12) [0]

Допустим компонент обладает методом Canvas, и с помошью подобной процедуры можно скопировать его изображение в Image1:

Image1.Canvas.Copyrect(Rect(0,0,Image1.Width,Image1.Height),
          ListBox1.Canvas,
          Rect(0,0,ListBox1.Width,ListBox1.Height));

Все бы хорошо, но если данный компонент частично прикрыт(а хуже если полностью закрыт другой формой), то на Image1 попадает не полное его изображение...
Как быть, подскажите кто знает.


 
Desdechado ©   (2006-05-22 21:22) [1]

зачем тебе полное, если реальное - прикрытое

по сабжу - попробуй заставить его отрисоваться на подсунутой ему канве вместо его родной


 
Pavia ©   (2006-05-22 21:47) [2]

Не знаю то или нет.


function GetImage(C:TWinControl): TBitmap;
var
 Ofs: Integer;
begin
 Result := TBitmap.Create;
 try
   Result.Width := C.Width;
   Result.Height :=  C.Height;
   Result.Canvas.Brush := C.Brush;
   Result.Canvas.FillRect(C.ClientRect);
   Result.Canvas.Lock;
   try
     if GetWindowLong(C.Handle, GWL_STYLE) and WS_BORDER <> 0 then
       Ofs := -1  // Don"t draw form border
     else
       Ofs := 0;  // There is no border
     C.PaintTo(Result.Canvas.Handle, Ofs, Ofs);
   finally
     Result.Canvas.Unlock;
   end;
 except
   Result.Free;
   raise;
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
image1.Picture.Bitmap:=GetImage(ListBox1)
end;


 
Krants   (2006-05-22 23:41) [3]

Спасибо огромное, то что надо!


 
Юрий Зотов ©   (2006-05-23 20:24) [4]

> Pavia ©   (22.05.06 21:47) [2]

При таком вызове
image1.Picture.Bitmap := GetImage(ListBox1)
будем иметь утечку памяти.

Вообще, функция, создающая объект и возвращающая его в виде Result - штука в этом смысле опасная.


 
Desdechado ©   (2006-05-23 20:45) [5]

да, лучше было бы
except
  Result.Free;
  Result := nil;
  raise;
end;
end;procedure TForm1.Button2Click(Sender: TObject);
x: TBitmap;
begin
x:=GetImage(ListBox1);
if(x<>nil) then begin
image1.Picture.Bitmap.Assign(x);
x.Free;
end;
end;

а то при ошибке в функции ловим AV

и согласен с
> функция, создающая объект и возвращающая его в виде Result - штука опасная.


 
Юрий Зотов ©   (2006-05-23 21:47) [6]

> Desdechado ©   (23.05.06 20:45) [5]

Какой смысл в строке Result := nil, если следующая строка все равно возбуждает исключение?


 
Desdechado ©   (2006-05-23 22:41) [7]

да, raise я проглядел :(
имхо, оно там не нужно
или вызовы переделывать


 
Pavia ©   (2006-05-23 22:42) [8]


> Вообще, функция, создающая объект и возвращающая его в виде
> Result - штука в этом смысле опасная.

Учту на будущие. Спасибо за совет.


 
Юрий Зотов ©   (2006-05-23 23:07) [9]

> Pavia ©   (23.05.06 22:42) [8]

Приводимый ниже вариант ничем не хуже, но безопасен. Утечек памяти он не дает, а  если пользователь процедуры  (то есть, использующий ее программист) подсунет ей неверную ссылку (например, ссылку на несозданный объект), то он получит нормальное AV (что сразу просигнализирует ему о его ошибке - то есть, он еще и подсказку получит).

procedure PaintControl(C: TWinControl; Bitmap: TBitmap);
var
 Ofs: integer;
begin
 with Bitmap do
 begin  
   Width := C.Width;
   Height :=  C.Height;
   Canvas.Brush := C.Brush;
   Canvas.FillRect(C.ClientRect);
   Canvas.Lock;
   try
     if GetWindowLong(C.Handle, GWL_STYLE) and WS_BORDER <> 0 then
       Ofs := -1  // Don"t draw form border
     else
       Ofs := 0;  // There is no border
     C.PaintTo(Canvas.Handle, Ofs, Ofs)
   finally
     Canvas.Unlock
   end
 end
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  PaintControl(ListBox1, Image1.Picture.Bitmap)
end;



Страницы: 1 вся ветка

Текущий архив: 2006.07.02;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.041 c
15-1149515741
Red_imp
2006-06-05 17:55
2006.07.02
Skype + Usergate 2.8


3-1146644994
Juice
2006-05-03 12:29
2006.07.02
LangId_To_CodePage - Ошибка Left side cannot be assigned to


2-1150096295
RzCoDer
2006-06-12 11:11
2006.07.02
Ашипка при освобождении DLL


2-1150449400
Тимофей Юрьевич
2006-06-16 13:16
2006.07.02
условие


15-1149579065
Труп Васи Доброго
2006-06-06 11:31
2006.07.02
Вопрос суперзнатокам Excel