现在的程序界面上有两个TImage,分别显示原图和放大图,真实的鼠标位置在放大图上,现在在原图上需要有个类似于光标的东西来指示鼠标当前位置。该怎么实现啊,有谁有想法吗?谢谢!

解决方案 »

  1.   

    去年下半年没上CSDN
    今年春天重新回来
    回了N多贴
    但有大量贴子楼主失踪
    问题得到解决不结贴而去
    直接打击了本人的回贴欲不知本贴楼主肯结贴不?
    如肯,给你代码
    但要声明:不是画鼠标光标(因为那是个ICON,画上就擦不掉了),而是用十字模拟了一个光标
      

  2.   

    得,楼主今晚不在,我也别那么小气了请到这里看效果:http://hi.baidu.com/382943850/blog/item/2fb06708eb4d19d463d986ee.html代码写得不好,请别笑话因为百度空间破坏了代码的格式,再贴到这里:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls;type
      TForm1 = class(TForm)
        Image1: TImage;  {缩略图}
        Image2: TImage;  {原始尺寸图}
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Image2MouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure Image2MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure Image2MouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
        { Private declarations }
        R : TRect;
        CanSelect : boolean;
        xOld, yOld: integer;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      with Self.Image1 do begin
        Width := 100;
        Height:= 100;
        Stretch := True;
      end;
      Self.Image2.AutoSize:= True;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      Self.Image2.Picture.LoadFromFile('c:\test.bmp');
      Self.Image2.Canvas.Pen.Mode := pmNot;
      Self.Image2.Canvas.Brush.Style := bsCross;{只是演示一种效果,另可用bsClear等}
      R := Rect(0, 0, 0, 0);
      with Self.Image1.Canvas do
        CopyRect(ClipRect, Image2.Canvas, Image2.Canvas.ClipRect);
    end;procedure TForm1.Image2MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      with Image2.Canvas do begin
        if (xOld<>0) and (yOld<>0) then begin {此处这个判断有点点问题,但无关紧要}
          MoveTo(xOld-10, yOld);
          LineTo(xOld+10, yOld);
          MoveTo(xOld, yOld-10);
          LineTo(xOld, yOld+10);
        end;
        MoveTo(X-10, Y);
        LineTo(X+10, Y);
        MoveTo(X, Y-10);
        LineTo(X, Y+10);
        xOld := X;
        yOld := Y;
      end;
      if CanSelect then begin
        Image2.Canvas.Rectangle(R);
        R.Right := X;
        R.Bottom := Y;
        Image2.Canvas.Rectangle(R);
      end;
      with Self.Image1.Canvas do
        CopyRect(ClipRect, Image2.Canvas, Image2.Canvas.ClipRect);
    end;procedure TForm1.Image2MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if Button = mbLeft then begin
        CanSelect := True;
        if (R.Left<>R.Right) and (R.Top<>R.Bottom) then
          Image2.Canvas.Rectangle(R);
        R.Left := X;
        R.Top := Y;
        R.Right := X;
        R.Bottom := Y;
      end;
    end;procedure TForm1.Image2MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      CanSelect := False;
    end;end.
      

  3.   

    谢谢linhuasoft,当然结了,即使没有合适的答案也会结的
    刚上线,先研究下你的程序,呵呵。不懂的再问
      

  4.   

    恩,跟需要的不太一样。那个画方框的思路还挺挺像的,可以先在原图上画标志,在放大到放大图之前在原位置重画标志,这样原图上的标志就不会显示到放大图上。
    刚试了一下Image1.Picture.bitmap.canvas 和Image1.canvas,以为这两个的内容是不一样的。不然可以在Image1.Canvas上画标志,放大时将Image1.Picture.bitmap.canvas的内容StrechBlt,呵呵失败。
      

  5.   

    现在是将原图内容StrechBlt到放大图,但不能将原图中用来指示位置的标志也放大出来,放大图的光标是另外定的。如果原图指示位置能用光标形式就最好啦,不然上面这种重画也可以试一下,先给些分,继续等
      

  6.   

    我每贴都结的,上次谢谢你回答我的问题。
    我问那个问题就是为了写一个百度css的查看器
      

  7.   


    to 楼主:
        这段程序,是看到你的问题之后写的,并非以前写的。但是我误解了你的意思:你的意思是原图+放大图;而我看走眼了,成了原图+缩略图。不过道理是一样的。稍稍改一下代码就成。你自己就能办到。
        另外,关于你在7楼说的前半部分,我读了几遍,猜测了一下你的意思:还是想画Cursor是吗?的确可以的。Cursor是一个TIcon对象,可以获得它的尺寸,然后只要拷贝相应大小的一块图暂时保存起来,Cursor移动之后,再重新画上。但我不打算给你改写代码了。你可以等别人给你改。我认为十字光标好用。^_^
        7楼下半部分,要表达的意思是:用Bitmap.Canvas画,与Image.Canvas画,效果不一样,是吗?首先声明,我为了节省代码,没有用一个幕后的TBitmap对象。两个的Canvas都是一样的,假设图片有尺寸的变形,就不太一样了。但是,只要把工作全部放在TBitmap里做,包括长宽调整等,就没问题了。to 楼上三位兄弟:谢谢你们。