Entwickler-Ecke
Multimedia / Grafik - Frage zu Delphix
Howard - Fr 03.01.03 19:38
Titel: Frage zu Delphix
Also, ich habe mir auf eine dxdraw-fläche über sone dximagelist ein Hintergrundbild bzw eine landkarte anzeigen lassen.Ein Dxtimer löst das ganze aus, das klappt auch soweit...aber nun hab ich noch ein zweites bild in der imagelist, ein kleines...dieses soll sobal jemand auf eine stelle der karte klickt dort gezeichnet werden..mein code dafür sieht so aus:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm2.DXTimer1Timer(Sender: TObject; LagCount: Integer); begin if not DXDraw1.CanDraw then Exit; DXImageList1.Items[0].draw(DXDraw1.Surface, 0, 0, 0); DXDraw1.Flip; end;
procedure TForm2.DXDraw1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var cursorpos: tpoint; begin getcursorpos(cursorpos); dximagelist1.Items[1].draw(DXDraw1.Surface, cursorpos.x,cursorpos.y, 0); end;
end. |
passiert aber nix :shock:
edit:
ok, hatte das dxdraw1.flip; vergessen...jetzt zeigt er es kurz an, aber nur kurz, dann ises wieder weg, und es erscheint auch nich an der mausposition... :(
thx, Howi
Borlox - Sa 04.01.03 00:50
Titel: Fehler
Der Fehler liegt darin, dass dein Timer das ganze ja immer wieder neu zeichnet, wie oft, kommt auf den Timer drauf an!
Und wenn du mit der Maus auf den Bildschirm zeichnest, dann macht er das zwar auch, aber sofort wird das ganze wieder von dem Timer wieder übergemalt!
Howard - Sa 04.01.03 00:58
ok, hast recht, hab den code vom timer einfach in das oncreate ereignis des formulars geschrieben...nu zeichnet er mal garkein bild...und das andere bild erscheint auch immernoch gut 200 pixel vom mauszeiger entfernt...
gruß Howard
Borlox - Sa 04.01.03 16:07
Titel: ???
Poste doch einfach mal deinen Code, dann kann man leichter den Fehler finden!
Howard - Sa 04.01.03 19:07
also:
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:
| unit Unit2;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DXClass, DXDraws;
type TForm2 = class(TForm) DXDraw1: TDXDraw; DXImageList1: TDXImageList; procedure FormCreate(Sender: TObject); procedure FormActivate(Sender: TObject); procedure DXDraw1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
private { Private-Deklarationen } public { Public-Deklarationen } end;
var Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.DXDraw1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var cursorpos: tpoint; begin getcursorpos(cursorpos); dximagelist1.Items[1].draw(DXDraw1.Surface, cursorpos.x,cursorpos.y, 0); DXDraw1.Flip; end;
procedure TForm2.FormCreate(Sender: TObject); begin if not DXDraw1.CanDraw then Exit; DXImageList1.Items[0].draw(DXDraw1.Surface, 0, 0, 0); DXDraw1.Flip; end;
procedure TForm2.FormActivate(Sender: TObject);
begin if not DXDraw1.CanDraw then Exit; DXImageList1.Items[0].draw(DXDraw1.Surface, 0, 0, 0); DXDraw1.Flip; end;
end. |
so schauts aus
Thunderman - Sa 04.01.03 19:33
Hallo!
Man macht das prinzipiell so, dass man immer alles neu zeichnen lässt. Dabei guckt man aber, was gerade wo sichtbar ist, und was nicht. In deinem OnTimer zeichnest Du jetzt einfach wie vorher auch die Karte, und immer wenn man mit der Mauklickst, setzt Du eine globale Variable auf True und speicherst auch die Mauskoordinaten ab. Jetzt überprüfst Du in deinem OnTimer, ob die Variable True ist, wenn ja zeichnest Du dein Bild einfach an den gespeicherten Koordinaten, ansonsten lässt Du es einfach bleiben.
Howard - Sa 04.01.03 21:15
Ok danke :)
Das funktioniert im Prinzip, nur das wie gesagt das gezeichnete bild nicht am mauscursor erscheint bzw dort wo man hingeklickt hat
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:
| procedure TForm2.DXDraw1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var cursorpos : tpoint; begin g:= true; getcursorpos(cursorpos); c:= cursorpos.x; d:= cursorpos.y; end;
//hiermit speicher ich die koordinaten
procedure TForm2.DXTimer1Timer(Sender: TObject; LagCount: Integer); begin if not DXDraw1.CanDraw then Exit; DXImageList1.Items[0].draw(DXDraw1.Surface, 0, 0, 0);
if g= true then dximagelist1.Items[1].draw(dxdraw1.surface,c,d,0); DXDraw1.Flip; end;
// zeichen-prozedur |
wieso speicher der falsche koordinaten?
Criz - So 19.01.03 02:30
Zu deinem Problem mit OnCreate:
Zum Zeitpunkt, an dem die Form erstellt wird,
ist DXDraw noch nicht initialisiert. Das dauert etwa
eine halbe Sekunde.
Criz - So 19.01.03 02:40
Hier mein Vorschlag:
Ich würde das Bild nur neu zeichnen lassen, wenn sich wirklich was verändert, also den Timer ganz rausnehmen und folgendes probieren:
Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm2.DXDraw1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin dximagelist1.items[0].draw(dxdraw1.surface, 0, 0, 0); dximagelist1.items[1].draw(dxdraw1.surface, x, y, 0); dxdraw1.flip; end; |
Eine andere Variante wäre es, den Timer drin zu lassen und ihn immer das
Bild flippen zu lassen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!