请问各位高手!如何用鼠标在画布上画曲线,
    并且鼠标的痕迹就是曲线的形状。
   拜托了!

解决方案 »

  1.   

    var
      Down: Boolean;
      prePt: TPoint;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      Down := True;
      Canvas.MoveTo(X, Y);
    end;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      Down := False;
    end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if Down then
      begin
        Canvas.LineTo(X, Y);
        prePt := Point(X, Y);
      end;
    end;
      

  2.   

    //--------------------------------------------------------------------------//
    //  Brush.cpp                                                               //
    //  Project: BrushForm                                                      //
    //  Copyright (c) 1997 by Jeff Cottingham                                   //
    //--------------------------------------------------------------------------////---------------------------------------------------------------------------
    #include <vcl\vcl.h>
    #pragma hdrstop#include "Brush.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------void __fastcall TForm1::RadioGroup1Click(TObject *Sender)
    {    switch(RadioGroup1->ItemIndex){
        case 8 : Check = true;
                 break;
        case 7 : myBrushStyle = bsVertical;
                  break;
        case 6 : myBrushStyle = bsFDiagonal;
                  break;
        case 5 : myBrushStyle = bsBDiagonal;
                  break;
        case 4 : myBrushStyle = bsHorizontal;
                  break;
        case 3 : myBrushStyle = bsDiagCross;
                  break;
        case 2 : myBrushStyle = bsClear;
                  break;
        case 1 : myBrushStyle = bsCross;
                  break;
        case 0 : myBrushStyle = bsSolid;
                  break;
        };
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::RadioGroup2Click(TObject *Sender)
    {
       switch(RadioGroup2->ItemIndex){
          case 15 : myMode = pmNotXor;
                    break;
          case 14 : myMode = pmXor;
                    break;
          case 13 : myMode = pmNotMask;
                    break;
          case 12 : myMode = pmMask;
                    break;
          case 11 : myMode = pmNotMerge;
                    break;
          case 10 : myMode = pmMerge;
                    break;
          case 9 :  myMode = pmMaskNotPen;
                    break;
          case 8 :  myMode = pmMergeNotPen;
                    break;
          case 7 :  myMode = pmMaskPenNot;
                    break;
          case 6 :  myMode = pmMergePenNot;
                    break;
          case 5 :  myMode = pmNotCopy;
                    break;
          case 4 :  myMode = pmCopy;
                    break;
          case 3 :  myMode = pmNot;
                    break;
          case 2 :  myMode = pmNop;
                    break;
          case 1 :  myMode = pmWhite;
                    break;
          case 0 :  myMode = pmBlack;
                    break;
       };
    }
    //---------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       int y = 20;
       int x = 20;   Image2->Canvas->Pen->Mode = myMode;
       Image2->Canvas->Pen->Width = Edit1->Text.ToInt();   for(int i = 0;i < 10 ;i++){
          Image2->Canvas->MoveTo(0,y);
          Image2->Canvas->LineTo(Image2->Width,y);
          y += 20;
       };   for(int i = 0;i < 13;i++){
          Image2->Canvas->MoveTo(x,0);
          Image2->Canvas->LineTo(x,Image2->Height);
          x += 20;
       };
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
       if(Check){
          Graphics::TBitmap *CustomBrush = new Graphics::TBitmap;;
          try {
            CustomBrush->LoadFromFile("Custom.bmp");
            Image1->Canvas->Brush->Bitmap = CustomBrush;
            Image1->Canvas->FillRect(Rect(3,3,Image1->Width - 3,
                                     Image1->Height - 3));
          }
          catch (...){
            Image1->Canvas->Brush->Bitmap = NULL;
            delete CustomBrush;
          };
          Image1->Canvas->Brush->Bitmap = NULL;
          delete CustomBrush;
          Check = false;
       }
       else {
          Image1->Canvas->Brush->Style = myBrushStyle;
          Image1->Canvas->FillRect(Rect(3,3,Image1->Width - 3,Image1->Height - 3));
       };
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormShow(TObject *Sender)
    {
       Image1->Canvas->Rectangle(0,0,Image1->Width,Image1->Height);
       Image2->Canvas->FillRect(Image2->Canvas->ClipRect);
       Image3->Canvas->FillRect(Image3->Canvas->ClipRect);
       Image4->Canvas->FillRect(Image4->Canvas->ClipRect);
       Image5->Canvas->FillRect(Image5->Canvas->ClipRect);
       Image6->Canvas->FillRect(Image6->Canvas->ClipRect);
       Image7->Canvas->FillRect(Image7->Canvas->ClipRect);
       Image8->Canvas->FillRect(Image8->Canvas->ClipRect);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Edit2Change(TObject *Sender)
    {
       myStyle = oldStyle;   Image3->Canvas->Font->Style = myStyle;   if(CheckBox1->Checked){
          myStyle << fsBold;
          Image3->Canvas->Font->Style = myStyle;
       };
       if(CheckBox2->Checked) {
          myStyle << fsItalic;
          Image3->Canvas->Font->Style = myStyle;
       };
       if(CheckBox3->Checked) {
          myStyle << fsUnderline;
          Image3->Canvas->Font->Style = myStyle;
       };
       if(CheckBox4->Checked) {
          myStyle << fsStrikeOut;
          Image3->Canvas->Font->Style = myStyle;
       };
       if(CheckBox5->Checked)
          Image3->Canvas->Font->Height = TFontHeight - 10;
       else {
          Image3->Canvas->Font->Height = TFontHeight;
          Image3->Canvas->Font->Size = 20;
       };   Image3->Canvas->FillRect(Image3->ClientRect);
       Image3->Canvas->TextOut(10,20,Edit2->Text);   Image4->Canvas->FillRect(Image4->ClientRect);
       Image4->Canvas->TextOut(10,20,Edit2->Text);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::CheckBox1Click(TObject *Sender)
    {
       Edit2->SetFocus();
       Edit2->SelStart = Edit2->SelLength;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Image5MouseDown(TObject *Sender, TMouseButton Button,
    TShiftState Shift, int X, int Y)
    {
       Point1.x = X;
       Point1.y = Y;
       Point2.x = X;
       Point2.y = Y;
       Rendering = true;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Image5MouseUp(TObject *Sender, TMouseButton Button,
    TShiftState Shift, int X, int Y)
    {
       Rendering = false;
       Image5->Canvas->Pen->Style = psSolid;
       Image5->Canvas->Pen->Mode = pmCopy;
       if(CanRender && !Rendering)DrawShape(Point1.x,Point1.y,X,Y);
       if(SpeedButton5->Down){
          Image5->Canvas->Brush->Color = clRed;
          Image5->Canvas->FloodFill(X,Y,clBlack,fsBorder);
          Image5->Canvas->Brush->Color = clWhite;
       };
    }
    //---------------------------------------------------------------------------void __fastcall TForm1::DrawShape(int w,int x,int y,int z)
    {
       switch(dsCurrentShape){
          case dsEllipse : Image5->Canvas->Ellipse(w,x,y,z);
                           break;
          case dsRectangle : Image5->Canvas->Rectangle(w,x,y,z);
                           break;
          case dsLine : {
                         Image5->Canvas->MoveTo(w,x);
                         Image5->Canvas->LineTo(y,z);
                         break;
                        };
       };
    }
    //---------------------------------------------------------------------------void __fastcall TForm1::Render(int x,int y)
    {
      if(CanRender && Rendering){
          Image5->Canvas->Brush->Style = bsClear;
          Image5->Canvas->Pen->Mode = pmNotXor;
          Image5->Canvas->Pen->Style = psDot;
          DrawShape(Point1.x,Point1.y,Point2.x,Point2.y);
          Point2.x = x;
          Point2.y = y;
          DrawShape(Point1.x,Point1.y,Point2.x,Point2.y);
       }
       else {
          Rendering = false;
       };
    }
    //---------------------------------------------------------------------------
      

  3.   


    void __fastcall TForm1::Image5MouseMove(TObject *Sender, TShiftState Shift,
    int X, int Y)
    {
       if(CanRender) Render(X,Y);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::SpeedButton2Click(TObject *Sender)
    {
       CanRender = true;
       dsCurrentShape = dsEllipse;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::SpeedButton4Click(TObject *Sender)
    {
       CanRender = false;
       Rendering = false;
       Image5->Canvas->Brush->Style = bsSolid;
       Image5->Canvas->FillRect(Image5->ClientRect);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
    {
       CanRender = true;
       dsCurrentShape = dsLine;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::SpeedButton3Click(TObject *Sender)
    {
       if(dynamic_cast<TSpeedButton*>(Sender)->Down) CanRender = true;
       if(dynamic_cast<TSpeedButton*>(Sender)->Name == "SpeedButton1")
          dsCurrentShape = dsLine;
       else if(dynamic_cast<TSpeedButton*>(Sender)->Name == "SpeedButton2")
          dsCurrentShape = dsEllipse;
       else if(dynamic_cast<TSpeedButton*>(Sender)->Name == "SpeedButton3")
          dsCurrentShape = dsRectangle;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::RadioGroup3Click(TObject *Sender)
    {
       switch(RadioGroup3->ItemIndex){
          case 14 : TCopyMode = cmWhiteness;
                    break;
          case 13 : TCopyMode = cmSrcPaint;
                    break;
          case 12 : TCopyMode = cmSrcInvert;
                    break;
          case 11 : TCopyMode = cmSrcErase;
                    break;
          case 10 : TCopyMode = cmSrcCopy;
                    break;
          case 9 :  TCopyMode = cmSrcAnd;
                    break;
          case 8 :  TCopyMode = cmPatPaint;
                    break;
          case 7 :  TCopyMode = cmPatInvert;
                    break;
          case 6 :  TCopyMode = cmPatCopy;
                    break;
          case 5 :  TCopyMode = cmNotSrcErase;
                    break;
          case 4 :  TCopyMode = cmNotSrcCopy;
                    break;
          case 3 :  TCopyMode = cmMergePaint;
                    break;
          case 2 :  TCopyMode = cmMergeCopy;
                    break;
          case 1 :  TCopyMode = cmDstInvert;
                    break;
          case 0 :  TCopyMode = cmBlackness;
                    break;
       };
    }
    //---------------------------------------------------------------------------void __fastcall TForm1::BitBtn1Click(TObject *Sender)
    {
       Image6->Canvas->Brush->Color = clWhite;
       Image6->Canvas->Brush->Style = bsSolid;
       Image6->Canvas->FillRect(Image6->Canvas->ClipRect);
       Image6->Canvas->Brush->Color = clGreen;
       Image6->Canvas->Rectangle(25,25,140,140);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::BitBtn2Click(TObject *Sender)
    {
       Image7->Canvas->Brush->Color = clWhite;
       Image7->Canvas->Brush->Style = bsSolid;
       Image7->Canvas->FillRect(Image7->Canvas->ClipRect);
       Image7->Canvas->Brush->Color = clBlue;
       Image7->Canvas->Rectangle(60,60,190,190);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::BitBtn3Click(TObject *Sender)
    {
       Image7->Canvas->CopyMode = TCopyMode;
       Image7->Canvas->CopyRect(Image7->Canvas->ClipRect,Image6->Canvas,
                                Image6->Canvas->ClipRect);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
       Image1->Canvas->Pen->Width = 3;
       Image1->Canvas->Pen->Color = clRed;   Image2->Canvas->Brush->Style = bsSolid;
       Image2->Canvas->Brush->Color = clBlue;
       Image2->Canvas->Pen->Color = clRed;   Image3->Canvas->Brush->Color = clBtnFace;
       Image3->Canvas->Font->Size = 20;
       TFontHeight = Image3->Canvas->Font->Height;
       oldStyle = Image3->Canvas->Font->Style;   Image4->Canvas->Brush->Color = clBtnFace;
       Image4->Canvas->Font->Size = 20;}
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
       HRGN MyRgn;   //Image8->Invalidate();
       MyRgn = ::CreateRectRgn(100,100,200,200);
       ::SelectClipRgn(Image8->Canvas->Handle,MyRgn);
       Ellipse(Image8->Canvas->Handle,90,90,210,210);
       Image8->Invalidate();
       ::SelectClipRgn(Image8->Canvas->Handle,NULL);
       ::DeleteObject(MyRgn);   MyRgn = CreateRectRgn(200,200,300,300);
       ::SelectClipRgn(Image8->Canvas->Handle,MyRgn);
       ::Ellipse(Image8->Canvas->Handle,190,190,310,310);
       Image8->Invalidate();
       ::SelectClipRgn(Image8->Canvas->Handle,NULL);
       ::DeleteObject(MyRgn);   MyRgn = ::CreateRectRgn(300,300,400,400);
       ::SelectClipRgn(Image8->Canvas->Handle,MyRgn);
       ::Ellipse(Image8->Canvas->Handle,290,290,410,410);
       Image8->Invalidate();
       ::SelectClipRgn(Image8->Canvas->Handle,0);
       ::DeleteObject(MyRgn);
    }
    //---------------------------------------------------------------------------void __fastcall TForm1::Button4Click(TObject *Sender)
    {
       Image8->Canvas->FillRect(Image8->Canvas->ClipRect) ;
    }
    //---------------------------------------------------------------------------
      

  4.   

    BCB写的画图程序,稍加改造就可变成Delphi的啦!!!!!!!!!
      

  5.   

    //完整的程序,按鼠标左键开始画,按鼠标右键停止画。
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      TForm1 = class(TForm)
        procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      b_Draw:boolean;
      p_Old,p_New:TPoint;
    implementation{$R *.dfm}procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
        if (not b_Draw) and (Button=mbleft)then
        begin
            b_Draw:=true;
            form1.Canvas.Pen.Mode:=pmNotXor;
            p_Old.X:=X;
            p_Old.Y:=y;
            p_New.X:=X;
            p_New.Y:=y;
        end;end;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
        if (b_Draw) and (Button=mbright) then
           b_Draw:=false;end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
        if not b_Draw then exit;
        form1.Canvas.MoveTo(p_Old.X,p_Old.Y);
        form1.Canvas.LineTo(p_New.X,p_New.Y);
        p_Old.X:=p_New.X;
        p_Old.Y:=p_New.Y;
        p_New.X:=X;
        p_New.Y:=Y;
    end;end.