Delphi组件中的鼠标滚轮事件

5

我想编写一个组件,使用鼠标滚轮来缩放,类似于谷歌地球。

我有一个使用onMouseWheel的组件,我有MaxZoom、MinZoom和Zoom属性,有没有更好的选择,可以用位图StretchDraw代替,我试图获取窗体中组件区域的位置。

据我所知,我必须找到每个父级,直到找到tCustomform,并将所有组件的top和components left相加,以获取对象的位置。是否有更好的方法?

一旦我获得了位置,我就可以从鼠标光标位置开始缩放地图,如果鼠标在我的对象上方,则确定从哪里缩放。

有人看到过任何代码吗?


我认为这个问题不能在组件中可靠地解决,因为鼠标滚轮消息并不总是发送到鼠标下的窗口。根据我的观察,滚轮消息有时只发送到“表单”窗口,有时只发送到鼠标下的窗口,有时会同时发送到两者!我解决这个问题的方法是将来自表单窗口的消息转发到相关的子组件,并在子组件中编写一些代码以尝试避免重复激活。问题在于,我的解决方案需要表单的协作,因此它不是“自包含”的。 - Cosmin Prund
2个回答

3

如果您正在编写一个组件,那么您应该尝试覆盖组件中的这两个方法:

function DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean; override;
function DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean; override;

这两个方法是TControl类的受保护动态方法。每当鼠标滚轮旋转时,它们就会被调用。


2
取决于您要放大的内容类型;我将在此处发布如何获取滚轮移动时间的方法。
私有声明。
private
{ Private declarations }
procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);

在创建或任何其他启动过程中

OnMouseWheel := formMouseWheel; // depends on you 

表单鼠标滚轮的样式如下所示。
procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
// your code here 
// WheelDelta returns you - or + values (in my computer -120 and + 120 ; 
// It depends on control panel mouse wheel settings)

//   If it is a font make the font size bigger or 
// if it is a image 
 // strech := true;
//  increase width and height of the Timage
//and put them inside a scrollbox
// 
end;

我使用了VCL窗体(不是组件内部)进行检查, 如果您想要缩放内容,请告诉我们您想要缩放的内容类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接