不是文档视图结构时,怎么样编写呢?例如:是一个对话框程序,提供打印功能
怎么样实现呢?先谢了!如果有源码的话,能否给我发过来:[email protected]

解决方案 »

  1.   

    http://www.codeproject.com/printing/printing_wo_docview.asp有完整的源代码
      

  2.   

    下面是我打印一长图片的程序:m_pb 是一副bmp图片
    CRect rect;
    CPrintDialog dlg(FALSE);
    if (dlg.DoModal() == IDCANCEL)
    return;// dlg.GetDefaults();

    // is a default printer set up?
    HDC hdcPrinter = dlg.GetPrinterDC();
    if (hdcPrinter == NULL)
    {
    MessageBox(_T("打印机忙!"));
    }
    else
    {
    // create a CDC and attach it to the default printer
    CDC dcPrinter;
    dcPrinter.Attach(hdcPrinter);

    // call StartDoc() to begin printing
    DOCINFO docinfo;
    memset(&docinfo, 0, sizeof(docinfo));
    docinfo.cbSize = sizeof(docinfo);
    docinfo.lpszDocName = _T("client print");

    // if it fails, complain and exit gracefully
    if (dcPrinter.StartDoc(&docinfo) < 0)
    {
    MessageBox(_T("初始化错误!"));
    }
    else
    {
    // start a page
    if (dcPrinter.StartPage() < 0)
    {
    MessageBox(_T("不能开始打印页"));
    dcPrinter.AbortDoc();
    }
    else
    {

    CGdiObject* pOldFont = dcPrinter.SelectStockObject(SYSTEM_FONT);

    int cxPage = dcPrinter.GetDeviceCaps(HORZRES);
    int cyPage = dcPrinter.GetDeviceCaps(VERTRES);

    int cxInch = dcPrinter.GetDeviceCaps(LOGPIXELSX);
    int cyInch = dcPrinter.GetDeviceCaps(LOGPIXELSY); LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)m_pb;
    LPVOID lpBits = m_pb + sizeof(BITMAPINFOHEADER);

    rect.top = rect.left = 0;// rect.bottom = (int)((double)(lpbi->biWidth * cxPage * cyInch)
    // / ((double)lpbi->biHeight * cxInch));
    // rect.right = cxPage; rect.SetRect(0,0, 
    dcPrinter.GetDeviceCaps(HORZRES) * 2 / 3, 
    dcPrinter.GetDeviceCaps(VERTRES) * 2 / 3);//设置范围
    rect.bottom = rect.right / 352 * 288;

    SYSTEMTIME time;
    GetLocalTime(&time);
    CString st;
    st.Format ("%d年%d月%d日%d时%d分%d秒",time.wYear ,time.wMonth ,time.wDay ,
    time.wHour ,time.wMinute ,time.wSecond );
    CFont *oldfont;
    CFont font; font.CreateFont(
    50,                        // nHeight
    100,                         // nWidth
    0,                         // nEscapement
    0,                         // nOrientation
    FW_NORMAL,                 // nWeight
    FALSE,                     // bItalic
    FALSE,                     // bUnderline
    0,                         // cStrikeOut
    ANSI_CHARSET,              // nCharSet
    OUT_DEFAULT_PRECIS,        // nOutPrecision
    CLIP_DEFAULT_PRECIS,       // nClipPrecision
    DEFAULT_QUALITY,           // nQuality
    DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
    "Arial");                 // lpszFacename
    oldfont=dcPrinter.SelectObject(&font);
    dcPrinter.TextOut (0,0,st);
    dcPrinter.SelectObject (oldfont);
    font.DeleteObject();
    DrawDibDraw(hdib,
    dcPrinter.GetSafeHdc (),
    200,200,
    rect.right + 200 ,
    rect.bottom + 200,
    (BITMAPINFOHEADER *)lpbi,
    lpBits,
    0,0,
    lpbi->biWidth,
    lpbi->biHeight,
    DDF_BACKGROUNDPAL);
    dcPrinter.EndPage();
    dcPrinter.EndDoc();
    dcPrinter.SelectObject(pOldFont);
      

  3.   

    下面在打印图象的代码,打印缓冲区中的bmp图象,打印到纸的2/3大小。
    // get the default printer
    CRect rect;
    CPrintDialog dlg(FALSE);
    if (dlg.DoModal() == IDCANCEL)
    return;// dlg.GetDefaults();

    // is a default printer set up?
    HDC hdcPrinter = dlg.GetPrinterDC();
    if (hdcPrinter == NULL)
    {
    MessageBox(_T("打印机忙!"));
    }
    else
    {
    // create a CDC and attach it to the default printer
    CDC dcPrinter;
    dcPrinter.Attach(hdcPrinter);

    // call StartDoc() to begin printing
    DOCINFO docinfo;
    memset(&docinfo, 0, sizeof(docinfo));
    docinfo.cbSize = sizeof(docinfo);
    docinfo.lpszDocName = _T("client print");

    // if it fails, complain and exit gracefully
    if (dcPrinter.StartDoc(&docinfo) < 0)
    {
    MessageBox(_T("初始化错误!"));
    }
    else
    {
    // start a page
    if (dcPrinter.StartPage() < 0)
    {
    MessageBox(_T("不能开始打印页"));
    dcPrinter.AbortDoc();
    }
    else
    {

    CGdiObject* pOldFont = dcPrinter.SelectStockObject(SYSTEM_FONT);

    int cxPage = dcPrinter.GetDeviceCaps(HORZRES);
    int cyPage = dcPrinter.GetDeviceCaps(VERTRES);

    int cxInch = dcPrinter.GetDeviceCaps(LOGPIXELSX);
    int cyInch = dcPrinter.GetDeviceCaps(LOGPIXELSY); LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)m_pb;
    LPVOID lpBits = m_pb + sizeof(BITMAPINFOHEADER);

    rect.top = rect.left = 0;// rect.bottom = (int)((double)(lpbi->biWidth * cxPage * cyInch)
    // / ((double)lpbi->biHeight * cxInch));
    // rect.right = cxPage; rect.SetRect(0,0, 
    dcPrinter.GetDeviceCaps(HORZRES) * 2 / 3, 
    dcPrinter.GetDeviceCaps(VERTRES) * 2 / 3);//设置范围
    rect.bottom = rect.right / 352 * 288;

    SYSTEMTIME time;
    GetLocalTime(&time);
    CString st;
    st.Format ("%d年%d月%d日%d时%d分%d秒",time.wYear ,time.wMonth ,time.wDay ,
    time.wHour ,time.wMinute ,time.wSecond );
    CFont *oldfont;
    CFont font; font.CreateFont(
    50,                        // nHeight
    100,                         // nWidth
    0,                         // nEscapement
    0,                         // nOrientation
    FW_NORMAL,                 // nWeight
    FALSE,                     // bItalic
    FALSE,                     // bUnderline
    0,                         // cStrikeOut
    ANSI_CHARSET,              // nCharSet
    OUT_DEFAULT_PRECIS,        // nOutPrecision
    CLIP_DEFAULT_PRECIS,       // nClipPrecision
    DEFAULT_QUALITY,           // nQuality
    DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
    "Arial");                 // lpszFacename
    oldfont=dcPrinter.SelectObject(&font);
    dcPrinter.TextOut (0,0,st);
    dcPrinter.SelectObject (oldfont);
    font.DeleteObject();
    DrawDibDraw(hdib,
    dcPrinter.GetSafeHdc (),
    200,200,
    rect.right + 200 ,
    rect.bottom + 200,
    (BITMAPINFOHEADER *)lpbi,
    lpBits,
    0,0,
    lpbi->biWidth,
    lpbi->biHeight,
    DDF_BACKGROUNDPAL);
    dcPrinter.EndPage();
    dcPrinter.EndDoc();
    dcPrinter.SelectObject(pOldFont);
    }
    }
    }