MFC单文档两点画线的四种方法

记录一下:


这个听起来似乎很简单了,没有什么技术难度,只是对几种方法有点含混不清,并且对CMainFrame类和CView类之间的关系与区别不太清楚,这里加以总结。

 

画线之前,我们必须明白,我们用什么方法画线,我这里采用的是2点画线,在MFC中对,WM_LBUTTONDOWNWM_LBUTTONUP消息进行响应,OnLButtonDown的时候记录一个点m_ptOrigin,在OnLButtonUp的时候再记录一个点m_ptEnd,并且利用函数在这两点之间画线。并且这里都是在CView类中对消息进行响应. 在画线之前,我们必须了解的是,CMainFrame类和CView之间的关系.首先,CMainFrame框架类分为2个区,一个是非客户区,一个是客户区.非客户去包括:标题栏,菜单栏.客户区包括toolbar和编辑区.CView就不存在客户区与非客户区了,他只有一个编辑区覆盖在CMainFrame类之上的.第三种方法可以实现在CMainFrame中的客户区绘图,也就是可以把线划到toolbar.

 

第一种方法:

HDC hdc;   //定义一个设备上下文句柄

hdc=::GetDC(m_hWnd);//调用全局函数GetDC,CView类已经定义好了它的句柄m_hWnd

MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);//全局函数MoveToEx

LineTo(hdc,point.x,point.y);//当然这里的LineTo也是全局的

::ReleaseDC(m_hWnd,hdc);//任何时候也不要忘记了这句关键的代码,这里的代码是释放DC的作用,因为我们定义了一个DC,系统是不知道我们不用它了,需要释放的,不释放会给我们带来很多不必要的麻烦

这样,就可以2点画线了,这样画线是在CView中的

第二种方法:

我们都知道,VC,微软给我们定义了一个做图的类CDC,它把所有关于绘图的函数都封装在了这个类中.

CDC *pDC=GetDC();//CDC类中的GetDC()正好返回了一个CDC类的对象指针

pDC->MoveTo(m_ptOrigin);//利用CDC的成员函数画线

pDC->LineTo(point);

ReleaseDC(pDC);//牢记的是,在这里我们依然不要忘记释放DC

本人认为这种方法画线是最直观方便的

第三种方法:

CClientDC画线,查看MSDN可以看出,CClientDC是由CDC类派生出来的。The CClientDC class is derived from CDC and takes care of calling the Windows functions GetDC at construction time and ReleaseDC at destruction time. This means that the device context associated with a CClientDCobject is the client area of a  window.看这段英文我们是可以看出的,CClientDC为我们做了2件事。就是在构造的时候调用GetDC(),在析构的时候自动调用ReleaseDC

CClientDC dc(this);获取一个客户DC,并且付给CView窗口句柄this

//CClientDC dc(GetParent());//获取父类的窗口句柄,也就是CMainFrame的窗口句柄,在父类的客户区内画线

dc.MoveTo(m_ptOrigin);

dc.LineTo(point);

第四种方法:

第四种方法必须了解一下我们的CWindowDC. Use this constructor to construct a CWindowDC object that accesses the entire screen area (both client and nonclient) of the CWnd object pointed to by pWnd. The constructor calls the Windows functionGetDC.MSDN里边是这样描述的,他不但可以获取到客户区和非客户区,而且还可以获取到整个屏幕区域.

//CWindowDC dc(this);//获得当前CView类窗口句柄

//CWindowDC dc(GetParent());//获得父类CMainFrame窗口句柄

CWindowDC dc(GetDesktopWindow());//获得操作系统桌面句柄

dc.MoveTo(m_ptOrigin);

dc.LineTo(point);

以上是画线方法的一些小小总结,望能够给大家带来一些帮助.

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值