【发布时间】:2010-12-28 09:38:36
【问题描述】:
我需要为 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;
【问题讨论】:
-
我知道肯定可以给例如页面控件下具有适当高度的面板,并为页面控件的 OnMouseEnter 和 OnMouseLeave 和面板共享相同的事件,但我需要认真地将其包装在一个组件中。