![]() |
Bildausschnitt mit CopyRect() in Zwischenablage
Hallo.
Ich muss bis nächste Woche mein Paint-Programm für den Informatik-Unterricht fertig haben, und mir fehlt leider noch eine Funktion... Und zwar will ich, wenn man einen bestimmten Button drückt, dass durch Aufziehen eines Rechtecks auf der "image1.canvas" der Inhalt des Rechtecks in die Zwischenablage kopiert wird. Eine Funktion, die das ganze Bild in die Zwischenablage einfügt hab ich schon:
Code:
Aber wie schaff ich des jetzt, dass wirklich nur der Inhalt eines Rechtecks in die Zwischenablage eingefügt wird?
Clipboard.Assign(image1.Picture.Bitmap);
Irgendwie hab ich des mit der Funktion CopyRect() net ganz verstanden... :? :roll: Extra-Funktion (nicht so wichtig wie des oben (!) ): Wenn man auf den Button klickt, dann soll ein Rechteck gezeichnet werden, mit gestrichelten Linien, das beim Aufziehen, also beim bewegender Maus seine Größe verändert, sodass man gleich sieht, wie groß das aufgezogene Rechteck ist. Wenn man die Maustaste los lässt, dann soll die Auswahl in die Zwischenablage übernommen werden, und das gestrichelte rechteck soll wieder verschwinden,.... Ist des überhaupt möglich? Wenn ja, und wenn des jemand weiß, dann postets ruhig... Aber die Funktion oben ist wirklich wichtiger!! Gruß, Toby |
Re: Bildausschnitt mit CopyRect() in Zwischenablage
Ich hätte eine Lösung für den Rahmen: Schau dir mal
![]() ![]() |
Re: Bildausschnitt mit CopyRect() in Zwischenablage
super! danke!
des klappt einwandfrei! :) jetzt brauch ich nur noch irgendwie des mit dem CopyRect()... :???: |
Re: Bildausschnitt mit CopyRect() in Zwischenablage
Hier ein kleines Beispiel fürs CopyRect. Auf der Form hast du zwei TImage. Im ersten ist ein Bild, welches du markieren kannst, dann wird es ins zweite Image kopiert:
Delphi-Quellcode:
Mit dem Code muss der User die Maus an einem Punkt loslassen, welcher recht unten vom Startpunkt liegt. Da musst du halt noch gucken, wie du das am besten änderst, aber soll ja nur ein Beispiel sein.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, jpeg, ExtCtrls; type TForm1 = class(TForm) Image1: TImage; Image2: TImage; procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private-Deklarationen } CopyFrame: TRect; CopyMouseDown: Boolean; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin CopyFrame.Left := X; CopyFrame.Top := Y; CopyMouseDown := True; end; procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if PtInRect(Image1.ClientRect, Point(X, Y)) then begin CopyFrame.Right := X; CopyFrame.Bottom := Y; end; end; procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var Bmp: TBitmap; begin Bmp := TBitmap.Create; try Bmp.PixelFormat := pf32Bit; Bmp.Width := CopyFrame.Right - CopyFrame.Left; Bmp.Height := CopyFrame.Bottom - CopyFrame.Top; Bmp.Canvas.CopyRect(Rect(0, 0, Bmp.Width, Bmp.Height), Image1.Picture.Bitmap.Canvas, CopyFrame); Image2.Picture.Bitmap.Assign(Bmp); finally Bmp.Free; end; end; end. MfG Pr0g |
Scrollbox per Mausrad scrollen
Danke nochmals! Hat alles bestens geklappt!
Ich hätte allerdings noch ne andere Frage: Ich hab jetzt des Image1 in einer ScrollBox, und jetzt will ich, dass man bei größeren Bildern, als dann wenn die Scrollbars angezeigt werden, auch mit dem mausrad scrollen kann. Hab dazu allerdings nirgendwo irgendwas dazu gefunden ^^ :roll: Kann mir da vielleicht noch jemand weiterhelfen? |
Re: Bildausschnitt mit CopyRect() in Zwischenablage
Pack in das OnMouseWheelDown Ereignis der ScrollBox folgenden Code:
Delphi-Quellcode:
und in das OnMouseWheelUp Ereignis folgenden:
//mit Mausrad nach unten scrollen
SendMessage(ScrollBox1.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
Delphi-Quellcode:
//mit Mausrad nach oben scrollen
SendMessage(ScrollBox.Handle, WM_VSCROLL, SB_LINEUP, 0); |
Re: Bildausschnitt mit CopyRect() in Zwischenablage
des klappt leider net ganz :?
ich glaub aber zu wissen woran des liegt... und zwar, wenn ich ein großes Bild geöffnet habe, "verdeckt" das image1 ja die scrollbox, und wenn ich dann mit der maus über dem image1 bin, kann ich da net mitm mausrad die befehle für die scrollBox ansteuern... ich weiß aber allerdings nicht wie man des lösen könnte... :| |
Re: Bildausschnitt mit CopyRect() in Zwischenablage
Zitat:
1. Nimm das OnMouseWheel-Event des Forms, das sollte vorher drankommen. 2. Deklarier die Procedure MouseWheelHandler im Form, die kommt auf jeden Fall zuerst an das Mouse-Event:
Code:
3. Laß die Scrollbox einfach weg, ein TImage erzeugt selber Scrollbars, wenn die Größe des TImage.Pictures größer ist als die eigene Größe. Und nebenbei bedient es auch die das Mausrad.
procedure MouseWheelHandler(var Message: TMessage); dynamic;
Thomas |
Re: Bildausschnitt mit CopyRect() in Zwischenablage
Zitat:
|
Re: Bildausschnitt mit CopyRect() in Zwischenablage
Zitat:
Aber du hast recht, die Scrollbox kommt von der Form, nicht vom TImage. Ich sollte vielleicht so sät nicht auf Beiträge antworten, sondern bis zum nächsten Tag warten ;-) Dies hier macht auf jeden Fall Scrollbars ohne Scrollbox und das Mausrad funktioniert ohne zusätzliche Programmierung. Man nehme ein Form mit einem TImage oben links in der Ecke, größe ist egal. Property Stretch := True;
Code:
Thomas
procedure TBild.SetPictureName(NewPictureName:String);
begin fPictureName := NewPictureName; Image1.Picture.LoadFromFile(NewPictureName); fScale := 0; Rescale; end; procedure TBild.Rescale; begin if (fScale = 1) or (fScale = -1) then fScale := 0; if fScale = 0 then begin Caption := fPicturename + ' (1:1)'; Image1.Width := Image1.Picture.Width; Image1.Height := Image1.Picture.Height; end else if fScale > 0 then begin Caption := fPicturename + ' ('+IntToStr(fScale)+':1)'; Image1.Width := Image1.Picture.Width div fScale; Image1.Height := Image1.Picture.Height div fScale; end else begin Caption := fPicturename + ' (1:'+IntToStr(-fScale)+')'; Image1.Width := Image1.Picture.Width * -fScale; Image1.Height := Image1.Picture.Height * -fScale; end; Self.ClientWidth := Image1.Width; Self.ClientHeight := Image1.Height; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz