Image1中的图有N个点,这些点的坐标已知,当鼠标在Image1中移动时,在OnMouseMove中判断鼠标是否在这N个点上,如果在显示Image2,Image2的Letf,Top设为当前点的坐标,否则Image2隐藏。
程序这样没有问题。
但是当Image1放大、缩小时(这时Image2也按照Image1的比例同时放大、缩小),N各点的坐标也同时放大、缩小,这时鼠标移动到这N各点上显示Image2时,就能感觉到鼠标停顿,Image2闪烁,CPU占用率大幅上升,如果设置Form的DoubleBuffered为True,那么Image2不闪烁,但鼠标停顿更加厉害,CPU占用率也更高,有没有解决的方法?其中Image1,Image2的图片都是程序中Canvas手工画的,如果换为已存在的图片,那么停顿会减轻,但仍能感觉出停顿,闪烁。

解决方案 »

  1.   

    贴代码:
    Image2,Image3的AutoSize=false,Stretch=trueunit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls,  Menus, StdCtrls;type
      TForm1 = class(TForm)
        PopupMenu1: TPopupMenu;
        N11: TMenuItem;
        N21: TMenuItem;
        N41: TMenuItem;
        Line1: TMenuItem;
        Image2: TImage;
        Load1: TMenuItem;
        Image3: TImage;
        Label1: TLabel;
        Label2: TLabel;
        procedure FormShow(Sender: TObject);
        procedure N11Click(Sender: TObject);
        procedure N21Click(Sender: TObject);
        procedure N41Click(Sender: TObject);
        procedure Load1Click(Sender: TObject);
        procedure Image2MouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure Line1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    type
      TMyPix=Class
        PixX:integer;
        PixY:integer;
      end;
    var
      Form1: TForm1;
      MPixArr: array of TMyPix;
      i:integer;
      B:integer;
      MInfo:TMyPix;implementationuses Unit2;{$R *.dfm}procedure TForm1.FormShow(Sender: TObject);
    begin
      image2.Width :=663;
      image2.Height :=458;
      Image3.Canvas.MoveTo(1,1);
      Image3.Canvas.Pen.Color :=clBlue;
      Image3.Canvas.LineTo(1,16);
      Image3.Canvas.LineTo(16,16);
      Image3.Canvas.LineTo(16,1);
      Image3.Canvas.LineTo(1,1);
      Image3.Visible:=false;
      B:=1;
    end;procedure TForm1.N11Click(Sender: TObject);
    begin
      image2.Width :=663;
      image2.Height :=458;
      image3.Width :=17;
      image3.Height :=17;
      B:=1;
    end;procedure TForm1.N21Click(Sender: TObject);
    begin
      image2.Width :=1326;
      image2.Height :=916;
      image3.Width :=33;
      image3.Height :=33;
      B:=2;
    end;procedure TForm1.N41Click(Sender: TObject);
    begin
      image2.Width :=1989;
      image2.Height :=1374;
      image3.Width :=49;
      image3.Height :=49;
      B:=3;
    end;
      

  2.   

    许:
    procedure TForm1.Load1Click(Sender: TObject);
    begin  i:=25;
      SetLength(MPixArr,i);
      MInfo := TMyPix.Create;
      MInfo.PixX :=30;
      MInfo.PixY :=30;
      MPixArr[0]:=MInfo;
      MInfo := TMyPix.Create;
      MInfo.PixX :=130;
      MInfo.PixY :=130;
      MPixArr[1]:=MInfo;
      MInfo := TMyPix.Create;
      MInfo.PixX :=230;
      MInfo.PixY :=230;
      MPixArr[2]:=MInfo;
      MInfo := TMyPix.Create;
      MInfo.PixX :=330;
      MInfo.PixY :=330;
      MPixArr[3]:=MInfo;
      MInfo := TMyPix.Create;
      MInfo.PixX :=430;
      MInfo.PixY :=430;
      MPixArr[4]:=MInfo;
      MInfo := TMyPix.Create;
      MInfo.PixX :=30;
      MInfo.PixY :=130;
      MPixArr[5]:=MInfo;
      MInfo := TMyPix.Create;
      MInfo.PixX :=30;
      MInfo.PixY :=230;
      MPixArr[6]:=MInfo;
      MInfo := TMyPix.Create;
      MInfo.PixX :=30;
      MInfo.PixY :=330;
      MPixArr[7]:=MInfo;
      MInfo := TMyPix.Create;
      MInfo.PixX :=30;
      MInfo.PixY :=430;
      MPixArr[8]:=MInfo;
      MInfo := TMyPix.Create;
      MInfo.PixX :=130;
      MInfo.PixY :=30;
      MPixArr[9]:=MInfo;
      MInfo := TMyPix.Create;
      MInfo.PixX :=230;
      MInfo.PixY :=30;
      MPixArr[10]:=MInfo;
      MInfo := TMyPix.Create;
      MInfo.PixX :=330;
      MInfo.PixY :=30;
      MPixArr[11]:=MInfo;
      MInfo := TMyPix.Create;
      MInfo.PixX :=430;
      MInfo.PixY :=30;
      MPixArr[12]:=MInfo;
      MInfo := TMyPix.Create;
      MInfo.PixX :=130;
      MInfo.PixY :=230;
      MPixArr[13]:=MInfo;
      MInfo := TMyPix.Create;
      MInfo.PixX :=130;
      MInfo.PixY :=330;
      MPixArr[14]:=MInfo;
      MInfo := TMyPix.Create;
      MInfo.PixX :=130;
      MInfo.PixY :=430;
      MPixArr[15]:=MInfo;
      MInfo := TMyPix.Create;
      MInfo.PixX :=230;
      MInfo.PixY :=130;
      MPixArr[16]:=MInfo;
      MInfo := TMyPix.Create;
      MInfo.PixX :=330;
      MInfo.PixY :=130;
      MPixArr[17]:=MInfo;
      MInfo := TMyPix.Create;
      MInfo.PixX :=430;
      MInfo.PixY :=130;
      MPixArr[18]:=MInfo;
      MInfo := TMyPix.Create;
      MInfo.PixX :=230;
      MInfo.PixY :=330;
      MPixArr[19]:=MInfo;
      MInfo := TMyPix.Create;
      MInfo.PixX :=230;
      MInfo.PixY :=430;
      MPixArr[20]:=MInfo;
      MInfo := TMyPix.Create;
      MInfo.PixX :=330;
      MInfo.PixY :=230;
      MPixArr[21]:=MInfo;
      MInfo := TMyPix.Create;
      MInfo.PixX :=430;
      MInfo.PixY :=230;
      MPixArr[22]:=MInfo;
      MInfo := TMyPix.Create;
      MInfo.PixX :=330;
      MInfo.PixY :=430;
      MPixArr[23]:=MInfo;
      MInfo := TMyPix.Create;
      MInfo.PixX :=430;
      MInfo.PixY :=330;
      MPixArr[24]:=MInfo;
      {MInfo := TMyPix.Create;
      MInfo.PixX :=530;
      MInfo.PixY :=530;
      MPixArr[5]:=MInfo;
      

  3.   

    续:
      Image2.Canvas.MoveTo(100,100);
      Image2.Canvas.LineTo(100,300);
      Image2.Canvas.LineTo(300,300);
      Image2.Canvas.MoveTo(300,300-15);
      Image2.Canvas.LineTo(300,300-15+40);
      Image2.Canvas.LineTo(300+36,300-15+40);
      Image2.Canvas.LineTo(300+36,300-15);
      Image2.Canvas.LineTo(300,300-15);  Image2.Canvas.TextOut(310,300-12,'256');
      Image2.Canvas.TextOut(310,300,'423');
      Image2.Canvas.TextOut(310,300+12,'789');  Image2.Canvas.MoveTo(28,28);
      Image2.Canvas.LineTo(28,32);
      Image2.Canvas.LineTo(32,32);
      Image2.Canvas.LineTo(32,28);
      Image2.Canvas.LineTo(28,28);  Image2.Canvas.MoveTo(128,128);
      Image2.Canvas.LineTo(128,132);
      Image2.Canvas.LineTo(132,132);
      Image2.Canvas.LineTo(132,128);
      Image2.Canvas.LineTo(128,128);  Image2.Canvas.MoveTo(228,228);
      Image2.Canvas.LineTo(228,232);
      Image2.Canvas.LineTo(232,232);
      Image2.Canvas.LineTo(232,228);
      Image2.Canvas.LineTo(228,228);  Image2.Canvas.MoveTo(328,328);
      Image2.Canvas.LineTo(328,332);
      Image2.Canvas.LineTo(332,332);
      Image2.Canvas.LineTo(332,328);
      Image2.Canvas.LineTo(328,328);  Image2.Canvas.MoveTo(428,428);
      Image2.Canvas.LineTo(428,432);
      Image2.Canvas.LineTo(432,432);
      Image2.Canvas.LineTo(432,428);
      Image2.Canvas.LineTo(428,428);
      Image2.Canvas.MoveTo(28,128);
      Image2.Canvas.LineTo(28,132);
      Image2.Canvas.LineTo(32,132);
      Image2.Canvas.LineTo(32,128);
      Image2.Canvas.LineTo(28,128);  Image2.Canvas.MoveTo(28,228);
      Image2.Canvas.LineTo(28,232);
      Image2.Canvas.LineTo(32,232);
      Image2.Canvas.LineTo(32,228);
      Image2.Canvas.LineTo(28,228);  Image2.Canvas.MoveTo(28,328);
      Image2.Canvas.LineTo(28,332);
      Image2.Canvas.LineTo(32,332);
      Image2.Canvas.LineTo(32,328);
      Image2.Canvas.LineTo(28,328);  Image2.Canvas.MoveTo(28,428);
      Image2.Canvas.LineTo(28,432);
      Image2.Canvas.LineTo(32,432);
      Image2.Canvas.LineTo(32,428);
      Image2.Canvas.LineTo(28,428);  Image2.Canvas.MoveTo(128,28);
      Image2.Canvas.LineTo(128,32);
      Image2.Canvas.LineTo(132,32);
      Image2.Canvas.LineTo(132,28);
      Image2.Canvas.LineTo(128,28);  Image2.Canvas.MoveTo(228,28);
      Image2.Canvas.LineTo(228,32);
      Image2.Canvas.LineTo(232,32);
      Image2.Canvas.LineTo(232,28);
      Image2.Canvas.LineTo(228,28);  Image2.Canvas.MoveTo(328,28);
      Image2.Canvas.LineTo(328,32);
      Image2.Canvas.LineTo(332,32);
      Image2.Canvas.LineTo(332,28);
      Image2.Canvas.LineTo(328,28);  Image2.Canvas.MoveTo(428,28);
      Image2.Canvas.LineTo(428,32);
      Image2.Canvas.LineTo(432,32);
      Image2.Canvas.LineTo(432,28);
      Image2.Canvas.LineTo(428,28);  Image2.Canvas.MoveTo(128,228);
      Image2.Canvas.LineTo(128,232);
      Image2.Canvas.LineTo(132,232);
      Image2.Canvas.LineTo(132,228);
      Image2.Canvas.LineTo(128,228);  Image2.Canvas.MoveTo(128,328);
      Image2.Canvas.LineTo(128,332);
      Image2.Canvas.LineTo(132,332);
      Image2.Canvas.LineTo(132,328);
      Image2.Canvas.LineTo(128,328);  Image2.Canvas.MoveTo(128,428);
      Image2.Canvas.LineTo(128,432);
      Image2.Canvas.LineTo(132,432);
      Image2.Canvas.LineTo(132,428);
      Image2.Canvas.LineTo(128,428);  Image2.Canvas.MoveTo(228,128);
      Image2.Canvas.LineTo(228,132);
      Image2.Canvas.LineTo(232,132);
      Image2.Canvas.LineTo(232,128);
      Image2.Canvas.LineTo(228,128);  Image2.Canvas.MoveTo(328,128);
      Image2.Canvas.LineTo(328,132);
      Image2.Canvas.LineTo(332,132);
      Image2.Canvas.LineTo(332,128);
      Image2.Canvas.LineTo(328,128);  Image2.Canvas.MoveTo(428,128);
      Image2.Canvas.LineTo(428,132);
      Image2.Canvas.LineTo(432,132);
      Image2.Canvas.LineTo(432,128);
      Image2.Canvas.LineTo(428,128);  Image2.Canvas.MoveTo(228,328);
      Image2.Canvas.LineTo(228,332);
      Image2.Canvas.LineTo(232,332);
      Image2.Canvas.LineTo(232,328);
      Image2.Canvas.LineTo(228,328);  Image2.Canvas.MoveTo(228,428);
      Image2.Canvas.LineTo(228,432);
      Image2.Canvas.LineTo(232,432);
      Image2.Canvas.LineTo(232,428);
      Image2.Canvas.LineTo(228,428);  Image2.Canvas.MoveTo(328,228);
      Image2.Canvas.LineTo(328,232);
      Image2.Canvas.LineTo(332,232);
      Image2.Canvas.LineTo(332,228);
      Image2.Canvas.LineTo(328,228);  Image2.Canvas.MoveTo(428,228);
      Image2.Canvas.LineTo(428,232);
      Image2.Canvas.LineTo(432,232);
      Image2.Canvas.LineTo(432,228);
      Image2.Canvas.LineTo(428,228);  Image2.Canvas.MoveTo(328,428);
      Image2.Canvas.LineTo(328,432);
      Image2.Canvas.LineTo(332,432);
      Image2.Canvas.LineTo(332,428);
      Image2.Canvas.LineTo(328,428);  Image2.Canvas.MoveTo(428,328);
      Image2.Canvas.LineTo(428,332);
      Image2.Canvas.LineTo(432,332);
      Image2.Canvas.LineTo(432,328);
      Image2.Canvas.LineTo(428,328);
    end;procedure TForm1.Image2MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    var
      j:integer;
    begin
      //Label2.Caption :=IntToStr(x) + ',' + IntToStr(y);
      //Form2.Label2.Caption :=IntToStr(X) + ',' + IntToStr(Y);
      Image3.Visible:=false;
      Form2.Label1.Caption :='';
      for j:=0 to i-1 do
      begin
        //if ((X-MPixArr[j].PixX*B<=10) and (X-MPixArr[j].PixX*B >=-10)) and
        // ((Y-MPixArr[j].PixY*B<=10) and (Y-MPixArr[j].PixY*B >=-10)) then
        if ((X-MPixArr[j].PixX*B<=10) and (X-MPixArr[j].PixX*B >=-10)) then
          if ((Y-MPixArr[j].PixY*B<=10) and (Y-MPixArr[j].PixY*B >=-10)) then
            begin
              image3.Left :=MPixArr[j].PixX*B-9*B+Image2.Left;
              image3.Top :=MPixArr[j].PixY*B-9*B+Image2.Top;
              image3.Visible :=true;
              Form2.Label1.Caption :='当前点的位置:' + IntToStr(MPixArr[j].PixX) + ',' + IntToStr(MPixArr[j].PixY );
              Break;
            end;
      end;end;procedure TForm1.Line1Click(Sender: TObject);
    begin
      Form2.Show;
    end;end.