![]() |
Etwas außerhalb des Fensters zeichnen?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
hat jemand eine Idee, wie ich etwas außerhalb des Bereichs eines Fensters zeichnen kann? Das ganze ist vielleicht etwas pedantisch, aber.. Ich habe mir eine eigene Art von einem Hauptmenü geschrieben, in dem ich auch andere Komponenten wie checkboxen, TEdit oder Comboboxen einbauen kann. Die Submenüs musste ich allerdings als eigene Fenster designen. Das hat den Nachteil, dass der Rahmen meines normalen aktiven Fensters inaktiv wird sobald ich so ein Submenü anzeige. An dem Bild im Anhang wird das hoffentlich ersichtlich. Ein eigenes Fenster ist aber nötig, da ein Menü bei einem kleineren Fenster auch die Fenstergrenzen überschreiten kann. Bei einem "normalen" Hauptmenu geht das ja auch. Das wird aber auch von Windows direkt gemacht. Eine normale Komponent zeichnet sich aber im Bereich des übergeordneten Fensters. Ich hatte schon überlegt, ob man den gesamten Bildschirm als Parent nehmen kann, wüsste jetzt aber nicht, wie das gehen soll. Für mich wäre es jetzt das "non plus ultra", wenn das aktive Fenster auch weiterhin als aktive gezeichnet würde. Gruß Erwin |
AW: Etwas außerhalb des Fensters zeichnen?
Außerhalb zeichnen ginge zwar über das Desktopcanvas, hinterlässt aber Artefakte und nützt Dir nichts weil Du dann ja auch außerhalb klicken würdest.
Wenn Du auf Deinem PseudoMenü auf weitere WinControls verzichten kannst und selbst malst oder z.B. Lables verwendest könnte das hier weiterhelfen. Der Aufruf wäre dann statt Show, ShowAT ... z.B. MenuLikeForm.ShowAt(Mouse.CursorPos); Ein naheliegendere Möglichkeit wäre ein Popupmenu mit OwnerDraw:=true zu verwenden und On(Advanced)DrawItem sowie OnMeasureItem zu versorgen.
Delphi-Quellcode:
unit Unit2;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TMenuLikeForm = class(TForm) procedure CreateParams(var Params: TCreateParams);override; procedure WMMouseActivate(var Message: TMessage); message WM_MOUSEACTIVATE; private public Procedure ShowAt(P:TPoint); end; var MenuLikeForm: TMenuLikeForm; implementation {$R *.dfm} procedure TMenuLikeForm.CreateParams(var Params: TCreateParams); begin inherited ; Params.Style := WS_POPUPWINDOW ; Params.ExStyle := Params.ExStyle or WS_EX_NOACTIVATE ; end; procedure TMenuLikeForm.ShowAt(P: TPoint); begin Left := p.X; Top := p.Y; ShowWindow(Handle, SW_SHOWNOACTIVATE); Visible := true; end; procedure TMenuLikeForm.WMMouseActivate(var Message: TMessage); begin Message.Result := MA_NOACTIVATE; end; end. |
AW: Etwas außerhalb des Fensters zeichnen?
Ich hab zwar nicht ganz verstanden was du machen möchtest, aber vielleicht geht das einfacher als du denkst (falls du das denkst was ich denke, dass du denkst).
Hier ein einfaches Beispiel wie man Popupmenü genau unter einer Komponente (hier Button) positionieren kann. Vielleicht ist es bereits das was du brauchst.
Delphi-Quellcode:
//
procedure TForm1.Button1Click(Sender: TObject);
begin PopupMenu1.Popup(Button1.ClientOrigin.X, Button1.ClientOrigin.Y + Button1.Height); end; Achso, die meisten Köche kochen mit Wasser, d. h. wenn es in einigen Programmen manchmal so aussieht als ob irgendwas außerhalb des Fensters gezeichnet wird, dann wird oft ein temporäres Fenster erzeugt auf dem gezeichnet wird. Beispiel Total Commander bietet an einer Stelle eine Art eigene eigene Popupmenüs mit Bildlaufleiste (kannst mal angucken). Das wird mit eigenen Fenstern gelöst. Es werden so viele temporäre Fenster produziert, wie viel Menüs und Unternemüs benötigt werden. |
AW: Etwas außerhalb des Fensters zeichnen?
Der Tip mit dem CreateParams des Fensters ist klasse. Ich habe noch die Option WS_EX_TOPMOST hinzugefügt. Sonst was das Fenster meines Submenüs nämlich hinter meinem Orginalfenster.
Aber mit dieser Option klappt es super. Wenn ich in meine Submenü ein Editierfeld, welches von TEdit abgelitten wurde, einfüge, und dieses dann anklicke, wird mein Hauptfenster allerdings inaktiv. Ich schätze, das muss aber so sein, da ja die Eingaben an mein Editierfeld geschickt werden müssen, welches ja in einem anderen Fenster ist. Oder kann man dort auch ein NoActivat machen? Müssten dann die Keyboard messages noch manuell weiter geleitet werden? Vielen Dank schon mal Erwin |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:24 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