Drucken ohne Canvas ? ? ?



  • Hallo,

    gibt es eine Möglichkeit ohne Canvas zu drucken?
    Ich möchte einfach das, was ich in eine Datei schreibe an einen Drucker senden
    (mit '\n' u. anderen ASCII-Zeichen zB. 0x02).

    Lt. Petzold soll es irgendwie mit CreateFile gehen. Aber wie beschreibt er in seinem dicken Buch leider nicht.

    Gruß,

    WorstCase



  • Ich bin grad nicht in der Lage nachzuschauen, aber IMHO steht da folgendes:
    Man kann zwar mit CreateFile auf den Druckerport zugreifen, aber das ist absolut keine akzeptable Lösung. Und zwar ganz einfach deswegen, weil du darauf mit CreateFile("lpt1") oder so ähnlich zugreifst. d.h. du nimmst an der Drucker ist ein ASCII drucker der an lpt1 sitzt.
    Was ist mit USB-Druckern?
    Mit Postscriptdruckern? (Okay, ich glaub die verstehen ascii befehle)
    Mit anderen Ausgabegeräten, wie einem virtuellen bitmap printer?

    Mit anderen Worten:
    Man kann es so nicht machen. 🙂

    Aber es gibt eine tolle Schnittstelle, mit der man Drucken kann. Wenn man sich auf den Standarddrucker beschränkt ist das sogar sehr einfach. Auch ein Standard-Auswahldialog ist nicht so schwer.
    Leider habe ich wie gesagt grad keine Möglichkeit, nach Code zu schauen. Vielleicht steht in der FAQ was. Wenn nicht, Drucken ist ein populäres Thema, du findest bestimmt was mit Google. 🙂



  • Hallo cd9000,

    habe jetzt was mit OpenPrinter gefunden.
    Dann muss man bei StartDocPrinter eine doc_info_1 übergeben:
    typedef struct _DOC_INFO_1 { // dci1
    LPTSTR pDocName;
    LPTSTR pOutputFile;
    LPTSTR pDatatype;
    } DOC_INFO_1;
    Leider ist in der Hilfe nicht beschrieben, was man für pDataType angeben kann.

    Weiß vielleicht jemand Rat?

    Gruß,
    WorstCase



  • Schau dir mal diese Funktion an:

    HDC GetStandardPrinterDC()
    {
        DWORD dwNeeded, dwReturned;
        HDC hDC;
        PRINTER_INFO_4* pInfo4;
        PRINTER_INFO_5* pInfo5;
    
        if(GetVersion() & 0x80000000)
        {
            EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 5, NULL, 0, &dwNeeded, &dwReturned);
    
            pInfo5 = (PRINTER_INFO_5*)(malloc(dwNeeded));
            EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 5, (PBYTE)pInfo5, dwNeeded,
                &dwNeeded, &dwReturned);
            hDC = CreateDC(NULL, pInfo5->pPrinterName, NULL, NULL);
            free(pInfo5);
        }
        else
        {
            EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 4, NULL, 0, &dwNeeded, &dwReturned);
    
            pInfo4 = (PRINTER_INFO_4*)(malloc(dwNeeded));
            EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 4, (PBYTE)pInfo4, dwNeeded,
                &dwNeeded, &dwReturned);
            hDC = CreateDC(NULL, pInfo4->pPrinterName, NULL, NULL);
            free(pInfo4);
        }
        return hDC;
    }
    

    Sie liefert die den HDC des Standarddruckers zurück.

    Drucken kann man damit so:

    bool PrintMyPage()
    {
        bool bSuccess = true;
    
        static DOCINFO di = { sizeof(DOCINFO), TEXT("Print1: Druck") };
        HDC hDC;
        int cxPage, cyPage;
    
        if((hDC = GetStandardPrinterDC()) == NULL)
            return false;
    
        cxPage = GetDeviceCaps(hDC, HORZRES);
        cyPage = GetDeviceCaps(hDC, VERTRES);
    
        if(StartDoc(hDC, &di) > 0)
        {
            if(StartPage(hDC) > 0)
            {
                // Die GDI (Zeichen-) Aufrufe auf den HDC.
                // cxPage/cyPage sind die Größe der Seite in Pixeln.
                // ACHTUNG! Ein Pixel ist wahrscheinlich ziemlich winzig.
    
                if(EndPage(hDC) > 0)
                    EndDoc(hDC);
                else
                    bSuccess = false;
            }
        }
        else
            bSuccess = false;
    
        DeleteDC(hDC);
    
        return bSuccess;
    }
    

    [ Dieser Beitrag wurde am 28.10.2002 um 18:06 Uhr von cd9000 editiert. ]


Anmelden zum Antworten