MFC双缓冲实现画图橡皮条的问题

来源:百度知道 编辑:UC知道 时间:2024/05/23 02:02:14
int CSketchpadView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
CRect rect;
GetClientRect(&rect);
int nWidth = rect.Width();
int nHeight = rect.Height();

CDC* pDC = GetDC();

m_pMemDCSave->CreateCompatibleDC(NULL);
m_pBitmap.CreateCompatibleBitmap(m_pMemDCSave, nWidth, nHeight);
CBitmap* pOldBit = m_pMemDCSave->SelectObject(&m_pBitmap);
m_pMemDCSave->FillSolidRect(0, 0, nWidth, nHeight, RGB(255, 255, 100));
m_pMemDCSave->BitBlt(0, 0, nWidth, nHeight, pDC, 0, 0, SRCCOPY);

m_pMemDC->CreateCompatibleDC(m_pMemDCSave);
MemBitmap.CreateCompatibleBitmap(m_pMemDC, nWidth, nHeight);
CBitmap* pOldBitmap = m_pMemDC->SelectObject(&MemBitmap);
m_pMemDC->FillSolidRect(0, 0, nWidth, nHeight, RGB(255, 100, 255));
return 0;
}

void CSketchpadView::OnMouseMove(UINT nFlags, CPoint point)

只要一个内存DC就行了。在构造函数里初始化和创建,在析构函数里释放。
<<<任何>>>其它函数里不要有绘图的操作,包括在内存DC上的。所有鼠标消息中的数据保存下来,然后在视图的OnDraw里绘图。先在内存DC上绘制,再拷贝到OnDraw参数的pDC上。
这样不但效果达到了。重要的是结构更清晰。

为什么要个pMemDC?

MouseDown :记录位置, 设置个flag:开始橡皮条
MouseMove :使矩形无效
Draw : bitblt m_pMemDCSave 到pDC ,如果需要橡皮条, 根据MouseDown位置和鼠标当前位置在pDC里画线
MouseUp : 设置flag 结束橡皮条。 使矩形无效化

晕,这个问题还没解决啊。
不是很简单的么
把操作逻辑分析清楚就行了