VC怎么样利用MFC利用SDK画线例子

来源:互联网 发布:人工智能机器人图片 编辑:程序博客网 时间:2024/05/16 07:09

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

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

[cpp] view plaincopyprint?
  1. void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)   
  2. {  
  3.     // 首先获得窗口的设备描述表  
  4.     HDC hdc;  
  5.     hdc = ::GetDC(m_hWnd);  
  6.     // 移动到线条的起点  
  7.     MoveToEx(hdc, m_ptOrigin.x, m_ptOrigin.y, NULL);  
  8.     // 画线  
  9.     LineTo(hdc, point.x, point.y);  
  10.     // 释放设备描述表  
  11.     ::ReleaseDC(m_hWnd, hdc);  
  12.   
  13.     CView::OnLButtonUp(nFlags, point);  
  14. }  

为了进行绘图操作,必须获得一个设备描述表(DC)。因此,我们这里首先定义了一个HDC类型的变量:hdc,接着调用全局函数GetDC获得当前窗口的设备描述表。CWnd类有一个成员变量(m_hWnd)用于保存窗口句柄,而CDrawView类派生于CWnd类,因此该类也有这样的一个成员变量,这里的GetDC函数可以直接把这个成员变量作为参数来使用。

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

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

[cpp] view plaincopyprint?
  1. void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)   
  2. {  
  3. /*  // 首先获得窗口的设备描述表 
  4.     HDC hdc; 
  5.     hdc = ::GetDC(m_hWnd); 
  6.     // 移动到线条的起点 
  7.     MoveToEx(hdc, m_ptOrigin.x, m_ptOrigin.y, NULL); 
  8.     // 画线 
  9.     LineTo(hdc, point.x, point.y); 
  10.     // 释放设备描述表 
  11.     ::ReleaseDC(m_hWnd, hdc); 
  12. */  
  13.     CDC *pDC = GetDC();  
  14.     pDC->MoveTo(m_ptOrigin);  
  15.     pDC->LineTo(point);  
  16.     ReleaseDC(pDC);  
  17.   
  18.     CView::OnLButtonUp(nFlags, point);  
  19. }  

从上例中的代码可以看出,利用MFC类实现画线功能时,首先需要定义一个CDC类型的指针,并利用CWnd类的成员函数GetDC获得当前窗口的设备描述表对象的指针;接着利用CDC类的成员函数MoveTo和LineTo完成画线操作;最后调用CWnd类的成员函数ReleaseDC释放设备描述表资源。

3、利用MFC的CClientDC类实现画线功能http://www.125pc.com/dnrm/

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

[cpp] view plaincopyprint?
  1. void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)   
  2. {  
  3.     CClientDC dc(this);  
  4.     dc.MoveTo(m_ptOrigin);  
  5.     dc.LineTo(point);  
  6.   
  7.     CView::OnLButtonUp(nFlags, point);  
  8. }  

在这个例子中,我们需要注意视类窗口和框架窗口的位置关系。整个程序窗口就是框架窗口,而工具栏以下白色区域部分才是视类窗口。视类窗口只有客户区(即视类窗口本身),而框架窗口既有客户区(即菜单栏以下部分),还有非客户区(就是程序运行界面中的标题栏和菜单栏)。而绘图操作一般都是在窗口的客户区进行的。

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

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

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

[cpp] view plaincopyprint?
  1. void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)   
  2. {     
  3.     CWindowDC dc(this);  
  4.     dc.MoveTo(m_ptOrigin);  
  5.     dc.LineTo(point);  
  6.   
  7.     CView::OnLButtonUp(nFlags, point);  
  8. }