读书笔记_GDI+程序设计_第二章(绘图表面)
2008-09-07 12:47
302 查看
1. Alpha成分
GDI+中的颜色有一种Alpha成分可用于控制颜色的透明度。使用Alpha成分可以控制淡入/淡出效果,可以绘制在其它图形之上的水印效果。Alpha成分由一个0到255之间的整数表示。以下代码展示了淡入淡出效果
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
menuStrip1.BackColor = Color.FromArgb(alpha, menuStrip1.BackColor);
Timer timer = new Timer();
timer.Interval = 100;
timer.Tick += new EventHandler(timer_Tick);
timer.Start();
}
void timer_Tick(object sender, EventArgs e)
{
Timer t = (Timer)sender;
t.Stop();
if (alpha > 255)
{
return;
}
menuStrip1.BackColor = Color.FromArgb(alpha, menuStrip1.BackColor);
alpha++;
t.Start();
}
private int alpha = 0;
}
上面的代码我们在Form1中添加了一个MenuStrip对象并让该对象背景色的alpha值按每0.1秒加1的速度增加,这样就得到了淡入淡出的效果
2. GDI+坐标系
当我们在象素(1,2)和(5,2)之间绘制一条矢量线时,线段的实际长度是5个象素而不是4个象素,为什么呢?
因为点是无限小的,而象素不是,它是一个方块,其边有一定的长度。在点(1,2)和(5,2)之间绘制的线段实际上是在象素(1,2)的中心和象素(5,2)的中心之间绘制的,其长度的确是4个象素。但GDI+要把5个象素标记为黑色,所以我们得到的线段的长度是从象素(1,2)的左边开始到象素(5,2)右边为止——其长度正好5个象素。
当绘制左上角(1,0)宽和高分别为5,4的矩形时,实际绘制的矩形宽度为6个象素,高度为5个象素;然而在填充矩形时,这个矩形的宽度为5个象素,高度为4个象素,为什么呢?
第一,现在,钢笔的宽度并不重要,我们不是绘制轮廓,而是绘制一个实心的图形轮廓。第二,假定钢笔的宽度并不是问题,GDI+知道可以提供一个矩形,其尺寸与指定的尺寸完全相同(即5 X 4)。但它不能把实心矩形的左上角设置为象素(1,0)的中心,因为它可以处理的最小区域是整个象素,在这里,它要么填充整个象素,要么不填充该象素。
这里应用了一个规则:如果请求的矩形需要填充象素的右下象限,就填充该象素的全部区域。
使用反锯齿功能:
当打开反锯齿功能后,输入下面的代码
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
e.Graphics.FillRectangle(Brushes.Red, new Rectangle(10, 50, 10, 10));
会在屏幕上绘制一个左上角(10,50)宽和高均为11的矩形,并且该矩形的角象素只有25%的灰度,边象素只有50%的灰度。
要准确的定位某些象素,在绘图时根本不使用反锯齿功能,我们可以把浮点数坐标传送给所有的方法,且在半象素上使用坐标。如下代码
e.Graphics.FillRectangle(Brushes.Red, 10.5f, 70.5f, 10f, 10f);
得到的是左上角(11,71)高和宽均为10的矩形。
将PointF转换为Point结构时,有三个选项
Ceiling方法把值圆整为下一个最大的整数
Round方法把值圆整为最接近的整数
Truncate方法截去小数点右边的所有数字。
因此,输入PointF(2.5f, 3.5f)得到的结果分别为
3,4
2,4
2,3
GDI+中的颜色有一种Alpha成分可用于控制颜色的透明度。使用Alpha成分可以控制淡入/淡出效果,可以绘制在其它图形之上的水印效果。Alpha成分由一个0到255之间的整数表示。以下代码展示了淡入淡出效果
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
menuStrip1.BackColor = Color.FromArgb(alpha, menuStrip1.BackColor);
Timer timer = new Timer();
timer.Interval = 100;
timer.Tick += new EventHandler(timer_Tick);
timer.Start();
}
void timer_Tick(object sender, EventArgs e)
{
Timer t = (Timer)sender;
t.Stop();
if (alpha > 255)
{
return;
}
menuStrip1.BackColor = Color.FromArgb(alpha, menuStrip1.BackColor);
alpha++;
t.Start();
}
private int alpha = 0;
}
上面的代码我们在Form1中添加了一个MenuStrip对象并让该对象背景色的alpha值按每0.1秒加1的速度增加,这样就得到了淡入淡出的效果
2. GDI+坐标系
当我们在象素(1,2)和(5,2)之间绘制一条矢量线时,线段的实际长度是5个象素而不是4个象素,为什么呢?
因为点是无限小的,而象素不是,它是一个方块,其边有一定的长度。在点(1,2)和(5,2)之间绘制的线段实际上是在象素(1,2)的中心和象素(5,2)的中心之间绘制的,其长度的确是4个象素。但GDI+要把5个象素标记为黑色,所以我们得到的线段的长度是从象素(1,2)的左边开始到象素(5,2)右边为止——其长度正好5个象素。
当绘制左上角(1,0)宽和高分别为5,4的矩形时,实际绘制的矩形宽度为6个象素,高度为5个象素;然而在填充矩形时,这个矩形的宽度为5个象素,高度为4个象素,为什么呢?
第一,现在,钢笔的宽度并不重要,我们不是绘制轮廓,而是绘制一个实心的图形轮廓。第二,假定钢笔的宽度并不是问题,GDI+知道可以提供一个矩形,其尺寸与指定的尺寸完全相同(即5 X 4)。但它不能把实心矩形的左上角设置为象素(1,0)的中心,因为它可以处理的最小区域是整个象素,在这里,它要么填充整个象素,要么不填充该象素。
这里应用了一个规则:如果请求的矩形需要填充象素的右下象限,就填充该象素的全部区域。
使用反锯齿功能:
当打开反锯齿功能后,输入下面的代码
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
e.Graphics.FillRectangle(Brushes.Red, new Rectangle(10, 50, 10, 10));
会在屏幕上绘制一个左上角(10,50)宽和高均为11的矩形,并且该矩形的角象素只有25%的灰度,边象素只有50%的灰度。
要准确的定位某些象素,在绘图时根本不使用反锯齿功能,我们可以把浮点数坐标传送给所有的方法,且在半象素上使用坐标。如下代码
e.Graphics.FillRectangle(Brushes.Red, 10.5f, 70.5f, 10f, 10f);
得到的是左上角(11,71)高和宽均为10的矩形。
将PointF转换为Point结构时,有三个选项
Ceiling方法把值圆整为下一个最大的整数
Round方法把值圆整为最接近的整数
Truncate方法截去小数点右边的所有数字。
因此,输入PointF(2.5f, 3.5f)得到的结果分别为
3,4
2,4
2,3
相关文章推荐
- 读书笔记_GDI+程序设计_第三章(钢笔和笔刷)
- 读书笔记_GDI+程序设计_第十四章(鼠标事件和指针)
- 读书笔记 - js高级程序设计 - 第十五章 使用Canvas绘图
- JavaScript高级程序设计(第3版)第二章读书笔记
- 读书笔记_GDI+程序设计_第四章(文本和字体)
- 读书笔记 - javascript 高级程序设计 - 第二章 在Html中使用JavaScript
- 《着色器和屏幕特效》读书笔记第二章-表面着色器和纹理映射
- 读书笔记_GDI+程序设计_第五章(图像)(上)
- GDI+基础知识二 绘图表面
- 读书笔记_GDI+程序设计_第五章(图像)(下)
- 读书笔记_GDI+程序设计_第六章(GraphicsPaths和Regions)
- MFC Windows 程序设计 第二章 在窗口中绘图
- 读书笔记_GDI+程序设计_第七章(裁剪和失效)
- 『C程序设计』读书笔记系列文章之第二章 数据类型、运算符与表达式
- 读书笔记_GDI+程序设计_第八章(变换)
- 读书笔记_GDI+程序设计_第十三章(滚动)
- 现在操作系统-第二章读书笔记2.2
- 《深入理解Java虚拟机》读书笔记:第二章Java内存区域与内存溢出异常
- 仿人机器人 第二章 运动学 2.1坐标变换 读书笔记
- c# GDI+简单绘图(四)----仿MS画板