我要把多个DC放到一个pDC上显示,打印;就是说我要在一个pDC上的不同位置贴上若干个DC, 如知道请告知生成DC 到粘贴到pDC上的整个过程。谢谢!

解决方案 »

  1.   

    不太清楚你的意思,是不是最终DC的成员是根据其他若干个DC的相应成员来赋值的,如果是这样的话,找出相应的成员赋值一下应该就可以了,不知我有没有误解你的想法
      

  2.   

    采用双缓的方法,
    把与多个DC分别兼容的CBitmap,一个一个拷到pDC上去
      

  3.   

    针对不同的DC,定义
    HBITMAP hBmp = ::CreateCompatibleBitmap(hdc, nWidth, nHeight);
    HBITMAP hBmpOld = (HBITMAP)::SelectObject(hdc, hBmp);
    ...................................
    你的操作
    ...................................
    然后
    ::BitBlt(pDC->m_hDC, 0, 0, nWidth, nHeight, hdc, 0, 0, SRCCOPY);
    ::SelectObject(hdc, hBmpOld);
    ::DeleteObject(hBmp);
      

  4.   

    plane1980(fy)和dz_w(快乐之星) 两位高手能不能更详细一些啊!最好有Sample或源代码;我需要在一个pDC上粘贴多个相同的DC,每一个DC的位置不同,即我需要在一张纸(pDC)上粘贴多个卡片(DC)后打印。我要把DcPrint粘贴到pDC上。void CRightUpView::OnDraw(CDC* pDC,int a_iSide)
    {
    int iRow,iCol; //行列ループの変数
    CBrush cbTmp(RGB(255, 255, 255)); //刷子を色
    CRect crTmp; //印刷用のDC対象
    CBitmap BmpPrint;
    CBitmap *BmpOldPrint;
    CDC DcPrint;
    // CDC *pDcPrint;
    //対象用のDC対象
    CBitmap BmpObject;
    CBitmap *BmpOldObject;
    CDC DcObject; BCSheetType*          pTmpPos; double dPaperLength; //紙の長さ
    double dPaperWidth; //紙の幅 CBusinessCardDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);

    //シート類型の対象
    pTmpPos = (BCSheetType*)(m_plSheetType[m_pstLayout->usSheetType]);
    dPaperLength = pTmpPos->dTopBlank + pTmpPos->dBottomBlank
    + pTmpPos->dRowInterval * (pTmpPos->iMaxRow -1) + pTmpPos->dSheetHeight * pTmpPos->iMaxRow;
    dPaperWidth = pTmpPos->dLeftBlank + pTmpPos->dRightBlank
    + pTmpPos->dCowInterval * (pTmpPos->iMaxCol -1) + pTmpPos->dSheetWidth * pTmpPos->iMaxCol;
    //メモリDCの実体となるビットマップを作成
    //BmpPrint.CreateCompatibleBitmap(pDC, (int)pTmpPos->dSheetWidth, (int)pTmpPos->dSheetHeight);
    BmpPrint.CreateCompatibleBitmap(pDC, m_crClinetRect.right, m_crClinetRect.bottom);
    DcPrint.CreateCompatibleDC(pDC);
    //メモリDCにビットマップを選択
    BmpOldPrint = DcPrint.SelectObject(&BmpPrint);
    m_pPrintDC = &DcPrint;
    m_pPrintDC->PatBlt(0,0,m_crClinetRect.right, m_crClinetRect.bottom,WHITENESS);
    //指定された描画コード
    DcPrint.SetMapMode(MM_TEXT); for(iRow=0; iRow< pTmpPos->iMaxRow; iRow++){
    for(iCol=0; iCol<pTmpPos->iMaxCol; iCol++){
    //白色区を描く
    crTmp.top = (long)((pTmpPos->dTopBlank + m_pstLayout->dEquipBlankTop) * (-10) + (pTmpPos->dSheetHeight + pTmpPos->dRowInterval) * (-10) * iRow);
    crTmp.left = (long)((pTmpPos->dLeftBlank + m_pstLayout->dEquipBlankLeft) * 10 + (pTmpPos->dSheetWidth + pTmpPos->dCowInterval) * 10 * iCol);
    crTmp.right = crTmp.left + (long)(pTmpPos->dSheetWidth * 10);
    crTmp.bottom = crTmp.top + (long)(pTmpPos->dSheetHeight * (-10));
    m_pPrintDC->FillRect(&crTmp, &cbTmp);
    m_pPrintDC->MoveTo(crTmp.left, crTmp.top);
    m_pPrintDC->LineTo(crTmp.right, crTmp.top);
    m_pPrintDC->LineTo(crTmp.right, crTmp.bottom);
    m_pPrintDC->LineTo(crTmp.left, crTmp.bottom);
    m_pPrintDC->LineTo(crTmp.left, crTmp.top);

    //対象を描く
    DrawObjects(&crTmp,a_iSide);
    //名刺対象メモリDCの画像(即ちビットマップの内容)を実際の画面に転送
    //m_pPrintDC->BitBlt(crTmp.left, crTmp.top, crTmp.right, crTmp.bottom, m_pPrintDC, 0, 0, SRCCOPY);
    }
    }
    //メモリDCのビットマップを戻す
    DcPrint.SelectObject(BmpOldPrint);
    }
      

  5.   

    HBITMAP hBmp = ::CreateCompatibleBitmap(hdc, nWidth, nHeight);
    HBITMAP hBmpOld = (HBITMAP)::SelectObject(hdc, hBmp);
    ...................................
    你的操作
    ...................................
    然后
    ::BitBlt(pDC->m_hDC, 0, 0, nWidth, nHeight, hdc, 0, 0, SRCCOPY);
    ::SelectObject(hdc, hBmpOld);
    ::DeleteObject(hBmp);