VC动态轨迹画线
2013-12-24 20:31
155 查看
分类: 2.4 线程/图形学2010-04-30 22:14 1878人阅读 评论(0) 收藏 举报
文档null
这是一个绘制直线的简单绘图程序,能过实现动态轨迹画线,在拖动时产生临时线来表示可能画出的直线效果。
首先:建立一个单文档程序,名称为Demo
然后:在视图类的声明文件里面加入数据成员
class CDemoView : public CView
{
//········
protected:
int m_Dragging;
HCURSOR m_HCross;
CPoint m_PointOld;
CPoint m_PointOrigin;
//········
};
接着:在视图类的构造函数里面
CDemoView::CDemoView()
{
// TODO: add construction code here
m_Dragging=0;
m_HCross=AfxGetApp()->LoadStandardCursor(IDC_CROSS);//载入标准的十字光标
}
接着:为视图类添加鼠标左键,鼠标移动,鼠标左键释放消息
void CDemoView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
::SetCursor(m_HCross);//这一句能防止左键单击的时候,保持鼠标样式不变
m_PointOrigin=point;
m_PointOld=point;
SetCapture();//捕获鼠标,充分控制鼠标
m_Dragging=1;
RECT Rect;
GetClientRect(&Rect);//取得窗口当前显示坐标
ClientToScreen(&Rect);//转换为屏幕坐标
::ClipCursor(&Rect);//限定光标在指定矩形了吗
CView::OnLButtonDown(nFlags, point);
}
void CDemoView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
::SetCursor(m_HCross);
if (m_Dragging)
{
CClientDC ClientDC(this);
ClientDC.SetROP2(R2_NOT);//逆转当前屏幕颜色来画线的绘图方式
ClientDC.MoveTo(m_PointOrigin);//
ClientDC.LineTo(m_PointOld); //擦去上一次的线
ClientDC.MoveTo(m_PointOrigin);
ClientDC.LineTo(point);//绘制这一次的临时线
m_PointOld=point;
}
CView::OnMouseMove(nFlags, point);
}
void CDemoView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (m_Dragging)
{
m_Dragging=0;
::ReleaseCapture();//结束捕获鼠标
::ClipCursor(NULL);//解锁鼠标
CClientDC ClientDC(this);
ClientDC.SetROP2(R2_NOT);
ClientDC.MoveTo(m_PointOrigin);
ClientDC.LineTo(m_PointOld);//擦去上一次的临时线
ClientDC.SetROP2(R2_COPYPEN);//缺省绘图模式,像素为画笔颜色
ClientDC.MoveTo(m_PointOrigin);
ClientDC.LineTo(point);//绘制固定线
}
CView::OnLButtonUp(nFlags, point);
}
文档null
这是一个绘制直线的简单绘图程序,能过实现动态轨迹画线,在拖动时产生临时线来表示可能画出的直线效果。
首先:建立一个单文档程序,名称为Demo
然后:在视图类的声明文件里面加入数据成员
class CDemoView : public CView
{
//········
protected:
int m_Dragging;
HCURSOR m_HCross;
CPoint m_PointOld;
CPoint m_PointOrigin;
//········
};
接着:在视图类的构造函数里面
CDemoView::CDemoView()
{
// TODO: add construction code here
m_Dragging=0;
m_HCross=AfxGetApp()->LoadStandardCursor(IDC_CROSS);//载入标准的十字光标
}
接着:为视图类添加鼠标左键,鼠标移动,鼠标左键释放消息
void CDemoView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
::SetCursor(m_HCross);//这一句能防止左键单击的时候,保持鼠标样式不变
m_PointOrigin=point;
m_PointOld=point;
SetCapture();//捕获鼠标,充分控制鼠标
m_Dragging=1;
RECT Rect;
GetClientRect(&Rect);//取得窗口当前显示坐标
ClientToScreen(&Rect);//转换为屏幕坐标
::ClipCursor(&Rect);//限定光标在指定矩形了吗
CView::OnLButtonDown(nFlags, point);
}
void CDemoView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
::SetCursor(m_HCross);
if (m_Dragging)
{
CClientDC ClientDC(this);
ClientDC.SetROP2(R2_NOT);//逆转当前屏幕颜色来画线的绘图方式
ClientDC.MoveTo(m_PointOrigin);//
ClientDC.LineTo(m_PointOld); //擦去上一次的线
ClientDC.MoveTo(m_PointOrigin);
ClientDC.LineTo(point);//绘制这一次的临时线
m_PointOld=point;
}
CView::OnMouseMove(nFlags, point);
}
void CDemoView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (m_Dragging)
{
m_Dragging=0;
::ReleaseCapture();//结束捕获鼠标
::ClipCursor(NULL);//解锁鼠标
CClientDC ClientDC(this);
ClientDC.SetROP2(R2_NOT);
ClientDC.MoveTo(m_PointOrigin);
ClientDC.LineTo(m_PointOld);//擦去上一次的临时线
ClientDC.SetROP2(R2_COPYPEN);//缺省绘图模式,像素为画笔颜色
ClientDC.MoveTo(m_PointOrigin);
ClientDC.LineTo(point);//绘制固定线
}
CView::OnLButtonUp(nFlags, point);
}
相关文章推荐
- VC动态轨迹画线
- VC动态轨迹画线
- VC动态轨迹画线
- VC动态轨迹画线
- 【PB】powerbuilder调用VC编写的动态链接库
- VC中动态改变控件和对话框字体(大小)
- VC++动态/静态链接库 【3】
- VC实现波形不闪烁动态绘图
- VC++ (四)动态内存
- VC中怎样使用自定义资源的动态库
- Mapx开发目标轨迹显示核心代码(VC++)[开发源代码]:
- vc如何动态增加类的成员函数
- 百度地图API(4):轨迹动态生成展示
- 如何在VC中显示动态的GIF
- 轨迹系列——WebGIS中使用ZRender实现轨迹前端动态播放特效
- 百度地图js 画运行轨迹之运行轨迹取增量数组坐标值画线(二)
- VC动态链接数据库类ADOConn
- Mapx开发目标轨迹显示核心代码(VC++)[开发源代码]:
- VC++ 动态创建单个工具条,并加载外部的位图(bmp)文件为工具栏图像
- 【独家】加入时间特征的船舶轨迹离线压缩算法——动态Douglas-Peucker算法