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下的绘图初步解析

 作者:zieckey(zieckey@yahoo.com.cn)All Rights Reserved!首先我们说下通过鼠标的移动来绘制直线。这里要捕获到鼠标的两个消息:WM_LBUTTONDOWN...
  • zieckey
  • zieckey
  • 2006年11月25日 21:20
  • 1695

VC在内存中绘图

双缓冲进行绘图可解决在VC 中绘图时的闪烁现象 用vc 做程序,如何画图是一个大家都很关心,但是却感到很难以理解的问题,因为在mfc 的封装之下,没有现成的画图函数供你直接调用,像vb 等等里面直接...
  • u010983763
  • u010983763
  • 2016年09月14日 22:29
  • 1120

VC中在对话框上的static控件中绘图

在MFC对话框上的static控件中绘制图形,发现的一些问题与解决方法
  • u010957054
  • u010957054
  • 2017年03月13日 09:03
  • 984

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

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

在VC2010上MFC从配置GDI到画出图形的完整过程

先前,在“VC2010上配置GDI+(图像库)”中我完成了在win32工程中GDI+的配置。但是在尝试画图时,出现了错误,其具体代码如下: // DrawRGB.cpp : 定义控制台应用程序的入口...
  • mwsgyyz8
  • mwsgyyz8
  • 2014年07月25日 12:45
  • 824

MFC绘图CBitmap/HBITMAP/CImage/CStatic/CDC/HDC-绘制到Static的五种方法

参考:http://bbs.csdn.net/topics/30173861   本文采用提出要求和给出实现方法布置本篇文章:   要求: 在Dialog中添加了一个图片组件框(绑定CStatic变...
  • chunyexiyu
  • chunyexiyu
  • 2013年11月12日 16:55
  • 4861

VS2010中MFC利用TeeChart控件实现画图

一、新建一个基于对话框的MFC应用程序工程,并取一个工程名称,我取的是MFCTeeChart,这个名字可以任意取。对于第三不的最大化最小化按钮可以根据自己喜好勾选或不勾选。      点击完成...
  • houge101
  • houge101
  • 2015年11月25日 22:09
  • 4054

VC双缓冲绘图技术介绍

VC双缓冲绘图技术介绍     双缓冲绘图,它是一种基本的图形图像绘图技术。首先,它在内存中创建一个与屏幕绘图区域一致的对象,然后将图形绘制到内存中的这个对象上,最后把这个对象上的图形数据一次性地...
  • oceanlucy
  • oceanlucy
  • 2015年07月10日 10:52
  • 2651

VC++ MFC 画图 详解(附源码)

(1)新建 MFC aplication exe 文件:painttool(2)在CPaintoo1View类的 OnDraw方法 添加如下代码:画图程序:Code: void CPaintoo...
  • jxusthusiwen
  • jxusthusiwen
  • 2011年01月06日 20:54
  • 2042

MFC JSON解析-开源jsoncpp

前一章说通过百度api获取身份证信息(通过身份证获取性别,地址和出生年月等信息),但是获取到的数据是一个json字符串。 如: {"errNum":0,"retMsg":"success","...
  • a379039233
  • a379039233
  • 2015年10月26日 15:15
  • 5791
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC中MFC下的绘图初步解析
举报原因:
原因补充:

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