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.