| Autor |
Beitrag |
Howard
Hält's aus hier
Beiträge: 8
|
Verfasst: Fr 03.01.03 19:38
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
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
      
Beiträge: 191
Win XP
Delphi 6 Enterprise
|
Verfasst: 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 
Hält's aus hier
Beiträge: 8
|
Verfasst: 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
      
Beiträge: 191
Win XP
Delphi 6 Enterprise
|
Verfasst: Sa 04.01.03 16:07
Titel: ???
Poste doch einfach mal deinen Code, dann kann man leichter den Fehler finden!
|
|
Howard 
Hält's aus hier
Beiträge: 8
|
Verfasst: Sa 04.01.03 19:07
also:
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
      
Beiträge: 26
|
Verfasst: 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.
_________________ Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?
|
|
Howard 
Hält's aus hier
Beiträge: 8
|
Verfasst: 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
      
Beiträge: 18
Win XP Prof.
D6 Ent, D7 Ent
|
Verfasst: 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
      
Beiträge: 18
Win XP Prof.
D6 Ent, D7 Ent
|
Verfasst: 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.
|
|
|