VC中MFC下的绘图初步解析

转载 2007年10月04日 10:49:00

作者:zieckey(zieckey@yahoo.com.cn)
All Rights Reserved!

首先我们说下通过鼠标的移动来绘制直线。
这里要捕获到鼠标的两个消息: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);
}

到此,我们知道了一般地绘图方法了。

 

VC中利用MFC设计绘图程序初步

时间:2011-04-22 zieckey - 首先我们说下通过鼠标的移动来绘制直线。 这里要捕获到鼠标的两个消息:  WM_LBUTTONDOWN, WM_LBUTTONUP。响应WM_L...

VC++深入详解(2):MFC消息映射与基本绘图

先看一个简单的例子:让程序对鼠标左键响应一个messagebox。 有两种方法完成这个任务:1.在对应的类上选择Add windows message Handler,然后选择WM_LBUTTOND...

MFC VC 双缓冲绘图基本原理与实现,详细解释

MFC做了一些时间了,不得不面对 的是在界面上画图的。 当然你可以直接搜索到能用的代码,并且基本能满足要求。不过这样总不是学习的态度。本着学习分享的态度,现做一些基本的分析吧。 在MSDN...

VC----MFC-简单绘图

学习MFC就像玩魔术,着实有趣,从传统的黑白命令行跳到熟悉的窗口界面,感觉还是很新鲜的。尽管MFC的知识更多是应用性的,但是自己还是想尽快掌握起来独立地写出图形接口的程序。今天学习的是如何绘制简单的图...

MFC VC 双缓冲绘图基本原理与实现,详细解释

MFC VC 双缓冲绘图基本原理与实现,详细解释 MFC做了一些时间了,不得不面对 的是在界面上画图的。 当然你可以直接搜索到能用的代码,并且基本能满足要求。不过这样总不是学习的态...

MFC VC 双缓冲绘图基本原理与实现,详细解释

MFC VC 双缓冲绘图基本原理与实现,详细解释 MFC做了一些时间了,不得不面对 的是在界面上画图的。 当然你可以直接搜索到能用的代码,并且基本能满足要求。不过这样总不是学习的态度。本着学习...

《VC++深入详解》读书笔记——4.MFC消息映射机制和绘图DC的获取

一 . 消息映射机制1.Windows应用程序消息处理   Windows程序维护有自己的消息队列,保存了队列消息(当然也有非队列消息,它们直接发给窗口),并用过消息循环对消息进行处理。消息循环首...

Win7操作系统下安装VC++6.0、MSDN并使用MFC绘图

2015年开学了,在群里各位老师的鼎力支持下,我的计算机图形学基础教程已经出版了十二五国家级规划教材。由于库存的原因,可能有的老师已经拿到了带标志的教材,也可能有的老师的教材上没有十二五标志。比如我这...
  • klingde
  • klingde
  • 2015年03月29日 07:36
  • 1145

VC中MFC的绘图控制

  • 2012年12月21日 10:28
  • 2.28MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC中MFC下的绘图初步解析
举报原因:
原因补充:

(最多只允许输入30个字)