A
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?