The easiest solution I had found for "1" is to send a WM_NCACTIVATE to the calling form as soon as the popup-form gets activated (in a WM_ACTIVATE handler), so that the calling form would draw its caption with the active colors. You'll have to have a reference for the calling form in the popup-form to achieve this.
For "2", you can release the popup form in the same WM_ACTIVATE handler, this won't eat the clicks that goes to the calling form.
So sth. like this should go to the popup-form;
type
TForm2 = class(TForm)
[..]
private
FOwner: TForm;
procedure WmActivate(var Msg: TWMActivate); message WM_ACTIVATE;
public
constructor Create(AOwner: TComponent); override;
[...]
constructor TForm2.Create(AOwner: TComponent);
begin
if not (AOwner is TForm) then
raise Exception.Create('Owner should be TForm');
FOwner := TForm(AOwner);
inherited;
end;
procedure TForm2.WmActivate(var Msg: TWMActivate);
begin
SendMessage(FOwner.Handle, WM_NCACTIVATE, Ord(Msg.Active <> WA_INACTIVE), 0);
inherited;
if Msg.Active = WA_INACTIVE then
Release;
end;
and supply the calling form as the owner of the popup-form;
procedure TForm1.Button1Click(Sender: TObject);
var
PopForm: TForm2;
begin
PopForm := TForm2.Create(Self);
[..]
FWIW, I agree with both
loursonwinny and
Ulrich. IMO a popup-form is more complicated then it seems. Though in the case of SpTBXFormPopupMenu you'd have to install two libraries,
TB2K and
SpTBXLib. At least browsing the sources could hint on what could get involved.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…