1、我新建一个对话框打印程序,可以正常打印,其他的例程我都试过,在例程中可以打印的程序,在我的程序里都不能打印,郁闷中;;;;;;
2、参考代码如下
void CPrintFormDlg::OnButton1()
{
// TODO: Add your control notification handler code here
// TODO: Add your control notification handler code here
CRect m_rect,framerect;
//获取对话框的大小
GetWindowRect(m_rect);
//获取图片控件大小
m_Frame.GetWindowRect(framerect);
int x,y;
x = framerect.left - m_rect.left;
CDC* pImageDC = GetDC(); //得到屏幕的分辨率(即;DPI设置 一般为96.)
int formx,formy;
formx = pImageDC->GetDeviceCaps(LOGPIXELSX);
formy = pImageDC->GetDeviceCaps(LOGPIXELSY);
ReleaseDC(pImageDC);
CPrintDialog m_printdlg (FALSE,PD_RETURNDEFAULT); //打印对话框加载
if (m_printdlg.DoModal()==IDOK) //如果点击OK,那么就开始打印准备工作。
{
CDC pdc; //建立一个新的DC,。
pdc.Attach(m_printdlg.GetPrinterDC());
//获取打印机与屏幕的分辨率比率
int printerx,printery; //得到打印机的分辨率
printerx = pdc.GetDeviceCaps(LOGPIXELSX);
printery = pdc.GetDeviceCaps(LOGPIXELSY);
double ratex,ratey; //得到打印机和屏幕的分辨率的比值。
ratex = (double)printerx/formx;
ratey = (double)printery/formy;
CClientDC dc(this); //根据要打印的控件大小建立一个位图区域
CBitmap bmp;
bmp.CreateCompatibleBitmap(&dc,framerect.Width()+2*x,framerect.Height()+x);
CDC imagedc; //将位图区域加载到内存当中。
imagedc.CreateCompatibleDC(&dc);
imagedc.SelectObject(&bmp);
imagedc.BitBlt(0,0,framerect.Width()+2*x,framerect.Height()+x,&dc,0,0,SRCCOPY);
BITMAP bmap;
bmp.GetBitmap(&bmap);
int panelsize = 0;
//非真彩色位图
if (bmap.bmBitsPixel <16)
panelsize = pow(2,bmap.bmBitsPixel*sizeof(RGBQUAD));
//设置BITMAPINFO结构
BITMAPINFO* bInfo = (BITMAPINFO*)LocalAlloc(LPTR,sizeof(BITMAPINFO)+panelsize);
bInfo->bmiHeader.biClrImportant = 0;
bInfo->bmiHeader.biBitCount = bmap.bmBitsPixel;
bInfo->bmiHeader.biCompression = 0;
bInfo->bmiHeader.biHeight = bmap.bmHeight;
bInfo->bmiHeader.biPlanes = bmap.bmPlanes;
bInfo->bmiHeader.biSize = sizeof(BITMAPINFO);
bInfo->bmiHeader.biSizeImage = bmap.bmWidthBytes*bmap.bmHeight;
bInfo->bmiHeader.biWidth = bmap.bmWidth;
bInfo->bmiHeader.biXPelsPerMeter = 0;
bInfo->bmiHeader.biYPelsPerMeter = 0;
char* pData = new char[bmap.bmWidthBytes*bmap.bmHeight];
::GetDIBits(imagedc.m_hDC,bmp,0,bmap.bmHeight,pData,bInfo,DIB_RGB_COLORS);
//打印图像
pdc.StartDoc("print");
// //pdc.StartDoc(*bInfo);
::StretchDIBits(pdc.m_hDC,50,50,(int)((framerect.Width()*ratex)+2*x)
,(int)((framerect.Height()+2*x)*ratey),0,0,framerect.Width()+2*x
,framerect.Height()+2*x,pData,bInfo,DIB_RGB_COLORS,SRCCOPY);
pdc.EndDoc();
LocalFree(bInfo);
delete[] pData;
bmp.DeleteObject();
}
}
3、调试过程中,到了红色区域就出现”文件无法打印“提示框,并且是一直出现,请问这是怎么回事?
是不是我的程序中没有绘图句柄?
2 个解决方案
#1
拿到hdc,设置绘图场景
#2
您好,谢谢您的回答,我已经找到无法打印的原因了。
具体原因是:我在程序中有一个定时读文件的程序,读取文件的目录方式用的的相对方式,当打印开始的时候,默认目录发生变化,读取文件的时候找不到要读取文件的目录,就报错“文件不存在”,
问题解决方法:每次打印前取得当前默认目录,然后才打印,打印完毕后,再回复当前默认目录。读取文件前,先取得当前默认目录,然后再读取文件。
第一次发帖就有好心人回复,谢谢了
具体原因是:我在程序中有一个定时读文件的程序,读取文件的目录方式用的的相对方式,当打印开始的时候,默认目录发生变化,读取文件的时候找不到要读取文件的目录,就报错“文件不存在”,
问题解决方法:每次打印前取得当前默认目录,然后才打印,打印完毕后,再回复当前默认目录。读取文件前,先取得当前默认目录,然后再读取文件。
第一次发帖就有好心人回复,谢谢了
#1
拿到hdc,设置绘图场景
#2
您好,谢谢您的回答,我已经找到无法打印的原因了。
具体原因是:我在程序中有一个定时读文件的程序,读取文件的目录方式用的的相对方式,当打印开始的时候,默认目录发生变化,读取文件的时候找不到要读取文件的目录,就报错“文件不存在”,
问题解决方法:每次打印前取得当前默认目录,然后才打印,打印完毕后,再回复当前默认目录。读取文件前,先取得当前默认目录,然后再读取文件。
第一次发帖就有好心人回复,谢谢了
具体原因是:我在程序中有一个定时读文件的程序,读取文件的目录方式用的的相对方式,当打印开始的时候,默认目录发生变化,读取文件的时候找不到要读取文件的目录,就报错“文件不存在”,
问题解决方法:每次打印前取得当前默认目录,然后才打印,打印完毕后,再回复当前默认目录。读取文件前,先取得当前默认目录,然后再读取文件。
第一次发帖就有好心人回复,谢谢了