Ausdruck mehrerer Seiten



  • Hallo Leute,

    ich hab eine MDI-Anwendung und schreibe ins Clientfenster (ScrollView) ein Protokoll, was mitunter einige Seiten lang werden kann. Das Problem beim Drucken bzw. bei der Druckvorschau ist, das immer nur die erste Seite angezeigt wird.
    Ich hab da ja auch schon viel geschaut aber zum mehrseitigen Drucken hab ich kaum was gefunden. Das Problem ist das gleiche wie das Zweite hier: http://www.c-plusplus.net/forum/viewtopic-var-t-is-155005-and-highlight-is-drucken+seiten.html

    Dravere schrieb:

    2. Schau dir mal OnBeginPrint, OnEndPrint und OnPrint an. Vor allem OnPrint, denn da zeichnest du, was auf das Blatt kommt. Der Basisaufruf von OnPrint ruft deine OnDraw Funktion auf. Du musst also OnPrint überschreiben und durch die Info, welche du mitgeliefert bekommst, das Zeugs entsprechend Zeichnen. Also rausfinden auf welcher Seite das Zeugs hingehört und dann entsprechend zeichnen. (sehr mühsam ^^)

    Bei mir wird OnFilePrint() bzw. OnFilePreviewPrint() nicht durchlaufen. Woran kann das liegen?



  • OK, das war 'n bissel blöd von mir. Ich dachte OnFilePrint währe OnPrint, nur mit anderem Namen. Ist aber schon komisch, das diese von VS erstellten Funktionen nicht beim Klick der zugeordneten ID durchlaufen werden.
    Ich hab mir die OnPrint jetzt aus der viewcore.cpp kopiert und sie wird auch durchlaufen.
    Ich hab da noch ne Frage zur organisation des Codes: hier: http://msdn.microsoft.com/en-us/library/w7wzay73(VS.80).aspx ist ja son schönes Diagramm aufgezeichnet was beim Drucken so passiert und ich hab auch etwas rumexperimentiert, aber ohne Erfolg. Muss ich denn den ganzen Code, der in der OnDraw steht (etwas angepasst) in der OnPrint schreiben?
    Bisher hab ich in der OnDraw sowas stehen, mit dem ich dachte, das es funktionieren könnte:

    CPrintInfo* pInfo;
    pInfo = dynamic_cast<CPrintInfo>(((CMainFrame*)AfxGetMainWnd())->MDIGetActive()->GetActiveView()->GetPrintDlg());  //funzt natürlich nicht, da es GetPrintDlg nicht gibt
    do{
    	if(pInfo)pInfo->m_pPD->StartPage();  //Seitenanfang
    	while(n < pDoc->g_DScount && LinesNumber(33+n)<p*PAGEHEIGHT)
    	//for(n=0;n<pDoc->g_DScount ;n++)
    	{	
    		help.Format(_T("%ld"),pDoc->Y[n].No+1);
    		pDC->TextOutW(LEFTBORDER,LinesNumber(33+n),help);
    				...		
    		help = pDoc->Z[n].Remarks;
    		pDC->TextOutW(TABLE7,LinesNumber(33+n),help);
    		n++;
    	}
    	if(pInfo)pInfo->m_pPD->EndPage();  //Seitenende
    	p++;                               //nächste Seite
    	}while(n < pDoc->g_DScount);
    

    Frage: Wenn die OnDraw zum Drucken durchlaufen wird will ich den PrinterDialog haben. Wie komme ich an den ran?


  • Mod

    Das kommt darauf an was Du machen möchtest.
    1. Würde ich korrekt OnPrint überschreiben.
    2. Würde ich gemeinsame Druck & Anzeige Routinen einfach auslagern in eigene Funktionen, die einfach einen DC bekommen und aus OnPrint/ONDraw aufrufen.
    3. Ist es übel auf diese Art und Weise mit dem cast an CPrintInfo heran zu kommen. Du bekommst diesen Zeiger doch in OnPrint!



  • Hallo Martin,

    ich habs dann so gemacht wie du es vorgeschlagen hast. Ich bin mir nicht mehr ganz sicher aber den PrinterDC hab ich glaub ich nicht aus den CPrintInfo bekommen (CPrintInfo::m_pDC?) bzw. funzte es nicht. Hier mal ein bissel Code (Sicher nicht schön - für Verbesserungsvorschläge bin ich offen - aber funzt; z.T. aus der MSDN):

    void CMyView::OnPrint(CDC* pDC, CPrintInfo* pInfo)	
    {
    	CString help,help2;
    
    	ASSERT_VALID(pDC);
    	CMyDoc *pDoc;
    	pDoc = dynamic_cast<CMyDoc*>(((CMainFrame*)AfxGetMainWnd())->MDIGetActive()->GetActiveView()->GetDocument());
    	ASSERT_VALID(pDoc);
    
    	CPrintDialog pDlg(false);
    	pDlg.GetDefaults();
    	HDC hdcPrinter = pDlg.GetPrinterDC();
    	if (hdcPrinter == NULL)
    	{
    	   MessageBox(_T("Install a printer!"));
    	}
    	CDC dcPrinter;
    	dcPrinter.Attach(hdcPrinter);
    if(pInfo->m_nCurPage==1){	
      dcPrinter.StartPage();		//erste Seite
    					DrawHead(0,pDC,pDoc);	
    					DrawStat(pDC,pDoc);
    					DrawLogo(pDC);
      dcPrinter.EndPage();
    if(pInfo->m_nCurPage==2){
      dcPrinter.StartPage();....
    

    Blöd ist nur das man bei Folgeseiten irgendwoher einen Offset (Y-Richtung)bekommt, das einem die Positionierung von TextOut usw. ziemlich vermießt. Bisher hab ich für jede Seite eine eigene Ausgabe gebastelt. Ich würde es aber gerne dynamisch erstellen also falls jemand noch Infos hat wie die Positionierung (x,y) auf den Folgeseiten überhaupt abläuft, währ ich ihm sehr dankbar.
    Micha


  • Mod

    der_micha1981 schrieb:

    ich habs dann so gemacht wie du es vorgeschlagen hast. Ich bin mir nicht mehr ganz sicher aber den PrinterDC hab ich glaub ich nicht aus den CPrintInfo bekommen (CPrintInfo::m_pDC?) bzw. funzte es nicht.

    Aber du bekommst doch den DC mit OnPrint geliefert! Warum willst Du den jetzt nochmal selbst erzeugen?



  • Danke für den Hinweis! zeile 10 bis 18 sind also Überflüssig. StartPage und EndPage hab ich dan mit
    pDC->StartPage() aufgerufen.

    Weiß noch jemand was zur Positionierung auf den Folgeseiten zu beachten ist?

    Micha


  • Mod

    Was meinst Du mit Positi0nierung? Jede Seite hat sein eigenes neues bei 0,0 beginnendes Koordinatensystem.


Anmelden zum Antworten