我想模仿TComBo列表功能,该功能在用户单击列表"外部"时关闭,但是对于另一个组件(TPanel).在Delphi XE2中.任何的想法 ?
假设您的面板是专注的(因为我从您的问题中"读取"),然后回复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;
Run Code Online (Sandbox Code Playgroud)
当面板本身没有聚焦时,例如儿童控制器,那么这将不起作用.在这种情况下,您可以跟踪所有鼠标点击(例如,通过使用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;
Run Code Online (Sandbox Code Playgroud)
但是当点击是 - 例如 - 在属于面板但部分展开在其外部的组合框的列表中时,这仍然不会成功.我不知道如何从点击信息中提取面板.