OnFilePrint()



  • Hallo,

    meine Anwendung soll alle Parameter, die im Document enthalten sind ausdrucken.
    Ich habe eine Klasse CPrintView von CView abgeleitet, in der ich die zum drucken benötigten Methoden implementiere.
    Dann rufe ich die Methode OnFilePrint() auf, es öffnet sich der Druckdialog. Ich bestätige mit Ok, und ich bekomme eine Zugriffsverletzung in

    GetWindowText(strTitle);
    

    Der Zeiger auf mein Document ist Null. Weiß jemand warum ich keinen gültigen Zeiger auf mein Document bekomme?

    // set up document info and start the document printing process
    		CString strTitle;
    		CDocument* pDoc = GetDocument();
    		if (pDoc != NULL)
    			strTitle = pDoc->GetTitle();
    		else
    			GetParentFrame()->GetWindowText(strTitle);
    

  • Mod

    Wie hast Du den View erzeugt? Wieso hast Du nicht in OnPrint/OnDraw des entsprechenden Views die ganze Druck Methodik implementiert.
    Ein View muss entsprechend erzeugt werden und mit dem CDocument verbunden werden. Zudem braucht der View ein CFrameWnd als Parent.

    Einen neuen View nur für den Druck zu erzeugen halte ich nicht für sinnreich.



  • Martin Richter schrieb:

    Wie hast Du den View erzeugt?

    Ich habe den View mit dem Klassenassitenten von VS 2003.NET erzeugt.

    Nun dann werde ich jetzt mal versuchen den Druckvorgang in meiner FormView in OnDraw zu implementieren.
    Wie geh ich am besten vor?
    Ich lege mir zuerst ein DC-Objekt und eine PrintInfo struktur an. Dann implementiere ich den MFC-code aus OnFilePrint() in der Methode OnDraw().
    Könnte das so funktionieren?


  • Mod

    Nein! Du musst nicht in OnPrint den Onfileprint Code implementieren.

    IMHO langt es wenn die Basis Funktion von OnFilePrint aufgerufen wird. Du musst nur OnPrint implementieren in dem der eigentliche Druckvorgang abläuft. Diese Funktion wird vom FRamework im View verwendet.
    OnPrepareDC und was sonst zum Drucken gehört natürlich auch.



  • 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


Anmelden zum Antworten