创建一个Canvas对象。然后让它的control属性指向Panel,在canvas表面画就行了

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls;type
      TForm1 = class(TForm)
        Panel1: TPanel;
      private
        { Private declarations }
      public
        { Public declarations }
        procedure WMPaint(var Message: TWMPaint);message WM_PAINT;
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.WMPaint(var Message: TWMPaint);
    var
    c:TCanvas;
    begin
    c:=TControlCanvas.Create;
    TControlCanvas(c).Control:=Panel1;
    c.Pen.Color :=clBlue;
    c.MoveTo(10,10);
    c.LineTo(100,10);
    c.LineTo(100,100);
    c.LineTo(10,100);
    c.LineTo(10,10);
    c.Free;
    end;end.
      

  2.   

    40Star(陪你去看--☆流星雨★) 这位大哥,我是想在鼠标移动的时候在PANEL上动态生成一个矩形。您有什么办法么,
      

  3.   

    使用刷子 TBrush
    三个重要的属性:color,style,bitmap
    color不用说了,style是形状,默认为bsSolid。bitmap指定一个位图,可以自定义图案为刷子背景。
    但还是要以Tcanvas为画布
      

  4.   

    我已经解决了:谢谢 wr960204(武稀松)和跟贴的朋友!下面是原码,
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ExtCtrls;unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ExtCtrls, StdCtrls;type
      TForm1 = class(TForm)
        Panel1: TPanel;
        Button1: TButton;
        Button2: TButton;
        procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure Panel1MouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
        { Private declarations }
      public
        { Public declarations }
        Drawing : boolean;
        Origin, MovePt: TPoint;    TempHandle: HWND;
        TempCanvas: TCanvas;
        procedure DrawShape(TopLeft, BottomRight: TPoint; AMode: TPenMode);
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.DrawShape(TopLeft, BottomRight: TPoint; AMode: TPenMode);
    begin
      with TempCanvas do
      begin
        Pen.Mode := AMode;
        Rectangle(TopLeft.X, TopLeft.Y, BottomRight.X,BottomRight.Y)
      end;
    end;procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      Drawing := True;
      TempCanvas := TCanvas.Create;
      TempHandle := TPanel(Sender).Handle;
      TempCanvas.Handle := GetWindowDC(TempHandle);
      TempCanvas.MoveTo(X, Y);
      Origin := Point(X, Y);
      MovePt := Origin;
    end;procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if Drawing then
      begin
        with TempCanvas  do
        begin
          Brush.Style := bsClear;
          Pen.Color := clWhite;
          Pen.Color := Clblack;
          Pen.Style := psDot;
          DrawShape(Origin, MovePt, pmNotXor);
          MovePt := Point(X, Y);
          DrawShape(Origin, MovePt, pmNotXor);
        end;
      end;
    end;procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      iLoop : integer;
      procedure SwapPoint(Var OP, LP : TPoint);
      var
        TempP : TPoint;
      begin
        if Op.y < Lp.y then
        begin
          TempP := Op;
          Op := Lp;
          Lp := TempP;
        end;
      end;
    begin
      if Drawing then
      begin
        with TempCanvas do
        begin
          DrawShape(Origin, Point(X, Y), pmNotXor);
          Drawing := False;
          TempHandle := 0;
          ReleaseDC(0, TempHandle);
          if TempCanvas <> nil then
             FreeAndNil(TempCanvas);
          MovePt := Point(X, Y);
          with Panel1 do
          begin
            SwapPoint(Origin,MovePt);
            For iLoop := 0 to ControlCount -1 do
            begin
              With Controls[iLoop] do
              begin
                  if (Movept.y < Top + Height) and (Movept.x< Left + Width) then
                  begin
                     //加入您想要的操作
                     Showmessage(inttostr(top)+','+inttostr(Orign.y)+''+inttostr(Movept.y)) 
                  end;
              end;
            end;
          end;
        end;
      end;
    end;end.