Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bildausschnitt mit CopyRect() in Zwischenablage (https://www.delphipraxis.net/35107-bildausschnitt-mit-copyrect-zwischenablage.html)

Tobias 2. Dez 2004 19:35


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:
  Clipboard.Assign(image1.Picture.Bitmap);
Aber wie schaff ich des jetzt, dass wirklich nur der Inhalt eines Rechtecks in die Zwischenablage eingefügt wird?
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

Nikolas 2. Dez 2004 20:36

Re: Bildausschnitt mit CopyRect() in Zwischenablage
 
Ich hätte eine Lösung für den Rahmen: Schau dir mal Delphi-Referenz durchsuchenpen.mode pmxor und Delphi-Referenz durchsuchenpen.style psdash an. Damit kannst du Linien zeichnen, die einfach die darunterliegende Farbe invertieren. Wenn du eine Linie z.B. im Onmousemove nocheinmal zeichnest, ist sie weg.

Tobias 2. Dez 2004 21:02

Re: Bildausschnitt mit CopyRect() in Zwischenablage
 
super! danke!
des klappt einwandfrei! :)


jetzt brauch ich nur noch irgendwie des mit dem CopyRect()... :???:

Pr0g 2. Dez 2004 21:04

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:
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.
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.

MfG Pr0g

Tobias 5. Dez 2004 17:20

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?

Pr0g 5. Dez 2004 17:55

Re: Bildausschnitt mit CopyRect() in Zwischenablage
 
Pack in das OnMouseWheelDown Ereignis der ScrollBox folgenden Code:
Delphi-Quellcode:
  //mit Mausrad nach unten scrollen
  SendMessage(ScrollBox1.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
und in das OnMouseWheelUp Ereignis folgenden:
Delphi-Quellcode:
  //mit Mausrad nach oben scrollen
  SendMessage(ScrollBox.Handle, WM_VSCROLL, SB_LINEUP, 0);

Tobias 6. Dez 2004 20:23

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... :|

Tempel 16. Dez 2004 22:46

Re: Bildausschnitt mit CopyRect() in Zwischenablage
 
Zitat:

Zitat von Tobias
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... :|

Das ist richtig. Und es gibt mehrere Möglichkeiten, das zu lösen:

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:
procedure MouseWheelHandler(var Message: TMessage); dynamic;
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.

Thomas

Pr0g 17. Dez 2004 14:17

Re: Bildausschnitt mit CopyRect() in Zwischenablage
 
Zitat:

Zitat von Tempel
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.

Das wäre mir neu. Welche Delphiversion nutzt du?

Tempel 17. Dez 2004 15:02

Re: Bildausschnitt mit CopyRect() in Zwischenablage
 
Zitat:

Zitat von Pr0g
Das wäre mir neu. Welche Delphiversion nutzt du?

5.0 Enterprise.

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:
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;
Thomas


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:11 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz