多视图程序,除开App Wizard生成的默认C*View之外(不打印),自己从CView中派生的CMyView如何实现打印?

解决方案 »

  1.   


    CDC pd;
    CPrintDialog printDlg(FALSE);
    if(printDlg.DoModal() == IDCANCEL)
    return; LPDEVMODE pDM = printDlg.GetDevMode();
    if(pDM == NULL)
    return;
    pDM->dmOrientation = DMORIENT_LANDSCAPE;
    pDM->dmPaperSize = DMPAPER_A4; pd.Attach(printDlg.GetPrinterDC());
    pd.m_bPrinting = TRUE;
    DOCINFO di;
    memset(&di,0,sizeof(DOCINFO));
    di.cbSize = sizeof(DOCINFO);
    di.lpszDocName = "打印测试";
    // di.lpszOutput = (LPTSTR)NULL;
    // di.lpszDatatype = (LPTSTR)NULL;
    di.fwType = 0;
    short cxInch = pd.GetDeviceCaps(LOGPIXELSX);
    short cyInch = pd.GetDeviceCaps(LOGPIXELSY);
    CFont m_fontPrint;
    m_fontPrint.CreateFont(MulDiv(fontsize,-cyInch,72),MulDiv(fontsize,-cxInch,72),FALSE,FALSE,FW_NORMAL,FALSE,
    FALSE,FALSE,GB2312_CHARSET,OUT_CHARACTER_PRECIS,CLIP_CHARACTER_PRECIS,
    DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,"Arials");
    CPen* Spen = new CPen(PS_SOLID,1,RGB(0,0,0));
    CPen* Open = pd.SelectObject(Spen);
    CFont* Ofont = pd.SelectObject(&m_fontPrint); int nError = pd.StartDoc(&di);
    BOOL bError = FALSE;
    if(nError == SP_ERROR)
    {
    goto Error;
    }
    OnPrepareDC(&pd);
    OnDraw(&pd); nError = pd.StartPage();
    if(nError <= 0)
    {
    bError = TRUE;
    goto Error;
    }
    nError = pd.EndPage();
    if(nError <= 0)
    {
    bError = TRUE;
    goto Error;
    }Error:
    if(bError)
    {
    pd.AbortDoc();
    }
    else{
    pd.EndDoc();
    }
    pd.SelectObject(Open);
    pd.SelectObject(Ofont);
    Spen->DeleteObject();
    m_fontPrint.DeleteObject();
    ::GlobalUnlock(pDM);
    ReleaseDC(&pd);