Problem mit DruckerCode



  • Hallo

    ich hoffe das ich im richtigen Forum dafür bin denn es geht zwar um Code aber welchen der in ner MFC genutzt wird.

    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********************************
    
    	BOOL bPrintingOK = dc.StartDoc( &di );
    
        // 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);
    
        char *startAt = p; // Durch Umbenennung der Funktion gibt es die Variable      
                           // nicht mehr, weiss nur net was ich dafür einsetzen muss
        int totalDone = 0;
        int lengthToGo = pSize;// das selbe in Grün wie mit p
    
        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();
    }
    

    Durch diesen Code will ich es schaffen meine CListCtrl die im Dialog mit Daten gefüllt ist ( Daten : jenachdem was gesucht wird) auszudrucken.
    Wie schaff ich es das ich alle Einträge in meienr Liste ausdrucken kann.
    Ich denke mal das man dazu eine Schleife einbauen muss und zwar an der Stelle wo ich new Print makiert habe. Nur wie muss diese Schleife aussehen??

    Gruss
    Silver



  • Vielleicht hilft die CListBox::GetCount() und CListBox::GetText() weiter.
    Gibt die Anzahl der Elemente deiner Liste wieder.

    würde dann eine for-Schleife nehmen. In etwa so:

    for (int i = 0; i<deineListBox.GetCount(); i++)
    {
        ...
        deineListBox.GetText(i, deinStringBuffer);
        ....
    }
    

    Schau dir dazu GetText und GetCount an.
    😋



  • Ok Danke werd mich da sofort mal durch arbeiten



  • Die Funktionen heißen bei CListCtrl so ähnlich: GetItemCount und GetItemText.

    Aber... Silvercreast, liest du eigentlich mal, was hinter den Links steht, die man dir postet? 🙄
    Ist nur so eine Frage, weil sonst weiß ich, dass ich mir bei dir nicht mehr die Mühe machen muss.
    In dem Beispiel zum Drucken von gestern war schon fast der komplette Code im Artikel abgedruckt - der Rest hätte sich im Demoprojekt gefunden. Oder hast du den gar nicht angeguckt, weil Doc/View oben drüber stand?



  • Ich hatte doch geschrieben das ich den Code gar nicht genommen habe sondern einen von codeguru, da ich ja selbst noch gesucht habe



  • @ estartu_de: Hast natürlich Recht mit den Funktionsnamen.
    Habe selber nie ein ListControl benutzt und bin daher automatisch zu CListBox gegeangen. 🤡



  • Das hatte ich schon gesehen - aber abgucken kann man da doch trotzdem. 😕



  • Stimmt schon bin jetzt noch mal auf den Link gegangen und ich seh schon was du meinst unter dem ersten Code steht das wie das geht 🙄

    Versprech Besserung



  • 👍



  • Na also 👍
    Solche Beispiele kann man auch bunt durcheinanderwürfeln. Allerdings muss man auch erstmal auf die Idee kommen. 🙂


Anmelden zum Antworten