有没有像“Form1.MousePreview:= true”这样的解决方法?

时间:2012-12-16 18:04:24

标签: delphi mouseevent vcl mousemove

我有两个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事件来过滤掉PageList,页面上的两个页面和所有组件吗?

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

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

1 个答案:

答案 0 :(得分:4)

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