Double buffering in print preview

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
Post Reply
mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Double buffering in print preview

Post by mesajflaviu » 29 Apr 2013, 13:39

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 ?
Attachments
TestDraw.zip
(252.31 KiB) Downloaded 224 times



User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: Double buffering in print preview

Post by bu7ch3r » 29 Apr 2013, 14:19

Code: Select all

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

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Double buffering in print preview

Post by mesajflaviu » 29 Apr 2013, 14:27

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 ...

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Double buffering in print preview

Post by Ovidiu Cucu » 30 Apr 2013, 10:33

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);

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Double buffering in print preview

Post by Ovidiu Cucu » 30 Apr 2013, 10:56

...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.

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Double buffering in print preview

Post by mesajflaviu » 30 Apr 2013, 12:27

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 ...
Attachments
TestDraw.zip
(251.16 KiB) Downloaded 216 times

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Double buffering in print preview

Post by mesajflaviu » 02 May 2013, 12:01

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 ...

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Double buffering in print preview

Post by Ovidiu Cucu » 02 May 2013, 17:28

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...

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Double buffering in print preview

Post by mesajflaviu » 03 May 2013, 09:16

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


User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Double buffering in print preview

Post by Ovidiu Cucu » 04 May 2013, 08:29

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.

Post Reply