用MFC编写绘图程序时, 在窗口最小化再还原后会将绘制的图形擦掉。
解决这一方法可使用双缓冲:在 内存DC中绘制, 然后从内存DCBitBlt到物理DC上。
示例:
1、建立一SDI工程Mfc_draw。
2、在类CMfc_drawView中添加变量:
protected: CPoint m_ptOld; CDC m_memDC; CBitmap m_bmp;3、在CMfc_drawView中添加WM_CREATE的响应函数, 设置内存DC。
int CMfc_drawView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here CDC *pDC = GetDC(); // 创建兼容的内存DC, 注意参数pDC m_memDC.CreateCompatibleDC(pDC); int cx = GetSystemMetrics(SM_CXSCREEN); int cy = GetSystemMetrics(SM_CYSCREEN); // 创建兼容位图作为内存DC的画布, 注意使用参数pDC m_bmp.CreateCompatibleBitmap(pDC, cx, cy); m_memDC.SelectObject(m_bmp); m_memDC.FillSolidRect(0,0,cx,cy,RGB(255,255,255)); ReleaseDC(pDC); return 0; }
4、在CMfc_drawView中添加WM_LBUTTONDOWN和WM_MOUSEMOVE的响应函数, 进行简单绘图控制。
void CMfc_drawView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default m_ptOld = point; CView::OnLButtonDown(nFlags, point); }
void CMfc_drawView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if (MK_LBUTTON == nFlags) { CPen pen(PS_SOLID, 50, 0xff0000); CPen *pOldPen = m_memDC.SelectObject(&pen); m_memDC.MoveTo(m_ptOld); m_memDC.LineTo(point); m_ptOld = point; m_memDC.SelectObject(pOldPen); Invalidate(FALSE); UpdateWindow(); } CView::OnMouseMove(nFlags, point); }5、在OnDraw函数中从内存DC显示到物理DC中。
void CMfc_drawView::OnDraw(CDC* pDC) { CMfc_drawDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CRect rc; GetClientRect(&rc); pDC->BitBlt(0, 0, rc.right, rc.bottom, &m_memDC, 0, 0, SRCCOPY); }