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.