DruckerCode

Silvercreast

Erfahrenes Mitglied
Hallo erstmal Allerseits

Ich habe ein Problem mit meinem DruckerCode naja Problem kann man das net nennen, aber eine Frage dazu. Erstmal zu meinem Code: Es handelt sich um eine Musik Datenbank in der man Lieder speichern und suchen kann. Die Suchergebnisse sollen in einer CListCtrl ausgegeben werden und zwar in 5 Spalten:
Regal; Interpret; Titel; Rubrik; CD
Das alles funktioniert auch einwandfrei.
Selbst das Drucken funktioniert, momentan lass ich aber nur das Regal (Grün hinterlegt) ausdrucken. Das Problem er druckt jedes Regal für sich ( Wenn ich Regal A und B hab hat Regal A eine Seite und B eine Seite) , kann das vielleicht an dem Orange hinterlegtem Code liegen Wenn ja wie kann ich das ändern ich glaub einfach raus löschen geht ziemlich in die Hose oder

Code:
void PrintList(CListCtrl &list)
{
    CDC             dc;
    CPrintDialog    printDlg(FALSE);
    CRect           r;
    int             nHeight;

    // ask the user to select a printer
    if (printDlg.DoModal() == IDCANCEL)
        return;

    // Attach a printer DC
    dc.Attach(printDlg.GetPrinterDC());
    dc.m_bPrinting = TRUE;

    // use Textmappingmode, that's easiest to map the fontsize
    dc.SetMapMode(MM_TEXT);

    // setup font specifics
    LOGFONT LogFont;

    CFont	aFont, *oldFont;

    LogFont.lfHeight = -MulDiv(10, GetDeviceCaps(dc, LOGPIXELSY), 72);
    LogFont.lfWidth = 0;
    LogFont.lfEscapement = 0;
    LogFont.lfOrientation = 0;
    LogFont.lfWeight = 0;
    LogFont.lfItalic = false;
    LogFont.lfUnderline = 0;
    LogFont.lfStrikeOut = 0;
    LogFont.lfCharSet = ANSI_CHARSET;
    LogFont.lfOutPrecision = OUT_TT_PRECIS;
    LogFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    LogFont.lfQuality = DEFAULT_QUALITY;
    LogFont.lfPitchAndFamily = DEFAULT_PITCH | FF_SWISS;
    lstrcpy (LogFont.lfFaceName, "MS Sans Serif");
    dc.SetBkMode(OPAQUE);
    aFont.CreateFontIndirect ( &LogFont );
    // ok, we've build the font, now use it
    oldFont = dc.SelectObject( &aFont );

    // Get the application title
    CString strTitle;
    strTitle.LoadString(AFX_IDS_APP_TITLE);

    // Initialise print document details

    DOCINFO di;
    ::ZeroMemory (&di, sizeof (DOCINFO));
    di.cbSize = sizeof (DOCINFO);
    // application title appears in the spooler view
    di.lpszDocName = strTitle;

//*****************Begin a new print job**************************************************
	CString Line;	

	BOOL bPrintingOK = dc.StartDoc( &di );

	for (int i = 0; i<list.GetItemCount(); i++)
	{
    
   	

	Line =  list.GetItemText(i, 0);
	list.GetItemText(i, 1);
	list.GetItemText(i, 2);
	list.GetItemText(i, 3);
	list.GetItemText(i, 4);
	

	

    // Get the printing extents and store in the m_rectDraw field of a
    // CPrintInfo object
    CPrintInfo Info;
    int w = dc.GetDeviceCaps(HORZRES);
    int h = dc.GetDeviceCaps(VERTRES);
    Info.m_rectDraw.SetRect(0,0, w, h);

    const char *startAt = LPCTSTR(Line);
    int totalDone = 0;
    int lengthToGo = Line.GetLength();

    for (UINT page = Info.GetMinPage();
    bPrintingOK && (totalDone < lengthToGo); page++)
    {
        // begin new page
        dc.StartPage();
        Info.m_nCurPage = page;

        // calc how much text fits on one page
        r = Info.m_rectDraw;
        r.bottom = r.top;
        int i = 0;
        while (r.bottom < Info.m_rectDraw.bottom && (totalDone + i < lengthToGo) )
        {
            r.right = Info.m_rectDraw.right;
            nHeight = dc.DrawText(startAt, i++, r,
                DT_CALCRECT|DT_WORDBREAK|DT_NOCLIP|DT_EXPANDTABS);
        }
        // go one back to assure correct height
        if (r.bottom >= Info.m_rectDraw.bottom)
            i--;


        // print that text
        dc.DrawText(startAt, i, r, DT_WORDBREAK|DT_NOCLIP|DT_EXPANDTABS);

        // go to next page
        startAt += i;
        totalDone += i;

        // end page
        bPrintingOK = (dc.EndPage() > 0);
    }
	}

    // end a print job
    if (bPrintingOK)
        dc.EndDoc();
    else
        // abort job.
        dc.AbortDoc();


    // restore font
    dc.SelectObject(oldFont);
    // free font memory
    aFont.DeleteObject();
    // detach the printer DC
    dc.Detach();
}
 
Wenn ich den Code richtig interpretiere, liegt es daran, daß du Line ein Item zuweist und das dann innerhalb der Seite ausdruckst. Innerhalb der Seite kann ich keinen Hinweis darauf finden, daß du weitere Items ausgibst. Meiner Meinung nach müßtest du innerhalb der Seite in einer Schleife alle gewünschten Items ausgeben.

Mfg

langer
 
Hab das mal versucht so umzusetzen jetzt kann ich aber nur eine Zeile ausdrucken und nicht mehrere ausserdem druckt der ohne leerzeichen kannste mir da vielleicht auch noch nen Tip geben
 
kopiere doch mal den ganzen Quelltext der Druckroutine, dann schaue ich mir das an und sehe mal, was man machen kann.
Ich weiß auch nicht so genau, wie du das ausgeben willst. Gesetzt den Fall, du willst die 5 Items als 5 Spalten ausgeben, so würde ich die Schleife so machen:
Code:
r.top=........
r.bottom=r.top+hoehe;
for(i=0;i<5;i++)
{
         r.left=anfang+i*spaltenabstand;
         r.right=r.left+spaltenbreite;
         Line=list.GetItemText(i,0);
         dc.DrawText(Line,..............);
}
//sollen weitere Zeilen ausgegeben werden:
r.top=r.bottom;
r.bottom=r.bottom+hoehe;
//und hier neue Schleife.
So ungefähr könnte es gehen.
Wenn nicht, bitte den Code posten.

Mfg

langer
 
ach ja, wenn du Text spalten- und zeilenweise ausgeben willst, kann man das auch noch eleganter lösen:
Code:
for(i=0;i<zeilenzahl;i++)
{
     for(j=0;j<spaltenzahl;j++)
     {
         Line=lst.GetItemText(j,i);
         r.top=anfangoben+i*hoehe;
         r.bottom=r.top+hoehe;
         r.left=anfang+j*spaltenbreite;
         r.right=r.left+spaltenbreite;
         dc.DrawText(Line............);
     }
}

Einfach mal experimentieren...

Mfg

langer
 
Zurück