BCB 打印Panel代码

void PrintAsScreen( TCanvas *CanvasSource,TPrinter *Prntr,
                    TRect RectSource,TRect RectTarget)
{//所见即所得打印方式
    Prntr->BeginDoc();
    int OriginalMapMode = GetMapMode(Prntr->Handle);//当前影射模式
    SetMapMode(Prntr->Handle,MM_ISOTROPIC);//设置图形影射模式
    SIZE ss;
    ss.cx = Screen->Width;
    ss.cy = Screen->Height;
    SetWindowExtEx( Prntr->Handle, ss.cx, ss.cy, ss);//设置窗口
    //获取打印机x方向每英寸象素点数
    float xLogPixelsPerInch = GetDeviceCaps(Prntr->Handle,LOGPIXELSX);
    //获取y方向每英寸象素点数
    float yLogPixelsPerInch = GetDeviceCaps(Prntr->Handle,LOGPIXELSY);

    ss.cx = xLogPixelsPerInch;
    ss.cy = yLogPixelsPerInch;
    SetViewportExtEx(//设置视口
        Prntr->Handle,
        Screen->Width  * xLogPixelsPerInch/Screen->PixelsPerInch,
        Screen->Height * yLogPixelsPerInch/Screen->PixelsPerInch,
        &ss);
    Prntr->Canvas->CopyRect(
        RectTarget,     //Target Rect
        CanvasSource,   //Source Canvas
        RectSource );   //Source Rect
    Prntr->EndDoc();
    SetMapMode(Prntr->Handle,OriginalMapMode);//复原影射模式
}
void __fastcall TfrmStatusReport::btnPrintClick(TObject *Sender)
{  
   //打印panel部分
   TPrinter *prt=Printer();
   HDC dc=GetWindowDC(Panel1->Handle);
   Graphics::TBitmap *bmp = new Graphics::TBitmap();
   bmp->Width=Panel1->Width;
   bmp->Height=Panel1->Height;
   BitBlt(bmp->Canvas->Handle, 0, 0, Panel1->Width, Panel1->Height, dc, 0, 0, SRCCOPY);
  //不做以下处理打印为空白//////////////////////////////////////////
   TMemoryStream *pms=new  TMemoryStream();
   bmp->SaveToStream(pms);
   pms->Position=0;
   bmp->LoadFromStream(pms);
   delete pms;
  //////////////////////////////////////////////////////

  TRect rect = TRect(0,0,Panel1->ClientWidth,Panel1->ClientHeight);
  PrintAsScreen(bmp->Canvas,prt,rect,rect);

  delete bmp;
  ReleaseDC(Panel1->Handle,dc);

}

 

posted @ 2016-02-25 15:57  風行  阅读(702)  评论(0编辑  收藏  举报