Autor Beitrag
DasTool
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 25.05.05 17:32 
Hallo!

Ich bin neu hier. Ich hoffe ich bin im richtigen Unterforum, sonst bitte verschieben.

Also zu meinem Problem. Das ist ähnlich dem "Image-Komponete", konnte es aber auch nicht mit dem dortigen Vorschlag einer PaintBox statt einem Image zu benutzen, lösen.

Ich möchte ein Bitmap einlesen. Dann den Benutzer erlauben einen Bereich im Bitmap zu selektieren. Was ich mir über ein Rechteck vorstelle. Habe bisher das Bitmap über die Image-Komponente eingelesen und das Rechteck über Canvas drüber gezeichnet. Leider löscht er das alte nicht. Zudem flackert die Bitmap ziemlich stark bei einer Mausbewegung.

Hat da jemand eine Idee, wie ich möglichst einfach und flimmerfrei ein (unausgefülltes) Rechteck über eine Bitmap zeichnen kann. Startposition bei "MouseDown" und Endposition bei "Mouseup". Das Rechteck sollte sich bei der Mausbewegung an die neue Endposition mitgezeichnet werden.

Danke euch schonmal.

DasTool
shadowmasta
Hält's aus hier
Beiträge: 14

WIN XP
Delphi 6
BeitragVerfasst: Mi 25.05.05 18:24 
Ja das steht in meinem Thread drin , da ich ja Paint nachprogge :)

www.delphi-forum.de/...setzenNeu_42363.html

also bei

Onmousedown:
ausblenden Delphi-Quelltext
1:
x_anfang:=x; y_anfang:=y; x_ende:=x; y_ende:=y  // initialisieren + Startwert					


Onmousemove:
ausblenden Delphi-Quelltext
1:
2:
3:
Rectangle(x_anfang,y_anfang,x_ende,y_ende);  // lösche die alte Linie
x_ende := x ; y_ende := y; // neue Linienende
Rectangle(x_anfang,y_anfang,x_ende,y_ende); // Zeichne neue Linie


Wichtig damit das Vorgängerrechteck gelöscht wird ist das man pen Modus auf pmNotXor stellt
ausblenden Delphi-Quelltext
1:
Image1.Canvas.Pen.Mode := pmNotXor;					


und das mit flackern sind wa auch bei
Doublebuffered := true; // is ne lösung soll aber net optimal sein kA
Blackheart
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 164

ME
D3Prof.-D6Standard
BeitragVerfasst: Mi 25.05.05 18:37 
Meinst Du's So ?
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: 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 }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  AnchorX :Integer;
  CurX :Integer;
  AnchorY :Integer;
  CurY :Integer;
  Bounding :Boolean;
implementation

{$R *.dfm}

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
try
  AnchorX := X;
  CurX := X;
  AnchorY  := Y;
  CurY := Y;
  Bounding := True;
  except
  end;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 if Bounding then
  begin
    Image1.Canvas.Pen.Mode := pmNot;
    Image1.Canvas.Pen.Width := 1;
    Image1.Canvas.Brush.Style := bsClear; // Rechteck Zeichnen
    Image1.Canvas.Rectangle(AnchorX, AnchorY, CurX, CurY);
    CurX := X;
    CurY := Y;
    Image1.Canvas.Rectangle(AnchorX, AnchorY, CurX, CurY);
 end;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 bounding := false;
end;

end.
DasTool Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 25.05.05 19:43 
@shadowmasta

Ja, habe deinen Thread vorher gelesen. Leider bin ich nicht schlau draus geworden. Ich verstehe zum Beispiel nicht, wo du in den Zeilen:
ausblenden Delphi-Quelltext
1:
2:
3:
Rectangle(x_anfang,y_anfang,x_ende,y_ende);  // lösche die alte Linie  
x_ende := x ; y_ende := y; // neue Linienende  
Rectangle(x_anfang,y_anfang,x_ende,y_ende); // Zeichne neue Linie

das alte Rechteck löscht. Du übermalst es zwar, aber doch mit der gleichen Farbe, mit der du alles zeichnest oder? Und ich kann bei einem Bild ja nicht einfach das alte Rechteck "übermalen", weil die verschiedenen Pixel des Rechtecks verschiedene Farbwerte haben.


@Blackheart

Ja, genau so. Flackert nur leider sehr stark bei mir, weil das Image bei jeder Mausbewegung neu gezeichnet werden muss. Geht das nicht irgendwie geschickter oder über schnellere (HW-) Zugriffe?

Benutze übrigens ein Notebook und Delphi 7.



Danke euch trotzdem! Ist ja schonmal was :)

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.
shadowmasta
Hält's aus hier
Beiträge: 14

WIN XP
Delphi 6
BeitragVerfasst: Mi 25.05.05 19:47 
user profile iconDasTool hat folgendes geschrieben:
@shadowmasta

Du übermalst es zwar, aber doch mit der gleichen Farbe, mit der du alles zeichnest oder? Und ich kann bei einem Bild ja nicht einfach das alte Rechteck "übermalen", weil die verschiedenen Pixel des Rechtecks verschiedene Farbwerte haben.


ja stimmt das is dooooof :) ich weiss auch net wie ich das mach soll denn mit den blöden komplementärfarben kann man zwar rückgängi malen aber die farben sind halt komplementär auf anderem hintergrund :(