Compatible DCs
Christopher Hudson -- christopher.hudson@magnet.mt Wednesday, December 04, 1996 Environment: NT 4.0 sp1, VC4.2b I am having difficulties with creating a memory DC, then copying it to the paint DC. If create the OnPaint funtion below, then everything works fine. // Working OnPaint not using Memory DCs void CLrView::OnPaint() { TRACE("Painting\n"); CPaintDC MemDC(this); // device context for painting CLrDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // Get pointer to image CImage* l_pImage = pDoc->GetImage(); if (l_pImage) { // Display Image int XPos = GetScrollPos(SB_HORZ); int YPos = GetScrollPos(SB_VERT); l_pImage->DisplayImage(this,&MemDC,XPos,YPos); // Display Regions if (!pDoc->GetRegionList()->IsEmpty()) { MemDC.SetBkMode(TRANSPARENT); // Iterate through Regions POSITION pos; pos = pDoc->GetRegionList()->GetHeadPosition(); while (pos) { CBrush NewBrush(HS_BDIAGONAL,RGB(255,0,0)); MemDC.SelectObject(NewBrush); MemDC.SetBrushOrg(CPoint(0,0)); TRACE("Painting Region\n"); MemDC.PaintRgn((CRgn*)pDoc->GetRegionList() ->GetAt(pos)); pDoc->GetRegionList()->GetNext(pos); NewBrush.DeleteObject(); } } } } But if I try to paint everything to a compatible memory DC then copy this to the actual dc it does not paint anything, but just leaves it blank // Not working OnPaint using CompatibleDCs void CLrView::OnPaint() { TRACE("Painting\n"); CPaintDC dc(this); // device context for painting // Create memory DC for creating the image on. CDC MemDC; MemDC.CreateCompatibleDC(&dc); OnPrepareDC(&MemDC); int ImageWidth = 0; int ImageHeight = 0; CLrDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // Get pointer to image CImage* l_pImage = pDoc->GetImage(); if (l_pImage) { // Display Image int XPos = GetScrollPos(SB_HORZ); int YPos = GetScrollPos(SB_VERT); l_pImage->DisplayImage(this,&MemDC,XPos,YPos); // Display Regions if (!pDoc->GetRegionList()->IsEmpty()) { MemDC.SetBkMode(TRANSPARENT); // Iterate through Regions POSITION pos; pos = pDoc->GetRegionList()->GetHeadPosition(); while (pos) { CBrush NewBrush(HS_BDIAGONAL,RGB(255,0,0)); MemDC.SelectObject(NewBrush); MemDC.SetBrushOrg(CPoint(0,0)); TRACE("Painting Region\n"); MemDC.PaintRgn((CRgn*)pDoc->GetRegionList() ->GetAt(pos)); pDoc->GetRegionList()->GetNext(pos); NewBrush.DeleteObject(); } } // Copy MemDC to dc /* */ ImageWidth = l_pImage->GetImageWidth(); ImageHeight = l_pImage->GetImageHeight(); } dc.StretchBlt(0,0,ImageWidth,ImageHeight, &MemDC,0,0,ImageWidth,ImageHeight, SRCPAINT); } I am getting desperate to find out what is wrong with this. I have searched through MSDN, FAQs, and various books, but cannot understand what is wrong with this. TIA C ------------------------------------------- Chris Hudson - christopher.hudson@magnet.mt
Brad Wilson/Crucial Software -- crucial@pobox.com Saturday, December 07, 1996 [Mini-digest: 3 responses] > But if I try to paint everything to a compatible memory DC then copy this to the > actual dc it does not paint anything, but just leaves it blank When you create a compatible DC, it has a 1x1x1bit bitmap selected into it. You also need to create a compatible bitmap to paint on to. > CDC MemDC; CBitmap MemBitmap, *pOldBitmap; CRect MemRect; > MemDC.CreateCompatibleDC(&dc); PaintDC.GetClientRect(&MemRect) MemBitmap.CreateCompatibleBitmap(&dc,MemRect.Width(),MemRect.Height()); pOldBitmap = MemDC.SelectObject(&MemBitmap); > OnPrepareDC(&MemDC); Then clean up at the end: > dc.StretchBlt(0,0,ImageWidth,ImageHeight, > &MemDC,0,0,ImageWidth,ImageHeight, SRCPAINT); MemDC.SelectObject(pOldBitmap); Good luck! -- Brad Wilson Custom software development & solutions crucial@pobox.com Internet and intranet consulting services The Brads' Consulting Windows NT/Windows 95 software development http://www.thebrads.com Web site planning, development and maintenance -----From: "P.J. Tezza"Chris, Unless you create a bitmap and select it into your memory DC there is no = point in painting anything on it. See MSDN:Books and = Periodicals:Programming Windows 3.1:Part 4 The Graphics Device = Interface:Chapter 13 Bits, Blts, and Metafiles:THE GDI BITMAP OBJECT. = This may be discussed elsewhere, but this is were I read about working = with memory DCs first. I am not sure what CLrView::OnPrepareDC does, but = CView::OnPrepareDC does nothing when called without the pInfo parameter. = OnPrepareDC is usually called before OnDraw is called. PJ pj@exemplarsoftware.com -----From: Paul.B.Folbrecht@JCI.Com Chris, When a memory DC is created, it has a 1x1 monochrome bitmap selected into it. That's all the room you have to work with- 1 pixel. What you need to do is select a bitmap into the DC the size (dimensions and colors) of what you're going to work with, before you do anything else. See CreateCompatibleBitmap(). -Paul Folbrecht Compuware Corp. Environment: NT 4.0 sp1, VC4.2b I am having difficulties with creating a memory DC, then copying it to the paint DC. If create the OnPaint funtion below, then everything works fine. // Working OnPaint not using Memory DCs void CLrView::OnPaint() { TRACE("Painting\n"); CPaintDC MemDC(this); // device context for painting CLrDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // Get pointer to image CImage* l_pImage = pDoc->GetImage(); if (l_pImage) { // Display Image int XPos = GetScrollPos(SB_HORZ); int YPos = GetScrollPos(SB_VERT); l_pImage->DisplayImage(this,&MemDC,XPos,YPos); // Display Regions if (!pDoc->GetRegionList()->IsEmpty()) { MemDC.SetBkMode(TRANSPARENT); // Iterate through Regions POSITION pos; pos = pDoc->GetRegionList()->GetHeadPosition(); while (pos) { CBrush NewBrush(HS_BDIAGONAL,RGB(255,0,0)); MemDC.SelectObject(NewBrush); MemDC.SetBrushOrg(CPoint(0,0)); TRACE("Painting Region\n"); MemDC.PaintRgn((CRgn*)pDoc->GetRegionList() ->GetAt(pos)); pDoc->GetRegionList()->GetNext(pos); NewBrush.DeleteObject(); } } } } But if I try to paint everything to a compatible memory DC then copy this to the actual dc it does not paint anything, but just leaves it blank // Not working OnPaint using CompatibleDCs void CLrView::OnPaint() { TRACE("Painting\n"); CPaintDC dc(this); // device context for painting // Create memory DC for creating the image on. CDC MemDC; MemDC.CreateCompatibleDC(&dc); OnPrepareDC(&MemDC); int ImageWidth = 0; int ImageHeight = 0; CLrDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // Get pointer to image CImage* l_pImage = pDoc->GetImage(); if (l_pImage) { // Display Image int XPos = GetScrollPos(SB_HORZ); int YPos = GetScrollPos(SB_VERT); l_pImage->DisplayImage(this,&MemDC,XPos,YPos); // Display Regions if (!pDoc->GetRegionList()->IsEmpty()) { MemDC.SetBkMode(TRANSPARENT); // Iterate through Regions POSITION pos; pos = pDoc->GetRegionList()->GetHeadPosition(); while (pos) { CBrush NewBrush(HS_BDIAGONAL,RGB(255,0,0)); MemDC.SelectObject(NewBrush); MemDC.SetBrushOrg(CPoint(0,0)); TRACE("Painting Region\n"); MemDC.PaintRgn((CRgn*)pDoc->GetRegionList() ->GetAt(pos)); pDoc->GetRegionList()->GetNext(pos); NewBrush.DeleteObject(); } } // Copy MemDC to dc /* */ ImageWidth = l_pImage->GetImageWidth(); ImageHeight = l_pImage->GetImageHeight(); } dc.StretchBlt(0,0,ImageWidth,ImageHeight, &MemDC,0,0,ImageWidth,ImageHeight, SRCPAINT); } I am getting desperate to find out what is wrong with this. I have searched through MSDN, FAQs, and various books, but cannot understand what is wrong with this. TIA C ------------------------------------------- Chris Hudson - christopher.hudson@magnet.mt
| Вернуться в корень Архива |