VC画线

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

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


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

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

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


从上例中的代码可以看出,利用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类实现画线功能的代码。


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

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

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

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



你可能感兴趣的:(VC)