我直接在对话框上画线。
不多说,给出我的关键代码:
class CMainDialog:public CDialog
{
public:
CMainDialog(CWnd* pParentWnd = NULL);
protected:
virtual BOOL OnInitDialog();
afx_msg void OnLButtonDown(UINT nFlags,CPoint point);
afx_msg void OnLButtonUp(UINT nFlags,CPoint point);
afx_msg void OnMouseMove(UINT nFlags,CPoint point);
DECLARE_MESSAGE_MAP()
protected:
CPen black_Pen;   //一些数据
CPen gray_Pen;
BOOL m_bDraw;
CPoint m_StartPoint;
CPoint m_EndPoint;
};//...void CMainDialog::OnLButtonDown(UINT nFlags, CPoint point) //左键按下时,记录下头尾位置
{
m_bDraw=TRUE;
m_StartPoint=m_EndPoint=point;
CDialog::OnLButtonDown(nFlags,point);
}void CMainDialog::OnLButtonUp(UINT nFlags, CPoint point)  //左键放开,画线结束
{
m_bDraw=FALSE;
CDialog::OnLButtonUp(nFlags,point);
}void CMainDialog::OnMouseMove(UINT nFlags, CPoint point) //鼠标移动时,先擦除,再画线
{
if(m_bDraw)
{
CDC* pDC=GetDC(); pDC->SelectObject(&gray_Pen);
pDC->MoveTo(m_StartPoint);                        //用底色重画
pDC->LineTo(m_EndPoint);
pDC->SelectStockObject(BLACK_PEN); CPen* pOldPen=pDC->SelectObject(&black_Pen);
m_EndPoint=point;
pDC->MoveTo(m_StartPoint);                       //画新线
pDC->LineTo(m_EndPoint); pDC->SelectObject(pOldPen);
}
CDialog::OnMouseMove(nFlags,point);
}症状:移动鼠标画线时,线段上有闪烁现象。我试着用Windows自带的画图程序画线,没有闪烁现象。如果原先的位置已经画过了其它的线段,那么新画线时会擦除掉经过的区域的直线。请问,这两个问题该怎么解决?先谢过了,等待指点

解决方案 »

  1.   

    1.不要在OnMouseMove直接画,在这里可以InvalidateRect(); 在OnPaint中画。2.在OnPaint中如果画的工作量较大,可以先画到内存设备上,再贴上,(即单缓冲)
     如果有不变的图片背景,可将背影保存到成员内存设备中,合起来就是
    双缓冲
      

  2.   

    把你OnMouseMove中的绘图代码放到 OnPaint
    在OnMouseMove中用InvalidateRect();来进行刷新
      

  3.   

    http://topic.csdn.net/u/20100303/18/a8239680-d351-43b1-85ef-7e6ac3f68632.html
      

  4.   

    给你个例子吧,你只需要改一个你的OnMouseMove函数即可: if(m_bDraw)
    {
    CDC *pDC = GetDC();
    int nMode = pDC->SetROP2(R2_NOTXORPEN);
    pDC->MoveTo(m_StartPoint);
    pDC->LineTo(m_EndPoint); pDC->MoveTo(m_StartPoint);
    pDC->LineTo(point);
    m_EndPoint = point;
    pDC->SetROP2(nMode);
    ReleaseDC(pDC);
    }
      

  5.   

    谢谢大家的关注,xsc2001 的建议解决了破坏原有图形的问题,谢谢了。结贴,给分。