急:关于VC/MFC绘图的弱问题? 各位大大,我刚接触vc不久,最近写一个简单地2D绘图程序,有一个弱弱的问题:画一条线后,再画另外一条线时,两条线重叠的部分线都消失了,是我用的绘图设置不对吗?我试了SetROP2中所有的参数,都是一样,哪位大侠指点一下,谢了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 void CDLine::DrawStatic(CDC*pDC){ CPen m_pen; m_pen.CreatePen(m_PenStyle,m_PenWidth,m_PenColor); CPen* pen=(CPen*)pDC->SelectObject(&m_pen); int oldDrawingMode=pDC->SetROP2(m_DrawingMode); COLORREF OldColor=pDC->SetBkColor(m_BackgroundColor); int OldBkMode=pDC->SetBkMode(m_BkMode); pDC->MoveTo(m_FirstPoint); pDC->LineTo(m_SecondPoint); pDC->SelectObject(pen); pDC->SetROP2(oldDrawingMode); pDC->SetBkMode(m_BkMode); pDC->SetBkColor(OldColor);}...void CUnit::Initial(){ m_BkMode=TRANSPARENT; m_Rgn=NULL; m_FirstPoint=0; m_SecondPoint=0; m_PenColor=RGB(0,0,0); m_BrushColor=RGB(0,0,0); m_BackgroundColor=RGB(255,255,255); m_PenWidth=1; m_PenStyle=PS_SOLID; m_DrawingMode=R2_COPYPEN; //m_DrawingMode=16; m_HaveLBUp=false; m_HaveFindFirst=false; m_DrawStatus=Draw_Status;} 最近也正在写画图,直线的动态画法,最好不要用 SetROP2 (异或)去画,因为无论如何,异或,或者反(异或)都肯定要改变直线的颜色的。应该在鼠标按下时,用一个DC来保存先前的图像,在每次鼠标移动时覆盖视图DC(注意脏矩形优化),画直线要直接在Cview 的DC上画,不要在背景缓冲DC上画。在鼠标弹起时再保存到背景缓冲DC上。如果你非要用异或模式来画直线,如下:异或绘图方式花直线,的弊端在于,非白色背景时,线条的颜色是改变了的。(虽然最终的颜色不变)在OnMouseMove 中如下写: CPen * pPen,pen; pen.CreatePen(PS_SOLID,1,pWnd->m_ClrBox.GetFrontClr()); pPen = m_DCCanView.SelectObject(&pen); //m_DCCanView 是背景缓冲DC //设置系统色彩模式取“反异或”色 int oldRop = m_DCCanView.SetROP2(R2_NOTXORPEN); // 画线 m_DCCanView.MoveTo(m_PrePoint); m_DCCanView.LineTo(m_PrePoint2); //注意这里不能把系统模式设置回去,因为只有是“反抑或”模式才能被擦除。 m_DCCanView.MoveTo(m_PrePoint); m_DCCanView.LineTo(point); m_PrePoint2 = point; this->Invalidate(FALSE);在OnMouseUp 中进行最后的擦除和画线,把DC的缺省模式设置回来。略。 在鼠标移动的时候我会调用这个方法我试过R2_NOTXORPEN,结果也是一样能告诉我怎么改吗void CDLine::DrawActive(CDC *pDC,CPoint point){ CPen m_pen; m_pen.CreatePen(m_PenStyle,m_PenWidth,m_PenColor); CPen* pen=(CPen*)pDC->SelectObject(&m_pen); COLORREF OldColor=pDC->SetBkColor(m_BackgroundColor); int OldBkMode=pDC->SetBkMode(m_BkMode); pDC->MoveTo(m_FirstPoint); pDC->LineTo(m_SecondPoint); pDC->SelectObject(pen); pDC->SetBkMode(m_BkMode); pDC->SetBkColor(OldColor);} void CDLine::DrawActive(CDC *pDC,CPoint point) { CPen m_pen; m_pen.CreatePen(m_PenStyle,m_PenWidth,m_PenColor); CPen* pen=(CPen*)pDC->SelectObject(&m_pen); pDC->MoveTo(m_FirstPoint); pDC->LineTo(m_SecondPoint); pDC->SelectObject(pen); m_pen.DeleteObject()}将代码改成这样试试效果! 不会是Initial函数没有调用吧? void CDLine::DrawStatic(CDC*pDC) 和void CUnit::Initial()都在哪调用的.贴上看看. 你的这连个坐标是怎么得的?注意要3个点才能画出直线。第一点:m_PrePoint 在鼠标按下时储存第二点:m_PrePoint2 和第三点 point 在鼠标移动时得到 // 擦除上次的直线(因为是异或模式,所以画2次就擦除) m_DCCanView.MoveTo(m_PrePoint); m_DCCanView.LineTo(m_PrePoint2); //画当前直线 //注意这里不能把系统模式设置回去,因为只有是“反抑或”模式才能被擦除。 m_DCCanView.MoveTo(m_PrePoint); m_DCCanView.LineTo(point); m_PrePoint2 = point; 你肯定调用了SetROP2设置了画图模式,所以去掉它即可。 vc++6.0编译DirectX 9.0 SDK下的baseclasses问题 MFC 调用对话框时,出现“OUT OF memory”错误 元旦将至,祝大家元旦快乐! chtmlview如何禁止点击链接? 请推荐几本OLE DB编程的书,要中文版的,最好电子书 点击botton控件后,如何让其弹出一个窗口 在vc中如何用ado打开sql数据库? VC/MFC版面上的各位朋友!看在本人也算比较积极的回答问题的份上,请帮在下一把 关于向导对话框的问题(菜!) vc里面有没有创建以CObject派生的新类,自己写很麻烦。 ado修改数据 DirectShow编程mpg文件有时打不开
{
CPen m_pen;
m_pen.CreatePen(m_PenStyle,m_PenWidth,m_PenColor);
CPen* pen=(CPen*)pDC->SelectObject(&m_pen);
int oldDrawingMode=pDC->SetROP2(m_DrawingMode);
COLORREF OldColor=pDC->SetBkColor(m_BackgroundColor);
int OldBkMode=pDC->SetBkMode(m_BkMode); pDC->MoveTo(m_FirstPoint);
pDC->LineTo(m_SecondPoint); pDC->SelectObject(pen);
pDC->SetROP2(oldDrawingMode);
pDC->SetBkMode(m_BkMode);
pDC->SetBkColor(OldColor);
}...void CUnit::Initial()
{
m_BkMode=TRANSPARENT;
m_Rgn=NULL;
m_FirstPoint=0;
m_SecondPoint=0;
m_PenColor=RGB(0,0,0);
m_BrushColor=RGB(0,0,0);
m_BackgroundColor=RGB(255,255,255);
m_PenWidth=1;
m_PenStyle=PS_SOLID;
m_DrawingMode=R2_COPYPEN;
//m_DrawingMode=16;
m_HaveLBUp=false;
m_HaveFindFirst=false;
m_DrawStatus=Draw_Status;}
应该在鼠标按下时,用一个DC来保存先前的图像,在每次鼠标移动时覆盖视图DC(注意脏矩形优化),画直线要直接在Cview 的DC上画,不要在背景缓冲DC上画。在鼠标弹起时再保存到背景缓冲DC上。如果你非要用异或模式来画直线,如下:
异或绘图方式花直线,的弊端在于,非白色背景时,线条的颜色是改变了的。(虽然最终的颜色不变)
在OnMouseMove 中如下写: CPen * pPen,pen;
pen.CreatePen(PS_SOLID,1,pWnd->m_ClrBox.GetFrontClr());
pPen = m_DCCanView.SelectObject(&pen); //m_DCCanView 是背景缓冲DC //设置系统色彩模式取“反异或”色
int oldRop = m_DCCanView.SetROP2(R2_NOTXORPEN);
// 画线
m_DCCanView.MoveTo(m_PrePoint);
m_DCCanView.LineTo(m_PrePoint2);
//注意这里不能把系统模式设置回去,因为只有是“反抑或”模式才能被擦除。
m_DCCanView.MoveTo(m_PrePoint);
m_DCCanView.LineTo(point);
m_PrePoint2 = point;
this->Invalidate(FALSE);在OnMouseUp 中进行最后的擦除和画线,把DC的缺省模式设置回来。略。
我试过R2_NOTXORPEN,结果也是一样
能告诉我怎么改吗void CDLine::DrawActive(CDC *pDC,CPoint point)
{
CPen m_pen;
m_pen.CreatePen(m_PenStyle,m_PenWidth,m_PenColor);
CPen* pen=(CPen*)pDC->SelectObject(&m_pen); COLORREF OldColor=pDC->SetBkColor(m_BackgroundColor);
int OldBkMode=pDC->SetBkMode(m_BkMode); pDC->MoveTo(m_FirstPoint);
pDC->LineTo(m_SecondPoint);
pDC->SelectObject(pen); pDC->SetBkMode(m_BkMode);
pDC->SetBkColor(OldColor);
}
{
CPen m_pen;
m_pen.CreatePen(m_PenStyle,m_PenWidth,m_PenColor);
CPen* pen=(CPen*)pDC->SelectObject(&m_pen);
pDC->MoveTo(m_FirstPoint);
pDC->LineTo(m_SecondPoint);
pDC->SelectObject(pen);
m_pen.DeleteObject()
}将代码改成这样试试效果!
和
void CUnit::Initial()
都在哪调用的.
贴上看看.
第一点:m_PrePoint 在鼠标按下时储存
第二点:m_PrePoint2 和第三点 point 在鼠标移动时得到 // 擦除上次的直线(因为是异或模式,所以画2次就擦除)
m_DCCanView.MoveTo(m_PrePoint);
m_DCCanView.LineTo(m_PrePoint2);
//画当前直线
//注意这里不能把系统模式设置回去,因为只有是“反抑或”模式才能被擦除。
m_DCCanView.MoveTo(m_PrePoint);
m_DCCanView.LineTo(point);
m_PrePoint2 = point;