Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - MouseOver


rhodan - Mi 12.01.11 23:56
Titel: MouseOver
huhu

ich hab habe eine landkarte als bild im programm vorliegen. nun möchte ich das wenn die maus über einem bestimmten land ist, der name des landes in einem panel links von der karte angezeigt wird. zu diesem zweck habe ich "unsichtbare bilder" erzeugt, sprich images in die ich keine bilder geladen habe die ich über die länder gelegt habe. nun möchte ich bei diesen unsichbaren einen mouseovereffekt erzeugen, heisst wenn die maus drüber schwebt soll der name des landes bzw das panel mit dem namen des landes sichtbar sein.

funktioniert auch, die frage ist, wie mache ich das panel wieder unsichtbar wenn die maus NICHT mehr über dem land ist??

habe etwas von mouseenter/mouseleave gelesen, aber weiß nicht ob das hier das richtige ist, vielleicht ist die lösung viel einfacher.

danke


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 13.01.2011 um 00:48


Bergmann89 - Do 13.01.11 00:04

Hey,

eine konkrete Lösung dazu fällt mir auch grad ncht ein. ABER: so wie ich das verstanden habe benutzt du jeweils eine Image/Bild für jedes Land, richtig? mach doch einfach eine Karte wo jedes land eine eigene Farbe hat, die lädst du dann in eine Bitmap und beim MouseOver ließt du mit den Koordinaten der Maus die Farbe in der Bitmap aus. Dann kannst du der Farbe ein Land zuordnen. Das ganze packst du in ne Funktion und dann kannst du dementsprechend dein Label benennen. Das ganze sollte dann ungefähr so aussehen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
TCountry = (laUnknown, laGermany, laEngland, laFrance, ...)
function GetCountry(X, Y: Integer): TCountry;
var
  c: TColor;
begin
  c := CountryMap.Canvas.Pixels[X, Y];
  case c of
    clBlack: result := laGermany;
    clRed  : result := laEngland;
    clGreen: result := laFrance;
    {...}
  else
    result := laUnknown;
  end;
end;


MfG Bergmann.


Tilman - Do 13.01.11 00:23

user profile iconrhodan hat folgendes geschrieben Zum zitierten Posting springen:
habe etwas von mouseenter/mouseleave gelesen, aber weiß nicht ob das hier das richtige ist,


Doch das müsste funktionieren, das gibts aber erst in neueren Delphi's, in D7 z.B. noch nicht. Das kann man aber mit messages einfach nachbauen. Es gibt aber noch ne andere Möglichkeit: wenn ich dich richtig verstehe, dann hast du ja ein großes Bild und viele kleine. Du kannst dann einfach das MouseOver vom großen Bild nehmen, um das Panel wieder auszublenden. Das funktioniert zwar nicht 100%, weil der Benutzer ja auch die Maus z.B. über den Rand des Fenster hinwegbewegen kann, aber vielleicht reicht es für deinen Zweck.


bummi - Do 13.01.11 00:27

Wenn Du Dir Regions für die Länder anlegst könntest Du im Mousemove über PtInRegion testen.


rhodan - Do 13.01.11 00:56

danke tilman...das war zu einfach auf die lösung hätte ich selbst kommen müssen, danke.
danke auch für die anderen antworten, die möglichkeit ginge selbstverständlich auch ist aber fpr diesen zweck zu aufwendig.

gracias


DonManfred - Do 13.01.11 11:19

HotSport-Image von TMS [http://www.tmssoftware.com/site/hsimg.asp] wäre evtl. auch eine passende Alternative.