Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Erstellen eines transparenten Rechtecks (https://www.delphipraxis.net/1485-erstellen-eines-transparenten-rechtecks.html)

Barzy2x 1. Dez 2002 21:10


Erstellen eines transparenten Rechtecks
 
Versuche zur Zeit ein Programm zu schreiben mit dem ich Zeitzonen und die jeweilige Zeit in diesen Zeitzonen ermitteln kann. Um das ganze benutzerfeundlicher zu machen, versuche ich ein transparentes Rechteck in ein Bild mit verschiedenen Zeitzonen einzubinden, damit der Benutzer über das Bild seine Zeitzone anklicken kann. Habe dazu ein Image in das Formular eingefügt. Weiß jemand ob und wie ich nun ein transparents Rechteck auf dieses Bild "legen" kann? Geht das mit TCanvas? Oder ist das mit einem Image gar nicht möglich?

Daniel B 1. Dez 2002 21:20

Hallo Barzy2x und Wilkommen,

wäre es nicht einfacher, die Koordinaten abzufragen, in denen der User geklickt hat?!?

Hier ist mal ein Beispiel, wie man einen Edit unsoichtbar macht und dennoch drauf reagieren kann.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit6.Brush.Style := bsClear;
  Edit6.BorderStyle := bsNone;
end;

procedure TForm1.Edit1Click(Sender: TObject);
begin
  ShowMessage('Klick!');
end;
Grüsse, Daniel :hi:

RomanK 1. Dez 2002 21:26

Hallo und Willkommen. :hi:
Du kannst auch das OnMouseDown Ereignis nehmen, und dann die Koordinaten abfragen.

Daniel B 1. Dez 2002 21:37

Kordinaten kannst Du zum Bleistift mit sowas abfragen:
Delphi-Quellcode:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ShowMessage('X=' + IntToStr(Mouse.CursorPos.X) + #13 + 'Y=' + IntToStr(Mouse.CursorPos.Y));
end;
Grüsse, Daniel :hi:

Daniel B 1. Dez 2002 21:42

Noch ein Einfall:
um die Bewegung "ständig" zu Überwachen, kannst Du dies noch benutzen:
Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Label1.Caption := IntToStr(Mouse.CursorPos.X);
  Label2.Caption := IntToStr(Mouse.CursorPos.Y);
end;
Somit müsstest Du nicht mehr auf klicken reagieren, sndern könntest immer sofort bei Bewegungen, Deine Zeitzone anzeigen.

Grüsse, Daniel :hi:

Barzy2x 1. Dez 2002 23:32

Die Idee mit den Koordinaten ist sehr hilfreich und ich werde sie sicherlich verwenden. Dennoch bleibt noch das Problem, dass ich die ausgewählte Zeitzone farblich hervorheben möchte.Habe dazu folgende (Test)procedure geschrieben:

procedure TZeitzone.ImageZZClick(Sender: TObject);

begin
with Zeitzone.ImageZZ do begin
Canvas.Pen.Style := pssolid ;
Canvas.Brush.Color := clred;
Canvas.Rectangle(322,429,337,645);

end;
end;

Der Effekt sollte sein, dass auf dem ImageZZ (nach anklicken) zumindest ein Viereck erscheint, das die gewählte Zeitzone markiert. Dies ist nicht der Fall.
Da ich mich erst seit kurzem mit Delphi beschäftige bin ich mir auch nicht sicher ob ich überhaupt irgendetwas auf ein Image projezieren kann. Gibt es vielleicht bessere Methoden?

Sebastian Nintemann 2. Dez 2002 11:57

Hallo Barzy2x, was passiert denn bei deiner Prozedur?
Das Problem dürfte auch sein, dass du das Rechteck ja auch wieder löschen musst, wenn du eine andere Zeitzone anklickst. Ich würde dir deshalb raten:
Nimm statt einer TImage Komponente eine TPaintBox.Das Bild, das du vorher im Image hattest lädst du in den Speicher (siehe TBitmap), dieses Bitmap kannst du dann immer beim Neuzeichnen (OnPaint der TPaintBox) auf die PaintBox (PaintBox.Canvas) zeichnen, und dazu dein Rechteck. Der Vorteil ist, dass du das eigentliche Bild nicht verändern musst, bei Bedarf zeichnest du das Bild einfach neu und hast kein altes Rechteck mehr drauf, beim TImage hingegen wird jede veränderung (beim zeichnen auf das Canvas) automatisch gespeichert.
Ich weiß jetzt nicht wie weit du damit umgehen kannst, du kannst dich bei Bedarf ja melden dann schreib ich dir eine Beispiel-Programmablauf.

Gruß, Sebastian

Sebastian Nintemann 2. Dez 2002 13:55

Hallo nochmal, was mir auch noch eingefallen ist:
Das TCanvas hat die Methode DrawFocusRect, die ist eigentlich genau das richtige für Markierungen. Im OnClick-Ereignis schreibst du also
Code:
Image1.Canvas.DrawFocusRect(rect(x1,y1,x2,y2));
x1,y1,x2,y2 sind die Koordinaten des Rechteckes.
Das gute bei DrawFocisRect ist, dass es sich auch umkehren lässt: Führst du nochmal den gleichen Befehl, mit den selben Koordinaten aus, so verschwindet das Focusrect wieder. Du musst dir also beim OnClick die Koordinaten merken (sprich in globale Variablen speichern), beim nächsten OnClick das alte Rect löschen (DrawFocusRect mit den alten Koordinaten aufrufen), dann mit den neuen Koordinaten, welche du dir dann auch wieder merkst. Auf diese Art und Weise musst du nicht viel an deinem Programm ändern, du kannst das TImage behalten.

Gruß, Sebastian

Nostromo 3. Dez 2002 20:24

Hallo,

wieso nimmst du nicht ein Panel das du an der Klick-Position auf Visible setzt. Auf dem Panel kannst du auch deinen Text verewigen.
Wozu denn aufwändig im Bild malen? :wink:

Du kannst ein Bild mit PaintShop/Photoshop bearbeiten und dort alle Zeitzonen beliebig einfärben.
Dieses Bild lädst du dann in ein Image und kannst die Zeit je nach gewählter Farbe unterhalb des Cursors anzeigen.
:hello:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz