VC画线

1、利用SDK全局函数实现画线功能

利用Platfirn SDK函数实现画线功能的代码:

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) { // 首先获得窗口的设备描述表 HDC hdc; hdc = ::GetDC(m_hWnd); // 移动到线条的起点 MoveToEx(hdc, m_ptOrigin.x, m_ptOrigin.y, NULL); // 画线 LineTo(hdc, point.x, point.y); // 释放设备描述表 ::ReleaseDC(m_hWnd, hdc); CView::OnLButtonUp(nFlags, point); }
为了进行绘图操作,必须获得一个设备描述表(DC)。因此,我们这里首先定义了一个HDC类型的变量:hdc,接着调用全局函数GetDC获得当前窗口的设备描述表。CWnd类有一个成员变量(m_hWnd)用于保存窗口句柄,而CDrawView类派生于CWnd类,因此该类也有这样的一个成员变量,这里的GetDC函数可以直接把这个成员变量作为参数来使用。

2、利用MFC的CDC类实现画线功能

MFC为我们提供一个设备描述表的封装类CDC,该类封装了所有与绘图相关的操作。该类提供一个数据成员m_hDC,用来保存与CDC类相关的DC句柄。其道理与CWnd类提供m_hWnd成员变量保存与窗口相关的窗口句柄是一样的。如下例就是利用MFC的CDC类实现画线功能的代码。

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) { /* // 首先获得窗口的设备描述表 HDC hdc; hdc = ::GetDC(m_hWnd); // 移动到线条的起点 MoveToEx(hdc, m_ptOrigin.x, m_ptOrigin.y, NULL); // 画线 LineTo(hdc, point.x, point.y); // 释放设备描述表 ::ReleaseDC(m_hWnd, hdc); */ CDC *pDC = GetDC(); pDC->MoveTo(m_ptOrigin); pDC->LineTo(point); ReleaseDC(pDC); CView::OnLButtonUp(nFlags, point); }
从上例中的代码可以看出,利用MFC类实现画线功能时,首先需要定义一个CDC类型的指针,并利用CWnd类的成员函数GetDC获得当前窗口的设备描述表对象的指针;接着利用CDC类的成员函数MoveTo和LineTo完成画线操作;最后调用CWnd类的成员函数ReleaseDC释放设备描述表资源。

3、利用MFC的CClientDC类实现画线功能

这里将利用MFC提供的CClientDC类来实现画线功能。这个类派生于CDC类,并且在构造时调用GetDC函数,在析构时调用ReleaseDC函数。也就是说,当一个CClientDC对象在构造时,它在内部会调用GetDC函数,获取一个设备描述表对象;在这个CClientDC对象析构时,会自动释放这个设备描述表资源。这样的话,程序中如果使用CClientDC类型定义DC对象,就不需要显式地调用GetDC函数和ReleaseDC函数了。只需要定义一个CClientDC对象,然后就可以利用该对象提供的函数进行绘图操作了。当该对象的生命周期结束时,会自动释放其所占用的设备资源。这就是CClientDC对象的好处。下例就是利用CClientDC类实现画线功能的代码。

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) { CClientDC dc(this); dc.MoveTo(m_ptOrigin); dc.LineTo(point); CView::OnLButtonUp(nFlags, point); }
在这个例子中,我们需要注意视类窗口和框架窗口的位置关系。整个程序窗口就是框架窗口,而工具栏以下白色区域部分才是视类窗口。视类窗口只有客户区(即视类窗口本身),而框架窗口既有客户区(即菜单栏以下部分),还有非客户区(就是程序运行界面中的标题栏和菜单栏)。而绘图操作一般都是在窗口的客户区进行的。

4、利用MFC的CWindowDC类实现画线功能

这里再介绍一个MFC类:CWindowDC,这个类也派生于CDC类,并且在析构时调用GetWindowDC函数获得相应的设备描述表对象,在析构时调用ReleaseDC函数释放该设备描述表对象所占用的资源。也就是说,当我们利用CWindowDC对象进行绘图时,也不需要显式地调用GetDC和ReleaseDC函数。该对象会自动获取和释放设备描述表资源。

使用CWindowDC对象的好处就是该对象可以访问整个窗口区域,包括框架窗口的非客户区和客户区。该对象的构造与CClientDC对象相同,如果要构造一个与视类窗口相关的设备描述表,则可以利用视类对象的指针来构造这个CWindowDC对象。如下例,就是利用CWindowDC对象实现画线功能的代码。

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) { CWindowDC dc(this); dc.MoveTo(m_ptOrigin); dc.LineTo(point); CView::OnLButtonUp(nFlags, point); }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值