hur.cn - 华软网

 热门搜索

在视图上根据鼠标轨迹画连续的线

  作者:未知    来源:网络    更新时间:2010/4/19
就像画图里面的铅笔工具那样,按住鼠标左键,在视图上画出连续的线。
我在OnMouseMove里面这么做,鼠标移动快的话画出的点是不连续的,估计是一些鼠标移动的消息被合并了,我问问画图里面可能是使用的什么方法。如果两次点不连续,就用直线连接起来吗?
C++">void CTView::OnMouseMove(UINT nFlags, CPoint point)
{
CDC*pDC;
pDC=GetDC();
pDC->SetPixelV(point,0);
ReleaseDC(pDC);

CView::OnMouseMove(nFlags, point);
}

---华软 网友回答---
C++">
画直线:

步骤一:在视图类中对WM_LBUTTONDOWN和WM_LBUTTONUP消息添加消息响应函数OnLButtonDown和OnLButtonUp

步骤二:在视图类中利用添加成员向导添加成员变量。名字,例如m_StartPoint,类型为CPoint,访问属性设置为protected

步骤三:在OnLButtonDown和OnLButtonUp 中写如下代码

void CswdfView::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

m_StartPoint=point;

CView::OnLButtonDown(nFlags, point);

}

void CswdfView::OnLButtonUp(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

//第一种,使用HDC和API函数

/*HDC hdc;

hdc=::GetDC(m_hWnd);

::MoveToEx(hdc,m_StartPoint.x,m_StartPoint.y,NULL);

::LineTo(hdc,point.x,point.y);

::ReleaseDC(m_hWnd,hdc);

CView::OnLButtonUp(nFlags, point);*/

//第二种,使用CDC类

/*CDC *pDC=GetDC();

pDC->MoveTo(m_StartPoint);

pDC->LineTo(point);

ReleaseDC(pDC);*/

//第三种,使用CClientDC

CClientDC aDC(this);

aDC.MoveTo(m_StartPoint);

aDC.LineTo(point);

}

OK,运行程序,可以画直线了。

二. 画曲线

步骤一:按照画直线中介绍的方法在视图类中添加对WM_MOUSEMOVE消息的响应函数OnMouseMove

步骤二:在OnMouseMove中写如下代码

void CswdfView::OnMouseMove(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

if(nFlags==MK_LBUTTON) //判断鼠标左键是否按下,如果按下,则移动时画线

{

CClientDC aDC(this);

aDC.MoveTo(m_StartPoint);

aDC.LineTo(point);

m_StartPoint=point; //将画线的起点移动到鼠标移动后的点

}

CView::OnMouseMove(nFlags, point);

}


---华软网友回复---
这样应该不要再判断鼠标左键弹起了吧,灰常感谢
---华软网友回复---
还有,按照VisualEleven兄弟的做法,实际上画出的和鼠标轨迹不一定完全重合吧,比如OnMouseMove分别在A点和B点响应了,然后会画一条A到B的直线,但是在A到B的过程中,鼠标有可能不是走的直线的。在鼠标移动很快时。
有没有办法能记录下鼠标真正走的轨迹,然后画出来。。。

---华软网友回复---
准备结贴!
---华软网友回复---
试试就知道了~~
---华软网友回复---
在OnLButtonDown里MoveTo
在OnMouseMove里LineTo
---华软网友回复---
喂,这个问题还没结束吧,windows自带的画图没这个问题,是不是加快了WM_MOUSEMOVE的响应频率啊
---华软网友回复---
Windows画图程序就是这样的,你可以把比例放大来看看。。。。      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。