class CMyDlg : public CDialog
{
...
protected:
   BOOL m_bLBtnDown;
   CPoint m_ptStart;
   CArray<CPoint> m_ptArr;
};void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
   m_bLBtnDown = TRUE;
   m_ptStart = point;
   CDialog::OnLButtonDown(nFlags, point);
}void CMyDlg::OnMouseMove(UINT nFlags, CPoint point)
{
m_ptArr.Add( point );
if( m_ptArr.GetSize() == 3 )
{
m_ptArr.RemoveAt( 0 );
}
ASSERT( m_ptArr.GetSize() <= 2 );
CClientDC dc( this );
if( m_ptArr.GetSize() == 2 )
{
dc.SetROP2( R2_XORPEN ); 
if( m_bLBtnDown )
{
dc.MoveTo( m_ptStart );
dc.LineTo( m_ptArr[0] );
}
}
if( m_bLBtnDown )
{
dc.MoveTo( m_ptStart );
dc.LineTo( point );
}
TRACE1 ( "m_ptArr.GetSize() = %d\n", m_ptArr.GetSize() );
CDialog::OnMouseMove(nFlags, point);
}void CMyDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
m_bLBtnDown = FALSE;
CDialog::OnLButtonUp(nFlags, point);
}

解决方案 »

  1.   

    给你个画矩形的  你看看有什么不同,这段代码在mousemove中//m_ptStart、m_ptPre、m_ptEnd分别为起始点、鼠标移动前的虚终点、终点
    pOldBrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH);
    nOldMode = pDC->SetROP2(R2_NOTXORPEN);   //或者是XORPEN   
    pDC->Rectangle(m_ptStart.x, m_ptStart.y, m_ptPre.x, m_ptPre.y);  //擦除之前的矩形
    pDC->Rectangle(m_ptStart.x, m_ptStart.y, m_ptEnd.x, m_ptEnd.y);  //绘制当前的矩形
    pDC->SetROP2(nOldMode);
    pDC->SelectObject(pOldBrush );
      

  2.   

    http://blog.sina.com.cn/s/blog_5f30147a0100dwzb.html
    可以参考一下
      

  3.   

    我已经知道了,谢谢各位,我是使用了系统默认的黑色画笔,即0x00000000,用这个数与任何数异或等于任何数,于是看不到画的直线。解决办法是,创建一个白色默认画笔,让其在鼠标左键释放之前填充移动的直线,在鼠标左键松开时在使用自定义的画笔再画一条直线。这样就实现了根Flash一模一样的画直线的效果!