如何在一个多个页的打印文档中安排页面,其中文档中既有文字又有图片程序是一个以对话框为主窗口的程序.
还有在对话框程序中如何制作打印预览

解决方案 »

  1.   

    可以用office自动化编程控制word做
      

  2.   

    在startpage和endpage之间安排一页的内容
      

  3.   

    用office自动化编程控制word做
    是否要用到com,可我还没有看过
      

  4.   

    呵呵,不好意思,上面的发错了
    对话框打印预览的在 codeguru 。com有很多例子,你自己去找一下
      

  5.   

    void CSGVView::OnPrintBitmap()
    {   
    CDC memDC;
    CClientDC dc(this);

    int bmpWidth = 1600;
    int bmpHeight = 500;
    memDC.CreateCompatibleDC( &dc );
    CBitmap * bitmap = new CBitmap();
    bitmap->CreateCompatibleBitmap(&dc,bmpWidth, bmpHeight);
    CBitmap * pOldBitmap = (CBitmap *) memDC.SelectObject( bitmap );
    if (pOldBitmap == NULL) // if bitmap is very big, better check this !
    {
    memDC.DeleteDC();
    delete bitmap;
    AfxMessageBox("Not enough resource for the bitmap. Either reduce the bitmap dimension or 
     \nswitch to lower screen setting (e.g. 256-color mode), and try again.");
    return;
    }
    //draw bitmap here, or it can be done in another function
        memDC.Ellipse(0, 0, bmpWidth - 1, bmpHeight - 1);

    CDC prtDC;
    CPrintInfo printInfo;
    CSize size;
    DOCINFO di;
    CString szPortName, szAppName, szPrintError;
    szAppName.LoadString(AFX_IDS_APP_TITLE);
    szPrintError = ""; CSize paper_size;  //printer paper size in mm
    int xLogPPI = 0;
    int yLogPPI = 0; if( AfxGetApp()->GetPrinterDeviceDefaults(&printInfo.m_pPD->m_pd) )
    {
    HDC hDC = printInfo.m_pPD->m_pd.hDC;
    if (hDC == NULL)
    hDC = printInfo.m_pPD->CreatePrinterDC();
    if(hDC !=NULL)
    {
    prtDC.Attach(hDC);
    paper_size.cx = prtDC.GetDeviceCaps(HORZSIZE);
    paper_size.cy = prtDC.GetDeviceCaps(VERTSIZE);
    xLogPPI = prtDC.GetDeviceCaps(LOGPIXELSX);
    yLogPPI = prtDC.GetDeviceCaps(LOGPIXELSY);
    }
    else 
    {
    AfxMessageBox("Can not find printer. Please check installed/default printers.");
    return;
    }
    }
    int scr_xLogPPI = dc.GetDeviceCaps(LOGPIXELSX);
    int scr_yLogPPI = dc.GetDeviceCaps(LOGPIXELSY);
    int paper_width = (int) ((double) paper_size.cx * (double) xLogPPI / 25.4);   //width of a printed page in pixels
    int paper_height = (int) ((double) paper_size.cy * (double) yLogPPI / 25.4);
    double ratio_x = (double) xLogPPI / (double) scr_xLogPPI;
    double ratio_y = (double) yLogPPI / (double) scr_yLogPPI; CString strPageNumber = "";

    int page_info_left = (int) ( (double) paper_width * 0.9 );
    int page_info_right = paper_width;
    int page_info_top = (int) ( (double) paper_height * 0.99);
    int page_info_bottom = paper_height;
    CRect page_info_rect = CRect(page_info_left, page_info_top, 
                                   page_info_right,page_info_bottom );
    int printed_pages = 0;
    int total_print_pages = 0;
    BOOL bAbort_print = FALSE; // calculate pages
        int total_pages = (bmpWidth * ratio_x + paper_width - 1 ) / paper_width;
    //pop up printer dialog
    CPrintDialog prtDlg(FALSE, PD_PAGENUMS);

    prtDlg.m_pd.nMinPage = 1;
    prtDlg.m_pd.nMaxPage = total_pages;
    prtDlg.m_pd.nFromPage = 1;
    prtDlg.m_pd.nToPage = total_pages;

    if(prtDlg.DoModal() == IDOK )
    {
    memset(&di, 0, sizeof(DOCINFO));
    di.cbSize = sizeof(DOCINFO);
    di.lpszDocName = szAppName;
    szPortName = prtDlg.GetPortName();
    di.lpszOutput = szPortName;
    prtDC.m_bPrinting = TRUE;
    }
    else
    return;  //Cancel button pressed, don't forget this! if(prtDC.StartDoc(&di) == -1)
    {
    AfxMessageBox("Printing error occured. Unable to find printer.");
    prtDC.Detach();
    prtDC.DeleteDC();
    return;
    }

    prtDC.SetMapMode(MM_TEXT);

    int i = 0;
    for(i = 0; i < total_pages; i++)
    {
    prtDC.StartPage();
    strPageNumber.Format("Page:%d of %d", ++printed_pages, total_print_pages );

    if ( i == (total_pages - 1) && total_pages > 1 ) //last page
    {
    int last_bmpWidth = bmpWidth - paper_width / ratio_x * i;
    prtDC.StretchBlt(0, 0, last_bmpWidth * ratio_x, bmpHeight* ratio_y, &memDC,
        paper_width * i / ratio_x, 0, last_bmpWidth, bmpHeight, SRCCOPY);
    }
    else
    prtDC.StretchBlt(0, 0, paper_width, bmpHeight* ratio_y, &memDC,
        paper_width * i / ratio_x, 0, paper_width / ratio_x , bmpHeight, SRCCOPY);
    prtDC.TextOut(page_info_rect.left, page_info_rect.top, strPageNumber );

    prtDC.EndPage();
    }
    memDC.SelectObject(pOldBitmap);
    delete bitmap;
    memDC.DeleteDC();

    prtDC.EndDoc();
    prtDC.Detach();
    prtDC.DeleteDC();
    return;
    }