我应该怎么做才能激活窗口?

时间:2011-08-23 11:03:12

标签: delphi winapi

  

可能重复:
  How to prevent form from being activated when the users clicks on it?

我的意思是,我想创建一个看起来像工具提示窗口的弹出窗口。我正在使用ShowWindowSetWindowPos来显示和设置其位置。我已经尝试了SW_SHOWNOACTIVE,它在弹出窗口出现时非常适合;但是当我点击弹出窗口时,它会聚焦,我不希望这种情况发生。此外,当这个弹出窗口可见时,无论它是否聚焦,都不会向其后面的窗口发送任何消息。

我实际上是在编写一个Object Inspector组件,对于long值,当鼠标悬停一个long值时,它必须显示一个工具提示。我希望这个工具提示看起来像一个普通的工具提示。我不想直接使用Windows工具提示而不是Delphi Tooltip。我想用自己的窗户。

P.S。我认为这个问题很常见,我搜索过,但是我找不到与我的问题完全匹配的答案。

提前致谢。 Javid

1 个答案:

答案 0 :(得分:1)

试试这个:

TMyTooltipWindow = class(TCustomControl)
private
  procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
  procedure WMMouseActivate(var Message: TWMMouseActivate); message WM_MOUSEACTIVATE;
protected
  procedure CreateParams(var Params: TCreateParams); override;
end;

procedure TMyTooltipWindow.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style := WS_POPUP or WS_BORDER;
  Params.ExStyle := WS_EX_TOOLWINDOW;
  Params.WindowClass.style := Params.WindowClass.style + CS_SAVEBITS;
end;

procedure TMyTooltipWindow.WMMouseActivate(var Message: TWMMouseActivate);
begin
  inherited;
  Message.Result := MA_NOACTIVATE;
end;

procedure TMyTooltipWindow.WMNCHitTest(var Message: TWMNCHitTest);
begin
  // this will make your window transparent for clicks 
  Message.Result := HTTRANSPARENT;
end;

这不允许用鼠标激活窗口。

另外在Controls.pas中查看 THintWindow 可能会有所帮助。