有些类似于拷屏,按print screen将整个屏幕复制到剪切版中,但如何复制一个form中的panel中的控件到一个image中呢。即将panel当成整个屏幕,复制成一个图形(图形和panel一致)。

解决方案 »

  1.   

    以下为示意代码,机器上没有delphi,大致就是把panel的dc拷贝到一个bmp的dc上去
    canvas = TControlCanvas.Create(Panel);
    bmp = TBitmap.CreateCompatiable(canvas.Handle, panel.width, panel.height);
    bitblt(canvas.Handel, 0, 0, panel.width, panel.height, bmp.canvas.handle, 0, 0, SRCCOPY);
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      h: HDC;
      p: TPoint;
    begin
      p.X:= 0;
      p.Y:= 0;
      p:= Panel1.ClientToScreen(p);
      h := getdc(0);
      bitblt(image1.canvas.handle,0,0,Panel1.Width, Panel1.Height,h,p.X,p.Y,srccopy);
      ReleaseDC(0,h);
    end;
      

  3.   

    procedure TForm2.Button3Click(Sender: TObject);
    var c:TCanvas;begin c:=TControlCanvas.Create; TControlCanvas(c).Control:=Panel1;
     Image1.Canvas.CopyRect(Image1.ClientRect,c,c.ClipRect);
     c.Free;end;
      

  4.   

    wudi_1982和xixuemao的方法是可以,但还有一个小问题,如果我的panel放在scrollbox上,出现了滚动条,为什么连windows状态栏都复制下来了,还有我有一个悬浮的工具栏,是一个form,如果这个form在这个被复制的panel上,为什么连这个悬浮工具栏都复制下来了,不知是为什么?谁能解释一下。
      

  5.   

    关注  我在想法办法 打印panel呢
      

  6.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
     Bitmap: TBitmap;
    begin
     Bitmap := TBitmap.Create;
     Bitmap.Width := Panel1.Width;
     Bitmap.Height := Panel1.Height;
     try
       Panel1.PaintTo(Bitmap.Canvas,0,0);
       Bitmap.SaveToFile('g:\jjj.bmp');
       //Use Bitmap Do SomeThing..
     finally
       Bitmap.Free;
     end;
    end;    ///////打印image
    //////
     Image1.Picture.LoadFromFile('f:\jjj.bmp');
     with Image1.Picture.Bitmap do
        begin
        Printer.BeginDoc;
        Printer.Canvas.StretchDraw(Canvas.ClipRect,Image1.Picture.Bitmap);
        Printer.EndDoc;
        end; 
    这样 效果不错