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);
}
参数
- 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 结构
------------------------------------------------分割线----------------------------------------------------
图形设备接口(Graphics Device Interface或Graphical Device Interface,缩写GDI),是微软公司视窗操作系统(Microsoft Windows)的三大核心部件(也称“子系统”)之一。GDI是微软视窗系统表征图形对象及将其传送给诸如显示器、打印机之类输出设备的标准。GDI类似Macintosh传统的QuickDraw。
简介
在DOS时期,应用程式如果要对于显示设备做输出的话,必须使用INT 10VGA卡当时日新月异,各家的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或其它格式的图片,还能够生成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+的支援。The GDI+ 的DLL可移植到旧有的Windows版本上。
GDI+ 类似Apple的Quartz 2D子系统,以及属于开放源码(open-source)的libart和Cairo库。
------------------------------------------------分割线----------------------------------------------------
句柄,是整个windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个四字节长的数值,来标志应用程序中的不同对象和同类对象中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。应用程序能够通过句柄访问相应的对象的信息,但是句柄不是一个指针,程序不能利用句柄来直接阅读文件中的信息。如果句柄不用在I/O文件中,它是毫无用处的。 句柄是windows用来标志应用程序中建立的或是使用的唯一整数,windows使用了大量的句柄来标志很多对象。
原理 WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的。相反,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。
在《WINDOWS编程短平快》(南京大学出版社)一书中是这么说的:句柄是WINDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。
从上面的2个定义中我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的。它就像我们的车牌号一样,每一辆注册过的车都会有一个确定的号码,不同的车号码各不相同,但是也可能会在不同的时期出现两辆号码相同的车,只不过它们不会同时处于使用之中罢了。从数据类型上来看它只是一个32位的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。在WINDOWS编程中会用到大量的句柄,比如:HINSTANCE(实例句柄),HBITMAP(位图句柄),HDC(设备描述表句柄),HICON(图标句柄)等等。这当中还有一个通用的句柄,就是HANDLE。