您的位置:首页 > 其它

读书笔记_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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: