GDI+编程的10个基本技巧(转)
创建绘图表面 创建绘图表面有两种常用的方法。下面设法得到PictureBox的绘图表面。
private void Form1_Load(object sender, System.EventArgs e)
{
//得到pictureBox1的绘图表面
Graphics g = this.pictureBox1.CreateGraphics();
} private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
//得到pictureBox1的绘图表面
Graphics g = e.Graphics;
} 可以利用Graphics对象绘制出各种图形图案。控件的Paint事件和OnPaint方法都可以绘图都是好时机。
在OnPaint方法里绘制图案一定从参数e里面得到Graphics属性。下面是两个例子。
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.Clear(Color.White);
float x, y, w, h;
x = this.Left+;
y = this.Top+;
w = this.Width-;
h = this.Height-;
Pen pen = new Pen(Color.Red, );
e.Graphics.DrawRectangle(pen, x, y, w, h);
base.OnPaint (e);
} private void PictureBoxII_Resize(object sender, EventArgs e)
{
this.Invalidate();
} private void button1_Click(object sender, System.EventArgs e)
{
this.pictureBoxII1.CreateGraphics().FillEllipse(
Brushes.Blue, , , , );
}
和文本有关的三个类:
FontFamily——定义有着相似的基本设计但在形式上有某些差异的一组字样。无法继承此类。
Font——定义特定的文本格式,包括字体、字号和字形属性。无法继承此类。
StringFormat——封装文本布局信息(如对齐方式和行距),显示操作(如省略号插入和国家标准 (National) 数字位替换)和 OpenType 功能。无法继承此类。
下面的程序显示了一段文字。
private void button2_Click(object sender, System.EventArgs e)
{
Graphics g = this.pictureBoxII1.CreateGraphics();
g.FillRectangle(Brushes.White, this.pictureBoxII1.ClientRectangle); string s = "aaaaaaaaaaaaaaaaaaaaaaaaaa";
FontFamily fm = new FontFamily("ËÎÌå");
Font f = new Font(fm, , FontStyle.Bold, GraphicsUnit.Point);
RectangleF rectF = new RectangleF(, , , );
StringFormat sf = new StringFormat();
SolidBrush sbrush = new SolidBrush(Color.FromArgb(, , , ));
sf.LineAlignment = StringAlignment.Center;
sf.FormatFlags = StringFormatFlags.DirectionVertical;
g.DrawString(s, f, sbrush, rectF, sf);
}
GDI+的路径——GraphicsPath类 GraphicsPath类提供了一系列属性和方法,利用它可以获取路径上的关键点,可以添加直线段、圆等几何元素。可以获得包围矩形,进行拾取测试。这些功能都怎么用,要仔细看一下。
private void button3_Click(object sender, System.EventArgs e)
{
//绘图表面
Graphics g = this.pictureBoxII1.CreateGraphics();
//填充成白色
g.FillRectangle(Brushes.White, this.ClientRectangle);
//弄一个绘图路径¶
GraphicsPath gp = new GraphicsPath();
//添加一些集合图形
gp.AddEllipse(, , , );
gp.AddPie(, , , , , );
gp.AddRectangle(new Rectangle(, , , ));
//在绘图表面上绘制绘图路径
g.DrawPath(Pens.Blue, gp);
//平移
g.TranslateTransform(, );
//填充绘图路径¶
g.FillPath(Brushes.GreenYellow, gp);
gp.Dispose();
}
区域——Region类 从已有的矩形和路径可以创建Region。使用Graphics.FillRegion方法绘制Region。该类指示由矩形和由路径构成的图形形状的内部。无法继承此类。
渐变色填充 需要使用两个刷子:
线性梯度刷子(LinearGradientBrush)
路径梯度刷子(PathGuadientBrush)
private void button4_Click(object sender, System.EventArgs e)
{
//绘图表面
Graphics g = this.pictureBoxII1.CreateGraphics();
g.FillRectangle(Brushes.White, this.pictureBoxII1.ClientRectangle); //定义一个线性梯度刷子 LinearGradientBrush lgbrush =
new LinearGradientBrush(
new Point(, ),
new Point(, ),
Color.FromArgb(, , ),
Color.FromArgb(, , ));
Pen pen = new Pen(lgbrush); //用线性笔刷梯度效果的笔绘制一条直线段并填充一个矩形 g.DrawLine(pen, , , , );
g.FillRectangle(lgbrush, , , , ); //定义路径并添加一个椭圆
GraphicsPath gp = new GraphicsPath();
gp.AddEllipse(, , , ); //用该路径定义路径梯度刷子
PathGradientBrush brush =
new PathGradientBrush(gp); //颜色数组
Color[] colors = {
Color.FromArgb(, , ),
Color.FromArgb(, , ),
Color.FromArgb(, , ),
Color.FromArgb(, , )}; //定义颜色渐变比率
float[] r = {0.0f, 0.3f, 0.6f, 1.0f};
ColorBlend blend = new ColorBlend();
blend.Colors = colors;
blend.Positions = r;
brush.InterpolationColors = blend; //在椭圆外填充一个矩形
g.FillRectangle(brush, , , , ); //用添加了椭圆的路径定义第二个路径梯度刷子
GraphicsPath gp2 = new GraphicsPath();
gp2.AddEllipse(, , , );
PathGradientBrush brush2 = new PathGradientBrush(gp2); //设置中心点位置和颜色
brush2.CenterPoint = new PointF(, );
brush2.CenterColor = Color.FromArgb(, , ); //设置边界颜色
Color[] color2 = {Color.FromArgb(, , )};
brush2.SurroundColors = color2; //用第二个梯度刷填充椭圆
g.FillEllipse(brush2, , , , );
}
GDI+的坐标系统
通用坐标系——用户自定义坐标系。
页面坐标系——虚拟坐标系。
设备坐标系——屏幕坐标系。
当页面坐标系和设备坐标系的单位都是象素时,它们相同。
private void button10_Click(object sender, System.EventArgs e)
{
Graphics g = this.pictureBoxII1.CreateGraphics();
g.Clear(Color.White);
this.Draw(g);
}
private void Draw(Graphics g)
{
g.DrawLine(Pens.Black, , , , );
g.DrawEllipse(Pens.Black, , , , );
g.DrawArc(Pens.Black, , , , , , );
g.DrawRectangle(Pens.Green, , , , );
} private void button5_Click(object sender, System.EventArgs e)
{
//左移
Graphics g = this.pictureBoxII1.CreateGraphics();
g.Clear(Color.White);
g.TranslateTransform(-, );
this.Draw(g);
} private void button6_Click(object sender, System.EventArgs e)
{
//右移
Graphics g = this.pictureBoxII1.CreateGraphics();
g.Clear(Color.White);
g.TranslateTransform(, );
this.Draw(g);
} private void button7_Click(object sender, System.EventArgs e)
{
//旋转
Graphics g = this.pictureBoxII1.CreateGraphics();
g.Clear(Color.White);
g.RotateTransform(-);
this.Draw(g);
} private void button8_Click(object sender, System.EventArgs e)
{
//放大
Graphics g = this.pictureBoxII1.CreateGraphics();
g.Clear(Color.White);
g.ScaleTransform(1.2f, 1.2f);
this.Draw(g);
} private void button9_Click(object sender, System.EventArgs e)
{
//缩小
Graphics g = this.pictureBoxII1.CreateGraphics();
g.Clear(Color.White);
g.ScaleTransform(0.8f, 0.8f);
this.Draw(g);
}
全局坐标——变换对于绘图表面上的每个图元都会产生影响。通常用于设定通用坐标系。
一下程序将原定移动到控件中心,并且Y轴正向朝上。
//先画一个圆 Graphics g = e.Graphics;
g.FillRectangle(Brushes.White, this.ClientRectangle);
g.DrawEllipse(Pens.Black, -, -, , ); //使y轴正向朝上,必须做相对于x轴镜像
//变换矩阵为[1,0,0,-1,0,0]
Matrix mat = new Matrix(, , , -, , );
g.Transform = mat;
Rectangle rect = this.ClientRectangle;
int w = rect.Width;
int h = rect.Height;
g.TranslateTransform(w/, -h/); //以原点为中心,做一个半径为100的圆
g.DrawEllipse(Pens.Red, -, -, , );
g.TranslateTransform(, );
g.DrawEllipse(Pens.Green, -, -, , );
g.ScaleTransform(, );
g.DrawEllipse(Pens.Blue, -, -, , );
局部坐标系——只对某些图形进行变换,而其它图形元素不变。
protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
//客户区设置为白色
g.FillRectangle(Brushes.White, this.ClientRectangle); //y轴朝上
Matrix mat = new Matrix(, , , -, , );
g.Transform = mat; //移动坐标原点到窗体中心
Rectangle rect = this.ClientRectangle;
int w = rect.Width;
int h = rect.Height;
g.TranslateTransform(w/, -h/); //在全局坐标下绘制椭圆
g.DrawEllipse(Pens.Red, -, -, , );
g.FillRectangle(Brushes.Black, -, , , );
g.FillRectangle(Brushes.Black, , , , );
g.FillRectangle(Brushes.Black, , , , );
g.FillRectangle(Brushes.Black, , -, , ); //创建一个椭圆然后在局部坐标系中进行变换
GraphicsPath gp = new GraphicsPath();
gp.AddEllipse(-, -, , );
Matrix mat2 = new Matrix(); //平移
mat2.Translate(, ); //旋转
mat2.Rotate();
gp.Transform(mat2);
g.DrawPath(Pens.Blue, gp);
PointF[] p = gp.PathPoints;
g.FillRectangle(Brushes.Black, p[].X-, p[].Y+, , );
g.FillRectangle(Brushes.Black, p[].X-, p[].Y+, , );
g.FillRectangle(Brushes.Black, p[].X-, p[].Y-, , );
g.FillRectangle(Brushes.Black, p[].X-, p[].Y-, , );
gp.Dispose();
//base.OnPaint (e);
}
Alpha混合
Color.FromArgb()的A就是Alpha。Alpha的取值范围从0到255。0表示完全透明,255完全不透明。
当前色=前景色×alpha/255+背景色×(255-alpha)/255
protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
//创建一个填充矩形
SolidBrush brush = new SolidBrush(Color.BlueViolet);
g.FillRectangle(brush, , , , ); //创建一个位图,其中两个位图之间有透明效果
Bitmap bm1 = new Bitmap(, );
Graphics bg1 = Graphics.FromImage(bm1);
SolidBrush redBrush = new SolidBrush(Color.FromArgb(, , , ));
SolidBrush greenBrush = new SolidBrush(Color.FromArgb(, , , ));
bg1.FillRectangle(redBrush, , , , );
bg1.FillRectangle(greenBrush, , , , );
g.DrawImage(bm1, , ); //创建一个位图,其中两个位图之间没有透明效果
Bitmap bm2 = new Bitmap(, );
Graphics bg2 = Graphics.FromImage(bm2);
bg2.CompositingMode = CompositingMode.SourceCopy;
bg2.FillRectangle(redBrush, , , , );
bg2.FillRectangle(greenBrush, , , , );
g.CompositingQuality = CompositingQuality.GammaCorrected;
g.DrawImage(bm2, , );
//base.OnPaint (e);
}
反走样
protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
//放大8倍
g.ScaleTransform(, );
//没有反走样的图形和文字
Draw(g);
//设置反走样
g.SmoothingMode = SmoothingMode.AntiAlias;
//右移40
g.TranslateTransform(, );
//再绘制就是反走样之后的了
Draw(g);
//base.OnPaint (e);
}
private void Draw(Graphics g)
{
//绘制图形和文字
g.DrawLine(Pens.Gray, , , , );
g.DrawEllipse(Pens.Gray, , , , );
string s = "反走样测试";
Font font = new Font("宋体", );
SolidBrush brush = new SolidBrush(Color.Gray);
g.DrawString(s, font, brush, , );
}
GDI+编程的10个基本技巧(转)的更多相关文章
- GDI编程
图形设备接口(GDI)是一个可执行程序,它接受Windows应用程序的绘图请求(表现为GDI函数调用),并将它们传给相应的设备驱动程序,完成特定于硬件的输出,象打印机输出和屏幕输出.GDI负责Wind ...
- GDI编程小结
图形设备接口(GDI)是一个可运行程序,它接受Windows应用程序的画图请求(表现为GDI函数调用),并将它们传给对应的设备驱动程序,完毕特定于硬件的输出,象打印机输出和屏幕输出.GDI负责Wind ...
- GDI+编程说明及小结
原文地址:http://blog.csdn.net/byxdaz/article/details/5972759 GDI+(Graphics Device Interface Plus图形设备接口加) ...
- GDI+编程小结
GDI+(Graphics Device Interface Plus图形设备接口加)是Windows XP和Windows Server 2003操作系统的子系统,也是.NET框架的重要组成部分,负 ...
- MFC控件GDI编程
MFC控件GDI编程 一丶学习内容 1.了解常用的GDI函数绘图. 2.使用常用的画笔画刷. 二丶常用的GDI函数绘图 上方则为我们常用的GDI函数了. 画线 矩形. 以及圆 等等. 2.1 画线代码 ...
- 10 个实用技巧,让 Finder 带你飞
Finder 是 Mac 电脑的系统程序,有的功能类似 Windows 的资源管理器.它是我们打开 Mac 首先见到的「笑脸」,有了它,我们可以组织和使用 Mac 里的几乎所有东西,包括应用程序.文件 ...
- [.net 面向对象编程基础] (10) 类的成员(字段、属性、方法)
[.net 面向对象编程基础] (10) 类的成员(字段.属性.方法) 前面定义的Person的类,里面的成员包括:字段.属性.方法.事件等,此外,前面说的嵌套类也是类的成员. a.类的成员为分:静态 ...
- Visual Studio 原生开发的10个调试技巧(二)
原文:Visual Studio 原生开发的10个调试技巧(二) 我以前关于 Visual Studio 调试技巧的文章引起了大家很大的兴趣,以至于我决定分享更多调试的知识.以下的列表中你可以看到写原 ...
- ★10 个实用技巧,让Finder带你飞~
10 个实用技巧,让 Finder 带你飞 Finder 是 Mac 电脑的系统程序,有的功能类似 Windows 的资源管理器.它是我们打开 Mac 首先见到的「笑脸」,有了它,我们可以组织和使用 ...
随机推荐
- SqlCommand.Parameters.add()方法
SqlParameter 类 表示 SqlCommand 的参数,也可以是它到 DataSet 列的映射.无法继承此类. 命名空间: System.Data.SqlClient 程序集: Syst ...
- js获取url的各项参数
function getQueryStringArgs() { //取得查询字符串并去掉开头的问号 var qs = location.search.length > 0 ? location. ...
- ie6下:png图片不透明 和 背景图片为png的节点的内部标签单击事件不响应
1.png图片不透明 少量图片时:使用滤镜: _background:none; _filter:prodig:DXImageTransform.Microsoft.AlphaImageLoader( ...
- Zepto源码笔记(二)
uniq(array) 返回不存在重复值的数组 function classRE(name) 判断classCache中是否已存在name,若存在则取出classCache[name];否则存入该类名 ...
- python之7-3对象的信息/方法获取
我们可以用dir()来获取一个类,一个模块,一个字符串的信息/方法 例如: #可以列出Image模块的方法 >>import Image >>dir(Image) #列出字符串 ...
- Number Sequence(HDU 1005 构造矩阵 )
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- webapi 上传图片
需求:上传学员信息时同时上传头像信息,学员基本信息表和科目表为一对多关系表(添加基本信息后添加通过科目信息). 测试: [HttpPost] public string Post() { if ( ...
- Hibernate学习笔记--核心编程
参考资料:Java Web核心框架 http://blog.csdn.net/lsh6688/article/details/7611950 补充:ThreadLocal的使用:http://www. ...
- Baidu百度搜索引擎登录网站 - Blog透视镜
Baidu百度是中国的搜索引擎,有心经营中国市场的网友,自然不能错过,不过Google谷歌已经遭中国封锁,如果你的网站是用Blogger架设的,具有blogspot.com网域的,则会无法浏览. 阅读 ...
- Android相关类关系
Activity Window.WindowManager View. interface----ViewManager LayoutInflater Components Activity.Serv ...