TPageControl选项卡区域OnMouseEnter OnMouseLeave事件

时间:2010-12-28 09:38:37

标签: delphi winapi

我需要为 TPageControl组件的特定区域捕获“OnMouseEnter”“0nMouseLeave”。对于该特定区域,我的意思是整个“标签页”矩形

问题是,页面控件没有捕获消息(我正在捕捉内部控制消息CM_MOUSEENTER和CM_MOUSELEAVE)在“空”空间

screenshot

我的目的是当用户在红色框架区域中盘旋(并且绘图只是一块蛋糕)时在右侧空方绘制一个小箭头,并在离开该区域时将其擦除。而且我不关心标签的溢出(导致绘制滚动双按钮) - 这将永远不会发生。

这是代码的工作,但它不是明确的解决方案,我不喜欢它。必须有另一种(更干净)的方式来做到这一点。

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;

2 个答案:

答案 0 :(得分:1)

显然,空白空间不属于控件的客户区,因此控件不会获取该区域的任何与鼠标相关的Windows消息。您将不得不使用表单的鼠标事件。或者将页面控件放在面板中(使用alClient)并使用面板的鼠标事件。

如果你不止一次需要这个,你可以创建一个新的组件来完成那个(组合一个面板和一个页面控件来实现所需的行为)。

答案 1 :(得分:0)

您确定要为页面控件本身处理OnMouseEnter / OnMouseLeave,而不是它包含的TTabSheet实例吗?