下面代码要实现的功能是:把显示器屏幕中(111,94)与(912,630)中间的图截出来然后另存,屏幕辨率为1024*768,并且rect(111,94,962,630)这个矩形的中心点为(512,384),也就是说这个矩形在屏幕的正中间,可编译运行后截的图的区域为rect(0,0,912,630),而我要的是rect(111,94,962,630)这部分的截图,最终保存的图中rect(0,0,111,630)与(0,0,962,94)中全部为白色,这两部分是不需要的。procedure TForm1.button1click(Sender: TObject);
  var
    DC: HDC;
    MyCanvas: TCanvas;
    MyRect: TRect;
    bmp:tbitmap;
  begin
    DC:= GetWindowDC(0);
    MyCanvas:= TCanvas.Create;
    try
      bmp:=tbitmap.Create;
      MyCanvas.Handle:= DC;
      MyRect:= Rect(111, 94, 912, 630);
      bmp1:=tbitmap.Create;
      bmp.PixelFormat:= pf24bit;
      bmp.Width:= MyRect.Right;
      bmp.Height:= MyRect.Bottom;
      bmp.canvas.CopyRect(MyRect, MyCanvas, MyRect);
      bmp.savetofile('d:\1.bmp');
    finally
      MyCanvas.Handle:= 0;
      bmp.Free;
      MyCanvas.Free;
      releaseDC(0, DC);
  end;
end;

解决方案 »

  1.   

    bmp.canvas.CopyRect(MyRect, MyCanvas, MyRect);//这句
      

  2.   

    var
      DC: HDC;
      MyCanvas: TCanvas;
      MyRect,destRect: TRect;
      bmp:tbitmap;
      begin
      DC:= GetWindowDC(0);
      MyCanvas:= TCanvas.Create;
      bmp:=tbitmap.Create;
      try
      MyCanvas.Handle:= DC;
      MyRect:= Rect(111, 94, 912, 630);
      bmp:=tbitmap.Create;
      bmp.PixelFormat:= pf24bit;
      bmp.Width:= 912-111;
      bmp.Height:= 630-94;
      destRect.top :=0;
      destRect.Left :=0;
      destRect.Bottom := bmp.Height;
      destRect.Right :=bmp.Width;
      bmp.canvas.CopyRect(destRect, MyCanvas, MyRect);
      bmp.savetofile('d:\1.bmp');
      finally
      MyCanvas.Handle:= 0;
      bmp.Free;
      MyCanvas.Free;
      releaseDC(0, DC);
      end;
      

  3.   

    这句错了那里啊,mycanvas是整个屏幕,第三个myrect已经指定了源画布区域,第一个myrect目标画布区域也没错啊
      

  4.   

    各位都高人啊,一针见血,搞清楚了,要把第一个myrect改为(0,0,1024,768),就行了,谢谢。