mfc 绘图问题~急
我想通过DrawPoly函数画一个矩形,并用OnLButtonDown和OnMouseMove来画直线进行裁剪,可运行结果总是不能实时的显示画线的过程,而再一次画线的时候...
我想通过DrawPoly函数画一个矩形,并用OnLButtonDown和OnMouseMove来画直线进行裁剪,可运行结果总是不能实时的显示画线的过程,而再一次画线的时候才会显示上次的裁剪结果,求教高手该如何修改??
void CComputerGraphicsView::DrawPoly()
{
CRect Rect;
GetClientRect(&Rect);//获得客户区的大小
CBitmap Bitmap,*pBitmap;
Bitmap.LoadBitmap(IDB_BITMAP);
CDC MemDC;
MemDC.CreateCompatibleDC(GetDC());
pBitmap=MemDC.SelectObject(&Bitmap);
MemDC.BitBlt(0,0,Rect.Width(),Rect.Height(),&Picture,0,0,SRCCOPY);
MemDC.TextOut((wxl+wxr)/2,wyb-20,"窗口");//窗口标题
//绘制窗口和直线
CPen Pen3,*pOldPen3;//定义3个像素宽度的画笔
Pen3.CreatePen(PS_SOLID,3,RGB(0,0,0));
pOldPen3=MemDC.SelectObject(&Pen3);
MemDC.MoveTo(wxl,wyt);MemDC.LineTo(wxr,wyt);
MemDC.LineTo(wxr,wyb);MemDC.LineTo(wxl,wyb);
MemDC.LineTo(wxl,wyt);MemDC.SelectObject(pOldPen3);
Pen3.DeleteObject();
CPen Pen1,*pOldPen1;//定义1个像素宽度的画笔
Pen1.CreatePen(PS_SOLID,1,RGB(0,0,255));
pOldPen1=MemDC.SelectObject(&Pen1);
if(m_i>=1)
{
MemDC.MoveTo(ROUND(Pointx[0]),ROUND(Pointy[0]));
MemDC.LineTo(ROUND(Pointx[1]),ROUND(Pointy[1]));
}
MemDC.SelectObject(pOldPen1);
Pen1.DeleteObject();
CDC *dc=GetDC();
dc->BitBlt(0,0,Rect.Width(),Rect.Height(),&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pBitmap);
}
void CComputerGraphicsView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(flag==0)
{
Seed=point;//选择种子位置
PolygonFill2();//进行填充
}
if(flag==1)
{
if(TRUE==m_Draw)
{
if(m_i<2)
{
Pointx[m_i]=point.x;Pointy[m_i]=point.y;
m_i++;
}
}
}
CView::OnLButtonDown(nFlags, point);
}
void CComputerGraphicsView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(flag==1)
{
if(TRUE==m_Draw)
{
if(m_i<2)
{
Pointx[m_i]=point.x;Pointy[m_i]=point.y;
Invalidate(FALSE);
}
}
}
CView::OnMouseMove(nFlags, point);
} 展开
void CComputerGraphicsView::DrawPoly()
{
CRect Rect;
GetClientRect(&Rect);//获得客户区的大小
CBitmap Bitmap,*pBitmap;
Bitmap.LoadBitmap(IDB_BITMAP);
CDC MemDC;
MemDC.CreateCompatibleDC(GetDC());
pBitmap=MemDC.SelectObject(&Bitmap);
MemDC.BitBlt(0,0,Rect.Width(),Rect.Height(),&Picture,0,0,SRCCOPY);
MemDC.TextOut((wxl+wxr)/2,wyb-20,"窗口");//窗口标题
//绘制窗口和直线
CPen Pen3,*pOldPen3;//定义3个像素宽度的画笔
Pen3.CreatePen(PS_SOLID,3,RGB(0,0,0));
pOldPen3=MemDC.SelectObject(&Pen3);
MemDC.MoveTo(wxl,wyt);MemDC.LineTo(wxr,wyt);
MemDC.LineTo(wxr,wyb);MemDC.LineTo(wxl,wyb);
MemDC.LineTo(wxl,wyt);MemDC.SelectObject(pOldPen3);
Pen3.DeleteObject();
CPen Pen1,*pOldPen1;//定义1个像素宽度的画笔
Pen1.CreatePen(PS_SOLID,1,RGB(0,0,255));
pOldPen1=MemDC.SelectObject(&Pen1);
if(m_i>=1)
{
MemDC.MoveTo(ROUND(Pointx[0]),ROUND(Pointy[0]));
MemDC.LineTo(ROUND(Pointx[1]),ROUND(Pointy[1]));
}
MemDC.SelectObject(pOldPen1);
Pen1.DeleteObject();
CDC *dc=GetDC();
dc->BitBlt(0,0,Rect.Width(),Rect.Height(),&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pBitmap);
}
void CComputerGraphicsView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(flag==0)
{
Seed=point;//选择种子位置
PolygonFill2();//进行填充
}
if(flag==1)
{
if(TRUE==m_Draw)
{
if(m_i<2)
{
Pointx[m_i]=point.x;Pointy[m_i]=point.y;
m_i++;
}
}
}
CView::OnLButtonDown(nFlags, point);
}
void CComputerGraphicsView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(flag==1)
{
if(TRUE==m_Draw)
{
if(m_i<2)
{
Pointx[m_i]=point.x;Pointy[m_i]=point.y;
Invalidate(FALSE);
}
}
}
CView::OnMouseMove(nFlags, point);
} 展开
2个回答
展开全部
1、在你画好图形后发送一个WM_PAINT消息给窗口。
2、你可以在你画好图形之后执行一下UpdateData();或UpdateWindow();
就可以啦!
还有,在你创建了对象或其他时最好还是让人家有始有终。也就是释放对象等的操作……
2、你可以在你画好图形之后执行一下UpdateData();或UpdateWindow();
就可以啦!
还有,在你创建了对象或其他时最好还是让人家有始有终。也就是释放对象等的操作……
更多追问追答
追问
好像都不行呢。我程序用了所谓的双缓冲,这个有没有关系?
追答
那你调调OnLButtonDown(UINT nFlags, CPoint point) 函数里面的执行顺序好好研究一下。
这个没有关系的 。
对了,你没有OnLButtonUp(UINT nFlags, CPoint point)消息函数,然后那个flag是鼠标按下的次数是吧!当然也就要当再次按下时才执行的。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询