| |
一些用户反映Trend控件的PrintPic方法在一些激光打印机上不能打印,现象为空走纸,没有输出内容,经我们跟踪调试,发现问题出在一个Windows的标准API函数上,这些激光打印机对这个API支持有问题,具体原因不太清楚,可能是驱动程序的问题,我们已找到替代解决方案:
不要使用Trend控件的PintPic方法,直接输出控件的Image属性到打印机,效果相同。
具体VB例程为:
Private Sub cmdPrint_Click()
Printer.PaintPicture Trend1.Image,
0, 0
End Sub
如果您使用的开发工具是VC的话,可以使用控件提供的hDC属性,使用StretchBlt直接输出到打印机:
void CTrendDlg::OnPrint()
{
//创建系统默认打印机的设备上下文
CPrintDialog pd(FALSE);
pd.GetDefaults();
HDC hdc = pd.CreatePrinterDC();
//打印机参数设置
DOCINFO DI;
DI.cbSize = sizeof(DOCINFO);
DI.fwType = 0;
DI.lpszDatatype = NULL;//"Trend
Chart";
DI.lpszDocName = "Trend Chart";
DI.lpszOutput = NULL;
//以下得到控件的宽度和高度
RECT rctTrend;
::GetWindowRect((HWND)m_Trend1.GetHWnd(), &rctTrend);
long nWidth = rctTrend.right - rctTrend.left;
long nHeight = rctTrend.bottom - rctTrend.top;
//以下分别得到屏幕和打印机的DPI,以及他们之间的比率,以校正打印图片的尺寸
int nScreenW = GetDeviceCaps((HDC)m_Trend1.GetHDC(),
LOGPIXELSX);
int nScreenH = GetDeviceCaps((HDC)m_Trend1.GetHDC(),
LOGPIXELSY);
int nPrintW = GetDeviceCaps(hdc, LOGPIXELSX);
int nPrintH = GetDeviceCaps(hdc, LOGPIXELSY);
float fRateX = float(nScreenW) / nPrintW;
float fRateY = float(nScreenH) / nPrintH;
//开始打印
StartDoc(hdc, (LPDOCINFO)&DI);
StartPage(hdc);
//::BitBlt(hdc, 0, 0, rctTrend.right - rctTrend.left,
rctTrend.bottom - rctTrend.top, (HDC)m_Trend1.GetHDC(),
0, 0, SRCCOPY);
::StretchBlt(hdc, 0, 0,int(nWidth / fRateX) , int(nHeight
/ fRateY), (HDC)m_Trend1.GetHDC(), 0, 0, nWidth, nHeight,
SRCCOPY);
EndPage(hdc);
EndDoc(hdc);
//打印结束
//删除创建的打印机设备上下文
DeleteDC(hdc);
} |