Другие языки программирования и технологии

как в дельфи сделать скриншот какого то поля?

Есть 2 поле Image, один на другом, причём один перекрывается другим, я хочу сохранить вилимую картинку (то есть 1 и часть второго Image) в 3 Image
_Bars_Rap_ )
_Bars_Rap_ )
2 808
Давайте я вам расскажу)) ) и так, в Windows есть такая чудо-процедура. называется BitBlt(source : HDC, x,y : integer; width,height : integer; dest : HDC; MODE : integer);

Она копирует изображение одного компонента на другой. естественно, нашим вторым компонентом скорее всего, будет Bitmap. HDC - это дескриптор Canvas`a, упомянутого выше. Как получить дескриптор Canvas`a? очень просто, процедурой GetDC(Handle), где Handle - это дескриптор компонента. И так, все знаем, все гттово - впуть!)) )

Допустим, вы хотиде сделать скриншот вашего Мемо с текстом, а канваса - то у него отродясь не было! Вот не задача, да? ну и что, у нас зато есть memo1.handle, и bitBlt!

И так, начнем:
//Сорри если что, писал попамяти

uses windows, graphics, sysutuils;

procedure TForm1.button1_click(Sender : TObject)
Var
bitmap: TBitmap;//Картинка-скриншот
memoHDC : HDC;
bmpHDC : HDC:
Begin
bitmap:=TBitmap.create;
try
//След 2 строки обязательны!
bitmap.width:=Memo1.width;
bitmap.height:=Memo1.height;
MemoHdc:=getDC(Memo1.handle);//Узнаем, где валяется картинка мемо)) )
bmpHDC:=bitmap.canvas.handle;//Если в Канвас есть свойство с типом HDC, лучше используйте его!
BitBlt(MemoHDC, 0, 0, Memo1.width, memo1.height, bmpHDC, SRCCOPY);
//Замечание: пустая моя голова! если не найдет константу SRCCOPY, попробуйте так: SRC_COPY
//Если после этого картинка будет черная, попробуйте MemoHDC и BMPHDC поменять местами
bitmap.save(ExtractFileDir(ParamStr(0)) + '\1.bmp');
finally
bmp.free;
end;
end;

И ещё: с помощью этой процедуры можно рисовать на других окнах! ! Сначала рисуем bitmap, а потом при помощи процедуры кидаем его на нужным нам компонент)) )

Я старался, не сочтите за наглость, но мне было бы приятно. если бы мой ответ оказался лучшим!

P.S. DELPHI forever!

В вашем примере можно поступить так:

Bitmap:=TBitmap.create;//Image2 должна быть правее и ниже Image 1
bitmap.width:=Image2.width + (Image2.left - Image1.left);//Узнаем общёю ширину картинок
Bitmap.height:=IMage2.height + (IMage2.top - Image1.top);//Аналогично
//Рисование нижней картинки:
Bitmap.canvas.draw(Image2.left - Image1.left, Image2.top - Image1.top, IMage2.picture.bitmap.canvas);
//Рисуем верхнюю поверх нижней:
Bitmap.canvas.draw(0, 0, IMage1.picture.bitmap.canvas);
Bitmap.save('1.bmp');
bitmap.free;
Серега Афанасьев
Серега Афанасьев
2 059
Лучший ответ
Серега Афанасьев Намек: если захотите рисовать на рабочем столе, берите вот так: DHDC:=GETDC(0);
Серега Афанасьев копирование картинок:
Assign может вызывать ошибку преобразования.

Делайте так:

Image1.picture.canvas.copyRect(RECT(0,0, Image1.width, Image1.Height), Image2.picture.canvas, Image2.Picture.Bitmap.Cliprect);
Пишу по памяти:
У любого наследника TGraphic есть свойство canvas со всякими методами, типа получается нечто вроде примерно так:
Image3.Canvas.bitmap.assign(Form1.canvas.bitmap);
Как-то в этом направлении я бы копал.
Т. е. береь канвас формы (на котоорой image1 + mage2 сидят) и делаешь присвоение его в Image3
Gadwin Print Screen
В настройках поставь "Прямоугольная область" И курсором выделяй ту часть которую хочешь сфотографировать.
Сам курсор можно спрятать, так же в настройках.