StartDoc()打印提示“文件不存在”?

时间:2021-11-15 11:35:00
各位大侠,我在编写一个打印程序,执行过程中出现“文件不存在‘提示框,请问这是怎么回事呢、。

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


您好,谢谢您的回答,我已经找到无法打印的原因了。
 具体原因是:我在程序中有一个定时读文件的程序,读取文件的目录方式用的的相对方式,当打印开始的时候,默认目录发生变化,读取文件的时候找不到要读取文件的目录,就报错“文件不存在”,

  问题解决方法:每次打印前取得当前默认目录,然后才打印,打印完毕后,再回复当前默认目录。读取文件前,先取得当前默认目录,然后再读取文件。

第一次发帖就有好心人回复,谢谢了