托管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属性的默认行为。例如:

using namespace System::Runtime::InteropServices;
typedef void* HDC;
[DllImport("gdi32", EntryPoint="LineTo")]
extern "C" bool LineTo(HDC hDC, int nXEnd, int nYEnd);

时间: 2024-10-25 18:35:54

托管C++中GDI+和GDI混合编程技术的相关文章

Matlab与C/C++混合编程接口应用总结 .

在参考文献基础上.补充和完善了. Matlab与C/C++混合编程接口及应用   摘要:Matlab具有很强的数值计算和分析等能力,而C/C++是目前最为流行的高级程序设计语言,两者互补结合的混合编程在科学研究和工程实践中具有非常重要的意义.从Matlab调用C/C++代码及C/C++调用m文件两方面,深入地研究了它们之间混合编程的原理和实现机制,并且给出了具体条件下的混合编程方法和步骤.实验表明,给出的Matlab与C/C++混合编程接口及应用方法是有效.实用的. 1引言 Matlab是当前应

GDI+编程基础(一)GDI+ Vs GDI

本文配套源码 一.GDI GDI是位于应用程序与不同硬件之间的中间层,这种结构让程序员从直接处理不同硬件的工作中解放出来,把硬件间的差异交给了GDI处理.GDI通过将应用程序与不同输出设备特性相隔离,使Windows应用程序能够毫无障碍地在Windows支持的任何图形输出设备上运行.例如,我们可以在不改变程序的前提下,让能在Epson点式打印机上工作的程序也能在激光打印机上工作.它把windows系统中的图形输出转换成硬件命令然后发送给硬件设备.GDI是以文件的形式存储在系统中,系统需要输出图形

VB与VC混合编程中处理消息的方法

现在越来越多的人采用VB与VC的混合编程:用VB快速开发出漂亮的界面以及外围处理程序,再用VC编写底层的各种操作,例如内存的操作.IO端口的操作等,VC中还可以嵌入汇编语言进行更底层的操作. 一般的做法是将VC程序编译成DLL,在VB中用Declare语句声明DLL中的函数,例如: Declare Function SendCommand Lib ″c:\program files\devstudio\wjfprojects\Hr0506dllMnsr\debug\Hr0506dllMnsr.d

c++-MATLAB和C++混合编程问题:如何让C中的全局变量不和matlab共享内存

问题描述 MATLAB和C++混合编程问题:如何让C中的全局变量不和matlab共享内存 我在做matlab2014和VS2013的混合编程,我在C的源码中有一个全局变量g,然后我在matlab中使用并行计算对c程序进行循环调用时,这个全局变量居然不会在c程序结束的时候被释放,而是一直在内存中,每次循环的时候都不断变化...例如一开始g=100,matlab调用一次c程序g++,然后在matlab中循环调用c程序,按理c程序中的全局变量应该在c程序结束时被释放,也就是输出结果应该是100,101

gdi-WinForm中图片填充GDI+画的矩形后,图片底部出现蓝色的线,如何去除

问题描述 WinForm中图片填充GDI+画的矩形后,图片底部出现蓝色的线,如何去除 解决方案 rectangle 这个是不是比图片高度还高,看看rectangle与图的高度是不是相等

界面划窗口设计-matlab与vs混合编程中,用户操作界面怎么设计,而且界面上的输入如何与matlab对应的值相对应??

问题描述 matlab与vs混合编程中,用户操作界面怎么设计,而且界面上的输入如何与matlab对应的值相对应?? matlab与vs混合编程中,用户操作界面怎么设计,而且界面上的输入如何与matlab对应的值相对应?? 解决方案 你界面用matlab做的还是用winform做的?

在c#中如何用gdi+ 画出柱形图,和饼形图,能不能提供点详细的代码?

问题描述 在c#中如何用gdi+画出柱形图,和饼形图,能不能提供点详细的代码? 解决方案 解决方案二:Bitmapbmp=newBitmap(Width,Height);Graphicsg=Graphics.FromImage(bmp);g.DrawEllipse(//画饼图g.DrawRectangle(//画柱形图g.DrawLine(//画线随手写的,参考一下吧.

Netbeasn中web工程实现与groovy混合编程

在netbeans(v 6.8)中的web工程中实现 groovy 与 java代码的混合编程 修改build-impl.xml文件   在 <target name="-pre-compile"  > 中添加如下代码   <!-- 混合groovy代码编译 --> <target name="-pre-compile" > <!-- Empty placeholder for easier customization. -

Windows GDI和GDI+区别(实例剖析)

1.概述         GDI在全称是Graphics Device Interface,即图形设备接口.是图形显示与实际物理设备之间的桥梁.GDI接口是基于函数,虽然使程序员省力不少,但是编程方式依然显得麻烦.例如显示一张位图,我们需要进行"创建位图,读取位图文件信息,启用场景设备,调色板变化"等一系列操作.然而有了GDI+,繁琐的步骤再次被简化.顾名思义,GDI+就是GDI的增强版,它是微软在Windows 2000以后操作系统中提供的新接口. 2.GDI+主要功能