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

ReleaseCapture()引发的奇怪有关问题,请帮帮忙!

2012-01-20 
ReleaseCapture()引发的奇怪问题,请帮帮忙!!各位高手帮帮忙啊,我写一个画多边形的程序,但遇到了一个很奇怪

ReleaseCapture()引发的奇怪问题,请帮帮忙!!
各位高手帮帮忙啊,我写一个画多边形的程序,但遇到了一个很奇怪的问题,原本图案已经画出来了,但是就在放开鼠标的时候原本从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);
}

------解决方案--------------------


你不是画图吗,你不会想在非客户区也画图吧!
你要是想保留这样的想法的话,试一下把CView::OnLButtonUp(nFlags, point);这句话注释掉。
ReleaseCapture(); 
//CView::OnLButtonUp(nFlags, point);
[解决办法]
LbuttonDown里有个SetCapture可以理解
但是mousemove里的setcapture是作什么用的呢?mousemove里的setcapture又由谁来释放呢??
去掉mousemove里的SetCapture应该就没事了..

热点排行