假设有如下代码(随意些的,没有调试):
var
  Dc: HDC;
  Bmp: TBitmap;
begin
  Bmp:= TBitmap.create;
  Bmp.width:= Screen.Width;
  Bmp.Height:= Screen.height;
  DC:= GetDC(0);  //如何将DC中的内容快速的画到Bmp中,最好能在10毫秒内完成  Bmp.free;
  ReleaseDC(nil, 0);
end;

解决方案 »

  1.   

    var
      Dc: HDC;
      Bmp: TBitmap;
    begin
      Bmp:= TBitmap.create;
      Bmp.width:= Screen.Width;
      Bmp.Height:= Screen.height;
      DC:= GetDC(0);  Bmp.Canvas.Handle := DC;
      //如何将DC中的内容快速的画到Bmp中,最好能在10毫秒内完成  Bmp.free;
      ReleaseDC(0, DC);
    end;
      

  2.   

    测试了下。。可行
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Dc: HDC;
      Bmp: TBitmap;
    begin
      Bmp:= TBitmap.create;
      Bmp.width:= Screen.Width;
      Bmp.Height:= Screen.height;
      DC:= GetDC(0);  Bmp.Canvas.Handle := DC;
      //如何将DC中的内容快速的画到Bmp中,最好能在10毫秒内完成  Canvas.CopyRect(Rect(0, 0, 200, 200), Bmp.Canvas, Rect(0, 0, 200, 200));
      Bmp.free;
      ReleaseDC(0, DC);
    end;
      

  3.   

    使用CreateCompatibleBitmap会不会提高速度?
    CreateCompatibleBitmap怎么使用?
      

  4.   

    zwjchina(蒲石)的方法是错误的。
    Bmp.Canvas.Handle := DC;只是关联以下画布。无法存成Bmp
      

  5.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      dc: hdc;
      bmp: TBitmap;
    begin
      bmp:= tbitmap.Create;
      bmp.Width := screen.Width;
      bmp.Height := screen.Height;
      dc:= getdc(0);
      bitblt(bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,dc,0,0,srccopy);
      bmp.SaveToFile('d:\aa.bmp');
      releasedc(handle,dc);
      bmp.Free;
    end;
      

  6.   

    bitblt(bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,dc,0,0,srccopy);

    bitblt(form1.Canvas.Handle,0,0,bmp.Width,bmp.Height,dc,0,0,srccopy);
    的执行速度相差太多。前者在150毫秒左右,而后者在15毫秒左右甚至更快。
      

  7.   

    正常,前者是DDB->DDB,后者是DDB->DIB,不是一回事。你的ReleaseDC有错,当然后面大家给你修正了。Bmp.Canvas.Handle := DC;肯定是不对的,这种代码本身就是错误的。我不知道你如何计算的执行时间?我用了多种方法计算执行时间,在我的计算机上该条语句我循环执行1000次花的时间也只有500毫秒,执行一次时间忽略不计。而且我屏幕的分辨率是1280*1024。常规方法里,直接调用API肯定是最快的方法了。
      

  8.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      StartTick: integer;
      HOld: HGDIOBJ;
    begin
      startTick:= GetTickCount;
      BitBlt(MemDC, 0, 0, 1024, 768, Dc, 0, 0 ,SrcCopy);
      ShowMessage(IntToStr(GetTickCount - StartTick));
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      DC:= GetDC(0);
      HBmp:= CreateCompatibleBitmap(DC, 1024, 768);
      MemDc:= CreateCompatibleDC(DC);
      SelectObject(MemDC, HBmp);
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      DeleteObject(MemDc);
      DeleteObject(HBmp);
      releaseDC(0, DC);
    end;
    在我这里显示的125  屏幕1024*768 * 32。
    使用Mirror Draw也是差不多的结果
      

  9.   

    啊?不会有这么大的差距吧。
    我的机器是P43.0、128显卡、1G内存。
    能把您的代码贴出来么?
    您的代码是DDB->DIB么?
      

  10.   

    晕死!!!!
    我在另一个机器上测试也快的很。
    请问大虾熟悉Mirror Draw么?
      

  11.   

    我的机器是AMD Athlon 64 3200+ (Venice)、ASUS A8N-SLI Deluxe、Kingston 512M DDR400*2、Geforce 6800GT DDR3 256M