问题1   在IMAGE控件上加载一张图片,图片尺寸很大,整个屏幕显示不完,所以需要向ACD图片软件上那样,用手可以拖动图片,图片可以移动,不是IMAGE移动最好是按住CTRL或者SHELFT键移动,因为鼠标按键在下面我需要用的来获取点下来的坐标的。
   问题2  IMAGE的鼠标移动事件里获得鼠标移到的左边,要求以MM(毫米)为单位我自己写了个代码是以整数问单位的给大家看看
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
 pos : string;
begin
 pos := format('%3d,%3d',[X,Y]);
 statusbar1.Panels[1].Text := pos;
end;
请大家写出的代码有注释,我是新手怕看不懂,谢谢了,分不多请大家体谅。

解决方案 »

  1.   

    将image放到ScrollBox中,image设置autosize,然后ScrollBox会显示滚动条
      

  2.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, JPEG;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure FormPaint(Sender: TObject);
        procedure FormResize(Sender: TObject);
        procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
        Jpg: TJpegImage;
        StartX, StartY, px, py, mx, my: Integer;
        MouseDown: Boolean;
        procedure WMEraseBkGnd(var Msg: TWMEraseBkGnd); message WM_ERASEBKGND;
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      Jpg := TJpegImage.Create;
      Jpg.LoadFromFile('1.jpg');
      px := 0;
      py := 0;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Jpg.Free;
    end;procedure TForm1.FormPaint(Sender: TObject);
    begin
      Canvas.Draw(px, py, Jpg);
    end;procedure TForm1.FormResize(Sender: TObject);
    begin
      if Assigned(Jpg) then begin
        mx := ClientWidth - Jpg.Width;
        my := ClientHeight - Jpg.Height;
      end;
    end;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if not MouseDown then
      begin
        MouseDown := True;
        StartX := X;
        StartY := Y;
      end;
    end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if MouseDown then
      begin
        Dec(px, StartX - X);
        Dec(py, StartY - Y);
        if px > 0 then px := 0;
        if px < mx then px := mx;
        if py > 0 then py := 0;
        if py < my then py := my;
        StartX := X;
        StartY := Y;
        Refresh;
      end;
    end;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if MouseDown then
        MouseDown := False;
    end;procedure TForm1.WMEraseBkGnd(var Msg: TWMEraseBkGnd);
    begin
      Msg.Result := -1;
    end;end.编译目录放置一个大于Form的1.jpg的图片文件。看效果。
      

  3.   

    pos是函数,最好不要用做变量名。如果需要转换为mm,那么可以 pos1 := format('%3d,%3d',[Round((X / Screen.PixelsPerInch) * 25.4),Round((Y / Screen.PixelsPerInch) * 25.4)]);
     statusbar1.Panels[1].Text := pos1;
      

  4.   

    楼上的放了个2592X1944的图片2M大小,显示不出来,能不能把鼠标按下的时间加一个坐标,显示为MM是单精度型
      

  5.   

    要不就把
    Jpg.LoadFromFile('1.jpg');
    换成
    Jpg.LoadFromFile('c:\1.jpg');
    这样把你的1.jpg放到c:\根目录。需要注意的是,有些jpg文件Delphi会打不开,需要先用绘图工具转换成bmp,然后再转换成jpg即可。具体原因没有研究过……Delphi的问题吧。"能不能把鼠标按下的时间加一个坐标,显示为MM是单精度型"这句话……我没理解……