Wie erstelle ich ein Popupfenster?
Sonntag, Januar 29th, 2012Popupmenüs kennt wohl jeder Windowsnutzer, aber warum sollte der Mechanismus nicht genutzt werden, um komplexere Aufgaben zu übernehmen. Mit diesem Blog möchte ich kurz beschreiben, wie man ein Popupfenster erstellt, auf dem man dann beliebige Komponenten platzieren kann. Das Popupfenster basiert auf einem einfachen Formular, bei dem allerdings einige Dinge berücksichtigt werden müssen.
Keinen Rahmen
Damit das Popupfenster einem Popupmenü ähnlich sieht, darf das Formular keinen Rahmen haben. Setzt dafür einfach die Eigenschaft BorderStyle des Formulars auf bsNone. Zusätzlich platziere ich meist ein TPanel auf das Formular (alClient), damit ich einen sichtbaren Rand erhalte.
Schließen des Popups
Da das Forumlar keinen Rahmen besitzt, gibt es erstmal keine Möglichkeit, um dieses zu schließen, wenn es einmal angezeigt wird. Folgendes Event für das Panel schafft Abhilfe:
procedure TfrmBVAImageInfo.pClientClick(Sender: TObject); begin Close; end;
Damit das Popup-Fenster ebenfalls geschlossen wird, wenn man außerhalb des Fensters auf die darunterliegende Anwendung klickt, wird folgendes Event benötigt:
procedure TfrmBVAImageInfo.FormDeactivate(Sender: TObject); begin Close; end;
Anzeige des Popupfensters
Damit das FormDeactivate Event ausgelöst werden kann, darf das Popupfenster nicht Modal geöffnet werden. Außerdem muss beim Anzeigen den Fensters die Position des Formulars, an die aktuelle Mausposition verschoben werden. Hierfür kann folgende Funktion genutzt werden:
procedure TBVAThumbnail.ShowImageInfo(aX,aY:Integer; aItem:TBVADLDataListItem); begin if aX+FInfo.Width < Screen.DesktopWidth-10 then FInfo.Left := aX else FInfo.Left := Screen.DesktopWidth-FInfo.Width-10; if aY+FInfo.Height < Screen.DesktopHeight -10 then FInfo.Top := aY else FInfo.Top := Screen.DesktopHeight-FInfo.Height-10;
FInfo.Show; end;
FShow ist hierbei das Formular des Popupfensters und aX bzw aY die aktuelle Mausposition, die man aus dem jeweiligen Mausevent erhält, welches das Popup öffnen soll. Durch die beiden If-Abfragen wird sichergestellt, das das Popupfenster immer ganz sichtbar ist.
WMActivate
Zu guter letzt benötigt man noch einen kleinen Trick, damit während das Popupfenster angezeigt wird, das Hauptfenster der Anwendung weiterhin als aktives Fenster sichtbar bleibt:
procedure TfrmBVAImageInfo.WmActivate(var Msg: TWMActivate); begin SendMessage(Application.MainForm.Handle, WM_NCACTIVATE, Ord(Msg.Active <> WA_INACTIVE), 0); inherited; end;
Das fertige Popupfenster sieht dann wie folgt aus: