2

我有两个 100% 重叠的面板,表单上有不同的内容。
默认情况下,第一个(信息的静态显示)应该是可见的,但是如果用户将鼠标移到两者附近,则另一个(用户交互)应该替换它 - 如果鼠标移开,它应该切换回来。
像这样的东西:

if (*the mouse is near*) then
begin
  Panel1.Hide;
  Panel2.Show;
end
else
begin
  Panel2.Hide;
  Panel1.Show;
end;

我的问题是:在哪里捕捉鼠标移动?
每个组件都有自己的OnMouseMove处理程序——当然我可以将它们中的每一个转发给表单处理程序,但我宁愿有一些更优雅(并且更易于维护)的东西。
完美的解决方案类似于Form1.MousePreview := true;.

另一种解决方案是分配一个通用处理程序来转换坐标并调用表单处理程序;分配可以在 FormCreate 中完成。
但这并不像看起来那么容易,因为一个 TImage 已经拥有自己的鼠标事件处理程序。

我已经尝试OnMouseEnterOnMouseLeave两个面板,但没有成功;#1 消失了,但 #2 没有出现。我猜那是因为如果鼠标离开 Panel2,它应该会消失 - 但如果它输入一个按钮,它也会离开它。
这就是为什么我想使用基于坐标的方法来使检查更可靠。

也许两个面板方法是完全错误的?

更新:是的,正如雷米所说。
我现在使用的是 TJVPageList,因为 TPageControl 具有可视选项卡。
PageList的OnMouseEnter处理程序设置一页,设置另一页OnMouseLeave;但是一旦鼠标移到 PageList 上,两个页面都开始闪烁。我也尝试将事件处理程序添加到每个页面,但这没有任何区别。
我应该检查所有 OnMouseEnter/Leave事件以过滤掉页面列表、两个页面和页面上的所有组件吗?

另一个更新:我现在使用的是 TPageControl,但行为相似。
它不会闪烁,但是如果我将鼠标移到 TPageControl 上,则根本不会显示 TTabSheet。
只有当我按下鼠标左键时,才会显示 UI 表。如果我移开鼠标,另一张纸会正常显示。(如果我按下鼠标左键,TJVPageList 也会显示 UI 页面。)
我使用了 TPageControl 和 TTabSheets 的鼠标事件处理程序(进入/离开)。

更新3: 完成了。静态 Panel / TabSheet / JvStandardPage (#1) 不得触发OnMouseLeave处理程序。

4

1 回答 1

4

使用单个TPageControl而不是两个TPanel控件可能会更好地提供您所描述的内容。使用TPageControl自己的OnMouseEnter/Leave事件(或拦截CM_MOUSEENTER/LEAVE消息)根据需要切换TPageControl.ActivePage

于 2012-12-16T19:04:01.437 回答