您的位置:首页 > 编程语言 > PHP开发

【转】Graphics.DrawImage 方法 IntPtr 结构 GDI 句柄 知识收集

2013-11-06 17:56 417 查看
Graphics.DrawImage方法

在指定的位置使用原始物理大小绘制指定的Image

命名空间:System.Drawing程序集:System.Drawing(在system.drawing.dll中)

publicvoidDrawImage(
Imageimage,
Pointpoint
)


参数

image
要绘制的Image。

point
Point结构,它表示所绘制图像的左上角的位置。

publicvoidDrawImagePoint(PaintEventArgse)

{//Createimage.

ImagenewImage=Image.FromFile("SampImag.jpg");

//CreatePointforupper-leftcornerofimage.

PointulCorner=newPoint(100,100);

//Drawimagetoscreen.

e.Graphics.DrawImage(newImage,ulCorner);

}

Graphics.DrawImage方法(Image,Rectangle,Single,Single,Single,Single,GraphicsUnit,ImageAttributes,Graphics.DrawImageAbort,IntPtr)

参数

image
要绘制的Image。

destRect
Rectangle结构,它指定所绘制图像的位置和大小。将图像进行缩放以适合该矩形。

srcX
要绘制的源图像部分的左上角的x坐标。

srcY
要绘制的源图像部分的左上角的y坐标。

srcWidth
要绘制的源图像部分的宽度。

srcHeight
要绘制的源图像部分的高度。

srcUnit
GraphicsUnit枚举的成员,它指定用于确定源矩形的度量单位。

imageAttrs
ImageAttributes,它指定image对象的重新着色和伽玛信息。

callback
Graphics.DrawImageAbort委托,它指定在绘制图像期间要调用的方法。此方法被频繁调用以检查是否根据应用程序确定的条件停止DrawImage方法的执行。

callbackData
一个值,它为Graphics.DrawImageAbort委托指定在检查是否停止执行DrawImage方法时要使用的附加数据。

实例:

usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;

usingSystem.IO;
usingSystem.Reflection;
usingSystem.Drawing.Imaging;

namespacetestWinCeGraphics
{
publicpartialclassForm1:Form
{
privatestringcurrentPath=Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);//获取PDA路径
privateBitmapbg,title,btn;

privateRectanglerectangle;
ColortranspColor=Color.FromArgb(255,0,255);//资源文件的透明色
ImageAttributesimageAttr;

publicForm1()
{
InitializeComponent();
}

privatevoidForm1_Load(objectsender,EventArgse)
{
bg=newBitmap(currentPath+@"\image\bg294.jpg");
title=newBitmap(currentPath+@"\image\title.jpg");

btn=newBitmap(currentPath+@"\image\button.bmp");
rectangle=newRectangle(10,60,219,48);
//rectangle=newRectangle();
imageAttr=newImageAttributes();
imageAttr.SetColorKey(transpColor,transpColor);
}

privatevoidForm1_Paint(objectsender,PaintEventArgse)
{
e.Graphics.DrawImage(bg,0,0);
e.Graphics.DrawImage(title,0,0);

//要更改图片显示请更改rectangle中x,y轴的坐标
e.Graphics.DrawImage(btn,rectangle,0,0,219,48,GraphicsUnit.Pixel,imageAttr);
}


}
}


------------------------------------------------分割线----------------------------------------------------

IntPtr结构

用于表示指针或句柄的平台特定类型。

命名空间:System程序集:mscorlib(在mscorlib.dll中)

[SerializableAttribute]
[ComVisibleAttribute(true)]
publicstructIntPtr:ISerializable


IntPtr类型被设计成整数,其大小适用于特定平台。即是说,此类型的实例在32位硬件和操作系统中将是32位,在64位硬件和操作系统上将是64位。

IntPtr类型可以由支持指针的语言使用,并可作为在支持与不支持指针的语言间引用数据的一种通用方式。

IntPtr对象也可用于保持句柄。例如,IntPtr的实例广泛地用在System.IO.FileStream类中来保持文件句柄。

IntPtr类型符合CLS,而UIntPtr类型却不符合。只有IntPtr类型可用在公共语言运行时中。UIntPtr类型大多数是提供来维护与IntPtr类型之间的体系结构上的对称性。

此类型实现ISerializable接口。

------------------------------------------------分割线----------------------------------------------------

图形设备接口GraphicsDeviceInterfaceGraphicalDeviceInterface,缩写GDI),是微软公司视窗操作系统(MicrosoftWindows)的三大核心部件(也称“子系统”)之一。GDI是微软视窗系统表征图形对象及将其传送给诸如显示器、打印机之类输出设备的标准。GDI类似Macintosh传统的QuickDraw。

简介

DOS时期,应用程式如果要对于显示设备做输出的话,必须使用INT10[1],或对于VGA卡直接I/O,或直接对VRAM所在的记忆体位置作填值。但VGA卡当时日新月异,各家的VGA卡在其I/Oports的定义并不一致,虽中间有推出一个名为VESASVGA的显卡驱动程式的共用标准,但由于DOS时先天的64KB的分页限制,仍有许多不便。

微软在开发Windows时,发现这个问题,于是决定打造一个GDI子系统,将显示设备改以API的方式进行操作,以便将各VGA卡的差异透过各VGA卡厂商自行制作的驱动程式来衔接GDI,来打消各VGA卡在操作上的彼此差异。

但微软很快就被其他的程式开发者告知,GDI太慢了,因此Microsoft就再出一个WING[2]用于Windows3.0/3.1,让应用程式能够直接对VRAM进行填值,以加速绘图的相关计算。

后来,WING再改为DirectDraw成为DirectX的一部分,直到DirectX7。(DirectX8以后,DirectX中2D与3D显示技术合并,开始进入全3D的贴图计算方式)

后来,微软再推.NetFramework,又再把GDI用.NetFramework方式进行封装,可是由于GDI本身的限制,再加上微软自己在MSDNLibrary上面用来写着爽的文档(有些功能已有技术文档,但从未实做出可用之功能过),再加上GDI+在图形计算与显示很慢,以及GDI+先后饱受远程代码执行的漏洞的困扰,因此GDI+无法成为微软在图形子系统的主流。

再后来,DirectX10进入XNA的时代,XNA是以DirectX的COM为基础,以.NetFramework方式进行封装,所以XNA身兼DirectX的性能与.NetFramework的使用便利性。XNA目前被应用于XBOX系列的游戏主机上,已成为新一代的图形子系统的主流。

GDI+

GDI+从WindowsXP操作系统开始引入,提供二维的向量图形,改进旧有的GDI,加强的视觉化属性,例如边界,渐变和透明。通过GDI+,能够直接将BMP转成JPG或其它格式的图片,还能够生成SVG、Flash等。GDI+使用ARGB的值来表示颜色。GDI+的双缓冲技术可以提高绘图效率,可避免屏幕闪烁。

GDI+号称提供了硬件加速功能,可以直接访问硬件。但这似乎是夸饰的说法,GDI+无法直接使用VGA卡上的GPU来加速绘图的相关计算,因此在绘图性能上远远不及DirectX,只能做到Lock记亿体进行操作。(GDI+只是一组重新封装GDI的API,DirectX则是从COM到底层的显卡驱动程式的组合)

随GDI+推出了加强型EMF,即EMF+,可以同时支持GDI和GDI+。Microsoft.NET透过System.Drawing命名空间提供对GDI+的支援。TheGDI+的DLL可移植到旧有的Windows版本上。

GDI+类似Apple的Quartz2D子系统,以及属于开放源码(open-source)的libart和Cairo库。

------------------------------------------------分割线----------------------------------------------------

句柄,是整个windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个四字节长的数值,来标志应用程序中的不同对象和同类对象中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。应用程序能够通过句柄访问相应的对象的信息,但是句柄不是一个指针,程序不能利用句柄来直接阅读文件中的信息。如果句柄不用在I/O文件中,它是毫无用处的。句柄是windows用来标志应用程序中建立的或是使用的唯一整数,windows使用了大量的句柄来标志很多对象。

原理  WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的。相反,WINDOWSAPI给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。

  在《WINDOWS编程短平快》(南京大学出版社)一书中是这么说的:句柄是WINDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。

  从上面的2个定义中我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的。它就像我们的车牌号一样,每一辆注册过的车都会有一个确定的号码,不同的车号码各不相同,但是也可能会在不同的时期出现两辆号码相同的车,只不过它们不会同时处于使用之中罢了。从数据类型上来看它只是一个32位的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。在WINDOWS编程中会用到大量的句柄,比如:HINSTANCE(实例句柄),HBITMAP(位图句柄),HDC(设备描述表句柄),HICON(图标句柄)等等。这当中还有一个通用的句柄,就是HANDLE。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: