图形界面编程(四) 尺寸、坐标、边界

点击打开链接


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

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(100200);
            // 重新设置宽度为150
10             size.Width = 150;
11             Console.WriteLine(size);
12  
13             // 将size变量表示的对象和一个宽度300, 高度200的Size对象相加
14             size = Size.Add(size, new Size(300200));
15             Console.WriteLine(size);
16  
17             // 将size变量表示的对象和一个宽度50, 高度20的Size对象相减
18             size = Size.Subtract(size, new Size(5020));
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(5050));
28             Console.WriteLine(sizeF);
29  
30             // 将sizeF变量表示的对象和一个宽度50, 高度50的SizeF对象相减
31             sizeF = SizeF.Subtract(sizeF, new SizeF(5050));
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(100200);
10             // 重新设置宽度为150
11             point.X = 150;
12             Console.WriteLine(point);
13  
14             // 将point变量表示的对象和一个宽度300, 高度200的Size对象相加
15             point = Point.Add(point, new Size(300200));
16             Console.WriteLine(point);
17  
18             // 将point变量表示的对象和一个宽度50, 高度20的Size对象相减
19             point = Point.Subtract(point, new Size(5020));
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(5050));
29             Console.WriteLine(pointF);
30  
31             // 将pointF变量表示的对象和一个宽度50, 高度50的SIzeF对象相减
32             pointF = PointF.Subtract(pointF, new SizeF(5050));
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(1010100200);
            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, 23));    // 使用类的静态方法
25             rect.Inflate(23);        // 使用普通方法
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(6090300500))); // 使用类的静态方法
33             rect.Intersect(new Rectangle(6090300500));    // 使用普通方法
34             Console.WriteLine(rect);
35            
36             // 判断两个矩形是否相交
37             Console.WriteLine(rect.IntersectsWith(new Rectangle(1009070200)));
38            
39             // 移动矩形, X坐标向正方向移动50单位, Y坐标向正方向移动100单位
40             rect.Offset(50100);
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(6090300500)));
60             rectF.Intersect(new RectangleF(6090300500));
61             Console.WriteLine(rectF);
62  
63             Console.WriteLine(rectF.IntersectsWith(new RectangleF(1009070200)));
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(10205090);
86             Console.WriteLine(rect);
87         }
88     }
89 }

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值