MFC绘图 (孙鑫老师 第四讲 MFC消息映射机制和CDC类的使用 参考文章)
2011-12-13 10:10
519 查看
【聚杰网VC】VC中利用MFC设计绘图程序初步 首先我们说下通过鼠标的移动来绘制直线。
这里要捕获到鼠标的两个消息:WM_LBUTTONDOWN, WM_LBUTTONUP。响应WM_LBUTTONDOWN消息记录直线的起始点,响应WM_LBUTTONUP消息记录直线的终点并绘制直线。
好了,我们看看怎么响应。
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
//MessageBox("Left Button Clicks DrawView");
m_ptOrigin = point ; //这里先定义了一个内部变量保存直线的起始点
CView::OnLButtonDown(nFlags, point);
}
下面看看响应WM_LBUTTONUP消息记录直线的终点并绘制直线。
//方法一
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
HDC hdc;
hdc = ::GetDC(m_hWnd); //调用全局函数
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,0);
LineTo(hdc,point.x,point.y);
::ReleaseDC(m_hWnd,hdc);
CView::OnLButtonUp(nFlags, point);
}
//方法二
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
CDC *pDC = GetDC();
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);
}
//方法三
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
CClientDC dc(this) ; //CClientDC对象构造的时候就调用了GetDC,析构的时候调用
ReleaseDC ,只能访问客户区
CClientDC dc(GetParent());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
}
//方法四
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
CWindowDC dc(this) ; //CWindowDC可以访问客户区和非客户区
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
}
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
CWindowDC dc(GetDesktopWindow()) ; //现在可以访问桌面
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
}
连续线绘图:
思路:鼠标移动的信号被捕捉到,然后随时响应该信号,绘制图线。
这里要设置一个BOOL变量 m_bDraw 来判断是否鼠标左键按下了。
//画连续的线条
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
if ( m_bDraw )
{
CClientDC dc(this) ;
dc.MoveTo(m_ptOrigin); //移动到原来的点
dc.LineTo(point); //绘制直线
m_ptOrigin = point ; //将现在的点赋值给原来的坐标,以便下次调用
}
CView::OnMouseMove(nFlags, point);
}
//改变画笔的颜色
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
if ( m_bDraw )
{
CClientDC dc(this) ;
CPen pen( PS_SOLID , 1 , RGB(255,128,128) );
CPen *pOldPen = dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
m_ptOrigin = point ;
dc.SelectObject(pOldPen);
}
CView::OnMouseMove(nFlags, point);
}
//画扇型
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
if ( m_bDraw )
{
CClientDC dc(this) ;
CPen pen( PS_SOLID , 1 , RGB(255,128,128) );
CPen *pOldPen = dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(m_ptOld);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
m_ptOld = point ;
dc.SelectObject(pOldPen);
}
CView::OnMouseMove(nFlags, point);
}
//画带边线的扇型
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
if ( m_bDraw )
{
CClientDC dc(this) ;
CPen pen( PS_SOLID , 1 , RGB(255,128,128) );
CPen *pOldPen = dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(m_ptOld);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.MoveTo(m_ptOld);
dc.LineTo(point);
m_ptOld = point ;
dc.SelectObject(pOldPen);
}
CView::OnMouseMove(nFlags, point);
}
//看看绘图的模式设置方法
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
if ( m_bDraw )
{
CClientDC dc(this) ;
dc.SetROP2(R2_BLACK); //绘图的模式设置,始终绘制黑色图形
CPen pen( PS_SOLID , 1 , RGB(255,128,128) );
CPen *pOldPen = dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(m_ptOld);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.MoveTo(m_ptOld);
dc.LineTo(point);
m_ptOld = point ;
dc.SelectObject(pOldPen);
}
CView::OnMouseMove(nFlags, point);
}
文章出处:http://www.diybl.com/course/3_program/c++/cppjs/20081012/150367.html
这里要捕获到鼠标的两个消息:WM_LBUTTONDOWN, WM_LBUTTONUP。响应WM_LBUTTONDOWN消息记录直线的起始点,响应WM_LBUTTONUP消息记录直线的终点并绘制直线。
好了,我们看看怎么响应。
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
//MessageBox("Left Button Clicks DrawView");
m_ptOrigin = point ; //这里先定义了一个内部变量保存直线的起始点
CView::OnLButtonDown(nFlags, point);
}
下面看看响应WM_LBUTTONUP消息记录直线的终点并绘制直线。
//方法一
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
HDC hdc;
hdc = ::GetDC(m_hWnd); //调用全局函数
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,0);
LineTo(hdc,point.x,point.y);
::ReleaseDC(m_hWnd,hdc);
CView::OnLButtonUp(nFlags, point);
}
//方法二
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
CDC *pDC = GetDC();
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);
}
//方法三
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
CClientDC dc(this) ; //CClientDC对象构造的时候就调用了GetDC,析构的时候调用
ReleaseDC ,只能访问客户区
CClientDC dc(GetParent());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
}
//方法四
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
CWindowDC dc(this) ; //CWindowDC可以访问客户区和非客户区
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
}
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
CWindowDC dc(GetDesktopWindow()) ; //现在可以访问桌面
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
}
连续线绘图:
思路:鼠标移动的信号被捕捉到,然后随时响应该信号,绘制图线。
这里要设置一个BOOL变量 m_bDraw 来判断是否鼠标左键按下了。
//画连续的线条
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
if ( m_bDraw )
{
CClientDC dc(this) ;
dc.MoveTo(m_ptOrigin); //移动到原来的点
dc.LineTo(point); //绘制直线
m_ptOrigin = point ; //将现在的点赋值给原来的坐标,以便下次调用
}
CView::OnMouseMove(nFlags, point);
}
//改变画笔的颜色
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
if ( m_bDraw )
{
CClientDC dc(this) ;
CPen pen( PS_SOLID , 1 , RGB(255,128,128) );
CPen *pOldPen = dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
m_ptOrigin = point ;
dc.SelectObject(pOldPen);
}
CView::OnMouseMove(nFlags, point);
}
//画扇型
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
if ( m_bDraw )
{
CClientDC dc(this) ;
CPen pen( PS_SOLID , 1 , RGB(255,128,128) );
CPen *pOldPen = dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(m_ptOld);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
m_ptOld = point ;
dc.SelectObject(pOldPen);
}
CView::OnMouseMove(nFlags, point);
}
//画带边线的扇型
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
if ( m_bDraw )
{
CClientDC dc(this) ;
CPen pen( PS_SOLID , 1 , RGB(255,128,128) );
CPen *pOldPen = dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(m_ptOld);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.MoveTo(m_ptOld);
dc.LineTo(point);
m_ptOld = point ;
dc.SelectObject(pOldPen);
}
CView::OnMouseMove(nFlags, point);
}
//看看绘图的模式设置方法
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
if ( m_bDraw )
{
CClientDC dc(this) ;
dc.SetROP2(R2_BLACK); //绘图的模式设置,始终绘制黑色图形
CPen pen( PS_SOLID , 1 , RGB(255,128,128) );
CPen *pOldPen = dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(m_ptOld);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.MoveTo(m_ptOld);
dc.LineTo(point);
m_ptOld = point ;
dc.SelectObject(pOldPen);
}
CView::OnMouseMove(nFlags, point);
}
文章出处:http://www.diybl.com/course/3_program/c++/cppjs/20081012/150367.html
相关文章推荐
- 孙鑫VC学习笔记:第四讲 MFC消息映射机制和CDC类的使用
- Lesson4 MFC消息映射机制和CDC类的使用 ---孙鑫VC++教程
- 孙鑫VC学习笔记:第四讲 MFC消息映射机制和CDC类的使用
- Lesson4 MFC消息映射机制和CDC类的使用 ---孙鑫VC++教程
- 孙鑫vc++ 第四课 笔记 MFC消息映射机制及CDC的使用
- Lesson4 MFC消息映射机制和CDC类的使用
- 孙鑫VC++视频学习笔记之3: MFC消息映射机制和绘图DC
- MFC绘图1--使用不同DC
- MFC笔记 - GDI绘图和CDC类
- 【转】第三章 MFC消息映射机制和绘图DC的获取
- MFC绘图1--使用不同DC
- VC++ MFC属性页使用说明(孙鑫视频教程总结)(2)
- 关于一些新手MFC入门时,在vs上运行孙鑫老师代码时可能碰到的问题。
- MFC(画图,孙鑫C++第四讲笔记整理)
- VC++ MFC属性页使用说明(孙鑫视频教程总结)(2)
- VS2010/MFC编程入门之四十九(图形图像:CDC类及其屏幕绘图函数)
- VC++ MFC属性页使用说明(孙鑫视频教程总结)(3)
- MFC绘图1--使用不同DC
- C++MFC编程笔记day02 MFC消息映射机制、菜单资源使用
- 这篇文章主要介绍了js使用post 方式打开新窗口的相关资料,需要的朋友可以参考下