请教:如何象Windows附近的画图程序那样画矩形?主要有两个问题:1.是背景透明,2是拖动的时候没有闪烁感,很流畅! 如题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 重载OnSetCursor()return true 就可以了、 使用XOR模式画,在画新的巨型之前先用原来数据再画一次,这样原来的巨型就被消掉,这种方法不用刷新窗口的背景,也就没有闪烁了。 我的代码void CPdaMapClientView::OnMouseMove(UINT nFlags, CPoint point) { if(m_sb.OutInModelFlag!=-1 && m_sb.DragFlag) { RECT rect; rect.left=m_sb.StartPoint.x; rect.top=m_sb.StartPoint.y; rect.right=m_sb.MovePoint.x; rect.bottom=m_sb.MovePoint.y; //InvalidateRect(&rect); //擦掉以前的矩形 //UpdateWindow(); 太闪烁 CDC *pDC=GetDC(); pDC->SetROP2(R2_XORPEN); //原来矩形擦掉 pDC->Rectangle(&rect); pDC->SetROP2(R2_MASKPEN); pDC->Rectangle(m_sb.StartPoint.x,m_sb.StartPoint.y,point.x,point.y); ReleaseDC(pDC); m_sb.MovePoint=point; //记录当前位置,以便下次擦除 } CView::OnMouseMove(nFlags, point);}可是有问题我的视窗口显示了一副图片,我要在图片上以矩形选择某个范围不能将图片擦掉,不能闪烁 void CPdaMapClientView::OnMouseMove(UINT nFlags, CPoint point) { if(m_sb.OutInModelFlag!=-1 && m_sb.DragFlag) { RECT rect; rect.left=m_sb.StartPoint.x; rect.top=m_sb.StartPoint.y; rect.right=m_sb.MovePoint.x; rect.bottom=m_sb.MovePoint.y; //InvalidateRect(&rect); //擦掉以前的矩形 //UpdateWindow(); 太闪烁 CDC *pDC=GetDC(); pDC->SetROP2(R2_XORPEN); //原来矩形擦掉 pDC->Rectangle(&rect); //pDC->SetROP2(R2_MASKPEN); //继续用XORPEN pDC->Rectangle(m_sb.StartPoint.x,m_sb.StartPoint.y,point.x,point.y); ReleaseDC(pDC); m_sb.MovePoint=point; //记录当前位置,以便下次擦除 } CView::OnMouseMove(nFlags, point);} to FFXI(黑):还是不行可以这样说,先画一条线在视窗口上,不管视窗口背景显示的是什么,然后如何再画一条线将原来的线擦除 用内存DC可以,先CreateCompatibleDC()创建DC后,在上面画,用到时拷贝上去,可以保证不闪烁,,,你也可以用背景色重新画矩形,这样就搽去原先的矩形了 .h:private: POINT spt; //开始点 BOOL dragflag; //鼠标按下标志 POINT mpt; //移动点.cpp:void CMfcshowpicView::OnLButtonDown(UINT nFlags, CPoint point) { dragflag=TRUE; spt=point; mpt=point; CView::OnLButtonDown(nFlags, point);}void CMfcshowpicView::OnMouseMove(UINT nFlags, CPoint point) { if(dragflag) { CDC *pDC=GetDC(); RECT rect; rect.left=spt.x; rect.top=spt.y; rect.right=mpt.x; rect.bottom=mpt.y; pDC->SetROP2(R2_XORPEN); pDC->Rectangle(&rect); pDC->Rectangle(&rect); //擦不掉 pDC->SetROP2(R2_MASKPEN);//设置成该模式才不会将矩形区域里的图片象素擦掉 pDC->Rectangle(spt.x,spt.y,point.x,point.y); mpt=point; ReleaseDC(pDC); } CView::OnMouseMove(nFlags, point);}void CMfcshowpicView::OnLButtonUp(UINT nFlags, CPoint point) { dragflag=FALSE; CView::OnLButtonUp(nFlags, point);} 如何让多个exe顺序执行 我知道这个很简单,读取文件错误 怎样把一个单文档编写的程序做成一个DLL 枚举窗口的代码,怎么不行啊,枚举不完哦(10行代码) 我知道这个问题很幼稚 怎样写自己的COM?? 完成端口中去主动连接别的主机,使用WSAConnect后该怎么才能让完成端口得到IO通知呢? 奇怪的问题,调用的函数进不去 win32 application 在MFC中使用ADO连接数据库 help me 关于函数的传值问题??问题解决,当时给分 对话框背景问题
void CPdaMapClientView::OnMouseMove(UINT nFlags, CPoint point)
{
if(m_sb.OutInModelFlag!=-1 && m_sb.DragFlag)
{
RECT rect;
rect.left=m_sb.StartPoint.x;
rect.top=m_sb.StartPoint.y;
rect.right=m_sb.MovePoint.x;
rect.bottom=m_sb.MovePoint.y;
//InvalidateRect(&rect); //擦掉以前的矩形
//UpdateWindow(); 太闪烁
CDC *pDC=GetDC();
pDC->SetROP2(R2_XORPEN); //原来矩形擦掉
pDC->Rectangle(&rect);
pDC->SetROP2(R2_MASKPEN);
pDC->Rectangle(m_sb.StartPoint.x,m_sb.StartPoint.y,point.x,point.y);
ReleaseDC(pDC);
m_sb.MovePoint=point; //记录当前位置,以便下次擦除
}
CView::OnMouseMove(nFlags, point);
}可是有问题我的视窗口显示了一副图片,我要在图片上以矩形选择某个范围
不能将图片擦掉,不能闪烁
{
if(m_sb.OutInModelFlag!=-1 && m_sb.DragFlag)
{
RECT rect;
rect.left=m_sb.StartPoint.x;
rect.top=m_sb.StartPoint.y;
rect.right=m_sb.MovePoint.x;
rect.bottom=m_sb.MovePoint.y;
//InvalidateRect(&rect); //擦掉以前的矩形
//UpdateWindow(); 太闪烁
CDC *pDC=GetDC();
pDC->SetROP2(R2_XORPEN); //原来矩形擦掉
pDC->Rectangle(&rect);
//pDC->SetROP2(R2_MASKPEN); //继续用XORPEN
pDC->Rectangle(m_sb.StartPoint.x,m_sb.StartPoint.y,point.x,point.y);
ReleaseDC(pDC);
m_sb.MovePoint=point; //记录当前位置,以便下次擦除
}
CView::OnMouseMove(nFlags, point);
}
如何再画一条线将原来的线擦除
private:
POINT spt; //开始点
BOOL dragflag; //鼠标按下标志
POINT mpt; //移动点
.cpp:
void CMfcshowpicView::OnLButtonDown(UINT nFlags, CPoint point)
{
dragflag=TRUE;
spt=point;
mpt=point;
CView::OnLButtonDown(nFlags, point);
}void CMfcshowpicView::OnMouseMove(UINT nFlags, CPoint point)
{
if(dragflag)
{
CDC *pDC=GetDC();
RECT rect;
rect.left=spt.x;
rect.top=spt.y;
rect.right=mpt.x;
rect.bottom=mpt.y;
pDC->SetROP2(R2_XORPEN);
pDC->Rectangle(&rect);
pDC->Rectangle(&rect); //擦不掉
pDC->SetROP2(R2_MASKPEN);//设置成该模式才不会将矩形区域里的图片象素擦掉
pDC->Rectangle(spt.x,spt.y,point.x,point.y);
mpt=point;
ReleaseDC(pDC);
}
CView::OnMouseMove(nFlags, point);
}void CMfcshowpicView::OnLButtonUp(UINT nFlags, CPoint point)
{
dragflag=FALSE;
CView::OnLButtonUp(nFlags, point);
}