见过画直线擦除以前留下的路径,但是画圆时留下的是一片阴影,如何解决这个问题。我用的程序是基于对话框的,用Invalidate()可以实现吗?而且另有个问题,当对话框拖动或者最小化后,以前画的就全没了,这又怎么解决?
解决方案 »
- 非模态对话框是不是收不到WM_MOUSEWHEEL消息
- 不知不觉失业刚好有一个月了,散分纪念。。。。
- 求教(有代码):opengl下,使用我们自己的代码来代替从库调用函数,比如glloadidentity
- SDK listview选择项问题
- 现在有150万的用户同时访问我的服务器,采用何种架构会更快速的访问到.比如SINA网是采用的什么架构呢?
- 请问dll中的隐式链接和显式链接的区别?谢谢,初学VC,多多帮助,在线等。
- WinZip软件的实现思路
- 如何使窗口大小不随双击标题栏改变?
- 我在程序中跟一个线程,但是跟不到,怎样才能一步一步的跟踪线程呢 ?请看我的程序代码
- CFindReplaceDialog如何与菜单里的查找关联起来
- 从int_ptr转换到int,会丢失数据吗???int_ptr是啥东东。。。
- 如何实现视图滚动!!!(去掉了 Document/View architecture support)
用Invalidate有个问题,就是当画完一个圆,再画一个圆时,会把原来的那个也擦掉。如何解决。
数据可以保存在Document里。
if(!(m_HLine||m_VLine||m_HVLine||m_BendLine||m_Rectangle||m_Circle1))return;
if(!m_FirstClick) return;
CPoint ScrollPoint;
ScrollPoint=GetScrollPosition();
//point.x+=ScrollPoint.x;
//point.y+=ScrollPoint.y;
CDC * pdc;
pdc=GetDC();
CPen pen,*OldPen;
pen.CreatePen(PenStyle,PenWidth,m_PenColor); //PS_SOLID
OldPen=pdc->SelectObject(&pen);
if(!m_BendLine)
SetCursor(LoadCursor(NULL,IDC_CROSS));
m_OldDrawMode=pdc->SetROP2(R2_NOTXORPEN);//重画时可以擦除原来的画线
m_End=point;
//画斜线
if(m_HVLine)
{
//擦去上次的画
pdc->MoveTo(m_Begin.x ,m_Begin.y );
pdc->LineTo(m_OldEnd.x ,m_OldEnd.y );
//重新绘画
pdc->MoveTo(m_Begin.x ,m_Begin.y );
pdc->LineTo(m_End.x ,m_End.y );
}
//画水平线
if(m_HLine)
{
//擦去上次的画
pdc->MoveTo(m_Begin.x ,m_Begin.y );
pdc->LineTo(m_OldEnd.x ,m_Begin.y );
//重新绘画
pdc->MoveTo(m_Begin.x ,m_Begin.y );
pdc->LineTo(m_End.x ,m_Begin.y );
}
//画竖直线
if(m_VLine)
{
//擦去上次的画
pdc->MoveTo(m_Begin.x ,m_Begin.y );
pdc->LineTo(m_Begin.x ,m_OldEnd.y );
//重新绘画
pdc->MoveTo(m_Begin.x ,m_Begin.y );
pdc->LineTo(m_Begin.x ,m_End.y );
}
//画矩形
if(m_Rectangle)
{
//擦去上次的画
pdc->Rectangle(CRect(m_Begin,m_OldEnd));
//重新绘画
pdc->Rectangle(CRect(m_Begin,m_End));
}
m_OldEnd=m_End;
pdc->SelectObject(OldPen);
ReleaseDC(pdc);
pen.DeleteObject();
CPoint m_Begin在LBUTTONDOWN中第一次单击时取得。
最后一次重画要在lBUTTONDOWN中画要不填充则设置OldBrush=(CBrush*)pdc->SelectStockObject(NULL_BRUSH);//创建一个不填充的画刷,否则选一个别的。