Печать при помощи OpenGL
От: DrMom  
Дата: 20.10.03 13:32
Оценка:
void CInclViewView::OnPrint( CDC* pDC, CPrintInfo* pInfo )
{
    CRect paper(0,0,0,0);

    if (pInfo->m_bPreview)    {
        PRINTDLG PrtDlg;
        if (!AfxGetApp()->GetPrinterDeviceDefaults(&PrtDlg))
        {
            if (pDC->IsKindOf(RUNTIME_CLASS(CPreviewDC))) 
            {
                CPreviewDC *pPrevDC = (CPreviewDC *)pDC;
                paper.right = GetDeviceCaps(pPrevDC->m_hAttribDC, HORZRES);
                paper.bottom = GetDeviceCaps(pPrevDC->m_hAttribDC, VERTRES);
            }
        }
        else
        {
            CPrintDialog dlg(FALSE);
            dlg.m_pd.hDevMode = PrtDlg.hDevMode;
            dlg.m_pd.hDevNames = PrtDlg.hDevNames;
            HDC hdc = dlg.CreatePrinterDC();
            paper.right = GetDeviceCaps(hdc, HORZRES);
            paper.bottom = GetDeviceCaps(hdc, VERTRES);
            DeleteDC(hdc);
        }
    }
    else 
    { 
        paper.right = GetDeviceCaps(pDC->GetSafeHdc(), HORZRES);
        paper.bottom = GetDeviceCaps(pDC->GetSafeHdc(), VERTRES); 
    }

    CBitmap     bitmap;
    BITMAP bi;
    CDC dc;

    CRect rect;
    GetClientRect(&rect);

    bitmap.CreateBitmap(rect.Width(), rect.Height(), 1, 24, NULL);
    bitmap.GetBitmap(&bi);
    double ar    =    double(bi.bmWidth) / double(bi.bmHeight);

    dc.CreateCompatibleDC(GetDC());

    CBitmap* pOldBitmap = dc.SelectObject(&bitmap);

    PIXELFORMATDESCRIPTOR pfd;
    int iFormat;

    ZeroMemory( &pfd, sizeof( pfd ) );
    pfd.nSize = sizeof( pfd );
    pfd.nVersion = 1;
    pfd.dwFlags = PFD_DRAW_TO_BITMAP | PFD_SUPPORT_OPENGL | PFD_STEREO_DONTCARE;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 24;
    pfd.cDepthBits = 16;
    pfd.iLayerType = PFD_MAIN_PLANE;

    iFormat = ChoosePixelFormat( dc.m_hDC, &pfd );
    BOOL ret    =    SetPixelFormat( dc.m_hDC, iFormat, &pfd );

    pDC->StretchBlt(0, 0, paper.Width(), paper.Height(), &dc, 0, 0, bi.bmWidth, bi.bmHeight * ar, SRCCOPY);

    dc.SelectObject(pOldBitmap);

    CView::OnPrint(pDC, pInfo);
}


Я уже совсем не соображаю. Может кто объяснит почему в месте выделенным жирным происходит ошибка. Т.е. возвращается FALSE. Есть здесь кто нить кто печатал при помощи OGL?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.