我需要为 TPageControl组件的特定区域捕获“OnMouseEnter”和“0nMouseLeave”。对于该特定区域,我的意思是整个“标签页”矩形。
问题是,页面控件没有捕获消息(我正在捕捉内部控制消息CM_MOUSEENTER和CM_MOUSELEAVE)在“空”空间。
我的目的是当用户在红色框架区域中盘旋(并且绘图只是一块蛋糕)时在右侧空方绘制一个小箭头,并在离开该区域时将其擦除。而且我不关心标签的溢出(导致绘制滚动双按钮) - 这将永远不会发生。
这是代码的工作,但它不是明确的解决方案,我不喜欢它。必须有另一种(更干净)的方式来做到这一点。
type
TPageControl = class(ComCtrls.TPageControl)
protected
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
end;
procedure TPageControl.CMMouseLeave(var Message: TMessage);
begin
inherited;
Canvas.TextOut(Width - 130, 5, 'CMMouseLeave'); // display result
end;
procedure TPageControl.WMNCHitTest(var Message: TWMNCHitTest);
var TabHeaderRect: TRect;
begin
if Message.Result = 0 then // if Message.Result = HTNOWHERE ...
begin
TabHeaderRect := ClientRect;
TabHeaderRect.Bottom := Top + 21;
if PtInRect(TabHeaderRect, ScreenToClient(Point(Message.XPos, Message.YPos))) then
Canvas.TextOut(Width - 130, 5, 'WMNCHitTest '); // display result
Message.Result := HTCLIENT;
end
else
inherited;
end;
答案 0 :(得分:1)
显然,空白空间不属于控件的客户区,因此控件不会获取该区域的任何与鼠标相关的Windows消息。您将不得不使用表单的鼠标事件。或者将页面控件放在面板中(使用alClient
)并使用面板的鼠标事件。
如果你不止一次需要这个,你可以创建一个新的组件来完成那个(组合一个面板和一个页面控件来实现所需的行为)。
答案 1 :(得分:0)
您确定要为页面控件本身处理OnMouseEnter / OnMouseLeave,而不是它包含的TTabSheet实例吗?