当前位置:C++技术网 > 资讯 > 屏幕DC与打印机DC未能获取的解决方法

屏幕DC与打印机DC未能获取的解决方法

更新时间:2016-01-28 21:56:09浏览次数:1+次

屏幕DC与打印机DC未能获取的解决方法

打印表格基本实现-设置预览,字体,线宽1》《打印表格基本实现-设置预览,字体,线宽2》两篇文章简要的介绍了打印表格的实现,同时增加了预览的功能,不过这里有个陷阱,你可能没有注意到,我们正常的运行一遍程序:

(图片上传不上,下次补上)

这个为什么会出现呢?现在就是检验我们调试代码的能力了。VS系列的调试功能很强大,具体的调试步骤,我就不详述了,既然出现了错误,就要检查出具体是哪里的代码有问题,我们才能修改。经过调试发现,其实是预览窗口类的CClientDC这里获得窗口的设备描述表有问题,根据上图可以知道,是窗口没有来得及创建或者是窗口没有创建,那么我们就需要分析了。

CClientDC sdc(this);
	//CDC *sdc=GetDC();
	CPrintDialog pdlg(false);
	pdlg.GetDefaults();
	CDC pdc;
	pdc.Attach(pdlg.GetPrinterDC());
	ratex = pdc.GetDeviceCaps(LOGPIXELSX) /
		sdc.GetDeviceCaps(LOGPIXELSX);
	ratey = pdc.GetDeviceCaps(LOGPIXELSY) /
		sdc.GetDeviceCaps(LOGPIXELSY);
我们利用这段代码分别得到窗口屏幕与打印机的尺寸及分辨率。然后得到两者的比率,但是,这也是出错的地方,为什么呢?根据报错的原因,应该是我们没有得到屏幕的设备描述表DC,也就是预览窗口的DC,我们没有得到,具体的原因我并没有分析出来,只是想到了解决办法,如果,你想到了预览窗口的DC没有获取到的原因,请不吝赐教。下面我们说说解决方案:
我在预览窗口类中删除了GetPrintRate方法,增加了两个变量:
double ratex,ratey;
在主对话框类的“打印”按钮消息响应函数中,得到屏幕与打印机的分辨率比值
void CPrintLineandFontDlg::OnPrint() 
{
dc1=GetDC();//修改后增加的代码
CPrintDialog pdlg(false); 
DWORD dw=GetLastError();
pdlg.GetDefaults();
CDC dc;
dc.Attach(pdlg.GetPrinterDC());
dc.StartDoc("PrintGrid");
double ratex,ratey;//修改后增加的代码
ratex = dc.GetDeviceCaps(LOGPIXELSX) /
dc1->GetDeviceCaps(LOGPIXELSX);//修改后增加的代码
ratey = dc.GetDeviceCaps(LOGPIXELSY) /
dc1->GetDeviceCaps(LOGPIXELSY);//修改后增加的代码
dlg.ratex=ratex;//修改后增加的代码
dlg.ratey=ratey;//修改后增加的代码
dlg.PreviewGrid(&dc,true);
dc.EndDoc();
}
然后在预览窗口类中:
void CPreview::PreviewGrid(CDC * dc,bool isprint)
{
if (PrintGrid == NULL)
return ;
//CClientDC sdc(this);
double ratex,ratey;
if (isprint)
{
ratex=CPreview::ratex;//修改的代码
ratey=CPreview::ratey;//修改的代码
}
else
ratex = ratey = 1;
.....以下的代码并没有变.....
看结果:
(图片上传不了,下次补上)
代码运行出错是很正常的事,我们要认真的检查,反复调试,在检查调试的过程中也能学到很多的东西,同时也能检验我们的代码调错能力。