第一章
1.1概念
GDI+是图形设备接口的英文缩写(Graphics Device Interface),它是.NetFrameWork中的一部分,实现了对底层GDI功能的封装。GDI是系统提供的一组图形绘制接口。
DirectX是另一个与图形编程有关的微软技术。
1.2GDI+命名空间
1.3绘图表面
1.4绘图表面对应的类
1.4Graphics功能
填充或画线重载方法请参考http://msdn.microsoft.com/library 网站。还包含的其它功能如下:
剪切:指绘图表面的某一区域,在设置了剪切区域后,执行的绘图操作就不会影响该剪切区域外部的任务像素。
转换:可以对绘图提供缩放、转换(在X或Y轴上移动)、旋转操作。
字体度量:测量字符串在绘图表面上的大小。
与GDI代码的互操作性:在C#中调用C++绘图代码,使用Graphics.GetHdc方法获取设备上下文,并将该设备上下文传给C++方法。使用Craphics.FromHDC方法从设备上下文中创建一个Craphics对象。
1.5坐标系
使用假想二维表格显示像素,绘制的起点为方框的中心。
例1:绘制一条直线(1,2,5,2)坐标表示如下图
注:实际绘制的长度为5。 因为在页面上绘制的元素的实际宽度要比每一边大半个像素。
例2:绘制一个矩形(1,0,5,4)坐标表示如下图
注:实际GDI+会把宽度和高度多绘制一个像素。是因为绘制的起点是从每个方框的中心点开始的,在页面上绘制的元素的实际宽度要比每一边大半个像素,所以最后的宽度是6个像素。
例3:填充一个矩形(1,0,5,4)坐标表示如下图
注:填充时不需要考虚画笔问题,起点就是整体方框,所以矩形的宽度是5而不是6个像素。
1.6锯齿与反锯齿
代码调置:e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
例1:填充一个矩形(1,0,5,4)的反锯齿效果如下图
1.7如何准确的对齐某些像素
(1)关闭反锯齿功能。
(2)使用浮点数做为坐标点,如填充一个矩形(1.5f,0.5f,4,3)。
1.8常用类及方法
第二章
1.1Pen钢笔
(1)与笔刷一起使用
SolidBrush solidBrush = new SolidBrush(Color.Red);
Pen pen = new Pen(solidBrush);
(2)Pen的Alignment属性
(3)Pen的DashStyle属性
SolidBrush solidBrush = new SolidBrush(Color.Red);
Pen pen = new Pen(solidBrush);
//15像素长的短线,接着是5像素长的空隙,
//然后是10像素长的短线,接着是5像素长的空隙。
float[] f = { 15, 5, 10, 5 };
pen.DashStyle = DashStyle.Custom;
pen.DashPattern = f;
注:如果钢笔的线宽大于1像素时,每条短线和空隙的实际长度就要用数组中指定的值乘以钢笔的线宽。便如将宽度设置为2时,数组值由{15,5,10,5}变为{30,10,20,10},效果如下图。
(4)Pen的StartCap和EndCap属性
注:自定义线段端部使用CustomStartCap和CustomEndCap属性,可以使用GraphicsPath类创建端部。
(5)Pen的LineJoin属性
1.2文本绘制
(1)文字测量
GDI+会添加额外的1/6em长度。可以使用StringFormat.GenericTypography静态属性来去掉增加的长度。
Graphics.MeasureString(“文本内容”,this.Font,Int32.MaxValue,StringFormat.GenericTypography);
Graphics.DrawString("文本内容",this.Font,Brushes.Black,RectangleF(),StringFormat.GenericTypography);
(2)字体样式
(3)字体换行
- 默认在英文单词的空格处换行。
- 显示换行
在字符串中加入\n。
- 强制不换行
(4)文本的水平和垂直居中
(5)绘制竖向文本,可以让文本旋转90度或使用StringFormat对象。
StringFormat sf=new StringFormat(StringFomatFlags.DirectionVertical);
1.3制表位
(1)左对齐制表位
float[]ts={10.0f,70.0f,100.0f,90.0f};
//数组长度表示要设置制表位的个数,以及每个制表位的宽度。第一个制表位距离边框矩形的左边10个像素,第二个制表位则距离第一个制表位70个像素,第三个距离第二个100个像素,第四个距离第三个制表位90个像素。
new StringFormat().SetTabStops(0.0f,ts);
\t\n混合使用
(2)右对齐制表位
1.4使用笔刷填充字体
HatchBrush hb=new HatchBrush(HatchStyle.Cross,Color.White,Color.Black);
1.5获取系统字体列表
方式一:new InstalledFontCollection().Families;
方式二:FontFamily.GetFamilies(e.Graphics);
1.6字体规格
1.7文本的质量
e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
注:反锯齿功能适合于CRT显示器。
(1)使用ClearType字体特性
ClearType反锯齿技术是微软专有的,比标准反锯齿技术绘制的文本要清晰得多,它只能用于彩色LCD屏幕,且只能在XP下使用。
1.8统一文字和画布的单位
第二章
2.1Image
(1)分辨率
Bitmap bmp=new Bitmap("xx.jpg");//原图分辨率为300X300
bmp.SetResolution(600f,600f);//修改为600X600
g.DrawImage(bmp,0,0);
bmp.SetResolution(1200f,1200f);//修改为1200X1200
g.DrawImage(bmp,180,0);
不同分辨率下的图片显示效果如下:
大小变化原因如下:
原图分辨率为300DPI,大小是1000X1100像素,在内存中的图像宽度是1000/300=3.333inches,高度是1100/300=3.667inches。
修改分辨率为600DPI,在内存中的图像宽度是1000/600=1.667inches,高度是1100/600=1.833inches。
修改分辨率为1200DPI,在内存中的图像宽度是1000/1200=0.833inches,高度是1100/1200=0.916inches。
(2)插补像素
在图像放大时,通过精确插补新像素值的算法来得到质量较高的图像。
使用g.InterpolationMode属性设置绘制的图片质量。
(3)截取图像
Rectangle sr=New Rectangle(80,60,400,400);//保留内容
Rectangle dr=New Rectangle(0,0,200,200);//在画布上绘制截取图片的位置
g.DrawImage(bmp,dr,sr,GraphicsUnit.Pixel);
(4)变形
Point[]dp={Point(0,0),Point(100,0),Point(50,100)};//左上角坐标、右上角坐标、左下角坐标
g.DrawImage(bmp,dp);
(5)翻转图像
Point[]dp={Point(0,100),Point(100,100),Point(0,0)};//左上角坐标、右上角坐标、左下角坐标
g.DrawImage(bmp,dp);//垂直翻转
Point[]dp={Point(100,0),Point(100,100),Point(0,0)};//左上角坐标、右上角坐标、左下角坐标
g.DrawImage(bmp,dp);//向右旋转90度。
注:效果类似于使用Bitmap.RotateFlip方法,区别在于画布上处理,还是对内存数据处理。
(6)图像复制(可复制整体或部分图像)
Rectangle r=New Rectangle(120,120,400,400);
Bitmap bmp2=bmp.Clone(r,PixelFormat.DontCare);//复制矩形大小不能超出源图像范围,否则会报内存溢出异常。
(6)缩略图
可以文件中读取,如文件不包含缩略图数据,系统会将原图缩小并返回。
GetThumbnailImageAbort callback=new GetThumbnailImageAbort(委托方法);
Image im=bmp.GetThumbnailImage(40,40,callback,IntPtr.Zero);
g.DrawImage(im,0,0,im.Width,im.Height);
im.Dispose();
(7)创建新图像
Bitmap bmp=new Bitmap(100,100);
Graphics g=Graphics.FromImage(bmp);
注:一般为提升性能,会将多次绘制操作先绘制到图片上,最后将图片在显示器上绘制。
2.2双缓存
(1)使用SetStyle方法
SetStyle(ControlStyles.DoubleBuffer,true);
SetStyle(ControlStyles.AllPaintingInWmPaint,true);
SetStyle(ControlStyles.UserPaint,true);
(2)图层与图层之间的颜色处理
设置Graphics.CompositingMode属性,效果如下图;
(3)获取图片像素和播放Gif图片
new Bitmap().GetPixel(x,y);
注:ColorMatrix和ImageAttributes类使用。
(4)图片格式转换
ImageCodeInfo、EncoderParameters、
第三章
3.1GraphicsPath
gp.StartFigure():开启第二个图形绘制,如果第一个图形使用了CloseFigure()方法,默认自动开启第二个图形绘制。
gp.CloseFigure():结束路径绘制。或将第一个图形的开始和结束座标相同。
gp.CloseAllFigures():闭合路径上的所有图形。
gp.AddString();创建文字路径。
路径填充
其它属性
其它方法
3.2Region
(1)使用GraphicsPath、Rectangle初始化Region。
(2)在一个区域中创建另一个区域,Region r1=new Region(new Region().GetRegionData());
(3)两个区域的并集与交集
注:GraphicsPath和Region都可以是不连接或不连续的,Region还可以是无限大的。
第四章
4.1变换方法
第五章
5.1自定义控件属性在VisualStudio.NET默认值
[DefaultValue("HellWord")]
public StringText
{
get{return text;}
}
set{text=value;}
注:属性是对象时需要使用Reset<PropertyName>()和Should'Serialize<PropertyName>()方法。
5.2自定义控件属性在VisualStudio.NET分类
[Category("Appearance")]
5.3类型转换方法
TypeConverter转换类,主要包括CanConvertFrom()、CanConvertTo()、ConvertFrom()、ConvertTo()。
5.4Editor特性
使用对话框来编辑控件属性值,如设置字体和设置颜色。也可以实现下拉菜单式。
[Editor(typeof(NumberRangeEditor),typeof(UITypeEditor))]
public struct NumberRange
{
}