急!打印分页问题,在打印预览中只能显示一页,大家帮忙看看!!!!
部分代码如下: void CJzjl::OnJzjlPrint()
{
CString strSQL;
UpdateData(TRUE);
int nCount=m_ctlList.GetItemCount();
if(nCount<=0)
{
AfxMessageBox("没有要打印的内容!");
return;
}
if(!db.IsOpen())
{
AfxMessageBox("数据库非正常断开,请退出后重新登陆!");
return;
}
CString strCdbh1,strCdbh2;
strCdbh1=_T("");
int j=0;
CRecordset rs(&db);
rs.Open(AFX_DB_USE_DEFAULT_TYPE,
"select distinct yqBH from tb_jzjl_detail where wtID='"+m_strWtbh+"'");
if(!rs.IsEOF())
{
rs.GetFieldValue("yqBH", strCdbh2);
j++;
rs.Close();
}else
{
rs.Close();
return;
}
strSQL.Format("update tb_jzjl_base set jzr='%s',fhr='%s' where wtID='%s'",m_strCyr,m_strFhr,m_strWtbh);
db.ExecuteSQL(strSQL);
PRNINFO PrnInfo = {0};
//PrnInfo.SetMinPage(); //加入代码
//PrnInfo.SetMaxPage(); //加入代码
PrnInfo.hListView = m_ctlList.m_hWnd;
PrnInfo.hWnd = this->m_hWnd;
PrnInfo.IsPrint = FALSE;
PrnInfo.nCurPage = 1;
PrnInfo.nMaxLine = 16*j;
if(m_strWtbh.GetLength()>1)
sprintf(PrnInfo.szTag,"%s",m_strWtbh.GetBuffer(1));
CPreParent DlgPreView;
DlgPreView.SetCallBackFun(DrawInfo, PrnInfo);
DlgPreView.DoModal();
}//Onprint()部分...
//OnDraw()部分//
void CJzjl::DrawInfo(CDC &memDC, PRNINFO PrnInfo)
{
if(memDC.m_hDC == NULL)
return;
int nCurPage = PrnInfo.nCurPage; //当前页
BOOL IsPrint = PrnInfo.IsPrint; //是否打印
int nMaxPage = PrnInfo.nCountPage; //最大页码
HWND hWnd = PrnInfo.hWnd;
HWND hList = PrnInfo.hListView;
CString csRFinality;
csRFinality.Format("第 %i 页/共 %i 页", nCurPage, nMaxPage);
CString strCyr,strFhr;
TCHAR szTitle[] = TEXT("大气采样仪流量校正记录");
CRect rc, rt1, rt2, rt3, rt4, rt5, rt6,rt7,rt8,rt;
CPen *hPenOld;
CPen cPen;
CFont TitleFont, DetailFont, *oldfont;
//取数据
if(!db.IsOpen())
{
AfxMessageBox("数据库非正常断开,请退出后重新登陆!");
return;
}
CString strJzrq,strOper,strYqmc,strXd,strGdbh,strWtbh;
strWtbh.Format("%s",PrnInfo.szTag);
CRecordset rs(&db);
rs.Open(AFX_DB_USE_DEFAULT_TYPE,
"select riqi,oper,yqmcbh,xd,gdbh,jzr,fhr from tb_jzjl_base where wtID='"+strWtbh+"'");
if(!rs.IsEOF())
{
rs.GetFieldValue("riqi", strJzrq);
rs.GetFieldValue("oper", strOper);
rs.GetFieldValue("yqmcbh", strYqmc);
rs.GetFieldValue("xd", strXd);
rs.GetFieldValue("gdbh", strGdbh);
rs.GetFieldValue("jzr",strCyr);
rs.GetFieldValue("fhr",strFhr);
}
rs.Close();
//标题字体
TitleFont.CreateFont(-MulDiv(14,memDC.GetDeviceCaps(LOGPIXELSY),72),
0,0,0,FW_NORMAL,0,0,0,GB2312_CHARSET,
OUT_STROKE_PRECIS,CLIP_STROKE_PRECIS,DRAFT_QUALITY,
VARIABLE_PITCH|FF_SWISS,_T("黑体"));
//细节字体
DetailFont.CreateFont(-MulDiv(10,memDC.GetDeviceCaps(LOGPIXELSY),72),
0,0,0,FW_NORMAL,0,0,0,GB2312_CHARSET,
OUT_STROKE_PRECIS,CLIP_STROKE_PRECIS,DRAFT_QUALITY,
VARIABLE_PITCH|FF_SWISS,_T("宋体"));
//粗笔
cPen.CreatePen(PS_SOLID, 2, RGB(0, 0, 0));
int xP = GetDeviceCaps(memDC.m_hDC, LOGPIXELSX); //x方向每英寸像素点数
int yP = GetDeviceCaps(memDC.m_hDC, LOGPIXELSY); //y方向每英寸像素点数
int xPix = xP*10/240; //每 mm 宽度的像素
int yPix = yP*10/240; //每 mm 高度的像素
int fAdd = 5*yPix; //每格递增量
// int nTitle=48*yPix;
int nTop = 15*yPix; //第一页最上线
int nLeft = 15*xPix; //最左线
int nRight = xPix*(B5_W-25); //最右线
int nBottom = nTop+B5_ONELINE*fAdd;//底
int nTextAdd = 2*xPix;//文字起始位置
// int iStart = (nCurPage - 1)*40;
// int iStart = (nCurPage - 1) * PrnInfo.nMaxLine; // //从第几行开始读取
int iStart=2*(nCurPage-1);
int iEnd=2*nCurPage;
// int iEnd = iStart + PrnInfo.nMaxLine;
// if(nCurPage != 1)
// nTop = nTop-nTitle; //非第一页最上线
// if(nCurPage>=2)
// iStart = B5_ONELINE+(nCurPage - 2)*B5_OTHERLINE;
if(IsPrint)
{
//真正打印部分
static DOCINFO di = {sizeof (DOCINFO), szTitle} ;
//开始文档打印
if(memDC.StartDoc(&di)<0)
{
::MessageBox(hWnd, "连接到打印机化败!", "错误", MB_ICONSTOP);
}
else
{
memDC.StartDoc(&di); //加入代码
iStart = 0;
for(int iTotalPages = 1; iTotalPages<=nMaxPage; iTotalPages++)
{
int nCurPage = iTotalPages;
csRFinality.Format("第 %i 页/共 %i 页", nCurPage, nMaxPage);
if(nCurPage != 1)
nTop = 25*yPix-fAdd; //非第一页最上线
//开始页
if(memDC.StartPage() < 0)
{
::MessageBox(hWnd, _T("打印失败!"), "错误", MB_ICONSTOP);
memDC.AbortDoc();
return;
}
else
{
//打印
memDC.StartPage(); //加入代码
//图像
DrawBMP(&memDC,xP,yP,".//image//df.bmp");
nTop=nTop+12*yPix;
//标题
oldfont = memDC.SelectObject(&TitleFont);
int nItem = B5_OTHERLINE;
nItem = B5_ONELINE;
rc.SetRect(nLeft, nTop, nRight, nTop+fAdd);
memDC.DrawText(szTitle, &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
//付标题
memDC.SelectObject(&DetailFont);
rc.SetRect(nRight-50*xPix, nTop, nRight, nTop+fAdd);
memDC.DrawText("归档编号:"+strGdbh, &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
nTop=nTop+fAdd;
...........//其它是打印部分内容
//采用的循环是
for(int k=iStart;k<iEnd;k++)//第二循环条件
......................
大家帮我看看,为这事,我都搞了得头都大了,而且参阅好多代码和书籍,但总打印预览只显示一页,不知原因如何?????大家一定要帮帮我啊...............