我需要捕捉"OnMouseEnter"和"0nMouseLeave"在TPageControl组件的某个区域。对于这个特定的区域,我的意思是整个“选项卡标题”矩形。
问题是,页面控件没有在“空”空间中捕获消息(我正在捕获内部控制消息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;发布于 2010-12-28 09:45:58
显然,空空间不属于控件的工作区,因此该控件不会收到任何与鼠标相关的Windows消息。您必须使用窗体的鼠标事件。或者将页面控件放入面板中(使用alClient)并使用面板的鼠标事件。
如果您不止一次需要这样做,您可以创建一个新组件来完成此任务(将面板和页面控件组合起来以实现所需的行为)。
发布于 2010-12-28 10:24:55
您确定要处理的是页控件本身的OnMouseEnter/OnMouseLeave,而不是它包含的TTabSheet实例吗?
https://stackoverflow.com/questions/4545062
复制相似问题