托管C++中GDI+和GDI混合编程技术
1.引言 早期的Windows程序中,可以使用GDI(Graphics Device Interface,图形设备接口)在一个窗体中绘制图形、文本和图像,但它的功能比较有限,尤其是图像处理方面。GDI+是GDI的一个新版本,它不仅在GDI基础上添加许多新特性,而且对原有的GDI功能进行优化,并在为开发人员提供的二维矢量图形、文本、图像处理、区域、路径以及图形数据矩阵等方面构造了一系列相关的类。其中,图形类Graphics是GDI+接口中的一个核心类,许多绘图操作都可用它来完成。 与GDI相比,GDI+增加了渐变画刷、样条曲线、持久的路径对象、矩阵和矩阵变换、Alpha混色、色彩修正、消除走样以及元数据等新的特性。但是,GDI+却并不支持GDI中的AND(与)、OR(或)以及XOR(异或)等光栅操作(ROP)以及硬件加速。其中,XOR光栅操作是实现图元动态定位的橡皮条技术的最重要方法,其次GDI+中的图像处理速度上并不比GDI更具优势。为此,本文通过若干托管C++实例来探讨在托管环境下GDI+和GDI的混合编程的方法和技巧。 2.托管C++和GDI 在Visual C++ .NET 2003中,程序员可以使用MFC和托管C++( Managed Extensions for C++,C++托管扩展)等编程方式进行图形图像程序开发。MFC是一套Microsoft基础类库,它是使用面向对象技术对Windows API进行封装。因此在MFC中进行图形图像程序开发时既可以使用MFC类CDC来编程,也可直接使用GDI API中的函数和结构。 托管C++是在C++基础上建立的,用来为Visual C++程序员开发.NET框架应用程序而设计。它除了保留标准C++的全部功能,还可通过.NET Framework(.NET框架)来创建对象,实现自动化内存管理以及与其他.NET语言的互操作性。由于托管环境与非托管环境的区别,因此GDI API并不能像MFC那样直接在托管C++中进行调用。但在GDI+中的Graphics类[4]提供了与GDI交互的一些方法,如GetHdc和ReleaseHdc,分别用于获取或释放与Graphics对象相关联的设备环境句柄。 由于GDI API不使用托管代码,它使用的数据类型与托管C++中所用的数据类型不同,且它也不是COM对象,所以在托管C++使用GDI是通过平台调用(PInvoke)来实现的。 3.平台调用和数据封送 平台调用[5]是一种服务,它使托管代码能够调用DLL中实现的非托管函数,使用时需要指定Runtime::InteropServices命名空间。 3.1 调用GDI API函数的一般方法 在托管C++中调用GDI API(GDI32.DLL)一般是按标识 DLL中的函数、在托管代码中创建原型和函数调用三个部分。其中,函数调用与一般托管C++中调用相同,这里不作讨论。 在托管C++中,DLL 函数的标识是通过DllImport属性来操作的,它包括常用的EntryPoint、CharSet、ExactSpelling和CallingConvention等字段。EntryPoint字段用来指定要调用的DLL入口点的名称。CharSet字段用来指定控制名称损坏和封送字符串参数的方式。ExactSpelling字段用来指定是否在非托管DLL中搜索入口点指定的函数或方法名称。CallingConvention字段用来指定入口点的调用约定,默认为WinAPI。 需要说明的是,DLL 函数的标识中不一定全部指定上述字段,通过设置一个或多个字段可以改变DllImport属性的默认行为。例如:
在托管代码中访问非托管DLL函数之前,首先需要用DllImport属性操作来指定该函数的名称以及将其导出的DLL的名称。获取以上信息后,就可以为该DLL中的非托管函数编写托管方法的定义,即在托管代码中创建函数或方法的原型。例如上面的紧跟DllImport属性操作后的代码是用来创建gdi32.dll中的LineTo函数原型,extern "C"是在托管C++中创建原 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |