C#语言 第四部分 图形界面编程(四) 尺寸、坐标、边界

这一课很简单,学习几个类即可。

1 尺寸:Size类和SizeF类

Size类是一个表示尺寸的值类型类,具有两个正常属性:Width和Height,表示宽度和高度;一个静态属性:Empty,表示0尺寸常量(Width属性和Height属性均为0)。

SizeF类和Size类似,区别主要是Size类型对象的属性为整数值,SizeF类型对象的属性为单精度浮点类型。

看一个简单的例子:

using System;
using System.Drawing;
 
namespace Edu.Study.Graphics.ToolClasses {
    static class Program {
        static void Main(string[] args) {
            // 定义Size类型对象, 宽度200, 高度100
            Size size = new Size(100, 200);
            // 重新设置宽度为150
10              size.Width = 150;
11              Console.WriteLine(size);
12   
13              // 将size变量表示的对象和一个宽度300, 高度200的Size对象相加
14              size = Size.Add(size, new Size(300, 200));
15              Console.WriteLine(size);
16   
17              // 将size变量表示的对象和一个宽度50, 高度20的Size对象相减
18              size = Size.Subtract(size, new Size(50, 20));
19              Console.WriteLine(size);
20   
21   
22              // 定义SizeF类型对象
23              SizeF sizeF = new SizeF(200.123F, 100.321F);
24              Console.WriteLine(sizeF);
25   
26              // 将sizeF变量表示的对象和一个宽度50, 高度50的SizeF对象相加
27              sizeF = SizeF.Add(sizeF, new SizeF(50, 50));
28              Console.WriteLine(sizeF);
29   
30              // 将sizeF变量表示的对象和一个宽度50, 高度50的SizeF对象相减
31              sizeF = SizeF.Subtract(sizeF, new SizeF(50, 50));
32              Console.WriteLine(sizeF);
33   
34              // 将SizeF类型对象转换为Size类型对象
35              // 得到的Size对象高度宽度属性不小于原始SizeF对象的高度宽度属性
36              Console.WriteLine(Size.Ceiling(sizeF));
37              // 将SizeF类型对象转换为Size类型对象
38              //得到的Size对象高度宽度属性为原始SizeF对象高度宽度属性四舍六入五成双的结果
39              Console.WriteLine(Size.Round(sizeF));
40              // 将SizeF类型对象转换为Size类型对象, 
41              // 得到的Size对象高度宽度属性为原始SizeF对象高度宽度属性截掉小数部分的结果
42              Console.WriteLine(Size.Truncate(sizeF));
43   
44              // 将Size.Empty赋值给size变量
45              size = Size.Empty;
46              Console.WriteLine(size);
47          }
48      }
49  }

很简单的代码,对照注释就应该可以理解,无需过多讲解。

2 坐标:Point和PointF类

坐标由Point和PointF类表示(整型属性和浮点数属性),是一个表示点的坐标的值类型类,具有X, Y两个属性,表示坐标系上的一个点。

注意:.net Framework设定屏幕右上角的点为(0, 0)坐标,并且y轴向下为正,x轴向右为正

其余和前面的完全类似,参考即可,看范例:

using System;
using System.Drawing;
 
namespace Edu.Study.Graphics.ToolClasses {
    static class Program {
        static void Main(string[] args) {
 
            // 定义Point类型对象, 宽度200, 高度100
            Point point = new Point(100, 200);
10              // 重新设置宽度为150
11              point.X = 150;
12              Console.WriteLine(point);
13   
14              // 将point变量表示的对象和一个宽度300, 高度200的Size对象相加
15              point = Point.Add(point, new Size(300, 200));
16              Console.WriteLine(point);
17   
18              // 将point变量表示的对象和一个宽度50, 高度20的Size对象相减
19              point = Point.Subtract(point, new Size(50, 20));
20              Console.WriteLine(point);
21   
22   
23              // 定义PointF类型对象
24              PointF pointF = new PointF(200.123F, 100.321F);
25              Console.WriteLine(pointF);
26   
27              // 将pointF变量表示的对象和一个宽度50, 高度50的SizeF对象相加
28              pointF = PointF.Add(pointF, new SizeF(50, 50));
29              Console.WriteLine(pointF);
30   
31              // 将pointF变量表示的对象和一个宽度50, 高度50的SIzeF对象相减
32              pointF = PointF.Subtract(pointF, new SizeF(50, 50));
33              Console.WriteLine(pointF);
34   
35              // 将PointF类型对象转换为Point类型对象
36              // 得到的Point对象高度宽度属性不小于原始PointF对象的高度宽度属性
37              Console.WriteLine(Point.Ceiling(pointF));
38              // 将PointF类型对象转换为Point类型对象
39              //得到的Point对象高度宽度属性为原始PointF对象高度宽度属性四舍六入五成双的结果
40              Console.WriteLine(Point.Round(pointF));
41              // 将PointF类型对象转换为Point类型对象, 
42              // 得到的Point对象高度宽度属性为原始PointF对象高度宽度属性截掉小数部分的结果
43              Console.WriteLine(Point.Truncate(pointF));
44   
45              // 将Point.Empty赋值给point变量
46              point = Point.Empty;
47              Console.WriteLine(point);
48          }
49      }
50  }

注意:Point.Add和Point.Subtract方法的第二个参数是一个Size类型对象,PointF类以此类推。

3 边界:Rectangle和RectangleF类

边界是一个矩形,由Rectangle类和RectangleF类定义,依旧是值类型对象,具有一个表示左边界的Left属性,一个表示上边界的Top属性,一个表示宽度Width属性和一个表示高度Height属性组成。Rectangle类的属性为整数类型,RectangleF类的属性为单精度浮点类型。

边界不仅定义了坐标,还定义了尺寸。坐标为该矩形右上角点的左边,尺寸为矩形的大小。使用起来也很简单,看代码范例即可:

using System;
using System.Drawing;
 
namespace Edu.Study.Graphics.ToolClasses {
    static class Program {
        static void Main(string[] args) {
            // 实例化一个左上角坐标为X=10, Y=10, 宽度100, 高度200的矩形
            Rectangle rect = new Rectangle(10, 10, 100, 200);
            Console.WriteLine(rect);
10              // 输出矩形的右下角坐标
11              Console.WriteLine(rect.Right + ", " + rect.Bottom);
12   
13              // 将矩形的左上角X坐标向正方向移动2个单位
14              rect.X += 20;
15              Console.WriteLine(rect);
16   
17              // 获取矩形左上角坐标, 返回一个Point类型对象
18              Console.WriteLine(rect.Location);
19             
20              // 将矩形的边长各放大4个单位和6个单位
21              // 左上角X坐标向负方向移动2, Y坐标向负方向移动3
22              // 右下角X坐标向正方向移动2, Y坐标向正方向移动3
23              // Rectangle类具备一个普通方法和一个静态方法, 功能相同
24              Console.WriteLine(Rectangle.Inflate(rect, 2, 3));    // 使用类的静态方法
25              rect.Inflate(2, 3);        // 使用普通方法
26              Console.WriteLine(rect);
27   
28              // 获取矩形{X=30,Y=10,Width=100,Height=200}与
29              // 矩形{X=60,Y=90,Width=300,Height=500}的交集矩形
30              // Rectangle类具备一个普通方法和一个静态方法, 功能相同
31              Console.WriteLine(
32                  Rectangle.Intersect(rect, new Rectangle(60, 90, 300, 500))); // 使用类的静态方法
33              rect.Intersect(new Rectangle(60, 90, 300, 500));    // 使用普通方法
34              Console.WriteLine(rect);
35             
36              // 判断两个矩形是否相交
37              Console.WriteLine(rect.IntersectsWith(new Rectangle(100, 90, 70, 200)));
38             
39              // 移动矩形, X坐标向正方向移动50单位, Y坐标向正方向移动100单位
40              rect.Offset(50, 100);
41              Console.WriteLine(rect);
42   
43   
44              // 下面的代码演示RectangleF类, 情况和Rectangle完全类似,
45              // 请参照Rectangle的代码理解
46              RectangleF rectF = new RectangleF(10.1F, 10.2F, 100.123F, 200.456F);
47              Console.WriteLine(rectF);
48              Console.WriteLine(rectF.Right + ", " + rectF.Bottom);
49   
50              rectF.X += 20;
51              Console.WriteLine(rectF);
52   
53              Console.WriteLine(rectF.Location);
54   
55              Console.WriteLine(RectangleF.Inflate(rectF, 2.1F, 3.2F));
56              rectF.Inflate(2.1F, 3.2F);
57              Console.WriteLine(rectF);
58   
59              Console.WriteLine(RectangleF.Intersect(rectF, new RectangleF(60, 90, 300, 500)));
60              rectF.Intersect(new RectangleF(60, 90, 300, 500));
61              Console.WriteLine(rectF);
62   
63              Console.WriteLine(rectF.IntersectsWith(new RectangleF(100, 90, 70, 200)));
64   
65              rectF.Offset(50.99F, 100.01F);
66              Console.WriteLine(rectF);
67   
68              // RectangleF类对象转化为Rectangle类对象(四舍六入五成双)
69              rect = Rectangle.Round(rectF);
70              Console.WriteLine(rect);
71   
72              // RectangleF类对象转化为Rectangle类对象(取不小于整数)
73              rect = Rectangle.Ceiling(rectF);
74              Console.WriteLine(rect);
75   
76              // RectangleF类对象转化为Rectangle类对象(小数部分截断)
77              rect = Rectangle.Truncate(rectF);
78              Console.WriteLine(rect);
79   
80              // 取Empty静态量
81              rect = Rectangle.Empty;
82              Console.WriteLine(rect);
83   
84              // 用左上角坐标和右下角坐标初始化矩形
85              rect = Rectangle.FromLTRB(10, 20, 50, 90);
86              Console.WriteLine(rect);
87          }
88      }
89  }

注意,Rectangle类和RectangleF类中具有几个方法,既有普通方法形式,也有静态方法形式。普通方法会改变当前对象的属性,静态方法则返回一个新的矩形对象,不会改变原有矩形对象的属性。

最后在重申一次,这些类都是值类型类,注意其对象在比较和赋值时候与引用类型对象的区别

本章代码下载

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值