在MFC中用双缓冲绘制橡皮线,新画的总是覆盖了原来画的
在MFC中用双缓冲绘制橡皮线,新画的总是覆盖了原来画的(就是一新画的时候原来的就消失了)
下面是我写的简易代码
这个鼠标移动的主要就是给OnDraw函数传坐标
- C/C++ code
void CTwoBufferView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if (chek)//鼠标按下的时候开始作图 { cend=point; Invalidate(false); } CView::OnMouseMove(nFlags, point);}
这是OnDraw函数的代码
- C/C++ code
void CTwoBufferView::OnDraw(CDC* pDC){ CTwoBufferDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CRect rect; GetClientRect(&rect); //创建一个用于绘图的内存设备环境 memDc.CreateCompatibleDC(pDC); //建立一个与屏幕显示兼容的位图, memBmp.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()); CBitmap *pOldBit= memDc.SelectObject(&memBmp); memDc.FillSolidRect(0,0,rect.Width(), rect.Height(),RGB(255,255,255)); //创建画笔 CPen m_pen; m_pen.CreatePen(PS_SOLID, 5, RGB(0,123,0)); SelectObject(memDc,m_pen); //开始画图 memDc.MoveTo(cbgin); memDc.LineTo(cend); //将内存设备环境上的图拷贝到屏幕上显示 pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDc, 0, 0, SRCCOPY); //绘图完成后清理 memBmp.DeleteObject(); memDc.DeleteDC();}
- C/C++ code
//都是全局变量CBitmap memBmp;CDC memDc;
高手请给解答。。是不是要用个数组把画过的保存起来 然后在循环的输出?
[解决办法]
我自己试了一下,可以的啊:
看代码:
- C/C++ code
// 1View.h : CMy1View 类的接口//#pragma oncetypedef struct{ CPoint begin; CPoint end;}PTS;#define MAX 100class CMy1View : public CView{protected: // 仅从序列化创建 CMy1View(); DECLARE_DYNCREATE(CMy1View)// 属性public: CMy1Doc* GetDocument() const;// 操作public:// 重写public: virtual void OnDraw(CDC* pDC); // 重写以绘制该视图 virtual BOOL PreCreateWindow(CREATESTRUCT& cs);protected: virtual BOOL OnPreparePrinting(CPrintInfo* pInfo); virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo); virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);// 实现public: virtual ~CMy1View();#ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const;#endifprotected:// 生成的消息映射函数protected: DECLARE_MESSAGE_MAP()public: afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnLButtonDown(UINT nFlags, CPoint point);private: PTS pt[MAX]; int count;public: afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg void OnMouseMove(UINT nFlags, CPoint point);private: BOOL m_IsLButtonDown;};#ifndef _DEBUG // 1View.cpp 中的调试版本inline CMy1Doc* CMy1View::GetDocument() const { return reinterpret_cast<CMy1Doc*>(m_pDocument); }#endif