问题很简单:在Canvas内部要动态划一根线,如果不清空Canvas,那么每个MouseMove事件中画出来的线都会留在Canvas上,如果清空,那么整个Canvas就会闪烁,该如何解决呢?

解决方案 »

  1.   

    其实在Image上绘图,是首先在内存中绘好,然后再整个画到Image.Canvas上;
    直接在Image.Canvas绘图会产生闪烁。同时设置pen.mode
    比如在内存中建立临时Canvas.
    然后CopyRect或者Draw到目标.
      

  2.   

    bcb代码,如果你要的是思路,这就足够了!
    void __fastcall TForm1::Image1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    Drawing =true;
    Image1->Canvas->MoveTo(0,0);
     Origin=Point(X,Y);
    tPoint=Origin;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
    if(Drawing)
    {
     Image1->Canvas->Brush->Style=bsClear;
        Image1->Canvas->Pen->Color=clLime;
     Image1->Canvas->Pen->Mode =pmXor;
     Image1->Canvas->Rectangle(Rect(Origin.x,Origin.y,tPoint.x,tPoint.y));
     tPoint=Point(X,Y); Image1->Canvas->Pen->Mode =pmXor;
     Image1->Canvas->Rectangle(Rect(Origin.x,Origin.y,tPoint.x,tPoint.y));
     }
    }
    //---------------------------------------------------------------------------void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y){
    if(Drawing)
    {
    Image1->Canvas->Pen->Color=clBlue;
    Image1->Canvas->Pen->Mode =pmCopy;
    Image1->Canvas->Rectangle(Rect( Origin.x,Origin.y,X,Y));
    Drawing=false;
    }
    }
    //---------------------------------------------------------------------------void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    DoubleBuffered=true;
    Image1->Picture->Bitmap->PixelFormat=pf24bit;
    Image1->Canvas->Pen->Color=clRed;
    }
    //----------------------------------------------------------------