一个很简单的单文档试图应用程序
    建好名为Huaban的项目后,为CHuabanDoc添加四个成员变量,如下:
         // 起始点
CPoint m_startpt;
// 终点
CPoint m_endpt;
// 表示图形类型  0:直线   1:椭圆  2:矩形
int m_state;
// 标志鼠标是否处于拖动状态  0:否  1;是
int m_isdrag;并在CHuabanView类中激活消息  WM_CHAR,WM_LBUTTONDOWN,WM_LBUTTONUP,WM_MOUSEMOVE,函数修改后的代码如下:
void CHuabanView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(nChar=='L'||nChar=='l')
{
GetDocument()->m_state=0;
}
else if(nChar=='E'||nChar=='e')
{
        GetDocument()->m_state=1;
}
else if(nChar=='R'||nChar=='r')
{
        GetDocument()->m_state=2;
} CView::OnChar(nChar, nRepCnt, nFlags);
}void CHuabanView::OnLButtonDown(UINT nFlags, CPoint point)
{
CHuabanDoc* pDoc=GetDocument(); pDoc->m_startpt=point;
pDoc->m_endpt=point; pDoc->m_isdrag=1; CView::OnLButtonDown(nFlags, point);
}void CHuabanView::OnLButtonUp(UINT nFlags, CPoint point)
{
CHuabanDoc* pDoc=GetDocument();
CClientDC dc(this); pDoc->m_isdrag=0;
pDoc->m_endpt=point;
if(pDoc->m_state==0)
{
dc.MoveTo(pDoc->m_startpt);
dc.LineTo(pDoc->m_endpt);
}
else if(pDoc->m_state==1)
{
dc.Ellipse(pDoc->m_startpt.x,pDoc->m_startpt.y,pDoc->m_endpt.x,pDoc->m_endpt.y);
}
else if(pDoc->m_state==2)
{
dc.Rectangle(pDoc->m_startpt.x,pDoc->m_startpt.y,pDoc->m_endpt.x,pDoc->m_endpt.y);
} CView::OnLButtonUp(nFlags, point);
}void CHuabanView::OnMouseMove(UINT nFlags, CPoint point)
{
CHuabanDoc* pDoc=GetDocument();
CClientDC dc(this);
dc.SetROP2(R2_NOT);
if(pDoc->m_isdrag==1)
{
if(pDoc->m_state==0)
{
dc.MoveTo(pDoc->m_startpt.x,pDoc->m_startpt.y);
dc.LineTo(pDoc->m_endpt.x,pDoc->m_endpt.y); pDoc->m_endpt=point; dc.MoveTo(pDoc->m_startpt.x,pDoc->m_startpt.y);
dc.LineTo(pDoc->m_endpt.x,pDoc->m_endpt.y);
}
else if(pDoc->m_state==1)
{
dc.Ellipse(pDoc->m_startpt.x,pDoc->m_startpt.y,pDoc->m_endpt.x,pDoc->m_endpt.y);
pDoc->m_endpt=point; dc.Ellipse(pDoc->m_startpt.x,pDoc->m_startpt.y,pDoc->m_endpt.x,pDoc->m_endpt.y);
}
else if(pDoc->m_state==2)
{
dc.Rectangle(pDoc->m_startpt.x,pDoc->m_startpt.y,pDoc->m_endpt.x,pDoc->m_endpt.y);
            pDoc->m_endpt=point;
            dc.Rectangle(pDoc->m_startpt.x,pDoc->m_startpt.y,pDoc->m_endpt.x,pDoc->m_endpt.y);
}
} CView::OnMouseMove(nFlags, point);
}
编译运行后,可以实行需要的功能,就是   
       按下L 或 l   鼠标移动画直线
       按下E 或 e   鼠标移动画椭圆
       按下R 或 r   鼠标移动画矩形
但是  我把OnMouseMove函数里面的第三句变成:dc.SetROP2(R2_BLACK);后,本来要画直线的时候画出来的就是扇形那样的了,大家可以试一下,我不知道怎么回事,希望高手能帮忙解释一下,谢谢了

解决方案 »

  1.   

    在R2_NOT(R2_NOT Pixel is the inverse of the screen color. )模式下,
    //这两句是擦除上一次的线
    dc.MoveTo(pDoc->m_startpt.x,pDoc->m_startpt.y);
    dc.LineTo(pDoc->m_endpt.x,pDoc->m_endpt.y);pDoc->m_endpt=point;
    //这两句才是真正的画图
    dc.MoveTo(pDoc->m_startpt.x,pDoc->m_startpt.y);
    dc.LineTo(pDoc->m_endpt.x,pDoc->m_endpt.y);
    而在R2_BLACK(R2_BLACK Pixel is always 0. )模式下,不能擦除原来的线,都是黑色
      

  2.   

    所以在R2_BLACK下就会出现无数的线,原因就是没把原来的线擦除
      

  3.   

    用NOT,进行取反绘制。如果原来的位置已经画了图形,将被擦除,否则将绘制出图形。
    用BLACK,则不会擦除,只会叠加绘制。