4

我想模仿当用户单击列表“外部”时关闭的 TComBo 列表功能,但对于另一个组件(TPanel)。在德尔福 XE2 中。任何的想法 ?

4

1 回答 1

10

假设您的面板已聚焦(正如我从您的问题中“读取”的那样),然后响应CM_CANCELMODE发送到所有聚焦窗口的消息。

type
  TPanel = class(Vcl.ExtCtrls.TPanel)
  private
    procedure CMCancelMode(var Message: TCMCancelMode); message CM_CANCELMODE;
  end;

  ...

{ TPanel }

procedure TPanel.CMCancelMode(var Message: TCMCancelMode);
begin
  inherited;
  if Message.Sender <> Self then
    Hide;
end;

当面板本身没有聚焦时,例如子控件,那么这将不起作用。在这种情况下,您可以跟踪所有鼠标点击(例如通过使用TApplicationEvents.OnMessage处理程序)并计算点击是否在面板的范围内:

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if Panel1.Visible and
      (Msg.message >= WM_LBUTTONDOWN) and (Msg.message <= WM_MBUTTONDBLCLK) and
      not PtInRect(Panel1.ClientRect, Panel1.ScreenToClient(Msg.pt)) then
    Panel1.Hide;
end;

但是,当单击是 - 例如 - 在属于面板但部分展开在面板之外的组合框列表中时,这仍然不会成功。我不知道如何从该点击信息中提取面板。

于 2012-09-19T17:36:07.447 回答