| Autor |
Beitrag |
ultraz06
      
Beiträge: 84
|
Verfasst: Mo 26.01.09 13:35
hi
ich habe folgendes problem ich habe ein programm prgrammiert, was wie moorhuhn aufgebaut ist.
so habe ich per TBitmap.Create den hintergrund gesetzt und per
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TForm1.Zeichnen; begin Puffer.Canvas.Draw(0,0,Hg); Puffer.Canvas.Draw(xAkt,yAkt,patrone); paintbox1.Canvas.Draw(0,0,Puffer); |
eine weitere bitmap(patrone) auf den hintergrund zeichnen lassen, nun möchte ich auf die bitmap(patrone) welches auf dem hintergrund ist, per mausklick zugreifen. ich will das wenn ich mausklick auf die bitmap mache sie verschwindet(also wie bei moorhuhn
Moderiert von Narses: Delphi-Tags hinzugefügt, BMP-Bilder komprimiert
Einloggen, um Attachments anzusehen!
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 26.01.09 16:24
Dann musst du anhand der Koordinaten prüfen, ob in das gezeichnete Bild geklickt wurde, und wenn das so ist, neu zeichnen ohne dieses Bild.
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mo 26.01.09 16:30
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
ultraz06 
      
Beiträge: 84
|
Verfasst: Mo 26.01.09 16:40
naja aber da sich die patrone bewegt weiß ich nicht wie ich beim Klick die Position des Mauszeigers auswerten kann :/?
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 26.01.09 16:44
Die aktuellen Koordinaten musst du ja irgendwo haben.
Und die des Mausklicks bekommst du in OnMouseDown übergeben (als X und Y). Bei OnClick müsstest du Mouse.GetCursorPos verwenden, was aber bei schnellen Bewegungen ungenauer ist.
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mo 26.01.09 16:45
...?
- Du weißt, wo der User hinklickt (bekommst du im OnMouseDown mitgeliefert)
- Du kennst die aktuelle Position der Patrone
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
ultraz06 
      
Beiträge: 84
|
Verfasst: Mo 26.01.09 17:06
ich kenne ja eben nicht die aktuelle position der patrone ich weiß nur von wo sie anfängt sich zu bewegen aber nicht die weiteren koordinaten
gibt es keine routine die das ausgibt?
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 26.01.09 17:39
ultraz06 hat folgendes geschrieben : | | ich kenne ja eben nicht die aktuelle position der patrone ich weiß nur von wo sie anfängt sich zu bewegen aber nicht die weiteren koordinaten |
Wie soll das gehen? Was sind denn xAkt und yAkt? Das sind doch die Koordinaten.
|
|
ultraz06 
      
Beiträge: 84
|
Verfasst: Mo 26.01.09 18:40
ah^^ jetzt versteh ich
und wie geht das mit onmousedown um auf die x und y zu zugreifen?
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 26.01.09 18:42
Schreib einfach mal in OnMouseDown das rein: Delphi-Quelltext 1:
| ShowMessage('Koordinaten (' + IntToStr(X) + ', ' + IntToStr(Y) + ') geklickt!'); | Du bekommst die Koordinaten da in X und Y übergeben.
|
|
ultraz06 
      
Beiträge: 84
|
Verfasst: Mo 26.01.09 18:47
wenn ich das so eingebe ShowMessage('Koordinaten (' + IntToStr(Xakt) + ', ' + IntToStr(Yakt) + ') geklickt!');
kommt gleich beim start die message und er hört nicht auf die koordinaten zu zählen?
soll ich vllt ma den ganzen uelltext posten?
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 26.01.09 18:48
ultraz06 hat folgendes geschrieben : | | kommt gleich beim start die message und er hört nicht auf die koordinaten zu zählen? |
Und du hast das sicher in OnMouseDown gelegt, und nicht OnMouseMove oder FormCreate?
ultraz06 hat folgendes geschrieben : | | soll ich vllt ma den ganzen uelltext posten? |
Das wäre wohl sinnvoll, ja.
|
|
ultraz06 
      
Beiträge: 84
|
Verfasst: Mo 26.01.09 18:50
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: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls;
type TForm1 = class(TForm) Timer1: TTimer; PaintBox1: TPaintBox; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure PaintBox1Paint(Sender: TObject); procedure Zeichnen; procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Berechnen(x,y:integer); procedure FormActivate(Sender: TObject); procedure PaintBox1Click(Sender: TObject);
private public end;
var Form1: TForm1; Hg:TBitmap; patrone:TBitmap; Puffer:TBitmap; xAkt,yAkt,Geschwindigkeit,AnzDurchgange:integer; SummandX,SummandY,xAktExt,yAktExt:extended; x,y:integer; StreckeX,StreckeY:integer; StreckeC:extended; implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin xAkt:=0; yAkt:=0; patrone:=TBitmap.Create; Hg:=TBitmap.Create; Hg.LoadFromFile('Hg.bmp'); patrone.LoadFromFile('patrone.bmp'); patrone.Width:=100; patrone.Height:=100; patrone.Transparent:=false; Puffer:=TBitmap.Create; hg.Width := form1.Width; hg.Height := form1.Height; Puffer.Width:=hg.Width; Puffer.height:=hg.Height; Geschwindigkeit:=5;
end;
procedure TForm1.Zeichnen; begin Puffer.Canvas.Draw(0,0,Hg); Puffer.Canvas.Draw(xAkt,yAkt,patrone);
paintbox1.Canvas.Draw(0,0,Puffer);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin xAkt:=xAkt+5; Zeichnen; if AnzDurchgange > 0 then begin xAktExt:=xAktExt+SummandX; yAktExt:=yAktExt+SummandY; xAkt:=round(xAktExt); yAkt:=round(yAktExt); Zeichnen; dec(AnzDurchgange); end
end;
procedure TForm1.PaintBox1Paint(Sender: TObject); begin Zeichnen; end; procedure TForm1.Berechnen(x,y:integer); var StreckeX,StreckeY:integer; StreckeC:extended; begin StreckeX:=x-xAkt; StreckeY:=y-yAkt; StreckeC:=sqrt(sqr(StreckeX)+sqr(StreckeY)); AnzDurchgange:=round(StreckeC/Geschwindigkeit); SummandX:=StreckeX/AnzDurchgange; SummandY:=StreckeY/AnzDurchgange; xAktExt:=xAkt; yAktExt:=yAkt; end;
procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Berechnen(x,y); Zeichnen;
end;
procedure TForm1.FormActivate(Sender: TObject); begin paintbox1.width:=form1.width; paintbox1.height:=form1.Height; end;
procedure TForm1.PaintBox1Click(Sender: TObject); begin ShowMessage('Koordinaten (' + IntToStr(Xakt) + ', ' + IntToStr(Yakt) + ') geklickt'); end;
end. |
Moderiert von Narses: Delphi-Tags hinzugefügt
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 26.01.09 18:52
Erstens schreibe deinen Quelltext bitte in Delphi-Tags hier im Forum:<span class="inlineSyntax"><span class="codecomment">{PROTECTTAG8f3c8a770c722a8b81cd563b5589a5c9}</span></span>
Zweitens hast du das ShowMessage in OnClick und nicht in OnMouseDown geschrieben und X und Y durch Xakt und Yakt ersetzt...
// EDIT:
Du kannst es natürlich auch in OnMouseUp setzen. Oder du speicherst X und Y in globalen Variablen und benutzt die dann in OnClick.
|
|
ultraz06 
      
Beiträge: 84
|
Verfasst: Mo 26.01.09 18:59
ok soweit habe ich es verstanden nun muss ich ja noch die koordianten des mausklicks mit den kooardinaten des bitmaps vergleichen, ich wollte es so machen aber das scheint nicht zu gehen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if (X) and (Y) = (Yakt) and (xakt) then begin Puffer.Canvas.Draw(0,0,Hg); paintbox1.Canvas.Draw(0,0,Puffer) end;; |
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 26.01.09 19:07
Du musst schauen ob das X vom Klick zwischen der linken Kante des Bildes (Xakt) und der rechten (Xakt + breite) liegt. Genauso mit Y.
|
|
ultraz06 
      
Beiträge: 84
|
Verfasst: Mo 26.01.09 19:15
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 26.01.09 20:48
|
|
ultraz06 
      
Beiträge: 84
|
Verfasst: Mo 26.01.09 21:25
so danke dir erstmal
jetzt ist natürlich noch das problem das die patrone beim klick verschwinden muss, entweder der hintergrund wird neu gezeichnet oder gibt es noch eine andere möglichkeit?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if (X >= Xakt) and (X <= Xakt + patrone.Width) then if (y>=yakt) and (y<=yakt +patrone.Height) then begin Puffer.Canvas.Draw(0,0,Hg); paintbox1.Canvas.Draw(0,0,Puffer); |
nur leider geht das nicht 
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 26.01.09 21:29
|
|
|