gpt4 book ai didi

delphi - TPageControl 选项卡区域 OnMouseEnter OnMouseLeave 事件

转载 作者:行者123 更新时间:2023-12-03 18:43:51 28 4
gpt4 key购买 nike

我需要 catch "OnMouseEnter" "0nMouseLeave"对于的某个区域TPageControl 组件 .对于那个特定区域,我的意思是 整个“标签页眉”矩形 .

问题是,页面控制没有捕捉到消息 (我正在捕获内部控制消息 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;

最佳答案

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

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

关于delphi - TPageControl 选项卡区域 OnMouseEnter OnMouseLeave 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4545062/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com