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

Graphics.DrawImage 方法

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

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

public void DrawImage (
	Image image,
	Point point
)

 

参数

image

要绘制的 Image

point

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

public void DrawImagePoint(PaintEventArgs e)

{ // Create image.

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

 // Create Point for upper-left corner of image.

 Point ulCorner = new Point(100, 100);

// Draw image to screen.

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 方法时要使用的附加数据。

 

实例:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Reflection;
using System.Drawing.Imaging;
namespace testWinCeGraphics
{
    public partial class Form1 : Form
    {
        private string currentPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);//获取PDA路径
        private Bitmap bg, title,btn;
        private Rectangle rectangle;
        Color transpColor = Color.FromArgb(255, 0, 255);//资源文件的透明色
        ImageAttributes imageAttr;
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            bg = new Bitmap(currentPath + @"\image\bg294.jpg");
            title = new Bitmap(currentPath + @"\image\title.jpg");
            btn = new Bitmap(currentPath + @"\image\button.bmp");
            rectangle = new Rectangle(10, 60,219,48);
            //rectangle = new Rectangle();
            imageAttr = new ImageAttributes();
            imageAttr.SetColorKey(transpColor, transpColor);
        }
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            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)]
public struct IntPtr : ISerializable

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

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

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

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

此类型实现 ISerializable 接口。

 

 

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

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

简介

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

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

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

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

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

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

 GDI+

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

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

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

GDI+ 类似Apple的Quartz 2D子系统,以及属于开放源码(open-source)的libartCairo库。

 

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

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

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

 

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

 

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

posted @ 2013-11-06 17:56  summer0311  阅读(750)  评论(0编辑  收藏  举报