Problem: Drucken von CBitmap in OnPrint (MFC)



  • Grüsse,
    der unten stehende Code durchläuft eine CTreeCtrl Struktur um einen Baum nachzuzeichnen da ich nicht auf das Clipboard zurückgreifen wollte. Der Text wird schön auf die Seiten verteilt, jedoch werden die Bilden von den Roots und Treeitems nur in der PrintPreview korrekt angezeigt, auf dem Papier nach dem Druck fehlen sie.
    Leider seh ich den Fehler in dem unten stehenden Code nicht 😞

    Wäre nett wenn mir das jemand erklären kann 😋

    So Far Puppet
    _______________________________________________________

    void COutput2::OnPrint(CDC* pDC, CPrintInfo* pInfo) 
    {	
    	int nSavedDC = pDC->SaveDC();
    
    	// Fussnoten setzen
    	CFont* pOldFont = pDC->SelectObject(&m_fontSet);
    	pDC->SetTextAlign(TA_LEFT|TA_BASELINE);
    	pDC->TextOut(HORZ_MARGIN,VERT_MARGIN,srkChange.strStatus);
    
    	// Tree initialisieren
    	CTreeCtrl& Tree = m_TreeWnd.GetTreeCtrl();
    	HTREEITEM hItem=Tree.GetRootItem();
    	int maxItemCnt = (prntY-VERT_MARGIN*2)/m_nRowHeight-2;
    
    	// Position im Tree ermitteln
    	for(int pos=0; pos<maxItemCnt*(pInfo->m_nCurPage-1); pos++)
    	{
    		Tree.Expand(hItem,TVE_EXPAND);
    		hItem = Tree.GetNextItem(hItem,TVGN_NEXTVISIBLE);
    	}
    
    	// Bildquelle übergeben
    	BITMAP bmpInfo;
    	bm.GetBitmap(&bmpInfo);
    
    	// Speicher anlegen und alten sichern
    	CDC SpeicherDC; 
    	SpeicherDC.CreateCompatibleDC(pDC);
    	CBitmap * oldbm = SpeicherDC.SelectObject(&bm);
    
    	int ItemCnt=0;
    	do
    	{
    		ItemCnt++;
    
    		// Position ermitteln
    		int x = HORZ_MARGIN+CalculateRootCnt(hItem)*20;
    		int y = VERT_MARGIN+m_nRowHeight*(ItemCnt+1);
    
    		// Bild ermitteln
    		int nImage, nSelectedImage;
    		Tree.GetItemImage(hItem,nImage,nSelectedImage);
    
    		// Bild transparent machen (rosa->weiss)
    		for(int picx=0;picx<bmpInfo.bmWidth;picx++)
    			for(int picy=0;picy<bmpInfo.bmHeight;picy++)
    				if(SpeicherDC.GetPixel(picx,picy)==RGB(255,0,255))
    					SpeicherDC.SetPixel(picx,picy,RGB(255,255,255));		
    
    		// Bild an DC übergeben
    		pDC->BitBlt(x,y,bmpInfo.bmWidth/4,bmpInfo.bmHeight,
    			&SpeicherDC,bmpInfo.bmWidth/4*nImage,0,SRCCOPY);
    
    		// Tree-Text verarbeiten
    		CString text = Tree.GetItemText(hItem);
    		char tmp[256];
    		strcpy(tmp,text);
    
    		text = strtok( tmp, "\t" );
    		pDC->TextOut(x+25,y+BIAS,text);
    		text = strtok( NULL, "\t" );
    		pDC->TextOut(x+25+300,y+BIAS,text);
    
    		// Tree "aufklappen", nächstes Item
    		Tree.Expand(hItem,TVE_EXPAND);
    		hItem = Tree.GetNextItem(hItem,TVGN_NEXTVISIBLE);
    	}
    	while(hItem && ItemCnt<maxItemCnt);
    
    	// Fusszeile -> Seitenanzahl
    	CString nPage;
    	nPage.Format(" %d",pInfo->m_nCurPage);
    	nPage = UINTtoCString(IDS_OUT_PAGE) + nPage;
    	pDC->TextOut(prntX/2-nPage.GetLength(),prntY-20,nPage);
    
    	// alte Objekte zurücksetzen
    	pDC->SelectObject(pOldFont);
    	//pDC->SelectObject(oldbm);
    	pDC->RestoreDC(nSavedDC);
    }
    //OnPrint///////////////////////////////////////////////////////////////////
    


  • Kann keiner helfen?


Anmelden zum Antworten