delphi中使用mapx想用鼠标滚轮实现自定义倍率的缩放,并且限制一定的缩放倍数

来源:互联网 发布:客户地图制作软件 编辑:程序博客网 时间:2024/05/16 07:04

我将只有将MousewheelSuppor属性设置成 miMousewheelNoAutoScroll或 miFullMousewheelSupport才能触发Mapx的MouseWheel事件。miNoMousewheelSupport不能。我设置成了miMousewheelNoAutoScroll,但是在MouseWheel中不管将map1.Zoom:= map1.Zoom*1.5;设置成几倍,最终都会按照系统默认的2倍进行缩放。

我想实现缩放到一定倍数后便不能再缩放的功能,走投无路之时,想了一个变态的方法勉强能应付
procedure TFrmMain.Map1MouseWheel(ASender: TObject; Flags: Integer;
  zDelta: Smallint; var X, Y: Single; var EnableDefault: WordBool);
var mapX,mapY:double;
begin
      map1.ConvertCoord(X,Y,mapX,mapY,miScreenToMap);//映射坐标 以指针所在位置居中缩放
      map1.Hint:='';
      if zDelta=120 then//滚轮向前放大
         if map1.Zoom<StartZoom*0.5 then begin//StartZoom 为我的初始大小[color=#FF0000]integer[/color]类型,避免double类型小数不准确问题  
            map1.Zoom:=map1.Zoom*2;//这里是为了解决自动放大两倍而先缩小2倍抵消用

            map1.Hint:='已经最大';
         end
         else begin
            map1.CenterX:= mapX;
            map1.CenterY:= mapY;
         end
      else if zDelta=-120 then//滚轮向后缩小
         if (Round(map1.zoom)>=StartZoom) then begin
            map1.Zoom:=map1.Zoom*0.5;//这里是为了解决自动缩小两倍而先放大2倍抵消用

            map1.Hint:='缩小至最佳';
            map1.CenterX:= StartCenterX;//初始中心位置
            map1.CenterY:= StartCenterY;
         end
         else begin
            map1.CenterX:= mapX;
            map1.CenterY:= mapY;
         end

end;

最终有个问题就是,一旦滚轮转的太快或者一直转仍然会继续放大缩小,唉,我能做的只有这么多了

原创粉丝点击