Autor Beitrag
thechu
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 04.01.06 16:11 
guten tag!
ich bin gleich am durchdrehen... ich schreibe ein zeichenprogramm. so, ich habe die suchfunktion benutzt, leider bringt mich das, was ich gelesen habe, nicht weiter.
ich habe folgendes problem:

wenn ich eine linie zeiche und danach eine weitere linie, welche die 1. schneidet, erscheint der geschnittene bereich in der hintergrundfarbe. (weiß)

den befehl pmnotxor benutze ich, damit pro "linie" auch wirklich nur eine, und nicht unendlich viele linien erscheinen. hier mal der code:
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:
procedure TMiniPaint.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
                                   Y: Integer);
begin
      if Mausgedrueckt then
        begin
         if BitBtn1.Enabled = false
            then Canvas.LineTo (x,y)     //freihand
      else if BitBtn3.Enabled = false then begin  // linie zeichnen
        Canvas.MoveTo (XAnfang,YAnfang);
        Canvas.Lineto (XEnde,YEnde);
        Canvas.MoveTo (XAnfang,YAnfang);
        Canvas.LineTo (X,Y);
      end;
      XEnde := X;
      YEnde := Y;
      end;

end;

procedure TMiniPaint.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
     Mausgedrueckt := True;
     XAnfang := x;
     YAnfang := y;
     XEnde   := x;
     YEnde   := y;
     Canvas.MoveTo (XAnfang, YAnfang);
   if BitBtn1.Enabled = false        //abfrage zeichenart
   then
       Canvas.Moveto (x,y)         // Freihand
   else
   if BitBtn2.Enabled = false
   then
       Canvas.Ellipse (x-2,y-2,x+2,y+2)      //ellipse
   else
   if  BitBtn3.Enabled = false
   then
       Canvas.Pen.Mode := pmnotxor;           //linie
   end;


procedure TMiniPaint.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
     Mausgedrueckt := false;
end;



wenn ich pmsolid statt pmnotxor einsetzte erhalte ich standartmäßig unendlich viele linien.

mfg
thechu

Moderiert von user profile iconGausi: Quote- durch Delphi-Tags ersetzt

ps.: ich habe noch das prob, dass wenn ich auf freihandzeichnen umschalte, die linie nicht mehr solid sonder auch notxor "gemalt" wird....
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Mi 04.01.06 17:32 
Ach herje. Die Frage ist schon ein bisschen verwirrend gestellt. Ich denke mal du wirst mit der Canvas deines Formulars sowieso probleme bekommen deswegen solltest du dein gezeichnetes in einem TBitmap abspeichern. Also sobald es etwas richtig gezeichnetes gibt wohlgemerkt.

So lange du deine Linie noch nur zur Info gezeichnet hast würde ich es so machen, dass ich das Bild zeichne und anschließend dann die Linie. Wenn du die Linie dann Fix gemacht werden soll würde ich sie ins Bild zeichnen. Damit wäre sie dann fest. Evtl solltest du das zeichnen dann auch noch mal puffern. Also Bild und Linie zeichnen noch mal ein Bitmap zeichnen um das dann am Stück zeichnen zu können. Dann flackerst nicht.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
Limster
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 72


Delphi 5 & 7 Enterprise
BeitragVerfasst: Mi 04.01.06 18:11 
Titel: hi
Hi!

Wenn du per NotXor zeichnest..ist das klar..

du musst die linie auf solid stellen

folgende variablen brauchst du global in der unit:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
var
  MouseBegin: TPoint;
  backsave  : TBitmap;
  backrect  : TRect;


beim mousedown merkst du dir X/Y des Mousedown

beim MouseMove folgendes:

merk dir den "hintergrund" (nur den bereich in dem sich die linie befindet) und zeichne DAVOR einen schon möglicherweise gesicherten hintergrund (damit ist vor jedem zeichnen einer neuen linie der Hintergrund wieder
so wie beim mousedown) und erst dann eine linie zeichnen

merk dir das rect vom MouseDown-Punkt zum MouseMove-Punkt.. und diesen bereich merk dir in einem
TBitmap.. width&Height vom bitmap zuvor der Rect-Grösse anpassen und per canvas.copyrect merken

beachte, dass left<right und top<bottom sein muss.. da du ja mit der maus umherfahren kannst
und wenn du den mousedown-punkt als ausgangspunkt nimmst (wenn du dich zb nach links oben bewegst),
auch falsche rect werte bekommen kanns, also das vorher wieder begradigen
(mit vergleichen und zb top/bottom vertauschen)

klingt vielleicht kompliziert, funktioniert aber gut (auch bei Rects,roundrects,ellipse,... und und) .. und so viel zeit zum erklären hab ich grad nicht :wink:

grüsse

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt