PrintPreview und Print unterscheiden sich



  • Hallo zusammen,

    ich muss aus einem Programm heraus Etiketten mit Seriennummern drucken. Dazu muss ich je nach Anzahl auch mal mehrseitig drucken. Das Problem dabei ist, dass in der Druckvorschau alles korrekt angezeigt wird. Beim Drucken selbst wird nur die erste Seite korrekt gedruckt, danach nur noch leere Seiten. Wenn aber z.B. 4 Seiten zu drucken sind und man nur die 3. oder 4. ausdrucken möchte, dann wird diese auch korrekt dargestellt. Da ich was anderes drucken will als auf dem Bildschirm dargestellt habe ich die entsprechenden Anweisungen in die OnPrint geschrieben. Hier nun der Quelltext zu den Methoden:

    BOOL CPrintSerialnumbersView::OnPreparePrinting(CPrintInfo* pInfo)
    {
    	// Standardvorbereitung
    	UINT maxPages_Etikett = 1;
    	double dAnzahl = static_cast<double>(GetDocument()->m_iAnzahl_Seriennummern);
    	dAnzahl = dAnzahl / static_cast<double>(Anzahl_Etiketten);
    	dAnzahl = ceil(dAnzahl);
    	maxPages_Etikett = static_cast<UINT>(dAnzahl);
    	if (maxPages_Etikett == 0)
    	{
    		maxPages_Etikett = 1;
    	}
    	pInfo->SetMaxPage(maxPages_Etikett);
    	
    	return DoPreparePrinting(pInfo);
    }
    
    void CPrintSerialnumbersView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
    {
    	// TODO: Fügen Sie hier Ihren spezialisierten Code ein, und/oder rufen Sie die Basisklasse auf.
    	
    	// Metrischen Abbildungsmodus einstellen
    	pDC->SetMapMode(MM_HIMETRIC);		// MM_HIMETRIC jede logische Einheit ist auf 0,01 mm konvertiert. Positives x ist rechts, positive y ist oben.
    	pDC->SetTextAlign(TA_CENTER | TA_BASELINE);
    	pDC->SetBkMode(TRANSPARENT);
    
    	//m_rcPrintRect festlegen
    	if (pInfo)
    	{
    		m_rcPrintRect = pInfo->m_rectDraw;
    		// in logische Einheiten konvertieren
    		pDC->DPtoLP(&m_rcPrintRect);
    		m_rcPrintRect.left += iSeitenrand_links;
    		m_rcPrintRect.right -= iSeitenrand_rechts;
    		m_rcPrintRect.top -= iSeitenrand_oben;
    		m_rcPrintRect.bottom += iSeitenrand_unten;
    	}
    	
    	GetDocument()->Drucke_Etiketten(pDC, pInfo, &m_rcPrintRect, this);
    	
    	// Weglassen des Aufrufs der Basisfunktion verhindert ein Aufrufen von OnDraw()
    	// CView::OnPrint(pDC, pInfo);
    }
    
    void CPrintSerialnumbersDoc::Drucke_Etiketten(CDC * pDC, CPrintInfo * pInfo, CRect * pRect, CView * pView)
    {
    	//Druckbereich festlegen
    	CRect Druckbereich;
    	Druckbereich.bottom = pRect->bottom;
    	Druckbereich.top = pRect->top;
    	Druckbereich.left = pRect->left;
    	Druckbereich.right = pRect->right;
    
    	//Fonts reservieren
    	CFont Barcode, *pOldFont;
    	// Font-Struktur deklarieren
    	LOGFONT lfBarcode;
    
    	// Struktur mit NULL füllen
    	ZeroMemory(&lfBarcode, sizeof(LOGFONT));
    
    	// Schriftgröße festlegen
    	lfBarcode.lfHeight = 120;
    
    	//Schriftstärke
    	lfBarcode.lfWeight = FW_NORMAL;
    
    	// Schriftart festlegen
    	wcscpy_s(lfBarcode.lfFaceName, _T("Bar-Code 39 lesbar"));
    
    	VERIFY(Barcode.CreatePointFontIndirect(&lfBarcode, pDC));
    	pOldFont = pDC->SelectObject(&Barcode);
    	
    	int A4_X_PART = A4_quer / (2 * X_Anz);
    	int A4_Y_PART = A4_hoch / (2 * Y_Anz);
    	int x_Offset = -iSeitenrand_links + (A4_quer - Druckbereich.right) / 2;
    	int y_Offset = iSeitenrand_oben + (29700 + Druckbereich.bottom) / 2;
    
    	CArray<CString, CString> m_arrSeriennummernTemp;
    	int iStart = Anzahl_Etiketten * (pInfo->m_nCurPage - 1);
    	int iStop = Anzahl_Etiketten * (pInfo->m_nCurPage - 1) + Anzahl_Etiketten;
    	if (iStop >= static_cast<int>(m_arrSeriennummern.GetCount()))
    	{
    		iStop = static_cast<int>(m_arrSeriennummern.GetCount());
    	}
    	for (int i = iStart;i<iStop;i++)
    	{
    		m_arrSeriennummernTemp.Add(m_arrSeriennummern.GetAt(i));
    	}
    
    	for (int iZeile = 0; iZeile < Y_Anz - 2; iZeile++)
    	{
    		for (int iSpalte = 0; iSpalte < X_Anz; iSpalte++)
    		{
    			int x = (2 * iSpalte + 1)*A4_X_PART - x_Offset;
    			int y = (-1 * ((2 * iZeile + 1) * A4_Y_PART + y_Offset + ((-1 * yFaktor * (iZeile + 1) / (Y_Anz - 2)) + yFaktor)));
    			pDC->TextOut(x, y, m_arrSeriennummernTemp.GetAt(0));
    			m_arrSeriennummernTemp.RemoveAt(0, 1);
    			if (m_arrSeriennummernTemp.IsEmpty())
    			{
    				break;
    			}
    		}
    		if ((m_arrSeriennummernTemp.IsEmpty()))
    		{
    			break;
    		}
    	}
    	// put back the old objects
    	m_arrSeriennummernTemp.RemoveAll();
    	m_arrSeriennummernTemp.FreeExtra();
    	pDC->SelectObject(pOldFont);
    	Barcode.DeleteObject();
    }
    

    OnPrint wird ja für jede Seite aufgerufen. Beim 2. Aufruf stimmen aber im Falle das man druckt die Koordinaten des Druckbereichs nicht mehr. In der Vorschau sind die identisch mit der ersten Seite. Woran liegt das?


Log in to reply