De ce imi era frica n-am scapat: in proiectul real desenarea se face cu CDib. Am mai incercat eu sa introduc de-a lungul acestui post CDib in proiectele de test, solutia finala n-are CDib. Acuma, cand am incercat sa aplic double-buffering la proiectul original, am dat de prag ... poate e simplu, dar eu n-am reusit.
CDib are metoda Draw:
Code: Select all
BOOL CDib::Draw(CDC* pDC, CPoint pointDest, CSize sizeDest, CPoint pointSource, CSize sizeSource)
{
// ...
StretchDIBits(hdc, pointDest.x, pointDest.y, sizeDest.cx, sizeDest.cy,
pointSource.x, pointSource.y, sizeSource.cx, sizeSource.cy,
m_lpImage, (LPBITMAPINFO) m_lpBMIH, DIB_RGB_COLORS, SRCCOPY);
}
bun.
Implementarea in CMyView::OnDraw este simpla:
Code: Select all
void CMyView::OnDraw(CDC* pDC)
{
CRect rectClient;
GetClientRect(&rectClient);
CBitmapMDIDoc* pDoc = GetDocument();
CPoint ptPrevViewportOrg = pDC->SetViewportOrg(CPoint(0, 0));
CMemDC DrawDC(pDC, rectClient.right, rectClient.bottom);
if(NULL == m_brush.GetSafeHandle())
m_brush.CreateHatchBrush(HS_DIAGCROSS, m_sBackgroundStyle.crHatch);
DrawDC.SelectObject(&m_brush);
DrawDC.PatBlt(0, 0, rectClient.right, rectClient.bottom, PATCOPY);
DrawImage(&DrawDC, pDC);
pDC->BitBlt(0, 0, rectClient.Width(), rectClient.Height(), &DrawDC, 0, 0, SRCCOPY);
pDC->SetViewportOrg(ptPrevViewportOrg);
}
simplu.
Problema e in DrawImage: daca am facut in modul urmator:
Code: Select all
void CMyView::DrawImage(CDC* pDestinationDC, CDC* pDC)
{
ASSERT_VALID(pDestinationDC);
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// ....
pDoc->m_dibDisplay->Draw(pDestinationDC, CPoint(xDst, yDst), CSize(nDstWidth, nDstHeight),
CPoint(xSrc, ySrc), CSize(nSrcWidth, nSrcHeight));
}
am un bitmap cat zona client, niciodata mai mare, e logic sa fie asa, fiindca pDestinationDC are masurile zonei client. Am incercat sa selectez tot bitmap-ul din CDib in modul urmator:
Code: Select all
void CMyView::DrawImage(CDC* pDestinationDC, CDC* pDC)
{
ASSERT_VALID(pDestinationDC);
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CBitmap Bitmap;
Bitmap.FromHandle(pDoc->m_dibDisplay->m_hBitmap);
CMemDC SourceDC(pDC, &Bitmap);
pDestinationDC->StretchBlt(xDst, yDst, nDstWidth, nDstHeight, &SourceDC,
xSrc, ySrc, nSrcWidth, nSrcHeight, SRCCOPY);
}
nu merge nici asa, fiindca rezultatul "
Bitmap.FromHandle(pDoc->m_dibDisplay->m_hBitmap);" este intotdeauna 0 (NULL) ... am pe view numai fundalul, fara bitmap ... poate e simplu, dar cum pun in pDestinationDC bitmap-ul din CDib ? Sau cum desenez cu CDib::OnDraw(...) direct in pDestinationDC ?