我在image上用鼠标画线的代码如下:
procedure TForm2.ImageOnMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MouseDownClick:=true;
  image1.Canvas.MoveTo(x ,y);
 origin.X :=x ;
 origin.Y :=y ; 
  MovePt:=origin;
end;
procedure TForm2.ImageOnMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
 var
    tx,ty,dx,dy,temp:integer;begin
  if MouseDownClick=true then
    begin
      Draw(origin,movept,pmnotxor);//画线过程,笔的MODE设为pmnotxor
    
      movept.X:=x ;      
      movept.Y:=y ;
      draw(origin,movept,pmnoyxor);
    
    end;
  end;procedure TForm2.ImageOnMouseUP(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin     Draw(origin,movept,pmcopy);//在mouseup时采用pmcopy模式再画一次
     
     MouseDownClick:=false;
end;procedure TForm2.Draw(TopLeft,ButtomRight:TPoint;AMode:TpenMode) ;
  begin
    
   
    image1.Canvas.Pen.Mode :=AMode;
  
    image1.Canvas.MoveTo(TopLeft.X,Topleft.Y);
    image1.Canvas.LineTo(buttomright.X,buttomright.Y );  end;
以上的代码画线没有问题,而且现在的书上以及网上的资料绝大部分都是介绍采用pmnotxor模式这样画直线,但出现这样一个小的细节部分,就是当鼠标在画线过程中,经过已经存在的直线时有交叉的地方会显示为底色而不是笔的颜色,请问这是为什么?有什么办法可以解决?
为什么DELPHI自带的imageeditor里画线时不会出现这种情况?window的画笔程序也不会出现.他们采用什么方法画线的?

解决方案 »

  1.   

    经过已经存在的直线时有交叉的地方会显示为底色而不是笔的颜色
    -----------
    应该不会,见 \Delphi7\Demos\Doc\Graphex 下面的例子procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      Drawing := True;
      Image.Canvas.MoveTo(X, Y);
      Origin := Point(X, Y);
      MovePt := Origin;
      StatusBar1.Panels[0].Text := Format('Origin: (%d, %d)', [X, Y]);
    end;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if Drawing then
      begin
        DrawShape(Origin, Point(X, Y), pmCopy);
        Drawing := False;
      end;
    end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if Drawing then
      begin
        DrawShape(Origin, MovePt, pmNotXor);
        MovePt := Point(X, Y);
        DrawShape(Origin, MovePt, pmNotXor);
      end;
      StatusBar1.Panels[1].Text := Format('Current: (%d, %d)', [X, Y]);
    end;
      

  2.   

    \Delphi7\Demos\Doc\Graphex 下面的例子一样是这种经过已经存在的直线时有交叉的地方会显示为底色而不是笔的颜色现象.仔细看便可以看到的.
      

  3.   

    我是说用鼠标画线的过程中,也就是onmousemove过程中会有这种现象,当然在onmouseup时再pmcopy画一次肯定没有了,但我要的是在onmousemove过程中也不要出现有交叉的地方会显示为底色而不是笔的颜色这种现象.delphi自带的imageeditor不会这样,windows的画笔也不会这样,到底他们采用什么方法画线呢?
      

  4.   

    看来csdn里的delphi高手都跑去做数据库了
      

  5.   

    //用层的概念来实现
    //Image1作为最底层
    //Image2作为最上层(预览层),进行透明绘制procedure TForm1.Image2MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    var
      tx, ty, dx, dy, temp: integer;
    begin
      if ssLeft in Shift then
      begin
        movept := Point(X, Y);
        Draw(origin, movept, False);
      end;
    end;procedure TForm1.Image2MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      Draw(origin, movept, True);
    end;procedure TForm1.Draw(TopLeft, ButtomRight: TPoint; mNotTry: Boolean{ 是否不是预览 });
    var
      vImage: TImage;
    begin
      if mNotTry then
        vImage := Image1
      else begin
        vImage := Image2;
        vImage.Canvas.FillRect(vImage.Canvas.ClipRect);
      end;
      vImage.Canvas.MoveTo(TopLeft.X, Topleft.Y);
      vImage.Canvas.LineTo(buttomright.X, buttomright.Y);
      Repaint;
    end;procedure TForm1.Image2MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      origin := Point(X, Y);
      MovePt := origin;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      DoubleBuffered := True;
      Image1.Canvas.FillRect(Image1.Canvas.ClipRect);
      Image2.BoundsRect := Image1.BoundsRect;
      Image2.Canvas.FillRect(Image2.Canvas.ClipRect);
      Image2.Transparent := True;
      Image2.Picture.Bitmap.TransparentColor := clWindow;
    end;
      

  6.   

    感谢zswang(伴水清清)(专家门诊清洁工),liangqingzhi(老之),wudi_1982(︻┳═一)
      

  7.   

    你采用异或方式(pmnoyxor),当然会出现这种情况.
    解决的办法,上面已经有了一种,个人感觉层是一种比较好的方式.
      

  8.   

    再次建议各位使用GDIPlus Pascal Objects来处理图形方面的问题。多快好省的事情
      

  9.   

    在执行效率上,我想GDI+不会比GDI更快