首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TPageControl选项卡区域OnMouseEnter OnMouseLeave事件

TPageControl选项卡区域OnMouseEnter OnMouseLeave事件
EN

Stack Overflow用户
提问于 2010-12-28 09:38:36
回答 2查看 1K关注 0票数 2

我需要捕捉"OnMouseEnter""0nMouseLeave"TPageControl组件的某个区域。对于这个特定的区域,我的意思是整个“选项卡标题”矩形。

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

我的目标是画一个小箭头在右边,当用户悬停在红色框区(绘图只是小菜一碟),当离开这个区域时擦除它。我也不关心标签的溢出(这会导致滚动的双按钮)--这是永远不会发生的。

下面是代码的工作部分,,但它不是明确的解决方案,我不喜欢它,。必须有另一种(更干净的)方法来做这件事。

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-28 09:45:58

显然,空空间不属于控件的工作区,因此该控件不会收到任何与鼠标相关的Windows消息。您必须使用窗体的鼠标事件。或者将页面控件放入面板中(使用alClient)并使用面板的鼠标事件。

如果您不止一次需要这样做,您可以创建一个新组件来完成此任务(将面板和页面控件组合起来以实现所需的行为)。

票数 1
EN

Stack Overflow用户

发布于 2010-12-28 10:24:55

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4545062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档