![]() |
ListBox TopLevel
Gibt es eine Möglichkeit eine ListBox über allen anderen Komponenten zu setzen inklusive der eigenen Mainform?
Damit sie sich so verhält wie eine Combobox? Ich hab schon so einiges versucht SetWindowPos und die dafür verwendbaren Flags. Hat nichts gebracht.. Siehe Bild unten das Teil das wie eine Combo aussieht, bekomme ich nicht über die MainForm. gruss |
AW: ListBox TopLevel
Wenn es sich auf die (Main)Form als Komponente drauf malt, dann nein.
Wenn es selber in einem "eigenem" Fenster ist, dann ja. (siehe Hints, PopupMenüs und DropDown-Fenster ala ComboBox) |
AW: ListBox TopLevel
Zitat:
Irgendwelche Informationen welche Style des Fensters Verwendung finden? WS_POPUP oder WS_OVERLAPED WS_CHILD und oder Parent Handle ? Glaube das dürfte nicht egal sein damit es funktioniert. gruss |
AW: ListBox TopLevel
FormStyle := fsStayOnTop sollte helfen
|
AW: ListBox TopLevel
Zitat:
Und nein würde auch nicht funktionieren.. (mit der ListBox ohne DropDown Window) Sagte schon das ich SetWindowPos und Konsorte schon versucht habe. gruss |
AW: ListBox TopLevel
Zitat:
Man könnte auf die blöde Idee kommen und in der Forms.pas nachgucken, was fsStayOnTop macht. :angle: SetWindowPos + HWND_TOPMOST Aber TopMost würde ich nicht nehmen. Es muß als Owner das Programmfenster bekommen und vermutlich wird man oft etwas mit WS_POPUP und eventuell SWP_NOACTIVATE verwenden. ![]() |
AW: ListBox TopLevel
Zitat:
Ich sagte schon das es nicht funktioniert inklusive aller Flags von SetWindowPos. Ich bekomme ohne eines emulierten DropDown (ala Combobox) so wie von dir vorgeschlagen die Einträge meiner Listbox nicht onTop.. Zitat:
Da ich fast ausschließlich Nonvcl programmiere. Zitat:
Dann werde ich das Fenster mit dem Style WS_POPUP auslegen. WS_CHILD weglassen und das Parent Handle auf 0 setzen. gruss |
AW: ListBox TopLevel
Da ist wohl nix zu machen.
Ich habe es auf verschiedene weise versucht aber das DropDown (für meine ListBox) verhalten der Combobox lässt sich nicht emulieren. Na ja wollte es nur noch mitteilen falls jemand anderes er versuchen sollte. gruss |
AW: ListBox TopLevel
In den Rx Komponenten gibt es ein TComboEdit welches dieses Verhalten nachstellt. Diese befindet sich in der Unit RxToolEdit. Da müsste ersichtlich sein, wie das gemacht wird.
Ich habe hier nur einen Stand vom 4.9.2012. Einen neueren Stand kann man unter ![]() |
AW: ListBox TopLevel
Zitat:
Danke.. Eigentlich dürfte es kein Problem sein wenn ich als Parent GetDesktopWindow nehme und anschließend die Listbox über das Window mit MoveWindow verschiebe. Das Problem ist nur das ohne Top_Most die Liste auch nicht über das Hauptfenster gezeichnet wird. Zudem geht mir dann noch die Transparenz verloren. Das schlimmst aber ist das die Liste dann on Top über alle Explorer Fenster liegt wenn ich ein Fenster über die Anwendung verschiebe. OK werde mir das Teil mal anschauen. EDIT: Keine Infos die mich weiterbringen gruss |
AW: ListBox TopLevel
Zitat:
ListBox1.BringToFront; Your_Other_Controls.SendToBack; MfG, Terence |
AW: ListBox TopLevel
Ich weise nochmal darauf hin.
Zitat:
Werde das Thema deshalb aus meinen Abonnierten Themen entfernen. gruss |
AW: ListBox TopLevel
Ok hier ist die Lösung falls es mal jemand braucht.
Delphi-Quellcode:
Das wars.
WM_LBUTTONDOWN:
// Die ListBox mit deren Handle auf den Desktop legen SetParent(WinHandle, GetDesktopWindow); //(alternativ für GetDesktopWindow einfach 0) //TopMost festlegen um das TopLEvel Window zu erhalten Skinengine.SetZorder(WinHandle, HWND_TOPMOST); //Mouse Event Aufnehmen damit die Mausmessagen an die Layered ListBox weitergereicht werden. SetCapture(WinHandle); //Layered Attribute für die ListBox setzen Skinengine.SetLayeredAlpha(WinHandle, 175); .... WM_LBUTTONUP: //Layered Style entfernen sonst sieht man die ListBox nicht mehr. (Child kann kein Layered Window haben) OldStyle := GetWindowLong(WinHandle, GWL_EXSTYLE); SetWindowLong(WinHandle, GWL_EXSTYLE, OldStyle and (not WS_EX_LAYERED)); //MouseEvents für die ListBox freigeben ReleaseCapture; // Vom Desktop zurück in die Hauptanwendung SetParent(WinHandle, HParent); // ListBox positionieren SetWindowPos(WinHandle, HWND_TOP, FLeft, FTop, FWidth - FLeft, FHeight, SWP_NOACTIVATE); Und das Ergebnis! Die ListBox ist jetzt TopLevel (geht über die MainForm hinaus und transparent.) gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz