各位高手帮帮忙啊,我写一个画多边形的程序,但遇到了一个很奇怪的问题,原本图案已经画出来了,但是就在放开鼠标的时候原本从HeadPoint到EndPoint的红色线却变成了灰色线,经我测试发现问题出现在鼠标放开的时候,但奇怪的也就在这里了,在OnLButtonUp这个函数里我只写了一句ReleaseCapture();没有其他的代码,应该是不会有影响才对的,可为什么会有这种奇怪的现象出现??而且,当我吧ReleaseCapture();这句话删掉时,程序正常了!!!弄得我一头雾水~~~难道真的是ReleaseCapture();这个函数出问题????函数功能说明:点击第一下的时候记录第一个点HeadPoint,用异或绘图画HeadPoint到TempPoint之间的移动直线,点击第二下的时候,记录第二个点EndPoint,移动过程中用异或绘图绘制HeadPoint到TempPoint的移动直线及EndPoint到TempPoint之间的移动直线,再点击,将新点击的位置记录为EndPoint,与上一步操作相同;双击时停止绘图.移动直线一律用灰色线,固定直线一致用红色线问题:在鼠标放开时在HeadPoint到EndPoint之间出现了不该出现的灰色线.代码已经贴出,请帮帮忙!!!谢谢了!!!这是参数:
CPoint HeadPoint,EndPoint;
int Count;
BYTE r;
BYTE g;
BYTE b;
BOOL BLNC;//底线需要擦除
CPoint TempPoint;//移动过程中鼠标所在的点
CPen *DrawPen;//画笔
CPen *GrayDrawPen;//灰色笔--绘图专用
int PenWidth;//画笔的宽度构造函数:
{
// TODO: 在此处添加构造代码
//RGB颜色赋值
r=255;
g=0;
b=0;
/////////////////////////////////////////////////////
GrayDrawPen=new CPen(PS_SOLID,0,RGB(128,128,128));
//画笔宽度
PenWidth=0;
//多边形边数
Count=0;
BLNC=FALSE;}双击时的消息响应函数:
OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
Count=0;
BLNC=0;CView::OnLButtonDblClk(nFlags, point);
}左键单击时的消息响应函数:
OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
SetCapture();
SetCursor(LoadCursor(NULL,IDC_CROSS)); CDC *pDC=GetDC();
CRect rect;
GetClientRect(&rect); DrawPen=new CPen(PS_SOLID,PenWidth,RGB(r,g,b)); if (Count==0)
{
Count++;
HeadPoint=point;
}
else if (Count==1)
{
//擦除
pDC->SelectObject(GrayDrawPen);
pDC->SetROP2(R2_XORPEN);
pDC->MoveTo(HeadPoint);
pDC->LineTo(TempPoint);
//画覆盖线
pDC->SelectObject(DrawPen);
pDC->SetROP2(R2_COPYPEN);
pDC->MoveTo(HeadPoint);
pDC->LineTo(point);
Count++;
EndPoint=point;
}
else 
{
//擦除
pDC->SelectObject(GrayDrawPen);
pDC->SetROP2(R2_XORPEN);
pDC->MoveTo(HeadPoint);
pDC->LineTo(TempPoint);
pDC->MoveTo(EndPoint);
pDC->LineTo(TempPoint);
pDC->SelectObject(DrawPen);
pDC->SetROP2(R2_COPYPEN);
pDC->MoveTo(HeadPoint);
pDC->LineTo(point);
pDC->MoveTo(EndPoint);
pDC->LineTo(point);
EndPoint=point;
}
BLNC=FALSE;
delete DrawPen; ReleaseDC(pDC); CView::OnLButtonDown(nFlags, point);
}左键放开时的消息响应函数:
OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
ReleaseCapture();
CView::OnLButtonUp(nFlags, point);
}鼠标移动时的消息响应函数:
OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
SetCapture();
SetCursor(LoadCursor(NULL,IDC_CROSS));
CRect rect;
GetClientRect(&rect);
CDC *pDC=GetDC(); pDC->SelectObject(GrayDrawPen);
pDC->SetROP2(R2_XORPEN);
if (Count==1)

if (BLNC)
{
pDC->MoveTo(HeadPoint);
pDC->LineTo(TempPoint);
}
else 
BLNC=TRUE;
pDC->MoveTo(HeadPoint);
pDC->LineTo(point);
TempPoint=point;
}
else if (Count==2)
{
if (BLNC)
{
pDC->MoveTo(HeadPoint);
pDC->LineTo(TempPoint);
pDC->MoveTo(EndPoint);
pDC->LineTo(TempPoint);
}
else 
BLNC=TRUE;
pDC->MoveTo(HeadPoint);
pDC->LineTo(point);
pDC->MoveTo(EndPoint);
pDC->LineTo(point);
TempPoint=point;
} CView::OnMouseMove(nFlags, point);
}

解决方案 »

  1.   

    去掉SetCapture()和ReleaseCapture(); 
    试试
     
      

  2.   

    这是一个办法,我是过了,可以.
    但鼠标移动时如果在非客户就感应不到了,而且我是想知道ReleaseCapture();那里到底是怎么回事,为什么会有错,明明是一句毫无相关的代码,可为什么却会出现这种情况.
    不过谢谢你的回答!
      

  3.   

    你不是画图吗,你不会想在非客户区也画图吧!
    你要是想保留这样的想法的话,试一下把CView::OnLButtonUp(nFlags,   point);这句话注释掉。
    ReleaseCapture(); 
    //CView::OnLButtonUp(nFlags,   point); 
      

  4.   

    你这个程序有了SetCapture之后问题蛮多的,你自己分析看看,即使LButtonDown,只要你鼠标有移动,就会就会出发OnMouseMove,又SetCapture,这样会影响其他程序的运行。
    建议你去掉SetCapture。
      

  5.   

    LbuttonDown里有个SetCapture可以理解
    但是mousemove里的setcapture是作什么用的呢?mousemove里的setcapture又由谁来释放呢??
    去掉mousemove里的SetCapture应该就没事了..
      

  6.   

    需要一对一这样来Set和Release吗?