2. 图形
2.1. 怎样建立一个图形对象?
有很多种方法可以建立图形对象,看你怎么用:
在OnPaint中,使用object参数提供的PaintEventArgs参数:
//C#
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.DrawLine(...);
}
'VB
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
e.Graphics.DrawLine(...)
End Sub 'OnPaint
在程序的其他部分,利用控件的一个方法,可以用来建立任意控件的图形对象:
//C#
using System.Drawing;
Graphics g = this.CreateGraphics();
'VB
Imports System.Drawing
Dim g As Graphics = Me.CreateGraphics()
直接画到bitmap位图文件中:
//C#
using System.Drawing;
Bitmap bm = new Bitmap(10,10);
Graphics g = Graphics.FromImage(bm);
'VB
Imports System.Drawing
Dim bm As New Bitmap(10, 10)
Dim g As Graphics = Graphics.FromImage(bm)
2.2. 怎样优化GDI+?
以下编码方式有助提高使用Graphics的绘图速度:
只建立一个图形对象 (或只使用OnPaint中的 PaintEventArgs)。
把所有绘图工作先画到不显示的位图上,再一次性把位图显示出来。
只重画变化的部分图象。
尽可能在相同的区域上画相同大小的图象。 主要思路:最小化地重画图象。例如,当光标拖过图象时,不需要把整个图重新画一遍。只需要重画光标之前经过的地方。
2.3. 怎样在窗体上画一个图案?
这里有个例子,告诉你怎样把图片画到窗体的背景上:
http://samples.gotdotnet.com/quickstart/CompactFramework/doc/bkgndimage.aspx
2.4. 怎样画一个带有透明色的图案?
画一个带有透明色的图象,需要设置ImageAttributes对象的透明色。目前.net精简框架支持单种颜色的透明色。虽然SetColorKey功能可以设置颜色范围,但颜色的最大值和最小值必须相同,不然在运行时会出现ArgumentException的错误:
//C#
using System.Drawing.Imaging;
ImageAttributes attr = new ImageAttributes();
'VB
Imports System.Drawing.Imaging
Dim attr As New ImageAttributes()
以下代码描述了如何根据图象左上角的颜色设置透明色。
//C#
attr.SetColorKey(bmp.GetPixel(0,0), bmp.GetPixel(0,0));
'VB
attr.SetColorKey(bmp.GetPixel(0,0), bmp.GetPixel(0,0))
以下方法可以准确的设置颜色:
//C#
attr.SetColorKey(Color.FromArgb(255,0,255),Color.FromArgb(255,0,255));
attr.SetColorKey(Color.Fuchsia, Color.Fuchsia);
'VB
attr.SetColorKey(Color.FromArgb(255,0,255),Color.FromArgb(255,0,255))
attr.SetColorKey(Color.Fuchsia, Color.Fuchsia)
图象会被重载的Graphics.DrawImage方法重画,并且使用ImageAttributes对象作为一个参数parameter:
//C#
g.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height,GraphicsUnit.Pixel, attr);
'VB
g.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height,GraphicsUnit.Pixel, attr)
2.5. 为什么从TextBox上调用CreateGraphics会失败?
只有Form类才支持Control.CreateGraphics().
2.6. 怎样获得屏幕上文字的大小?
使用Graphics的MeasureString方法。以下代码说明如何在文字周围画一个方框:
//C#
using System.Drawing;