Hi,
erstmal herzlich willkommen in der
DP!
P:
Du möchtest einen roten Punkt, der ständig im Vordergrund ist? Ok, wenn du's schön findest
Ich hab dir mal die Lösung angehangen.
Hier noch ein wenig Erklärung. An sich ist die Idee sehr einfach, du nimmst ein Formular (dies Hauptfenster das immer angezeigt wird). Würdest du dein Programm so starten, hast du ein leeres Fenster mit dieser Leiste oben, zum Schließen und minimieren usw. Diese Leiste möchtest du sicherlich nicht bei einem roten Punkt sehen, also schaltet man sie ab. Dazu findest du im Objektinspektor unter den Eigenschaften deines Forms BorderStyle, diese Eigenschaft änderst du auf BsNone (keine Titelleiste).
Als nächstes platzierst du ein TImage auf dem Form. Das ist eine Komponente in die du zeichnen kannst. Da hier dein Kreis reingezeichnet wird, machst du das TImage einfach so groß, wie dein Kreis später sein soll und das Form drum rum so klein, dass es genau mit der Image größe übereinstimmt.
Gut, du hast die Zeichenfläche, aber da ist jetzt noch kein roter Kreis drin. Macht nichts, kannst du ja zeichnen. Dazu wechselst du im Objektinspektor auf TForm1 (also dein Hauptformular) und klickst unter Ereignisse doppelt ins Feld OnCreate.
Hier fügst du die Routine zum zeichnen ein:
Delphi-Quellcode:
// Zeichenfarbe (Pinsel) auf rot setzen
self.Image1.Canvas.Brush.Color := clRed;
// Kreis zeichnen
self.Image1.Canvas.Ellipse(0, 0, self.Width, self.Height);
// DoubleBuffer aktivieren (verhindert flackern)
self.DoubleBuffered := true;
Soweit so gut. Wenn du jetzt startest, hättest du schon mal ein weißes Rechteck, mit einem roten Kreis drin. Toll, aber du wolltest sicherlich nur den roten Punkt, ohne rotes Rechteck? Dann machen wir weiß einfach mal etwas unsichtbar.
Dazu gehst du wieder auf deinen ObjektInspektor, auf das Form1 und suchst hier unter Eigenschaften TransparentColor. TransparentColor setzt du auf True und TransparentColorValue auf clWhite. Damit wird weiß transparent (also nicht mehr Sichtbar). Nun hast du also einen roten Kreis.
Wenn du diesen bewegen möchtest (mit der Maus) musst du auf Mausereignisse reagieren. Hierzu gehst du wieder auf den Objektinspektor, diesmal wählst du jedoch das Image.
Wird die Linke Maustaste gedrückt, so merkst du dir einfach, dass der Punkt bewegt wird und natürlich die Ausgangsposition.
Wird die Maus bewegt, so bewegst du den Punkt mit der Maus. Dazu berechnest du einfach den Unterschied zwischen der aktuellen Mausposition und den Ausgangskoordinaten. Natürlich solltest du den Punkt auch nur bewegen, wenn die linke Maustaste gedrückt ist.
Wird die linke Maustaste wieder losgelassen, so hörst du einfach mit dem Bewegen auf.
Dazu klickst du nacheinander doppelt auf OnMouseDown, OnMouseMove und OnMouseUp und fügst jeweils folgenden Code ein:
Delphi-Quellcode:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
// prüfen ob die linke Maustaste gedrückt wurde
if ssLeft in Shift then
begin
// aktuelle Mausposition merken
self.lastX := Mouse.CursorPos.X;
self.lastY := Mouse.CursorPos.Y;
// Modus wechseln
self.moving := True;
end;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
// wenn Modus moving aktiv
if self.moving then
begin
// Position des Fensters relativ zu Mauskoordinaten ändern
self.Left := self.Left + (Mouse.CursorPos.X - lastX);
self.Top := self.Top + (Mouse.CursorPos.Y - lastY);
// Merken der neuen Position
self.lastX := Mouse.CursorPos.X;
self.lastY := Mouse.CursorPos.Y;
end;
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
// Wenn Linke Maustaste losgelassen wurde
if Button = mbLeft then
begin
// Modus moving verlassen
self.moving := false;
end;
end;
Die Variablen moving : Boolean und lastX sowie lastY musst du im Form noch unter private eintragen, fertig.
Das sollte klappen. Hoffe es wahr halbwegs verständlich.
Gruß Der Unwissende