@user322, nie wiem dlaczego tak się motasz z obliczeniem środka wycinka pulpitu - przecież to bardzo proste obliczenia; Zawsze możesz wspomóc się dodatkowymi stałymi, w których zapiszesz sobie wymiary wycinka i połowy wymiarów wycinka - będzie łatwiej użyć je w kodzie;
Łatwiej jest najpierw skopiować wycinek pulpitu, po czym na gotowym wycinku namalować krzyżyk; Poniżej masz zakomentowany przykład metody realizującej pobranie wycinka pulpitu, na którym rysowany jest biały krzyżyk w miejscu, w którym znajduje się kursor, po czym wycinek zapisywany jest do pliku JPG:
procedure TMainForm.CapturePartOfDesktop(const APoint: TPoint; const AFileName: TFileName);
const
{ part dimensions }
PART_WIDTH = Integer(200);
PART_HEIGHT = Integer(150);
{ half of part dimensions }
PART_HALF_WIDTH = Integer(PART_WIDTH shr 1);
PART_HALF_HEIGHT = Integer(PART_HEIGHT shr 1);
const
{ cross arm width }
CROSS_ARM_WIDTH = Integer(10);
var
cnvDesktop: TCanvas;
rctDesktop: TRect;
bmpPart: TBitmap;
jpgPart: TJPEGImage;
begin
{ create desktop and part classes }
cnvDesktop := TCanvas.Create();
bmpPart := TBitmap.Create();
try
{ get the desktop handle }
cnvDesktop.Handle := GetWindowDC(GetDesktopWindow());
{ set the part dimensions }
bmpPart.Width := PART_WIDTH;
bmpPart.Height := PART_HEIGHT;
{ set the part rect bounds in desktop }
rctDesktop.Left := APoint.X - PART_HALF_WIDTH;
rctDesktop.Right := APoint.X + PART_HALF_WIDTH;
rctDesktop.Top := APoint.Y - PART_HALF_HEIGHT;
rctDesktop.Bottom := APoint.Y + PART_HALF_HEIGHT;
{ copy rect from desktop to part }
bmpPart.Canvas.CopyRect(bmpPart.Canvas.ClipRect, cnvDesktop, rctDesktop);
{ paint the cross on part bitmap }
with bmpPart.Canvas do
begin
{ set the pen style }
Pen.Color := clWhite;
Pen.Width := 3;
{ draw the cross }
MoveTo(PART_HALF_WIDTH, PART_HALF_HEIGHT - CROSS_ARM_WIDTH);
LineTo(PART_HALF_WIDTH, PART_HALF_HEIGHT + CROSS_ARM_WIDTH);
MoveTo(PART_HALF_WIDTH - CROSS_ARM_WIDTH, PART_HALF_HEIGHT);
LineTo(PART_HALF_WIDTH + CROSS_ARM_WIDTH, PART_HALF_HEIGHT);
end;
{ save part to file }
jpgPart := TJPEGImage.Create();
try
jpgPart.Assign(bmpPart);
jpgPart.SaveToFile(AFileName);
finally
jpgPart.Free();
end;
finally
{ free the desktop and part classes }
cnvDesktop.Free();
bmpPart.Free();
end;
end;
Użycie metody jest bardzo proste:
procedure TMainForm.btnCaptureClick(Sender: TObject);
var
pntCursor: TPoint;
begin
{ get cursor position on desktop }
GetCursorPos(pntCursor);
{ capture and save the part of desktop }
CapturePartOfDesktop(pntCursor, 'C:\Part.jpg');
end;
Źródła aplikacji realizującej powyższy algorytm w załączniku;
Powyższy kod co prawda realizuje pobranie wycinka pulpitu, jednak nie jest zabezpieczony pod kątem pobrania takiego wycinka, który znajduje się zaraz przy krawędzi pulpitu; Jeśli punkt znajdować się będzie w mniejszej odległości niż połowa ustalonego wycinka - jego część pozostanie np. biała (ta która musiałaby zawierać obraz spoza ekranu); W takim przypadku trzeba by przesunąć punkt rysowania krzyżyka w odpowiednie miejsce w wycinku;
Na przyszłość polecam więcej kombinowania, dlatego że tutaj jedynym problemem było skopiowanie współrzędnych do rysowania krzyżyka z mojego wcześniejszego przykładu, w którym oczywiście wpisane były na pałę; Ale ten przykład miał przedstawić prostotę rysowania po kanwie bitmapy stąd sądziłem, że obliczenia już wykonasz sam.