精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
本例子用MFC相关类:子框架类和CView类实现了打印。
1、原例子把ListCtrl里内容竖向预览及打印,新例子支持横向预览及打印
2、CView派生类的OnPreparePrinting函数负责预览及打印前的准备,包括设备状态准备,在这里通过修改设备状态对应的成员变量实现了功能。涉及关键字:GetPrinterDeviceDefaults,CPrintInfo,dmOrientation,DMORIENT_LANDSCAPE
核心代码如下:
BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo)
{
// TODO: call DoPreparePrinting to invoke the Print dialog box
//设置横向打印
LPDEVMODE lpDevMode;
if(AfxGetApp()->GetPrinterDeviceDefaults(&pInfo->m_pPD->m_pd))
{
lpDevMode=(LPDEVMODE)GlobalLock(pInfo->m_pPD->m_pd.hDevMode);
if(lpDevMode)
{
lpDevMode->dmPaperSize=DMPAPER_A4;
lpDevMode->dmOrientation=DMORIENT_LANDSCAPE;
}
GlobalUnlock(pInfo->m_pPD->m_pd.hDevMode);
}
if (DoPreparePrinting(pInfo))
return TRUE;
else
{
GetParent()->DestroyWindow();
return FALSE;
}
}
LRESULT CMyPrintDlg::OnMyPrint(WPARAM wParam,LPARAM lParam)
{
UINT gl_uNumOfPoints = m_List.GetItemCount();
CDC* pDC = (CDC*)wParam;
CPrintInfo* pInfo = (CPrintInfo *)lParam;
int nPageNumber = pInfo->m_nCurPage;
TRACE("myprint get page %d\r\n",pInfo->m_nCurPage);
int i,j,columns = m_List.GetColumnCounts();
CFont *pOldFont;
CFont DataFont;
DataFont.CreatePointFont(120,"宋体",pDC);
CHeaderCtrl *header = m_List.GetHeaderCtrl();
//columns = header->GetItemCount();
int nItems = m_List.GetItemCount();
nPageNumber = nPageNumber % pInfo->GetMaxPage();
if (0 == nPageNumber)
{
nPageNumber = 1;
m_CurrenItem = 0;
pInfo->m_nCurPage = 1;
}
int m_templines = m_nLinesPerPage * (nPageNumber) ;
CString temp;
pOldFont=pDC->SelectObject(&DataFont);
temp.Format("总共%d页,第%d页,从第%d项到第%d项", pInfo->GetMaxPage(),nPageNumber,m_CurrenItem,m_templines);
pDC->TextOut(0, 0, temp);
if(nPageNumber > 0)
{
pDC->Rectangle(m_cxOffset,(int)((2.5 + PRINTMARGIN)*m_cyPrinter),m_cxOffset+m_cxWidth,(m_nLinesPerPage+3 + PRINTMARGIN)*m_cyPrinter+20);
for(i=1;i<7;i++)
{
pDC->MoveTo(m_cxOffset+i*m_cxWidth/7,(int)((2.5 + PRINTMARGIN)*m_cyPrinter));
pDC->LineTo(m_cxOffset+i*m_cxWidth/7,(3 +m_nLinesPerPage+PRINTMARGIN)*m_cyPrinter+20);
}
pDC->MoveTo(m_cxOffset,(4 + PRINTMARGIN)*m_cyPrinter);
pDC->LineTo(m_cxOffset+m_cxWidth,(4 + PRINTMARGIN)*m_cyPrinter);
for (i = 0; i < columns; i++)
{
CString temp;
TCHAR buffer[120];
HDITEM *hdItem = new HDITEM;
hdItem->mask = HDI_TEXT;
hdItem->pszText = buffer;
hdItem->cchTextMax = sizeof(buffer);
if (header->GetItem(i, hdItem))
{
temp = CString(buffer);
pDC->TextOut(m_cxOffset+50+i*m_cxWidth/7,(int)((2.8 + PRINTMARGIN)*m_cyPrinter),temp);
}
}
m_CurrenItem = (nPageNumber-1) * m_nLinesPerPage;
for(i=m_CurrenItem;i < m_templines && i < nItems;i++)
{
int nIndex = i - m_CurrenItem;
// if(nIndex<(int)gl_uNumOfPoints)
//{
for(j=0;j<columns;j++)
{
CString str;
str = m_List.GetItemText(i,j);//新改
pDC->TextOut(m_cxOffset+50+j*m_cxWidth/7,(4 + PRINTMARGIN+nIndex)*m_cyPrinter+5,str);
}
//}
}
// m_CurrenItem = i;
pDC->SelectObject (pOldFont);
// DeleteObject(DataFont);
}
/*if(nPageNumber==1)
{
HBITMAP hBitmap=::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1));
BITMAP bitmap;
::GetObject(hBitmap,sizeof(BITMAP),&bitmap);
double dScale=(double)m_cxWidth/bitmap.bmWidth;
int nScaledWidth=m_cxWidth;
int nScaledHeight=(int)(bitmap.bmHeight*dScale);
HDC dcMem;
dcMem=::CreateCompatibleDC(pDC->m_hDC);
HBITMAP hOldBmp=(HBITMAP)::SelectObject(dcMem,hBitmap);
int nVertCenterPos = pDC->GetDeviceCaps (VERTRES) / 2;
::StretchBlt(pDC->m_hDC,m_cxOffset,(4 + PRINTMARGIN)*m_cyPrinter,nScaledWidth,nScaledHeight,dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
::SelectObject(dcMem,hOldBmp);
::DeleteDC(dcMem);
::DeleteObject(hBitmap);
}*/
// if(m_bPrintHead)
PrintPageHeader(pDC,pInfo->m_nCurPage, pInfo);
return TRUE;
}
LRESULT CMyPrintDlg::OnBeginPrinting(WPARAM wParam,LPARAM lParam)
{
CDC* pDC = (CDC*)wParam;
CPrintInfo* pInfo = (CPrintInfo*)lParam;
if(NULL == m_fontPrinter.m_hObject)
m_fontPrinter.CreatePointFont(120, "FixedSys", pDC);
TEXTMETRIC tm;
CFont *pOldFont = pDC->SelectObject(&m_fontPrinter);
pDC->GetTextMetrics(&tm);
m_cyPrinter = tm.tmHeight + tm.tmExternalLeading;
CSize size = pDC->GetTextExtent(_T("---------1---------2---------" \
"3---------4---------5---------6---------7---------8---"),81);
pDC->SelectObject(pOldFont);
m_cxWidth = size.cx;
m_nLinesPerPage = (pDC->GetDeviceCaps(VERTRES)-
(m_cyPrinter * (3 + (2* PRINTMARGIN))))/ m_cyPrinter;
int m_MaxPage = m_List.GetItemCount();
m_MaxPage = m_MaxPage / m_nLinesPerPage + (m_MaxPage % m_nLinesPerPage > 0 ? 1:0);
pInfo->SetMaxPage(m_MaxPage);
pInfo->m_nCurPage = 1; // start printing at page# 1
m_cxOffset = (pDC ->GetDeviceCaps(HORZRES) - size.cx) / 2;
return TRUE;
}
LRESULT CMyPrintDlg::OnEndPrinting(WPARAM wParam,LPARAM lParam)
{
if ( NULL != m_fontPrinter.m_hObject)
m_fontPrinter.DeleteObject();
return TRUE;
}
void CMyPrintDlg::LoadmList()
{
m_List.InsertColumn(0, "编号", LVCFMT_CENTER);
m_List.InsertColumn(1,"名称", LVCFMT_CENTER);
m_List.InsertColumn(2,"ID", LVCFMT_CENTER);
m_List.InsertColumn(3, "检验类别", LVCFMT_CENTER);
m_List.InsertColumn(4, "shh", LVCFMT_CENTER);
m_List.InsertColumn(5, "ywsx", LVCFMT_CENTER);
m_List.InsertColumn(6, "cdff", LVCFMT_CENTER);
m_List.AutoAdjustWidth();
for(int i=0;i<1500;i++)
{
m_List.InsertItem(i,"aaa");
}
}
void CMyPrintDlg::ReadEXCEL()
{
CDatabase database;
CString sSql;
CString sDriver = GetEXCELDriver();
if (sDriver.IsEmpty())
return;
CString sFile;
CFileDialog mFile(TRUE,"xls", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"Excel文件(*.xls)|*.xls|", this);
if (IDOK != mFile.DoModal())
return ;
sFile = mFile.GetPathName();
if (0 == mFile.m_ofn.nFileExtension)
sFile += ".xls";
AfxMessageBox(sFile);
try{
//sSql.Format("ODBC;DRIVER = {%s}; DSN = ''''; DBQ = %s",sDriver,sFile);
sSql.Format("ODBC;DRIVER={%s};DSN='''';DBQ=%s", sDriver, sFile);
database.Open(NULL, false, false, sSql);
CRecordset recordset(&database);
sSql.Format("select distinct bh, mc,id,jylbbh, shh, ywsx, cdff from [3785$] order by bh, mc");
recordset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
int i = 0;
while(!recordset.IsEOF())
{
CString m_bh, m_mc, m_id, m_jylbbh, m_shh, m_ywsx, m_cdff;
recordset.GetFieldValue("bh",m_bh);m_bh.TrimLeft(); m_bh.TrimRight();
recordset.GetFieldValue("mc", m_mc);m_mc.TrimLeft(); m_mc.TrimRight();
recordset.GetFieldValue("id", m_id);m_id.TrimLeft(); m_id.TrimRight();
recordset.GetFieldValue("jylbbh", m_jylbbh);m_jylbbh.TrimLeft(); m_jylbbh.TrimRight();
recordset.GetFieldValue("shh", m_shh);m_shh.TrimLeft(); m_shh.TrimRight();
recordset.GetFieldValue("ywsx", m_ywsx);m_ywsx.TrimLeft(); m_shh.TrimRight();
recordset.GetFieldValue("cdff", m_cdff);m_cdff.TrimLeft(); m_cdff.TrimRight();
m_List.InsertItem(i,"");
m_List.SetItemText(i, 0, m_bh);
m_List.SetItemText(i, 1, m_mc);
m_List.SetItemText(i, 2, m_id);
m_List.SetItemText(i, 3, m_jylbbh);
m_List.SetItemText(i, 4, m_shh);
m_List.SetItemText(i, 5, m_ywsx);
m_List.SetItemText(i, 6, m_cdff);
i++;
recordset.MoveNext();
}
recordset.Close();
database.Close();
}catch(CDBException *e)
{
AfxMessageBox(e->m_strError);
}
}
CString CMyPrintDlg::GetEXCELDriver()
{
char szBuf[2001];
WORD cbBufMax = 2000;
WORD cbBufOut = 0;
char *pszBuf = szBuf;
CString sDriver;
if (!SQLGetInstalledDrivers(szBuf, cbBufMax,&cbBufOut))
return "";
do
{
if (0 != strstr(pszBuf, "Excel"))
{
sDriver = CString(pszBuf);
break;
}
pszBuf = strchr(pszBuf, '\0')+1;
} while ('\0' != pszBuf[1]);
return sDriver;
}