CCircle类

在项目中添加CCircle类,它是CGElement类的派生类。CCircle类也要继承CGElement类的3个属性和DrawSettings方法。除此之外,CCircle类还要提供确定圆本身所需要的圆心和圆上一点两个属性,另外还有一个Radius属性,它是只读的,根据圆心坐标和圆上一点的坐标,可以计算出半径Radius。与CLine类一样,CCircle也提供了3个构造函数。其中,根据两个给定的点构造一个圆是最常用的。

计算半径Radius时要用到数学药数,在VC#.NET中直接调用Math类。

code.vc#.net
	public class CCircle:CGElement
	{
		protected PointF m_Center;
		protected PointF m_pCircle;
		Module m=new Module();
		public PointF Center
		{
			get{return m_Center;}
			set{m_Center=value;}
		}
		public PointF PCircle
		{
			get{return m_pCircle;}
			set{m_pCircle=value;}
		}
		public float Radius
		{
			get
			{
				float r=m.DistPtoP(m_Center,m_pCircle);
				return r;
			}
		}
		public CCircle()
		{
            Init();
		}
		public CCircle(PointF pCenter,PointF pCircle)
		{
			Init();
			m_Center=pCenter;
			m_pCircle=pCircle;
		}
		public CCircle(CCircle aCircle)
		{
			m_Center=aCircle.Center;
			m_pCircle=aCircle.PCircle;
		}
		private new void Init()
		{
			base.Init();
			m_Center=new PointF(0,0);
			m_pCircle=new PointF(0,0);
		}
	}

在CCircle类中重写基类的Draw方法,根据不同的绘图模式绘圆。在绘图之前,同样需要将圆心和圆上一点的坐标从通用坐标转换为页面坐标。像素模式下,设备坐标的大小与该页面坐标相同。后面绘图的过程也基本上与绘直线段相同,但是需要选一把空刷子到绘图环境中,否则绘出的是黑色的圆形区域,该操作用GetStockObject断数实现,需要从Win32AP类中调用它。绘圆使用的是Ellipse函数。

code.vc#.net
		//绘圆
		override public void Draw(Graphics g,DrawMode aDrawMode)
		{
			long aPen,oldP;
			//将控制点的坐标由世界坐标转换为页面坐标
			PointF ec=m.WorldtoPage(m_Center);
			//获得当前绘图环境的句柄
			IntPtr hdc=g.GetHdc();
			//设置画笔参数
			int[] penPara=DrawSettings(hdc,aDrawMode);
			//创建画笔
			aPen=Win32API.CreatePen(penPara[0],penPara[1],penPara[2]);
			//把画笔选入绘图环境,并返回原来的画笔
			oldP=Win32API.SelectObject(hdc,aPen);
			//把空刷子选入绘图环境
			Win32API.SelectObject(hdc, Win32API.GetStockObject(5));
			//绘圆
	        Win32API.Ellipse(hdc, (int)(ec.X - Radius),
				  (int)(ec.Y + Radius),
		          (int)(ec.X + Radius),
				  (int)(ec.Y - Radius));
			//把原来的画笔选入绘图环境
			Win32API.SelectObject(hdc, oldP);
			//删除新创建的画笔
			Win32API.DeleteObject(aPen);
			//释放绘图环境句柄
			g.ReleaseHdc(hdc);
		}