OnFilePrint()



  • Das habe ich so auch schon mal probiert.
    Ich rufe OnFilePrint() auf, und das Framework ruft dann die Methoden OnPreparePrinting(), OnPrepareDC() usw. auf.
    Mein Problem war das wenn die Methode OnPreparePrinting() aufgerufen wird die Methode CView::OnPreparePrinting() aufgerufen wird und nicht die von mir überschriebene Methode CMyView::OnPreparePrinting(). IMHO liegt es vielleicht daran das mein View von CFormView abgeleitet ist und nicht von CView.


  • Mod

    Hast Du auch sicherlich OnPreparePrnting mit der richtigen Signatur belegt?

    virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
    

    Diese Funktion ist virtuell und muss aus Deiner Klasse aufgerufen werden!



  • Die Signatur stimmt! Du meinst ich muss sie also aus CMyFormView aufrufen?
    Wird sie ja aber nicht, sie wird ja aus der Methode OnFilePrint() aufgerufen.


  • Mod

    Eben! Die Funktion ist virtuell und wird vom Framework aufgerufen sofern eben diese Klasse OnPreparePrinting überschreibt.



  • Nee funktioniert einfach nicht, entweder steh ich total auf dem Schlauch oder das Drucken funktioniert mit einer FormView so nicht.
    Hier mal mein Code:

    void CMyFormView::Print()
    {	
    	CMyFormView::OnFilePrint();
    }
    
    BOOL CMyFormView::OnPreparePrinting(CPrintInfo* pInfo)
    {
    	return CMyFormView::DoPreparePrinting(pInfo);
    }
    
    virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
    

    OnFilePrint() sollte die überschriebene Methode CMyFormView::OnPreparePrinting(CPrintInfo* pInfo) aufrufen, aber sie ruft die Methode CView::OnPreparePrinting(CPrintInfo* pInfo) auf.


  • Mod

    Verstehe ich nicht. Ein mit dem Wizard erzeugtes Sample arbeitet korrekt...
    Kann ich in keiner Weise nachvollziehen.



  • Hmm??
    Wie hast du das Sample erzeugt?
    Wenn ich die Ansichtsklasse von CView ableite funktionierts, aber mit meiner CFormView leider nicht. 😕


  • Mod

    Ich habe eine normale SDI Anwednung erzeugt mit einem normalen CView...
    Wenn man ein CFormView hat wird hier das Drucken verhindert.

    Aber die grundsätzliche Technik mit den entsprechedenden On...Print Funktionen lässt sich damit prima testen.



  • Martin Richter schrieb:

    Wenn man ein CFormView hat wird hier das Drucken verhindert.

    Also kann ich mit dieser Methode mein CFormView nicht drucken?!


  • Mod

    Doch schon. Du musst nur selber OnPrint überschreiben und den ganzen Käse selber machen. Aber die grundsätzliche Funktion unterscheidet sich nicht!

    In Codeproject suche mal nach "CFormView Print", das findest Du eine halbgare Lösung die ds Formular in eine Bitmap kopiert und dann druckt...



  • Das habe ich mir auch schonmal angeschaut. Ich möchte allerdings nicht die komplette Oberfläche mit allen Controls drucken, sondern nur die Einträge in den Editfeldern ausdrucken.


  • Mod

    Dann mach das doch... 🤡

    Ich habe einfach in meiner CView Klasse diese beiden Funktionen über den Class View hinzugefügt:

    void CTestSDIFormPrintView::OnFilePrint()
    {
    	__super::OnFilePrint();
    }
    
    BOOL CTestSDIFormPrintView::OnPreparePrinting(CPrintInfo* pInfo)
    {
    	return DoPreparePrinting(pInfo);
    }
    

    Jetzt nur noch ein bischen DrawText in OnPrint und das wars...



  • Also mach ich doch ne eigene Ansichtsklasse zum drucken-> CPrintView, abgeleitet von CView-> dann kann ich OnPreparePrinting überschreiben.
    Doch dann hab ich wieder das andere Problem das OnFilePrint() nicht an mein Document rankommt.


  • Mod

    Falsch... Wieso CPrintView?

    Du sollst das ganze drucken in Deine eigene CFormView Klasse packen und icht in eine Extraklasse.



  • Wer ruft denn die Methode OnPrint() auf?


  • Mod

    OnFilePrint



  • Habe mir jetzt mal das Beispiel projekt von CodeProject.com runtergeladen. Genau so hatte ich es auch vor, aber bei denen funktionierts.
    In deren Message Map der Klasse CFormViewPrint2View steht

    ON_COMMAND(ID_FILE_PRINT, OnFilePrint)
    

    In meiner Anwendung musste ich das in die Applikationsklasse schreiben und nicht in die CFormView. Wenn ich es in der CFormView implementiere bleibt der Menü-Eintrag ausgegraut.
    Haben die irgendwie die Druckunterstützung aktiviert?


Anmelden zum Antworten