Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.07.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.027 c
3-1146131337
yaral
2006-04-27 13:48
2006.07.02
Как закрыть DataModule


2-1149571360
Алексий
2006-06-06 09:22
2006.07.02
экран + мышка


15-1149551726
Nevilon
2006-06-06 03:55
2006.07.02
Потестите, плиз, прогу


15-1149676254
Vlad Oshin
2006-06-07 14:30
2006.07.02
почему нельзя создать папку PRN?


15-1149440445
Nic
2006-06-04 21:00
2006.07.02
Простой вопрос





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский