Entwickler-Ecke

Multimedia / Grafik - In einem Image nach MouseUp an bestimmter Position zeichnen


galagher - Sa 30.01.16 11:07
Titel: In einem Image nach MouseUp an bestimmter Position zeichnen
Hallo!

Ich habe ein Image, 500x500 Pixel.

Es sollen 50x50 Pixel grosse Icons so heineingezeichnet werden, dass sie genau neben- und untereinander sind, also je 10 waag- und senkrecht.

Wenn ich nun auf das Image klicke, soll das Icon korrekt in jenem Bereich eingepasst werden, in dem es nach obigem Schema liegen soll. Also kann ich nicht einfach Mouse.CursorPos.X, Mouse.CursorPos.Y verwenden.
Wie muss ich Mouse.CursorPos, ScreenToClient und X, Y zusammen einsetzen?

Ich hoffe, ihr versteht, was ich meine!


jaenicke - Sa 30.01.16 12:27

Hört sich nach einem gezeichneten Raster an wie ich es hier demonstriert habe:
http://www.delphi-forum.de/viewtopic.php?p=557541

Prinzipiell ist das ja einfache Mathematik. Du teilst einfach die Mausposition bezogen auf das Bild durch 50, der ganzzahlige Anteil ist dann die Spalte bzw. Zeile. Sprich Image.ScreenToClient(Mouse.CursorPos).X div 50. Wobei du Mouse.CursorPos.X eigentlich gar nicht brauchst, da du im MouseUp die Position ja mitbekommst, sprich eigentlich reicht div 50.


galagher - So 31.01.16 19:10

Dein Projekt kann ich nicht kompilieren, da gibt's 39 Fehlermeldungen:
Zitat:
[DCC Fehler] PeriodXtremeSHDocVw.pas(1686): E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen

Nimm's nicht persönlich, aber ich möchte dem jetzt nicht auf den Grund gehen!

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
sprich eigentlich reicht div 50.

Wenn ich, wie du vorschlägst, Image1.Canvas.Draw(X div 50, Y div 50, aIcon); angebe, wird bei jedem Klicken alles stets in der linken oberen Ecke gezeichnet, je nachdem, wo ich klicke, um einige Pixel versetzt, aber im Grunde alles links oben!

//Edit: Habe die Lösung:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
  p := Image1.ScreenToClient(Mouse.CursorPos);

  p.x := p.x div 50;
  p.y := p.y div 50;
 
  aIcon := TIcon.Create;

  ImageList1.GetIcon(0, aIcon);
  Image1.Canvas.Draw(p.X * 50, p.Y * 50, aIcon);

  aIcon.Free;


Das kriege ich noch einfacher hin, mal sehen!