头大得很,为这个东西花费了一个晚上的时间。贴出来抗挖埋起
void CPreviewDemoDlg::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 csLFinality, csRFinality;
CTime time;
time=CTime::GetCurrentTime();
csLFinality = time.Format("报表日期:%Y-%m-%d");
csRFinality.Format("第 %i 页/共 %i 页", nCurPage, nMaxPage);
TCHAR szTitle[] = TEXT("罗平县宜康医院住院明细");
CRect rc, rt1, rt2, rt3, rt4, rt5, rt6,rt7;
CPen *hPenOld;
CPen cPen;
CFont TitleFont, DetailFont, *oldfont;
//标题字体
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方向每英寸像素点数
DOUBLE xPix = (DOUBLE)xP*10/254; //每 mm 宽度的像素
DOUBLE yPix = (DOUBLE)yP*10/254; //每 mm 高度的像素
DOUBLE fAdd = 7*yPix; //每格递增量
DOUBLE nTop = 25*yPix; //第一页最上线
int iStart = 0; //从第几行开始读取
DOUBLE nBottom = nTop+B5_ONELINE*fAdd;
if(nCurPage != 1)
nTop = 25*yPix-fAdd; //非第一页最上线
if(nCurPage == 2)
iStart = B5_ONELINE;
if(nCurPage>2)
iStart = B5_ONELINE+(nCurPage - 2)*B5_OTHERLINE;
DOUBLE nLeft = 20*xPix; //最左线
DOUBLE nRight = xPix*(B5_W-20); //最右线
DOUBLE nTextAdd = 1.5*xPix;
if(IsPrint)
{
//真正打印部分
static DOCINFO di = {sizeof (DOCINFO), szTitle} ;
//开始文档打印
if(memDC.StartDoc(&di)<0)
{
::MessageBox(hWnd, "连接到打印机失败!", "错误", MB_ICONSTOP);
}
else
{
iStart = 0;
nTop = 25*yPix; //第一页最上线
for(int iTotalPages = 1; iTotalPages<=nMaxPage; iTotalPages++)
{
int nCurPage = iTotalPages;
csRFinality.Format("第 %i 页/共 %i 页", nCurPage, nMaxPage);
time=CTime::GetCurrentTime();
csLFinality = time.Format("报表日期:%Y-%m-%d");
if(nCurPage != 1)
nTop = 25*yPix-fAdd; //非第一页最上线
if(nCurPage == 2)
iStart = B5_ONELINE;
if(nCurPage>2)
iStart = B5_ONELINE+(nCurPage - 2)*B5_OTHERLINE;
//开始页
if(memDC.StartPage() <0)
{
::MessageBox(hWnd, _T("打印失败!"), "错误", MB_ICONSTOP);
memDC.AbortDoc();
return;
}
else
{
//打印
//标题
oldfont = memDC.SelectObject(&TitleFont);
int nItem = B5_OTHERLINE;
if(nCurPage == 1)
{
nItem = B5_ONELINE;
rc.SetRect(0, yPix*10, B5_W*xPix, yPix*20);
memDC.DrawText(szTitle, &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}
//细节
memDC.SelectObject(&DetailFont);
rc.SetRect(nLeft, nTop, nRight, nTop+fAdd);
//上横线
memDC.MoveTo(rc.left, rc.top);
memDC.LineTo(rc.right, rc.top);
rt1.SetRect(nLeft, nTop, nLeft+20*xPix, nTop+fAdd); //学号
rt2.SetRect(rt1.right, rt1.top, rt1.right + 20*xPix, rt1.bottom); //姓名
rt3.SetRect(rt2.right, rt1.top, rt2.right + 10*xPix, rt1.bottom); //性别
rt4.SetRect(rt3.right, rt1.top, rt3.right + 20*xPix, rt1.bottom); //专业
rt5.SetRect(rt4.right, rt1.top, rt4.right + 20*xPix, rt1.bottom); //年级
rt6.SetRect(rt5.right, rt1.top, rt4.right + 20*xPix, rt1.bottom); //班级
rt7.SetRect(rt6.right, rt1.top, rc.right, rt1.bottom); //年级
memDC.DrawText("学 号", &rt1, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
memDC.DrawText("姓 名", &rt2, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
memDC.DrawText("性别", &rt3, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
memDC.DrawText("专 业", &rt4, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
memDC.DrawText("年 级", &rt5, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
memDC.DrawText("班 级", &rt6, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
memDC.DrawText("备 注", &rt7, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
memDC.MoveTo(rt1.right, rt1.top);
memDC.LineTo(rt1.right, rt1.bottom);
memDC.MoveTo(rt2.right, rt1.top);
memDC.LineTo(rt2.right, rt1.bottom);
memDC.MoveTo(rt3.right, rt1.top);
memDC.LineTo(rt3.right, rt1.bottom);
memDC.MoveTo(rt4.right, rt1.top);
memDC.LineTo(rt4.right, rt1.bottom);
memDC.MoveTo(rt5.right, rt1.top);
memDC.LineTo(rt5.right, rt1.bottom);
memDC.MoveTo(rt6.right, rt1.top);
memDC.LineTo(rt6.right, rt1.bottom);
memDC.MoveTo(rc.left, rt1.bottom);
memDC.LineTo(rc.right, rt1.bottom);
TCHAR szID[32]={0}, szName[16]={0}, szSex[8]={0}, szZY[32]={0}, szNJ[32]={0}, szBJ[32]={0},szBZ[32]={0};
rc.SetRect(nLeft, nTop+fAdd, nRight, nTop+2*fAdd);
rt1.SetRect(nLeft+nTextAdd, rc.top, nLeft+20*xPix, rc.bottom); //学号
rt2.SetRect(rt1.right+nTextAdd, rt1.top, rt1.right + 20*xPix, rt1.bottom); //姓名
rt3.SetRect(rt2.right+nTextAdd, rt1.top, rt2.right + 10*xPix, rt1.bottom); //性别
rt4.SetRect(rt3.right+nTextAdd, rt1.top, rt3.right + 20*xPix, rt1.bottom); //专业
rt5.SetRect(rt4.right+nTextAdd, rt1.top, rt4.right + 20*xPix, rt1.bottom); //年级
rt6.SetRect(rt5.right+nTextAdd, rt1.top, rt5.right + 20*xPix, rt1.bottom); //班级
rt7.SetRect(rt6.right+nTextAdd, rt1.top, rc.right, rt1.bottom); //班级
int nCountItem = ListView_GetItemCount(hList);
for(int i=0;i
{
ListView_GetItemText(hList, i+iStart, 0, szID, 32);
ListView_GetItemText(hList, i+iStart, 1, szName, 16);
ListView_GetItemText(hList, i+iStart, 2, szSex, 8);
ListView_GetItemText(hList, i+iStart, 3, szZY, 32);
ListView_GetItemText(hList, i+iStart, 4, szNJ, 32);
ListView_GetItemText(hList, i+iStart, 5, szBJ, 32);
ListView_GetItemText(hList, i+iStart, 6, szBZ, 32);
memDC.DrawText(szID, &rt1, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
memDC.DrawText(szName, &rt2, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
memDC.DrawText(szSex, &rt3, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
memDC.DrawText(szZY, &rt4, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
memDC.DrawText(szNJ, &rt5, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
memDC.DrawText(szBJ, &rt6, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
memDC.DrawText(szBZ, &rt7, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
//下横线
memDC.MoveTo(rc.left, rc.bottom);
memDC.LineTo(rc.right, rc.bottom);
memDC.MoveTo(rt1.right, rt1.top);
memDC.LineTo(rt1.right, rt1.bottom);
memDC.MoveTo(rt2.right, rt1.top);
memDC.LineTo(rt2.right, rt1.bottom);
memDC.MoveTo(rt3.right, rt1.top);
memDC.LineTo(rt3.right, rt1.bottom);
memDC.MoveTo(rt4.right, rt1.top);
memDC.LineTo(rt4.right, rt1.bottom);
memDC.MoveTo(rt5.right, rt1.top);
memDC.LineTo(rt5.right, rt1.bottom);
memDC.MoveTo(rt6.right, rt1.top);
memDC.LineTo(rt6.right, rt1.bottom);
memDC.MoveTo(rc.left, rt1.bottom);
memDC.LineTo(rc.right, rt1.bottom);
rc.top += fAdd;
rc.bottom += fAdd;
rt1.top = rc.top;
rt1.bottom = rc.bottom;
rt2.top = rt1.top;
rt2.bottom = rt1.bottom;
rt3.top = rt1.top;
rt3.bottom = rt1.bottom;
rt4.top = rt1.top;
rt4.bottom = rt1.bottom;
rt5.top = rt1.top;
rt5.bottom = rt1.bottom;
rt6.top = rt1.top;
rt6.bottom = rt1.bottom;
rt7.top = rt1.top;
rt7.bottom = rt1.bottom;
if((i+iStart+1)>=nCountItem)
break;
}
//结尾
memDC.MoveTo(rc.left, nTop);
memDC.LineTo(rc.left, rc.top);
memDC.MoveTo(rc.right, nTop);
memDC.LineTo(rc.right, rc.top);
memDC.DrawText(csLFinality, &rc, DT_LEFT| DT_VCENTER | DT_SINGLELINE);
memDC.DrawText(csRFinality, &rc, DT_RIGHT| DT_VCENTER | DT_SINGLELINE);
memDC.EndPage();
memDC.SelectObject(oldfont);
}
}
memDC.EndDoc();
}
}
else
{
//打印预览
//边框线
hPenOld = memDC.SelectObject(&cPen);
rc.SetRect(0, 0, B5_W*xPix, B5_H*yPix);
memDC.Rectangle(&rc);
memDC.SelectObject(hPenOld);
//标题
oldfont = memDC.SelectObject(&TitleFont);
int nItem = B5_OTHERLINE;
if(nCurPage == 1)
{
nItem = B5_ONELINE;
rc.SetRect(0, yPix*5, B5_W*xPix, yPix*10);
memDC.DrawText(szTitle, &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
oldfont = memDC.SelectObject(&DetailFont);
rc.SetRect(80, yPix*16, B5_W*xPix, yPix*25);
memDC.DrawText("定点医疗机构:罗平县宜康医院 病历号: 姓名: 住院号: 年龄: 科室: ", &rc, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
}
//细节
memDC.SelectObject(&DetailFont);
rc.SetRect(nLeft, nTop, nRight, nTop+fAdd);
//上横线
memDC.MoveTo(rc.left, rc.top);
memDC.LineTo(rc.right, rc.top);
rt1.SetRect(nLeft, nTop, nLeft+20*xPix, nTop+fAdd); //学号
rt2.SetRect(rt1.right, rt1.top, rt1.right + 20*xPix, rt1.bottom); //姓名
rt3.SetRect(rt2.right, rt1.top, rt2.right + 10*xPix, rt1.bottom); //性别
rt4.SetRect(rt3.right, rt1.top, rt3.right + 20*xPix, rt1.bottom); //专业
rt5.SetRect(rt4.right, rt1.top, rt4.right + 20*xPix, rt1.bottom); //年级
rt6.SetRect(rt5.right, rt1.top, rt5.right + 20*xPix, rt1.bottom); //班级
rt7.SetRect(rt6.right, rt1.top, rc.right, rt1.bottom); //年级
memDC.DrawText("日 期", &rt1, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
memDC.DrawText("内 容", &rt2, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
memDC.DrawText("类别", &rt3, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
memDC.DrawText("规 格", &rt4, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
memDC.DrawText("总 量", &rt5, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
memDC.DrawText("金 额", &rt6, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
memDC.DrawText("备 注", &rt7, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
memDC.MoveTo(rt1.right, rt1.top);
memDC.LineTo(rt1.right, rt1.bottom);
memDC.MoveTo(rt2.right, rt1.top);
memDC.LineTo(rt2.right, rt1.bottom);
memDC.MoveTo(rt3.right, rt1.top);
memDC.LineTo(rt3.right, rt1.bottom);
memDC.MoveTo(rt4.right, rt1.top);
memDC.LineTo(rt4.right, rt1.bottom);
memDC.MoveTo(rt5.right, rt1.top);
memDC.LineTo(rt5.right, rt1.bottom);
memDC.MoveTo(rt6.right, rt1.top);
memDC.LineTo(rt6.right, rt1.bottom);
memDC.MoveTo(rc.left, rt1.bottom);
memDC.LineTo(rc.right, rt1.bottom);
TCHAR szID[32]={0}, szName[16]={0}, szSex[8]={0}, szZY[32]={0}, szNJ[32]={0}, szBJ[32]={0},szBZ[32]={0};
rc.SetRect(nLeft, nTop+fAdd, nRight, nTop+2*fAdd);
rt1.SetRect(nLeft+nTextAdd, rc.top, nLeft+20*xPix, rc.bottom); //学号
rt2.SetRect(rt1.right+nTextAdd, rt1.top, rt1.right + 20*xPix, rt1.bottom); //姓名
rt3.SetRect(rt2.right+nTextAdd, rt1.top, rt2.right + 10*xPix, rt1.bottom); //性别
rt4.SetRect(rt3.right+nTextAdd, rt1.top, rt3.right + 20*xPix, rt1.bottom); //专业
rt5.SetRect(rt4.right+nTextAdd, rt1.top, rt4.right + 20*xPix, rt1.bottom); //年级
rt6.SetRect(rt5.right+nTextAdd, rt1.top, rt5.right + 20*xPix, rt1.bottom); //班级
rt7.SetRect(rt6.right+nTextAdd, rt1.top, rc.right, rt1.bottom); //班级
int nCountItem = ListView_GetItemCount(hList);
for(int i=0;i
{
ListView_GetItemText(hList, i+iStart, 0, szID, 32);
ListView_GetItemText(hList, i+iStart, 1, szName, 16);
ListView_GetItemText(hList, i+iStart, 2, szSex, 8);
ListView_GetItemText(hList, i+iStart, 3, szZY, 32);
ListView_GetItemText(hList, i+iStart, 4, szNJ, 32);
ListView_GetItemText(hList, i+iStart, 5, szBJ, 32);
ListView_GetItemText(hList, i+iStart, 6, szBZ, 32);
memDC.DrawText(szID, &rt1, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
memDC.DrawText(szName, &rt2, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
memDC.DrawText(szSex, &rt3, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
memDC.DrawText(szZY, &rt4, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
memDC.DrawText(szNJ, &rt5, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
memDC.DrawText(szBJ, &rt6, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
memDC.DrawText(szBZ, &rt7, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
//下横线
memDC.MoveTo(rc.left, rc.bottom);
memDC.LineTo(rc.right, rc.bottom);
memDC.MoveTo(rt1.right, rt1.top);
memDC.LineTo(rt1.right, rt1.bottom);
memDC.MoveTo(rt2.right, rt1.top);
memDC.LineTo(rt2.right, rt1.bottom);
memDC.MoveTo(rt3.right, rt1.top);
memDC.LineTo(rt3.right, rt1.bottom);
memDC.MoveTo(rt4.right, rt1.top);
memDC.LineTo(rt4.right, rt1.bottom);
memDC.MoveTo(rt5.right, rt1.top);
memDC.LineTo(rt5.right, rt1.bottom);
memDC.MoveTo(rt6.right, rt1.top);
memDC.LineTo(rt6.right, rt1.bottom);
memDC.MoveTo(rc.left, rt1.bottom);
memDC.LineTo(rc.right, rt1.bottom);
rc.top += fAdd;
rc.bottom += fAdd;
rt1.top = rc.top;
rt1.bottom = rc.bottom;
rt2.top = rt1.top;
rt2.bottom = rt1.bottom;
rt3.top = rt1.top;
rt3.bottom = rt1.bottom;
rt4.top = rt1.top;
rt4.bottom = rt1.bottom;
rt5.top = rt1.top;
rt5.bottom = rt1.bottom;
rt6.top = rt1.top;
rt6.bottom = rt1.bottom;
rt7.top = rt1.top;
rt7.bottom = rt1.bottom;
if((i+iStart+1)>=nCountItem)
break;
}
//结尾
memDC.MoveTo(rc.left, nTop);
memDC.LineTo(rc.left, rc.top);
memDC.MoveTo(rc.right, nTop);
memDC.LineTo(rc.right, rc.top);
memDC.DrawText(csLFinality, &rc, DT_LEFT| DT_VCENTER | DT_SINGLELINE);
memDC.DrawText(csRFinality, &rc, DT_RIGHT| DT_VCENTER | DT_SINGLELINE);
memDC.SelectObject(oldfont);
memDC.SelectObject(hPenOld);
}
TitleFont.DeleteObject();
DetailFont.DeleteObject();
cPen.DeleteObject();
}
如果你想投稿或者有其他建议,请发到邮箱qiaolaoer#gmail.com(将#替换为@即可)

