首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

在MFC中用双缓冲绘制橡皮线,新画的总是覆盖了原来画的,该怎么处理

2012-04-11 
在MFC中用双缓冲绘制橡皮线,新画的总是覆盖了原来画的在MFC中用双缓冲绘制橡皮线,新画的总是覆盖了原来画

在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 

热点排行