您的位置:首页 > 编程语言 > C#

C# GDI+绘图高级编程(三)

2011-02-01 09:50 162 查看
  测量坐标和区域
       GDI+使用几个类似的结构来表示坐标或区域。下面介绍几个结构,他们都是在System.Drawing命名空间中定义的。

       结构               |          主     要    公     共      属 性|           
|    Point                 |     X,Y                                                 |
|    PointF               |                                                           |
|    Size                   |    Width,Height                                   |
|    SizeF               |                                                             |
|    Rectangle         |    Left,Right,Top,Bottom,Width,Height|
|    RectangleF       |       ,X,Y,Location,Size                        |
(1) Point、PointrF结构
     从概念上讲,Point在这个结构中是最简单的,在数学上,它完全等价于一个二维矢量,包含两个公共整形属性,表示它与某个特定位置的水平和垂直距离(在屏幕上),如下图。



       为了从点A到点B,需要水平移动20个单位,并向下垂直移动10个单位,在图中标为x和y,这就是他们的一般含义。创建一个Point结构,表示他们:
       
Point ab = new Point(20,10);
Console.WriteLine("Moved{0} across,{1} down",ab.x,ab.y);
 
       X 和 Y都是读写属性,也可以在Point中设置这些值:

Point ab = new Point();
ab.X = 20;
ab.Y = 10;
Console.WirteLine("Moved{0} across,{1} down",ab.X,ab.Y);
 
       注意:按照惯例,水平和垂直坐标表示为x和y(小写),但对应的Point属性是X和Y(大写),因为在C#中,公共属性的一般约定是名称以大写字母开头。
       PointF与Point完全相同,但X和Y属性的类型是float,而不是int。PointF属性用于坐标不是整数值得情况。已经为这些结构定义了数据类型转换,这样就可以把Point隐式转换为PointF(这个转换是结构之间的)。但没有相应的逆过程,要把Point转换为Point,必须显示的复制值或使用下面的3个转换方法:Round(),Truncate(),Ceiling()。
       
PointF abFloat = new PointF(25.5F,10.9F);

// converting to Point
Point ab = new Point();
ab.X = (int)abFloat.X;
ab.Y = (int)abFloat.Y;
Point ab1 = Point.Round(abFloat);
Point ab2 = Point.Truncate(abFloat);
point ab3 = Point.Ceiling(abFloat);

// but conversion back to PointF is implicit
PointF abFloat2 = ab;
 
       在默认情况下,GDI+把单位看作是屏幕(或打印机,无论图形设备是什么,都可以这样认为)的像素,这就是Graphics对象方法把它们接受到的坐标看作其参数的方式。例如:点 new Point(20,10)表示在屏幕上水平移动20个像素,向下垂直移动10个像素。通常这些像素从窗体客户区域的左上角开始测量,如上图。但是,情况并不是如此。在某些情况下,需要以窗口的左上角(包括其边框)为原点来绘图,甚至以屏幕的左上角为原点。除特殊说明,大多数可以假定像素是相对于客户区域的左上角。

(2) Size、SizeF结构
       Size结构用于int类型,SizeF用于float类型。
       在许多情况下Size结构与Point结构是相同的。有两个整形属性,表示水平和垂直距离----区别是两个属性的名称是:Width和Heihgt。

Size ab = new Size(20,10);
Console.WriteLine("Moved {0} across,{1} down",ab.Width,ab.Height);
 
       严格的讲,Size在数学上与Point表示的含义相同;但在概念上它使用的方式略有不同。Point用于说明实体在什么地方,而Size用于说明实体有多大。但是Size和 Piont是紧密相关的,目前甚至支持他们之间的显示转换:
Point point = new Point();
Size size = (Size)point;
Point anotherPoint = (Point)size;
 

       例如:前面绘制的矩形,其左上角的坐标是(0,0),大小是(50,50)。这个矩形的大小是(50,50),可以用一个Size实例来表示。其右下角的坐标也是(50,50),但它由一个Point来表示。

       Point和Size结构的相加运算符都已经重载了,所以可以把一个Size加到Point结构上,得到另一个Point结构:
static void Main(string[] args)
{
Point topLeft = new Point(10,10);
Size rectangleSize = new Size(50,50);
Point bottomRight = topLeft + rectangleSize;
Console.WriteLine("topLeft = " + topLeft);
Console.WriteLine("bottomRight = " + bottomRight);
Console.WirteLine("Size = " + rectangleSize);
}

运行结果:
topLeft = {X=10,Y=10}
bottomRight = {X=60,Y=60}
Size = {Width=50,Height=50}
 

      这个结果说明Point和Size的ToString()方法已被重写并以{X,Y}的格式显示。
      还可以进行Point和Size之间的显示数据类型转换:
Point topLeft = new Point(10,10);
Size s1 = (Size)topLeft;
Point p1 = (Point)s1;
 
      说明:s1.Width被赋予topLeft.X,s1.Height被赋予topLeft.Y的值。最后p1与topLeft的值相同。

<注:>本文参考文献
《C#高级编程》第4版 清华大学出版社
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息