Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2010, 12:25   #1
EinKRieGeR
 
Регистрация: 30.04.2010
Сообщений: 4
По умолчанию Скриншот выделенной области

Привет всем!

Собственно программа работает следующим образом - с первой формы нажатием кнопки вызывается вторая. Вторая форма Alphablend=100, borderstyle:= none, align:= allclient. По нажатию кнопки мыша начинается рисование Canvas.Rectangle, по отпусканию кнопки - рисование прекращается, область прямоугольника сохраняется в файл - но есть одно "НО": Image перед этим устанавливается размером с экран, и получается что сохраняется большое белое изображение с кусочком выделенной области.

Как задать Width и Height компоненту Image чтобы сохраненное изображение было по размерам как и Canvas.Rectangle ?

Или возможен другой способ?

Код:
procedure TForm2.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
pos1 := Point(X, Y);
risuem := true;
Form2.AlphaBlendValue := 80;
end;

procedure TForm2.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
  var
ScreenDC:HDC;
Canvas:TCanvas;
myjpg:  TJPEGImage;
Image: TImage;
  begin
pos2 := Point(X, Y);
risuem := false;
Form2.AlphaBlendValue := 1;

Image:=TImage.Create(nil);
myjpg:= TJPEGImage.Create;
ScreenDC := GetDC(0);
Canvas:=TCanvas.Create();
Canvas.Handle:=ScreenDC;
Image.Width := Screen.Width;
Image.Height := Screen.Height;
Image.Canvas.CopyRect(Rect(pos1, pos2), Canvas, Rect(pos1, pos2));
ReleaseDC(0,ScreenDC);
myjpg.Assign(Image.Picture.Bitmap);
myjpg.compressionquality:=100;
myjpg.compress;
myjpg.SaveToFile('prob.jpg');
Image.Free;
Canvas.Free;
  close;
end;

procedure TForm2.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if risuem = true then
  begin
    Form2.Canvas.Pen.Color := clNone;
    Form2.Canvas.Brush.Color := clBtnFace;
    Form2.Canvas.Rectangle(0,0,Form2.Width, Form2.Height);
    Form2.Canvas.Pen.Color := clred;
    Form2.Canvas.Brush.Color := clBlack;
    Form2.Canvas.Rectangle(Classes.Rect(pos1, Point(x, y)));
    pos3 := Point(X, Y);
  end;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  Form2.Canvas.Pen.Color := clred;
  Form2.Canvas.Brush.Color := clBlack;
end;

end.
EinKRieGeR вне форума Ответить с цитированием
Старый 25.07.2011, 12:58   #2
TEBS-S
Новичок
Джуниор
 
Регистрация: 01.10.2009
Сообщений: 1
По умолчанию

Сам искал как сделать скриншот выделенной части экрана. Набрел на ваш код и нашел в чем у вас проблемка была, что джипег получался размером с экран. Достаточно исправить вот эти строки

Код:
  Image.Width := pos2.X - pos1.X;
  Image.Height := pos2.y - pos1.y;
  Image.Canvas.CopyRect(Rect(0,0,Image.Width,Image.Height), Canvas, Rect(pos1, pos2));

И еще добавил проверку координат, а то вашим кодом можно выделять только слева направо, сверху вниз
Код:
 if (pos2.X<pos1.X) then
    begin
      tmp:=pos2.X;
      pos2.X:=pos1.X;
      pos1.X:=tmp;
    end;
  if (pos2.Y<pos1.Y) then
    begin
      tmp:=pos2.Y;
      pos2.Y:=pos1.Y;
      pos1.Y:=tmp;
    end;

Последний раз редактировалось TEBS-S; 25.07.2011 в 13:07.
TEBS-S вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление выделенной строки из DBGrid Sinker БД в Delphi 9 20.05.2011 03:09
Скриншот выделеной области экрана. Мигает при выделениии. Casper-SC Общие вопросы .NET 2 27.03.2010 11:49
Как определить, что в выделенной области есть глаза Бзик Помощь студентам 2 09.04.2009 21:46
Проблема с выделенной памятью Ivan_32 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 8 27.02.2009 02:14
Скриншот ForzaJuve Win Api 13 05.10.2008 21:27