Tatsache: MouseDown wird vorher aufgerufen, aber MouseUp später. Macht ja eigentlich auch Sinn.
Hab’s jetzt so gelöst:
Delphi-Quellcode:
TfrmMain = class(TForm)
{…}
private
FPopupActive,
FPreventMouseUp: Boolean;
procedure EnterMenuLoop(var Msg); message CM_ENTERMENULOOP;
public
{…}
end;
procedure TfrmMain.EnterMenuLoop(var Msg);
begin
FPopupActive := True;
end;
procedure TfrmMain.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
begin
FPopupActive := false;
end;
procedure TfrmMain.PaintBoxMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if FPopupActive then
begin
FPreventMouseUp := True;
exit;
end;
{…}
end;
procedure TfrmMain.PaintBoxMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if FPreventMouseUp then
begin
FPreventMouseUp := False;
exit;
end;
{…}
end;
Vielleicht sollte man noch eine Kontrolle einführen, ob MouseDown und MouseUp sich auf den gleichen MouseButton beziehen, aber vielleicht ist das auch schon wieder Overkill.
So funktioniert es jedenfalls erstmal.
Danke euch allen