AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bildausschnitt mit CopyRect() in Zwischenablage
Thema durchsuchen
Ansicht
Themen-Optionen

Bildausschnitt mit CopyRect() in Zwischenablage

Ein Thema von Tobias · begonnen am 2. Dez 2004 · letzter Beitrag vom 10. Jan 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Tobias
Tobias

Registriert seit: 26. Okt 2004
Ort: Pforzheim
18 Beiträge
 
Delphi 6 Personal
 
#1

Bildausschnitt mit CopyRect() in Zwischenablage

  Alt 2. Dez 2004, 20:35
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...



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
Tobias
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#2

Re: Bildausschnitt mit CopyRect() in Zwischenablage

  Alt 2. Dez 2004, 21:36
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.
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Benutzerbild von Tobias
Tobias

Registriert seit: 26. Okt 2004
Ort: Pforzheim
18 Beiträge
 
Delphi 6 Personal
 
#3

Re: Bildausschnitt mit CopyRect() in Zwischenablage

  Alt 2. Dez 2004, 22:02
super! danke!
des klappt einwandfrei!


jetzt brauch ich nur noch irgendwie des mit dem CopyRect()...
Tobias
  Mit Zitat antworten Zitat
Benutzerbild von Pr0g
Pr0g

Registriert seit: 21. Mai 2004
809 Beiträge
 
Delphi 7 Personal
 
#4

Re: Bildausschnitt mit CopyRect() in Zwischenablage

  Alt 2. Dez 2004, 22:04
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
  Mit Zitat antworten Zitat
Benutzerbild von Tobias
Tobias

Registriert seit: 26. Okt 2004
Ort: Pforzheim
18 Beiträge
 
Delphi 6 Personal
 
#5

Scrollbox per Mausrad scrollen

  Alt 5. Dez 2004, 18:20
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 ^^
Kann mir da vielleicht noch jemand weiterhelfen?
Tobias
  Mit Zitat antworten Zitat
Benutzerbild von Pr0g
Pr0g

Registriert seit: 21. Mai 2004
809 Beiträge
 
Delphi 7 Personal
 
#6

Re: Bildausschnitt mit CopyRect() in Zwischenablage

  Alt 5. Dez 2004, 18:55
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);
  Mit Zitat antworten Zitat
Benutzerbild von Tobias
Tobias

Registriert seit: 26. Okt 2004
Ort: Pforzheim
18 Beiträge
 
Delphi 6 Personal
 
#7

Re: Bildausschnitt mit CopyRect() in Zwischenablage

  Alt 6. Dez 2004, 21:23
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...
Tobias
  Mit Zitat antworten Zitat
Tempel

Registriert seit: 15. Jul 2004
6 Beiträge
 
#8

Re: Bildausschnitt mit CopyRect() in Zwischenablage

  Alt 16. Dez 2004, 23:46
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
  Mit Zitat antworten Zitat
Benutzerbild von Pr0g
Pr0g

Registriert seit: 21. Mai 2004
809 Beiträge
 
Delphi 7 Personal
 
#9

Re: Bildausschnitt mit CopyRect() in Zwischenablage

  Alt 17. Dez 2004, 15:17
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?
  Mit Zitat antworten Zitat
Tempel

Registriert seit: 15. Jul 2004
6 Beiträge
 
#10

Re: Bildausschnitt mit CopyRect() in Zwischenablage

  Alt 17. Dez 2004, 16:02
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:38 Uhr.
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