www.gusucode.com > 几个VC++打印小例子-源码程序 > 几个VC++打印小例子-源码程序/code/Print2/Print2Dlg.cpp
//Download by http://www.NewXing.com // Print2Dlg.cpp : implementation file // #include "stdafx.h" #include "Print2.h" #include "Print2Dlg.h" #include "PreparentDlg.h" #include "math.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPrint2Dlg dialog CPrint2Dlg::CPrint2Dlg(CWnd* pParent /*=NULL*/) : CDialog(CPrint2Dlg::IDD, pParent) { //{{AFX_DATA_INIT(CPrint2Dlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CPrint2Dlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPrint2Dlg) DDX_Control(pDX, IDC_DEGREE_CAL_LIST, m_listctrlDegree); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CPrint2Dlg, CDialog) //{{AFX_MSG_MAP(CPrint2Dlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(ID_PRINT_BTN, OnPrintBtn) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPrint2Dlg message handlers BOOL CPrint2Dlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here //初始化列表 m_listctrlDegree.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); int nItem = 0; //列名 m_listctrlDegree.InsertColumn(nItem++, "角度", LVCFMT_LEFT, 50); m_listctrlDegree.InsertColumn(nItem++, "正弦", LVCFMT_LEFT, 70); m_listctrlDegree.InsertColumn(nItem++, "余弦", LVCFMT_LEFT, 70); m_listctrlDegree.InsertColumn(nItem++, "正切", LVCFMT_LEFT, 70); m_listctrlDegree.InsertColumn(nItem++, "余切", LVCFMT_LEFT, 70); CString str; long double sini,cosi,tani,ctani; for(int i=0 ; i<=360 ; i++) { sini = sin((long double)i*2*3.1415926/360); cosi = cos((long double)i*2*3.1415926/360); tani = tan((long double)i*2*3.1415926/360); ctani = 1/tani; str.Format("%d", i); nItem = m_listctrlDegree.InsertItem(0xFFFFFF, str); int nSub = 1; str.Format("%.4f", sini); m_listctrlDegree.SetItem(nItem, nSub++, 1, str, NULL, 0, 0, 0); str.Format("%.4f", cosi); m_listctrlDegree.SetItem(nItem, nSub++, 1, str, NULL, 0, 0, 0); if(i==90 || i==270) str = ""; else str.Format("%.4f", tani); m_listctrlDegree.SetItem(nItem, nSub++, 1, str, NULL, 0, 0, 0); if(i==0||i==180 || i==360) str=""; else str.Format("%.4f", ctani); m_listctrlDegree.SetItem(nItem, nSub++, 1, str, NULL, 0, 0, 0); } UpdateData(FALSE); return TRUE; // return TRUE unless you set the focus to a control } void CPrint2Dlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CPrint2Dlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CPrint2Dlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CPrint2Dlg::OnPrintBtn() { // TODO: Add your control notification handler code here if(m_listctrlDegree.GetItemCount()<= 0) return; PRNINFO PrnInfo = {0}; PrnInfo.hListView = m_listctrlDegree.m_hWnd; PrnInfo.hWnd = this->m_hWnd; PrnInfo.IsPrint = FALSE; PrnInfo.nCurPage = 1; PrnInfo.nMaxLine = m_listctrlDegree.GetItemCount(); CPreparentDlg m_PreparentDlg; m_PreparentDlg.SetCallBackFun(DrawInfo, PrnInfo); m_PreparentDlg.DoModal(); } void CPrint2Dlg::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("角度计算表"); CString szTitle = "角度计算表"; CRect rc, rt1, rt2, rt3, rt4, rt5; 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+24*xPix, nTop+fAdd); //角度 rt2.SetRect(rt1.right, rt1.top, rt1.right + 30*xPix, rt1.bottom); //正弦 rt3.SetRect(rt2.right, rt1.top, rt2.right + 30*xPix, rt1.bottom); //余弦 rt4.SetRect(rt3.right, rt1.top, rt3.right + 30*xPix, rt1.bottom); //正切 rt5.SetRect(rt4.right, rt1.top, rt4.right + 30*xPix, 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.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(rc.left, rt1.bottom); memDC.LineTo(rc.right, rt1.bottom); TCHAR strDegree[32]={0}, strSin[32]={0}, strCos[32]={0}, strTan[32]={0}, strCtan[32]={0}; rc.SetRect(nLeft, nTop+fAdd, nRight, nTop+2*fAdd); rt1.SetRect(nLeft+nTextAdd, rc.top, nLeft+24*xPix, rc.bottom); //角度 rt2.SetRect(rt1.right+nTextAdd, rt1.top, rt1.right + 30*xPix, rt1.bottom); //正弦 rt3.SetRect(rt2.right+nTextAdd, rt1.top, rt2.right + 30*xPix, rt1.bottom); //余弦 rt4.SetRect(rt3.right+nTextAdd, rt1.top, rt3.right + 30*xPix, rt1.bottom); //正切 rt5.SetRect(rt4.right+nTextAdd, rt1.top, rt4.right + 30*xPix, rt1.bottom); //余切 int nCountItem = ListView_GetItemCount(hList); for(int i=0;i<nItem; i++) { ListView_GetItemText(hList, i+iStart, 0, strDegree, 32); ListView_GetItemText(hList, i+iStart, 1, strSin,32); ListView_GetItemText(hList, i+iStart, 2, strCos, 32); ListView_GetItemText(hList, i+iStart, 3, strTan, 32); ListView_GetItemText(hList, i+iStart, 4, strCtan, 32); memDC.DrawText(strDegree, &rt1, DT_LEFT | DT_VCENTER | DT_SINGLELINE); memDC.DrawText(strSin, &rt2, DT_LEFT | DT_VCENTER | DT_SINGLELINE); memDC.DrawText(strCos, &rt3, DT_LEFT | DT_VCENTER | DT_SINGLELINE); memDC.DrawText(strTan, &rt4, DT_LEFT | DT_VCENTER | DT_SINGLELINE); memDC.DrawText(strCtan, &rt5, 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(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; 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*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+24*xPix, nTop+fAdd); //角度 rt2.SetRect(rt1.right, rt1.top, rt1.right + 30*xPix, rt1.bottom); //正弦 rt3.SetRect(rt2.right, rt1.top, rt2.right + 30*xPix, rt1.bottom); //余弦 rt4.SetRect(rt3.right, rt1.top, rt3.right + 30*xPix, rt1.bottom); //正切 rt5.SetRect(rt4.right, rt1.top, rt4.right + 30*xPix, 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.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(rc.left, rt1.bottom); memDC.LineTo(rc.right, rt1.bottom); TCHAR strDegree[32]={0}, strSin[32]={0}, strCos[32]={0}, strTan[32]={0}, strCtan[32]={0}; rc.SetRect(nLeft, nTop+fAdd, nRight, nTop+2*fAdd); rt1.SetRect(nLeft+nTextAdd, rc.top, nLeft+24*xPix, rc.bottom); //角度 rt2.SetRect(rt1.right+nTextAdd, rt1.top, rt1.right + 30*xPix, rt1.bottom); //正弦 rt3.SetRect(rt2.right+nTextAdd, rt1.top, rt2.right + 30*xPix, rt1.bottom); //余弦 rt4.SetRect(rt3.right+nTextAdd, rt1.top, rt3.right + 30*xPix, rt1.bottom); //正切 rt5.SetRect(rt4.right+nTextAdd, rt1.top, rt4.right + 30*xPix, rt1.bottom); //余切 int nCountItem = ListView_GetItemCount(hList); for(int i=0;i<nItem; i++) { ListView_GetItemText(hList, i+iStart, 0, strDegree, 32); ListView_GetItemText(hList, i+iStart, 1, strSin, 32); ListView_GetItemText(hList, i+iStart, 2, strCos, 32); ListView_GetItemText(hList, i+iStart, 3, strTan, 32); ListView_GetItemText(hList, i+iStart, 4, strCtan, 32); memDC.DrawText(strDegree, &rt1, DT_LEFT | DT_VCENTER | DT_SINGLELINE); memDC.DrawText(strSin, &rt2, DT_LEFT | DT_VCENTER | DT_SINGLELINE); memDC.DrawText(strCos, &rt3, DT_LEFT | DT_VCENTER | DT_SINGLELINE); memDC.DrawText(strTan, &rt4, DT_LEFT | DT_VCENTER | DT_SINGLELINE); memDC.DrawText(strCtan, &rt5, 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(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; 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(); }