Bitmap位图绘制打印空白???

w88529593 2013-07-08 10:07:00
以下代码是写的一个Bitmap的绘图,绘制以后,打印出来,这个好像打印出来以后是空白的,但是把位图保存到硬盘上,却是有内容的,请高手们看一下什么情况



Graphics::TBitmap *Bmp = new Graphics::TBitmap();
Bmp->Width = 600;
Bmp->Height = 600;
Bmp->Canvas->Pen->Color = clRed;
Bmp->Canvas->Pen->Width=1;
for(int i=1;i<=30;i++)
{
Bmp->Canvas->Rectangle(i*10, i*10, Bmp->Width-i*10, Bmp->Height-i*10);
}
TPrinter * pPrinter=Printer();
pPrinter->BeginDoc();
int nScaleX = GetDeviceCaps(pPrinter->Canvas->Handle, LOGPIXELSX)/PixelsPerInch;
int nScaleY = GetDeviceCaps(pPrinter->Canvas->Handle, LOGPIXELSX)/PixelsPerInch;
TRect TheRect= TRect(0,0,Bmp->Width*nScaleX,Bmp->Height*nScaleY);
Bmp->SaveToFile("c:\\333.bmp");
DIBSECTION DibSec;
GetObject(lpBitmap->Handle, sizeof(DibSec), &DibSec);
StretchDIBits(pPrinter->Canvas->Handle,TheRect.Left, TheRect.Top,
(TheRect.Right-TheRect.Left), (TheRect.Bottom-TheRect.Top),
0, 0,Bmp->Width, Bmp->Height,DibSec.dsBm.bmBits,
(BITMAPINFO*)&DibSec.dsBmih,DIB_RGB_COLORS,SRCCOPY);
pPrinter->EndDoc();
delete Bmp;


...全文
165 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
w88529593 2013-07-09
  • 打赏
  • 举报
回复
好像对于静态载入的图片,用StretchDIBits和Printer->Canvas的StretchDraw函数好像都能直接打印出来,我用Image载入一张bmp图片,就可以用这个StretchDIBits函数打印出来,用Canvas的StretchDraw函数也可以打印出来,自己绘制的BMP用StretchDIBits打印不出来,用pPrinter->Canvas->StretchDraw可以打印,虽然用pPrinter->Canvas->StretchDraw在大部分打印机上都能打印,但在某些型号的激光打印机上,纸张从打印机空过一下就出来了,打印出来是空白的,我在网上查到pPrinter->Canvas->StretchDraw有时候会在打印机上打印失败,也就是打印不出来东西
缘中人 2013-07-09
  • 打赏
  • 举报
回复
	Graphics::TBitmap *Bmp = new Graphics::TBitmap();
	Bmp->Width = 600;
	Bmp->Height = 600;
	Bmp->Canvas->Pen->Color = clRed;
	Bmp->Canvas->Pen->Width=1;
	for(int i=1;i<=30;i++)
	{
		Bmp->Canvas->Rectangle(i*10, i*10, Bmp->Width-i*10, Bmp->Height-i*10);
	}
	Bmp->SaveToFile("c:\\333.bmp");
        TPrinter   *   pPrinter=Printer();
	pPrinter->BeginDoc();
	int nScaleX = GetDeviceCaps(pPrinter->Canvas->Handle, LOGPIXELSX)/PixelsPerInch;
	int nScaleY = GetDeviceCaps(pPrinter->Canvas->Handle, LOGPIXELSX)/PixelsPerInch;
	TRect TheRect= TRect(0,0,Bmp->Width*nScaleX,Bmp->Height*nScaleY);

	DIBSECTION DibSec;
	GetObject(Bmp->Handle, sizeof(DibSec), &DibSec);//此处贴错了
	StretchDIBits(pPrinter->Canvas->Handle,TheRect.Left, TheRect.Top,
		(TheRect.Right-TheRect.Left), (TheRect.Bottom-TheRect.Top),
		0, 0,Bmp->Width, Bmp->Height,DibSec.dsBm.bmBits,
		(BITMAPINFO*)&DibSec.dsBmih,DIB_RGB_COLORS,SRCCOPY);


        TRect myrect(0,0,600,600);//少了这句话
        pPrinter->Canvas->StretchDraw(myrect,Bmp);//少了这句话
	pPrinter->EndDoc();
	delete Bmp;
w88529593 2013-07-08
  • 打赏
  • 举报
回复
上面的代码贴错了一行,重新贴一下


	Graphics::TBitmap *Bmp = new Graphics::TBitmap();
	Bmp->Width = 600;
	Bmp->Height = 600;
	Bmp->Canvas->Pen->Color = clRed;
	Bmp->Canvas->Pen->Width=1;
	for(int i=1;i<=30;i++)
	{
		Bmp->Canvas->Rectangle(i*10, i*10, Bmp->Width-i*10, Bmp->Height-i*10);
	}
	TPrinter   *   pPrinter=Printer();
	pPrinter->BeginDoc();
	int nScaleX = GetDeviceCaps(pPrinter->Canvas->Handle, LOGPIXELSX)/PixelsPerInch;
	int nScaleY = GetDeviceCaps(pPrinter->Canvas->Handle, LOGPIXELSX)/PixelsPerInch;
	TRect TheRect= TRect(0,0,Bmp->Width*nScaleX,Bmp->Height*nScaleY);
	Bmp->SaveToFile("c:\\333.bmp");
	DIBSECTION DibSec;
	GetObject(Bmp->Handle, sizeof(DibSec), &DibSec);//此处贴错了
	StretchDIBits(pPrinter->Canvas->Handle,TheRect.Left, TheRect.Top,
		(TheRect.Right-TheRect.Left), (TheRect.Bottom-TheRect.Top),
		0, 0,Bmp->Width, Bmp->Height,DibSec.dsBm.bmBits,
		(BITMAPINFO*)&DibSec.dsBmih,DIB_RGB_COLORS,SRCCOPY);
	pPrinter->EndDoc();
	delete Bmp;

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧