画直线 在VC的视图窗口中实现画直线,怎样实现如下功能1,点左键定坐标位,2,拖动鼠标画直线,3,放开鼠标完成画线第1和第3没问题,但是在第2步拖动鼠标时如果鼠标振动就会画出很多线条,这时如果刷新屏的话,屏就会很闪烁,请问有什么好方法简单画出两点直线 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 鼠标按下时记下该点坐标,鼠标松开时记下第二个点坐标,在ondraw函数里moveto一个点,再lineto第二个点 这个有点类似选择的橡皮框!楼主查一下橡皮线的画法!有擦除、贴图两种!擦除,是使用CDC::SetROP2,但是,处理不好的话,会脏的!贴图就方便了,每次在基本图上面画出当前的线,然后贴出来!效果较好,就是双缓冲! 用SetROP2设置绘图模式,再利用橡皮条技术反画,就不会出现很多线条了 好像是SetROP2(R2_NOTXORPEN),LZ看看Windows程序设计上面的讲解就明白了,不行就到下载频道随便下个画图代码看看 一例void CMSView::OnMouseMove(UINT nFlags, CPoint point){ if(nFlags & MK_LBUTTON) { CClientDC dc(this); // 变换系统座标,保存为逻辑座标 OnPrepareDC(&dc); dc.DPtoLP(&point); // 橡皮圈 dc.SetROP2(R2_NOT); m_pCurShape->Draw(&dc); m_pCurShape->Update(point); m_pCurShape->Draw(&dc); }}移动画线时需要画两次,第一次的目的是擦掉上一次的线,第二次是在新的位置画线。 直线起点记为: start_pt拖动鼠标时,前一个位置 记为: old_pt, 当前位置记为 curt_pt, 将 start_pt 和 old_pt 连起来,并且将该线的颜色设为白色,以达到擦去该线的目的再将start_pt 和curt_pt 连起来,将该线的颜色设为默认(黑色)即可 实现拖动鼠标画直线:void CTest2View::OnMouseMove(UINT nFlags, CPoint point) {m_MouseDownPoint=point;m_m_OldPoint=point;}void CMSView::OnMouseMove(UINT nFlags, CPoint point){CClientDC dc(this);dc.SetROP2(R2_NOT);if( m_OldPoint != point) { dc.MoveTo(m_MouseDownPoint);//m_MouseDownPoint记录鼠标按下的点 dc.LineTo(m_OldPoint); dc.MoveTo(MouseDownPoint); dc.LineTo(point); m_OldPoint=point; }} 1.定义起始位置点CPoint m_pStart;2.在OnLButtonDown(UINT nFlags, CPoint point)中m_pStart = point;3.在OnLButtonUp(UINT nFlags, CPoint point)中HDC hdc = ::GetDC(m_hWnd);MoveToEx(hdc,m_pStart.x,m_pStart.y,NULL);LineTo(hdc,point.x,point.y);::ReleaseDC(m_hWnd,hdc); 急!!!!帮忙看看这段程序!!!! 哪位大虾有vc读一个PE文件节表信息的代码 完成端口的使用 知道美国的一个IP地址,我PING它,如何知道经过了哪些网关? 对NT端口的操作,除了使用NT port还有其他方法吗? 如何使用GetTopWindow? 急,在线等,ADO连接oralce的连接字符串怎么写? 有用吧? 写了个比sqrtf()快一倍的sqrt()函数 在线程中捕获消息处理 我连接到sql server 7.0 数据库,但是每次连接时要重新输入密码才能通过,这是为什么? Edit Box初始化 关于图像大范围点阵处理中CPU命中导致速度慢的问题
擦除,是使用CDC::SetROP2,但是,处理不好的话,会脏的!
贴图就方便了,每次在基本图上面画出当前的线,然后贴出来!效果较好,就是双缓冲!
void CMSView::OnMouseMove(UINT nFlags, CPoint point)
{
if(nFlags & MK_LBUTTON)
{
CClientDC dc(this);
// 变换系统座标,保存为逻辑座标
OnPrepareDC(&dc);
dc.DPtoLP(&point); // 橡皮圈
dc.SetROP2(R2_NOT);
m_pCurShape->Draw(&dc);
m_pCurShape->Update(point);
m_pCurShape->Draw(&dc);
}
}
移动画线时需要画两次,第一次的目的是擦掉上一次的线,第二次是在新的位置画线。
拖动鼠标时,前一个位置 记为: old_pt,
当前位置记为 curt_pt, 将 start_pt 和 old_pt 连起来,并且将该线的颜色设为白色,以达到擦去该线的目的
再将start_pt 和curt_pt 连起来,将该线的颜色设为默认(黑色)即可
void CTest2View::OnMouseMove(UINT nFlags, CPoint point)
{
m_MouseDownPoint=point;
m_m_OldPoint=point;
}void CMSView::OnMouseMove(UINT nFlags, CPoint point)
{
CClientDC dc(this);
dc.SetROP2(R2_NOT);
if( m_OldPoint != point)
{
dc.MoveTo(m_MouseDownPoint);//m_MouseDownPoint记录鼠标按下的点
dc.LineTo(m_OldPoint);
dc.MoveTo(MouseDownPoint);
dc.LineTo(point);
m_OldPoint=point;
}
}
CPoint m_pStart;
2.在OnLButtonDown(UINT nFlags, CPoint point)中
m_pStart = point;
3.在OnLButtonUp(UINT nFlags, CPoint point)中
HDC hdc = ::GetDC(m_hWnd);
MoveToEx(hdc,m_pStart.x,m_pStart.y,NULL);
LineTo(hdc,point.x,point.y);
::ReleaseDC(m_hWnd,hdc);