1,在C#中,结构体和类的成员都会被默认设置为私有成员。区别在于类是引用类型,结构体是值类型。
引用类型是指,一个指向内存块的指针。
2,C#中,点、尺寸、矩形、颜色 四个数据类型都是结构体而不是类。
3,Point结构具有两个读写属性的,叫做x,y的32为整数。
Point是个结构体,但是定义的同时也必须赋值
Point pt=new Point();然后pt.x=1;pt.y=2;
Point结构本身有个静态字段 Point.Empty,可以对Point的值进行初始化。X,Y都会被初始化为0。还有个IsEmpty只读属性,如果X,Y都为0,可以返回一个true。
4,Point的实例有方法ToString(); 可以输出 {x=1,y=2}这样的结果
pt1.Equals(Point pt2);可以比较两个点是否同一个坐标,返回一个bool结果。也可以用pt1==pt2代替。
pt.Offset(4,-5);可以设置偏移量。相当于pt.x+=4,pt.y+=-5;
5,Point 数组: Point[] pt=new Point[20];就可以使用pt[0]~pt[19];用于表示曲线上的一系列点。每个点都会被初始化为0,0。
创建数组的时候可以初始化数组
Point[] pt=new Point[3]{new Point(1,2),new Point(3,4),new Point(5,2)};
Point[] pt=new Point[]{new Point(1,2),new Point(3,4),new Point(5,2)};
Point[] pt={new Point(1,2),new Point(3,4),new Point(5,2)};
6, Size
Size结构和Point结构类似,有3个属性,Width,Hight,IsEmpty。创建Size方式和Point一样,Size size=new Size(15,20); (Width和Hight可正可负)
Size和Point可以相互构造 Size(Point point); Point(Size size);可以相互强制转换 size=(Size)pt; pt=(Point)size;
7,Size可以进行+ -运算。size1=size2+size3; size1-=size2;
Point可以与Size进行加减。pt1+=size1
8,Float版本
PointF ptf=new PointF();
ptf.x=10.2f;
ptf.y=8.7f; (记得必须要加f)
Pointf不包括Offset方法。
可以将一个Point强制转换成PointF
ptf=(PointF)pt,但是不能进行相反的强制转换。
但是可以使用以下方法转换
Point Round(PointF ptf);四舍五入
Point Truncate(PointF ptf);去掉小数点
Point Ceiling(PointF ptf);去掉小数点后+1
9,矩形就是一个Point加上一个Size 。构造方法为Rectangle(Point pt,Size size);或者Rectangle(int x,int y ,int width,int height)
RectangleF的构造是RectangleF(PointF ptf,SizeF sizef);RectangleF(float x,float y ,float width,float height)
Rectangle可以强制转换成RectangleF,RectangleF可以通过Round,Truncate,Ceiling方法转换成Rectangle。
Rectangle属性包括:Point location,Size size,int X,int Y,int width,int height,int left,int top,int right,int bottom,bool isEmpty.
10,方法Offset可以把Rectangle从一个位置移动到另一个位置,rect.Offset(2,4);相当于rect.X+=2,rect.Y+=4
或者使用rect.location+=new Size(2,4);
Inflate可以把矩形从圆心放大,rect.Inflate(3,6);横坐标各增加3,纵坐标各增加6.
11,窗体和客户区,客户区不包含窗体的边框、标题栏、菜单栏。有两个属性
1,ClientSize,
2,ClientRectangle。
避免设置一个属性的属性。例如form1.client.ClinetSize.Width=100。这是错误的。
可以用这样的形式form1.clinet.ClinetSize=new Size(200,300);
12,OnMove是Move事件的对应的方法,在窗口移动的时候触发该事件。对应的委托是void MoveEvent(object obj,EventArg ea); OnResize一样,在窗口大小变化的时候触发该事件。
在OnResize 里增加了Invalidate(),可以直接用ResizeRedraw属性来代替。ResizeRedraw=true;他的本质是调用了基类的OnResize()方法,在基类的OnResize方法中可能包含有语句
{
if(ResizeRedraw)
Invalidate();
}
在重写OnResize的时候一定要调用基类的OnReSize,否则ResizeRedraw会失效。
13,Control类的Invalidate()方法可以是客户区无效,调用OnPaint()方法重绘客户区。但是OnPaint不是立即调用的。需要等待其他事件处理完。如果要立即重绘客户区,在Invalidate()后,在调用Control类的Update()方法即可。
14,Color是System.Drawing空间下的 一个机构。WinForm中的颜色基于ARGB (alpha-red-green-blue)模型。Color的构造函数为Color clr=new Color; 是一个纯黑色。一般使用Color的属性或者Color的方法来得到Color的对象。
静态方法Color.FromArgb,可以返回一个Color对象,重载的方法有
Color Color.FromArgb(int r,int g,int b);
Color Color.FromArgb(int a,int r,int g,int b);
Color Color.FromArgb(int a,Color clr);
15,Pen类是由Color类指定的。例如Pen pen=new Pen(Color clr);如果要使用预制颜色,可以使用Pens类,它包含有很多属性,可以返回一个Pen的对象。
16,Brush是一个抽象类,不能对其进行实例化,他有几个子类,SolidBrush,HashBrush等等。
Brush brush=new SolidBrush(Color clr);
Burshes类有很多属性,可以返回一个Brush。
17,在DrawString有个重载的方法,里边包含StringFormat类,可以决定String在控件中的现实位置。
StringFormat strfmt=new StringFormat();
strfmt这个类有两个属性,Alignment和LineAlignment,是水平位置和竖直位置。StringAlignment结构包含三个枚举类型,near,middle,far。
strfmt.Alignment=StringAlignment.near;
strfmt.Alignment=StringAlignment.far;
18,MeasureString方法。MeasureString 是Grafics类的一个方法。SizeF stringSize=grfx.measureString(String str,Font f);
19,在矩形里的文本: grfx.DrawString(String str,Font font,RectangleF rect,StringFormat strfmt);
如果这个矩形是ClientRectangle,那么就可以把文本输入在客户区里,自动换行。