Autor Beitrag
beastofchaos
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: Sa 25.12.10 23:36 
Hallo Leute, ich habe schon das nächste Problem für mein Minigolfprogramm, im Anhang findet ihr die Datei mit allem DrumundDran ;)

Mein programm zeichnet per MouseMove eine Linie und speichert sie in Image2. dieses Image2 überlagert leider die Canvaszeichnung meiner Kugel ( auch wenn Image2 im Hintergrund ist ). Image2 ist übrigens so ziemlich über das ganze Form verteilt und dadurch, dass es über alles drüber geht, aktualisiert es auch die Images und Canvaszeichnungen, die dadurch blinken oder gar nicht erzeugt werden/hinter dem Image sind. Schaut euch doch bitte mal meinen Quelltext an. Hab auch einen Timer, der die Kugel imemr wieder malen soll, aber da ist es halt wirklich so, dass die Kugel hinter dem Image2 ist.

MfG Thomas


Moderiert von user profile iconMartok: Topic aus Sonstiges (Delphi) verschoben am Sa 25.12.2010 um 22:37


@Martok:Tschuldige, da hab ich mich wohl geirrt^-^

edit: Da hab ich noch eine Frage zu meiner Kugelzeichnung. Wie schaff ich es, dass bei FormCreate gleich die Kugel gezeichnet wird mit Canvas. Wenn ich den Befehl bei Formcreate eingebe oder nem Timer, der auf True gesetzte ist, das machen lasse, kommt nichts. Erst, wenn ich einen Button klicke, funktioniert das. Weiß jem eine Lösung?

Moderiert von user profile iconNarses: Inline- in normalen Anhang gewandelt und Binaries aus dem Archiv entfernt.
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von beastofchaos am Sa 25.12.10 23:55, insgesamt 1-mal bearbeitet
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: Sa 25.12.10 23:50 
Naja, habs mir nicht angeschaut, klingt aber so, als würdest du mehrere Komponenten benutzen, um zu zeichnen? Dann solltest du besser nur eine einzige Zeichenfläche nehmen, die zur Anzeige des Gesamtbildes verwendet wird. Um Teilbereiche zu zeichnen (Ball, Hintergrund, Schläger oder was auch immer) solltest du besser Komponenten wählen, die nicht angezeigt werden, sondern nur zum internen Gebrauch gedacht sind. Wie z.B. TBitmap, in der kannst du beliebig zeichnen, dem Benutzer wird nichts angezeigt. Wenn du mit dem Zeichnen fertig bist, kopierst du es in die visuelle Komponente zum Anzeigen hinein.

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19321
Erhaltene Danke: 1748

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 26.12.10 00:00 
Ein wenig Besserung könnte es schon bringen, wenn du DoubleBuffered des Formulars und ggf. von Panels usw. auf True setzt.

Wirklich sinnvoll wäre aber wie schon geschrieben das insgesamt zu zeichnen, am besten vermutlich auf eine TPaintBox.
beastofchaos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: So 26.12.10 00:14 
Ich find die TBitmap / TPaintbox nicht bei mir ( habe Delphi 7 ). In welches Kategorie ist das?

Hab mal Doublebuffered von Form auf True gesetzt. Mein Hindernis ( Image1 ) funktioniert einwandfrei. Nur blinkt imemr noch meine Canvaszeichnung von der Kugel. Ich mach das ganze ( außerdem Hindernis ) mit Shape. Mal schaun, ob das funktioniert.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19321
Erhaltene Danke: 1748

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 26.12.10 00:26 
user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
Ich find die TBitmap / TPaintbox nicht bei mir ( habe Delphi 7 ). In welches Kategorie ist das?
TBitmap ist keine visuelle Komponente, sondern eine Klasse. TPaintBox findest du unter System.
[url]www.michael-puff.de/...enBitmap.shtml[/url]
beastofchaos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: So 26.12.10 00:32 
Ich hab schon eine andere Lösung gefunden. Ich benutze jetzt immer noch Image2 ( da ich ja auch die anderen nicht finden kann^^). ich binde den Kreis in Image2 mit ein - also es nicht einfach gezeichnet wird, sondern auch in Image2 mit der Linie gespeichert wird ;)

Bloß schaffe ichs jetzt nicht, die Brush.Color/Pen.Color zu verändern und er malt nur einen kreis, der "Pen.Color:= Black" und "Brsuh.Color:=White" hat... Wisst ihr wieso und kennt ihr eine Lösung?
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: So 26.12.10 01:11 
Eine Lösung wäre, TPaintBox zu verwenden. Über lang oder kurz wirst du darauf zurückgreifen müssen, denn alles andere sind nur kurzfristige Lösungen.

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
beastofchaos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: So 26.12.10 01:19 
Kann ich ruhig machen, aber ich bekomms nicht hin. Dieser Befehl zum Beispiel funktioniert nicht mit Paintbox: Paintbox1.Canvas.Ellipse(x1,y1,x2,y2);
Wie müss das da dann lauten? :)

Gehe jetzt schlafen, bis morgen
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19321
Erhaltene Danke: 1748

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 26.12.10 01:24 
Inwiefern funktioniert der nicht? Kann es sein, dass du aus Versehen den Code nicht im OnPaint der PaintBox zu stehen hast?

Und auch dort ist das eigentlich nicht so sinnvoll. Meistens ist es besser, wenn du zuerst (wie im Link oben beschrieben) auf eine TBitmap zeichnest und diese in OnPaint nur auf die PaintBox kopierst. Denn sonst flackert es meistens trotzdem etwas.
beastofchaos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: So 26.12.10 02:06 
Jep, in nem anderen Topic hab ich das schon mitbekommen/durch gelesen ( habe noch nie mit bmp und paintbox gearbeitet ). Weiß jetzt wie es funktioniert, aber hab gleich wieder ein Problem ( warsch mit der Bitmap ). Im Anhang ist ein BIld, Sobald ich mit der maus auf das ausführende Form dann komme, aktiviert er ja das MouseMove Ereignis, bloß kommt dann diese Fehlermeldung: "Access violation at adress 00430300 in module 'Project.exe'. Read of addres 000000000." Also hat er ein Problem mit dem Auslesen der exe-Datei, aber ich hab keinen blassen Schimmer, wieso :/
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19321
Erhaltene Danke: 1748

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 26.12.10 02:07 
Kein Problem mit der Exe, ich vermute du hast vergessen die Bitmap zu erzeugen.
beastofchaos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: So 26.12.10 02:10 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Kein Problem mit der Exe, ich vermute du hast vergessen die Bitmap zu erzeugen.


Ne, steht:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var bmp: TBitMap
.
.
.
Formcreate[...]
begin
bmp := TBitmap.Create;
bmp.Canvas.Brush.Color := clRed;
bmp.Canvas.Pen.Width := 3;
bmp.Width := Paintbox1.Width;
bmp.Height := Paintbox1.Height

Im Anhang ist ein Bild davon (jpg, 412.27 KB) ;)

Moderiert von user profile iconNarses: Delphi-Tags und Link auf Bild im Anhang hinzugefügt
Einloggen, um Attachments anzusehen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19321
Erhaltene Danke: 1748

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 26.12.10 02:14 
Was steht denn an der Stelle, an der der Fehler auftritt?

Die Fehlermeldung heißt einfach, dass du versuchst auf die Adresse 0 (also nix) zuzugreifen. Weil in einer Variable der Wert 0 steht.
beastofchaos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: So 26.12.10 02:28 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Kein Problem mit der Exe, ich vermute du hast vergessen die Bitmap zu erzeugen.



user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Was steht denn an der Stelle, an der der Fehler auftritt?

Die Fehlermeldung heißt einfach, dass du versuchst auf die Adresse 0 (also nix) zuzugreifen. Weil in einer Variable der Wert 0 steht.


Ah, mich hat gewundert, dass das nicht in der üblichen Fehlleiste steht (Problem war: "PaintBox1:=nil"). Jetzt hab ich das entfernt und er zeichnet nichts. Iwie schaff ich das nicht, dass er die bmp zeichnet und das dann in der Paintbox ausgibt.

Hier der Quellcode:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if Timer1.Enabled=False then begin
Canvas.Pen.Color:=ClBlack;
Canvas.Brush.Color:=ClBlue;
Maus:=PaintBox1.ScreentoClient(Mouse.CursorPos);
d:=(x1+x2)/2;
e:=(y1+y2)/2;
bmp.Canvas.MoveTo(trunc(d-PaintBox1.Left),trunc(e-PaintBox1.top));
bmp.Canvas.LineTo(Maus.x,Maus.y);
PaintBox1.Repaint;
bmp.Canvas.Ellipse(x1,y1,x2,y2);
PaintBox1.Repaint;
end;
end;


Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19321
Erhaltene Danke: 1748

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 26.12.10 02:46 
user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if Timer1.Enabled=False then begin
Besser:
ausblenden Delphi-Quelltext
1:
if not Timer1.Enabled then					


user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
Canvas.Pen.Color:=ClBlack;
Canvas.Brush.Color:=ClBlue;
Das ist zwar nicht falsch, aber ich verstehe nicht, warum du die Farben beim Formular änderst. Dort zeichnest du doch sowieso nicht. :gruebel:

user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
Maus:=PaintBox1.ScreentoClient(Mouse.CursorPos);					
Du hast die Koordinaten doch schon als Parameter direkt in X und Y.

user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
PaintBox1.Repaint;					
Hast du OnPaint denn auch implementiert? Kopierst du dort die Bitmap auf die PaintBox?
beastofchaos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: So 26.12.10 14:19 
Zitat:
user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if Timer1.Enabled=False then begin
Besser:
ausblenden Delphi-Quelltext
1:
if not Timer1.Enabled then					

Das ist eigentlich nicht so wichtig/benötigend , aber danke :)


Zitat:
user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
Canvas.Pen.Color:=ClBlack;
Canvas.Brush.Color:=ClBlue;
Das ist zwar nicht falsch, aber ich verstehe nicht, warum du die Farben beim Formular änderst. Dort zeichnest du doch sowieso nicht. :gruebel:

Naja, damit kann man doch die allgemeine Farbe für alles bestimmen, oder? der muss ich davor ein "Paintbox1." oder "bmp." setzen?


Zitat:
user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
Maus:=PaintBox1.ScreentoClient(Mouse.CursorPos);					
Du hast die Koordinaten doch schon als Parameter direkt in X und Y.

Ich find das sauberer, weil ich das ja später dafür brauche:
ausblenden Delphi-Quelltext
1:
bmp.Canvas.LineTo(Maus.x,Maus.y);					



Zitat:
user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
PaintBox1.Repaint;					
Hast du OnPaint denn auch implementiert? Kopierst du dort die Bitmap auf die PaintBox?

ich weiß nicht, was du meinst. Ich hab Paintbox1 auf dem Form gemacht, bmp in variablen definiert und in Form nochmal "bmp:=TBitmap.Creat" geschrieben.
Muss ich der Painjtbox ncoh sagen, dass er das von bmp malen soll, weil ich das ja von bmp auf die Paintbox kopieren will? ;)
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: So 26.12.10 15:00 
user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
Zitat:
user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if Timer1.Enabled=False then begin
Besser:
ausblenden Delphi-Quelltext
1:
if not Timer1.Enabled then					

Das ist eigentlich nicht so wichtig/benötigend , aber danke :)


Doch, das ist wichtig. Führt in 99% der Fälle nicht zu Fehlern, aber NUR so ist es absolut sauber programmiert. Am besten direkt abgewöhnen, Konstruktionen wie =true oder =false zu verwenden.


user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
Zitat:
user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
Canvas.Pen.Color:=ClBlack;
Canvas.Brush.Color:=ClBlue;
Das ist zwar nicht falsch, aber ich verstehe nicht, warum du die Farben beim Formular änderst. Dort zeichnest du doch sowieso nicht. :gruebel:

Naja, damit kann man doch die allgemeine Farbe für alles bestimmen, oder? der muss ich davor ein "Paintbox1." oder "bmp." setzen?


Wenn du nichts davor schreibst (und das gilt für alle Anweisungen analog), dann bezieht sich das immer nur auf dein Hauptformular (Form1). Woher soll Delphi denn wissen, worauf es sich sonst bezieht?



user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
Zitat:
user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
Maus:=PaintBox1.ScreentoClient(Mouse.CursorPos);					
Du hast die Koordinaten doch schon als Parameter direkt in X und Y.

Ich find das sauberer, weil ich das ja später dafür brauche:
ausblenden Delphi-Quelltext
1:
bmp.Canvas.LineTo(Maus.x,Maus.y);					


Ist trotzdem nicht sauberer. Die Parameter bekommst du ja bereits korrekt übergeben, da muss man das Rad nicht neu erfinden ;) Jeder, der nach dir den Sourcecode lesen wird, wird sich fragen, warum du das so machst und wird sich in die Doku einlesen, ob das ScreentoClient eventuell was anderes liefert als das X und Y. Niemand kann ahnen, warum du das verwendest (es sei denn, du kommentierst die Stelle).


user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
Zitat:
user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
PaintBox1.Repaint;					
Hast du OnPaint denn auch implementiert? Kopierst du dort die Bitmap auf die PaintBox?

ich weiß nicht, was du meinst. Ich hab Paintbox1 auf dem Form gemacht, bmp in variablen definiert und in Form nochmal "bmp:=TBitmap.Creat" geschrieben.
Muss ich der Painjtbox ncoh sagen, dass er das von bmp malen soll, weil ich das ja von bmp auf die Paintbox kopieren will? ;)


Ja logisch! Du sagst der Paintbox, dass sie sich neuzeichnen soll, aber du sagst ihr nicht, was wie wo wann warum...

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)

Für diesen Beitrag haben gedankt: beastofchaos
beastofchaos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: So 26.12.10 15:08 
1. Das mit "True" und "False" merk ich mir, denke. Vll bekomm ich bei meinem Referat dafür ein Plus :p

2.Also soll ich schreiben:
ausblenden Delphi-Quelltext
1:
2:
Paintbox1.Canvas.Pen.Color:=ClBlack;
Paintbox1.Canvas.Brush.Color::=ClBlue;

oder soll ich das mit
bmp.Canvas etc.
schreiben?

3.Wie soll ich das dann schreiben? etwa so:
ausblenden Delphi-Quelltext
1:
bmp.Canvas.LineTo(PaintBox1.ScreentoClient(Mouse.CursorPos.x),PaintBox1.ScreentoClient(Mouse.CursorPos.y);					

Denn ich meine, dass geht nicht. Und statt der langen Wortfolge fand ich halt Maus übersichtlicher ;)

4.Wie lautet der Befehl, mit dem ich Paintbox sage bmp zu zeichnen?
Hab mal im anderen Topic nachgeschaut, so? :
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  BitBlt(PaintBox1.Canvas.Handle, 00, bmp.Width, bmp.Height, bmp.Canvas.Handle,
    00, SrcCopy);
end;
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: So 26.12.10 15:31 
2) Schreib eben das dahin, worauf gezeichnet werden soll. Ob bmp, Paintbox1 oder was auch immer, kannst ja nur du wissen ;)

3) Vlt. vertue ich mich da auch. Aber wenn ich das richtig verstanden habe, dann zeichnet du im MouseMove-Event einer Image-Komponente? Falls ja, so liefert das MouseMove direkt X und Y mit, also musst du nur X und Y schreiben. Oder findet das Zeichnen außerhalb dieses Events statt?

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
beastofchaos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: So 26.12.10 16:03 
user profile iconplatzwart hat folgendes geschrieben Zum zitierten Posting springen:

2) Schreib eben das dahin, worauf gezeichnet werden soll. Ob bmp, Paintbox1 oder was auch immer, kannst ja nur du wissen ;)

Jo, meine Frage war da eher, ob man as mit der virtuellen Bitmap machen soll doer mit der Paintbox, weil die das ja dann erst malt.

user profile iconplatzwart hat folgendes geschrieben Zum zitierten Posting springen:

3) Vlt. vertue ich mich da auch. Aber wenn ich das richtig verstanden habe, dann zeichnet du im MouseMove-Event einer Image-Komponente? Falls ja, so liefert das MouseMove direkt X und Y mit, also musst du nur X und Y schreiben. Oder findet das Zeichnen außerhalb dieses Events statt?


Das ganze ist in MouseMove drin, das stimmt! Aber wenn er die Koordinaten liest, liest er nur die Koordinaten auf dem ganzen Bildschirm und nicht in der Paintbox. Deswegen benutz ich ja auch "ScreenToClient".