CFormView drucken mit hoher Auflösung



  • Hallo,

    ich drucke bei mir die CFormView, wie in dem Artikel auf Codeproject beschrieben. www.codeproject.com/kb/printing/printformview.aspx (Variante 2)

    Nun ist die Auflösung (die wohl vom Bildschirm genommen wird) ziemlich pixelig auf dem Ausdruck. Ich hab schon etwas rumprobiert, aber keine Lösung gefunden, die Auflösung zu vergrößern.

    Fällt euch noch was dazu ein?

    Danke
    Micha


  • Mod

    Dise Methode kann niemals ein besseres Ergebnis liefern, weil sie einfach nur einen Screenshot macht.

    Versuch es mal selber mit WM_PRINTCLIENT und einem DC den Du selbst anlegst.



  • Hallo,

    ich geh jetzt das Problem an. Der Hinweis mit dem WM_PRINTCLIENT war etwas dürftig, so das ich keinen brauchbaren Ansatz habe finden können.
    Ich hab mir also gedacht, ich nehm einfach den CDC* im OnPrint und zeichne alles rein. Mit DrawText usw. Nun bin ich bei den Controls angelangt (konkret CListCtrl). Die Quali der Überschriften ist zwar immernoch schlecht, doch die Items sind gut. Ich zeichne das so ins Bild:

    m_List.Print( pDC, PRF_ERASEBKGND|PRF_CLIENT|PRF_CHILDREN );
    

    Nun wird die CListCtrl oben links gezeichnet. Gut dachte ich, nehme ich

    m_List.GetWindowRect(&rect);
    ScreenToClient(&rect);
    //int i = GetDeviceCaps(pDC->GetSafeHdc(), (RASTERCAPS) & RC_BITBLT);
    if(!BitBlt( pDC->GetSafeHdc( ),		//Copy pic to the right place
    			rect.left, 
    			rect.top,
    			rect.Width(),
    			rect.Height(),
    			pDC->GetSafeHdc( ),
    			0, 
    			0, 
    			SRCCOPY))
    	{
    		CString help;
    		help.Format(_T("Failed to copy GetLastErr %u"), GetLastError());
    		MessageBox(help);
    	}
    

    ...zum Kopieren des Bildes auf die richtige Stelle. Funktioniert auch in der Druckvorschau, aber nicht auf dem Ausdruck. BitBlt schlägt fehl. GetLastError: 0
    Ausdruck mit einem PDF-Drucker und einem richtigen Drucker gemacht. Es schlägt immer fehl. Kann mir jemand sagen warum? Gibts Alternativen?

    Danke für hilfe


  • Mod

    Und warum lässt Du nicht das List-Control erst in einen memory DC drucken und gibst ihn anschließend dahin aus wo Du ihn hin haben willst?



  • Hab ich auch schon versucht:

    CDC memDC;
    	memDC.CreateCompatibleDC(pDC);
    	m_ListDrop.GetWindowRect(&rect);
    	ScreenToClient(&rect);
    	CBitmap bmp;
    	bmp.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
    	memDC.SelectObject(&bmp);
    	m_ListDrop.Print( &memDC, PRF_ERASEBKGND|PRF_CLIENT|PRF_CHILDREN );
    	//int i = GetDeviceCaps(pDC->GetSafeHdc(), (RASTERCAPS) & RC_BITBLT);
    	//if(RC_BITBLT
    	if(!pDC->BitBlt(
    	//if(!BitBlt( pDC->GetSafeHdc( ),		//Copy pic to the right place
    			rect.left, 
    			rect.top,
    			rect.Width(),
    			rect.Height(),
    			&memDC,
    			0, 
    			0, 
    			SRCCOPY))
    	{
    		CString help;
    		help.Format(_T("Failed to copy GetLastErr %u"), GetLastError());
    		MessageBox(help);
    	}
    

    Die CListCtrl ist an der richtigen Stelle, aber pixelig (Items). Was mache ich denn falsch?

    Edit:
    ich denke, es liegt an den memDC, das es pixelig ist. Mir dünkt, memDC.CreateCompatibleDC(pDC); funktioniert nicht richtig (liefert true zurück), aber wenn ich bmp.CreateCompatibleBitmap(&memDC, rect.Width(), rect.Height()); mache, ist das Bild sogar nur monochrome



  • Hallo.
    So nach ewigem rumprobieren und lesen hab ich rausgefunden, das BitBlt und StretchBlt beim Ausdruck wahrscheinlich nicht funkionieren, da der DruckerDC nicht sichtbar ist. Bei der Druckvorschau hatte es funktioniert...

    Ich würde jetzt gerne einen neuen Ansatz probieren:

    "Versuch es mal selber mit WM_PRINTCLIENT und einem DC den Du selbst anlegst"

    Ich habe damit auch schon etwas rumprobiert und gesucht, bin aber zu keinem Ergebnis gekommen.
    Kannst du kurz näher erläutern, was ich dazu machen muss?

    Danke


  • Mod

    Oft gibt e snur Probleme mit StreckBlt. BitBlt sollte gehen.

    Also Compatibe DC erzeugen, StrechBlt ausführen. Danach BitBlt auf den TargetDC.


Anmelden zum Antworten