Re: CView and bitmap problem
Make sure your view classes follows this kind of logic.
class CDrawingSampleView : public CView
{
protected: // create from serialization only
CDrawingSampleView();
DECLARE_DYNCREATE(CDrawingSampleView)
// Implementation
public:
virtual ~CDrawingSampleView();
// Generated message map functions
protected:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
virtual void OnInitialUpdate();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnDrawLine();
afx_msg void OnDrawRect();
DECLARE_MESSAGE_MAP()
private:
CBitmap m_MemBitmap;
};
}
void CDrawingSampleView::OnInitialUpdate()
{
CView::OnInitialUpdate();
CDC *pDC = GetDC();
//create the bitmap
m_MemBitmap.CreateCompatibleBitmap(pDC,800,600);
//create a dc to initialize the bitmap with
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
ReleaseDC(pDC);
//make the bitmap white to begin with
CBitmap *pOldBmp = MemDC.SelectObject(&m_MemBitmap);
MemDC.FillSolidRect(0,0,800,600,RGB(255,255,255));
MemDC.SelectObject(pOldBmp);
}
//don't erase background because OnDraw will paint over the entire client
area
BOOL CDrawingSampleView::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
// CDrawingSampleView drawing
void CDrawingSampleView::OnDraw(CDC* pDC)
{
//draw whatever is in the bitmap on the screen, stretch to fit entire
screen
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
int SavedDC = MemDC.SaveDC();
MemDC.SelectObject(&m_MemBitmap);
CRect Rect;
GetClientRect(&Rect);
pDC->StretchBlt(0,0,Rect.Width(),Rect.Height(),&MemDC,0,0,800,600,SRCCOPY);
MemDC.RestoreDC(SavedDC);
}
//draw a random line on the memory bitmap
void CDrawingSampleView::OnDrawLine()
{
CDC *pDC = GetDC();
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
ReleaseDC(pDC);
CBitmap *pOldBitmap = MemDC.SelectObject(&m_MemBitmap);
MemDC.SelectStockObject(BLACK_PEN);
MemDC.MoveTo(rand()%800,rand()%600);
MemDC.LineTo(rand()%800,rand()%600);
MemDC.SelectObject(pOldBitmap);
Invalidate();
UpdateWindow();
}
//draw a random rect on the memory bitmap
void CDrawingSampleView::OnDrawRect()
{
CDC *pDC = GetDC();
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
ReleaseDC(pDC);
CBitmap *pOldBitmap = MemDC.SelectObject(&m_MemBitmap);
MemDC.SelectStockObject(BLACK_PEN);
MemDC.Rectangle(rand()%800,rand()%600,rand()%800,rand()%600);
MemDC.SelectObject(pOldBitmap);
Invalidate();
UpdateWindow();
}
AliR.