Page 1 of 1

Double buffering in print preview

Posted: 29 Apr 2013, 13:39
by mesajflaviu
Am desenat cu tehnica double buffering in print preview:

Code: Select all

void CPreviewViewExt::OnDraw(CDC* pDC)
{
	ASSERT_VALID(pDC);

	// don't do anything if not fully initialized
	if (m_pPrintView == NULL || m_dcPrint.m_hDC == NULL)
		return;

	CRect rectClip;
	pDC->GetClipBox(&rectClip);
	CMemDC dcDraw(pDC, rectClip.right, rectClip.bottom);

	// Fill background with APPWORKSPACE
	CBrush backBrush(GetSysColor(COLOR_APPWORKSPACE));
	CBrush* pOldBrush = dcDraw.SelectObject(&backBrush);
	dcDraw.PatBlt(rectClip.left, rectClip.top, rectClip.Width(), rectClip.Height(), PATCOPY);
	dcDraw.SelectObject(pOldBrush);

	CPoint ptViewportOrg = dcDraw.GetViewportOrg();
...
...
	GetOrigView()->OnDraw(m_pPreviewDC);
...

	pDC->BitBlt(0, 0, rectClip.right, rectClip.bottom, &dcDraw, 0, 0, SRCCOPY);
}
si merge OK, cum am exemplificat si aplicatia de test atasata ... totusi, ceva nu cred ca e bine: daca imprimanta este landscape, si fac zoom pe imagine (framework-ul face doua zoom-uri la fiecare click, iar la al treilea click imaginea revine la zoom-ul 1:1), la prima incercare am scroll orizontal (daca imaginea iese din client), dar daca mai vreau sa repet zoom-ul, nu mai am zoom orizontal deloc (de oricate ori mai incerc) ... intrebarea mea este, am facut bine desenarea (dimensiunile) in rutina OnDraw ?

Re: Double buffering in print preview

Posted: 29 Apr 2013, 14:19
by bu7ch3r

Code: Select all

pDC->BitBlt(0, 0, rectClip.right, rectClip.bottom, &dcDraw, 0, 0, SRCCOPY);
Da-i si lui cu width si height:)

Re: Double buffering in print preview

Posted: 29 Apr 2013, 14:27
by mesajflaviu
bu7ch3r wrote:

Code: Select all

pDC->BitBlt(0, 0, rectClip.right, rectClip.bottom, &dcDraw, 0, 0, SRCCOPY);
Da-i si lui cu width si height:)
Nu deseneaza corect cu Width() si Height() ... se poate usor incerca asta in aplicatia de test ...

Re: Double buffering in print preview

Posted: 30 Apr 2013, 10:33
by Ovidiu Cucu

Code: Select all

   pDC->BitBlt(0, 0, rectClip.right, rectClip.bottom, &dcDraw, 0, 0, SRCCOPY);
Asta e OK numai daca rectClip coincide cu zona client.
Mai bine fa asa:

Code: Select all

   pDC->BitBlt(rectClip.left, rectClip.top, rectClip.Width(), rectClip.Height(), 
      &dcDraw, rectClip.left, rectClip.top, SRCCOPY);

Code: Select all

   dcDraw.RestoreDC(-1);
Asta, din ce se intelege din documentatie, face restore la cel mai recent SaveDC.
Mai bine si mai sigur (deoarece poate sa fie vreun SaveDC si in celalalt view), fa asa:

Code: Select all

   const int nSavedDC = dcDraw.SaveDC();
   //...
   dcDraw.RestoreDC(nSavedDC);

Re: Double buffering in print preview

Posted: 30 Apr 2013, 10:56
by Ovidiu Cucu
...in rest pare OK. Vad ca nu ai flicker.
Ramane doar calitatea imaginii care lasa de dorit. Eu unul as lasa desenatul cu functii GDI "clasice" si as folosi GDI+.
In fine, nu stiu care sunt cerintele proiectului tau. Poate, cel putin pe "print preview", nu conteaza.

Re: Double buffering in print preview

Posted: 30 Apr 2013, 12:27
by mesajflaviu
Am facut modificarile sugerate, acelasi rezultat ... daca imaginea e landscape, si se mareste de doua ori (CPreviewView::m_nZoomState poate avea valorile ZOOM_OUT, ZOOM_MIDDLE si ZOOM_IN), prima data am scroll orizontal, pe urma de cate ori maresc imaginea, nu mai am scroll orizontal deloc ... eu ma gandesc ca nu iau bine rectClip-ul ... mai sap ...

Re: Double buffering in print preview

Posted: 02 May 2013, 12:01
by mesajflaviu
Se pare ca asa functioneaza framework-ul ... desenarea se face OK, doar ca la al doilea zoom mazim, nu mai am decat unul dintre scroll-uri (vertical sau orizontal, niciodata doua, ca la primul zoom maxim, si asta depinde de rezolutie) ... am luat de tot CPreviewViewExt::OnDraw afara, si tot asa merge ...

Re: Double buffering in print preview

Posted: 02 May 2013, 17:28
by Ovidiu Cucu
mesajflaviu wrote:Se pare ca asa functioneaza framework-ul ... desenarea se face OK, doar ca la al doilea zoom maxim, nu mai am decat unul dintre scroll-uri (vertical sau orizontal, niciodata doua, ca la primul zoom maxim, si asta depinde de rezolutie) ... [...]
Da, e un bug de framework si n-are legatura cu ce facem noi aici.
L-am reprodus si eu pe un proiect "curat", asa cum l-a generat wizard-ul.
O sa ma uit mai acusi...

Re: Double buffering in print preview

Posted: 03 May 2013, 09:16
by mesajflaviu
Ovidiu Cucu wrote:
mesajflaviu wrote:Se pare ca asa functioneaza framework-ul ... desenarea se face OK, doar ca la al doilea zoom maxim, nu mai am decat unul dintre scroll-uri (vertical sau orizontal, niciodata doua, ca la primul zoom maxim, si asta depinde de rezolutie) ... [...]
Da, e un bug de framework si n-are legatura cu ce facem noi aici.
L-am reprodus si eu pe un proiect "curat", asa cum l-a generat wizard-ul.
O sa ma uit mai acusi...
You are too kind, dar daca e problema de framework, mai bine o lasam asa ... eu ma gandeam ca am facut iarasi o gogomanie, si nu imi explicam de ce se intampla sa raman fara scrollbar la al doilea zoom ... OK, ma opresc din sapat :P

Re: Double buffering in print preview

Posted: 03 May 2013, 16:53
by viorel2005

Re: Double buffering in print preview

Posted: 04 May 2013, 08:29
by Ovidiu Cucu
Problema scroll-ului in CPrintPreview e veche.
Vezi Print Preview Scroll Bar Disappears after Zoom In, Zoom Out.
Se spune acolo ca a fost rezolvata in VC6.0 insa am testat in VS 2005/2010 si inca e prezenta.
Eu unul, as rescrie clasa aia de la inceput, cap-coada.