CGElement类

CGElement类是图元基类,为抽象类。它定义了图元的公共属性,如颜色、线型、线宽等。geDrawMode枚举定义了正常、选择、拖曳和删除等4种绘图模式,对应于图元不同的显示效果。geStyle枚举定义图元的线型,有实线、虚线、点线等5种。

Draw方法是必须在派生类中重写的,它有两个参数:g为Graphics对象,指示绘图表面;aGrawMode 为geDrawMode枚举类型,表示以何种绘图模式绘图。

DrawSettings函数确定在不同绘图模式下用何种线条绘制图形。因为函数中用到了SetROP2函数,该函数有一个hdc参数,指示绘图环境的句柄,所以要传递一个hdc参数给它。调用DrawSet tings函数时, 用Grap ics .的GetHdc法可以获得该参数的值。 要注意的是,在这里,hdc参数为IntPtr类型,而不是VB6.0中的Long型。以正常模式绘图时,SetROP2函数的第2个参数的值设置为13(此时,钢笔的颜色覆盖背景色),用宽度为1的实线绘制,颜色为黑色:以选择模式绘图时,SetROP2函数的设置与上面的相同,用宽度为1的虚线绘制,颜色为红色;以拖曳模式绘图时,SetROP2函数的第2个参数的值设置为10,用反转方式画线,此时用宽度为1的实线画线,颜色为蓝色;以删除模式绘图时,SetROP2函数的设置与正常模式的相同,用宽度为1的实现绘制,颜色为白色。因为背景色设为白色,用白色重画图元实际上就将图元在屏幕上删除了。在VC#.NET中直接指定颜色值。

code.vc#.net
	public abstract class CGElement
	{
		private int m_Color;
		private int m_Style;
		private int m_Width;
		public int Color
		{
			get{return m_Color;}
			set{m_Color=value;}
		}
		public int Style
		{
			get{return m_Style;}
			set{m_Style=value;}
		}
		public int Width
		{
			get{return m_Width;}
			set{m_Width=value;}
		}
		public CGElement()
		{
			Init();
		}
	    //初始化图元
	   protected void Init()
       {
        	m_Style=0;
	        m_Width=1;
			m_Color=0;
		}
		//绘制图元
		abstract public void Draw(Graphics g,DrawMode aDrawMode);
		//根据不同的绘图模式设置不同的绘图参数
		public int[] DrawSettings(IntPtr hdc,DrawMode aDrawMode)
		{
			switch(aDrawMode)
			{
				case DrawMode.Normal:
		            Win32API.SetROP2(hdc, 13);
	                m_Style = 0;
	                m_Width = 1;
	                m_Color =0;
					break;
	            case DrawMode.Selec:
	                Win32API.SetROP2(hdc, 13);
	                m_Style = 1;
	                m_Width = 1;
	                m_Color =255;
					break;
	            case DrawMode.Drag:
	                Win32API.SetROP2(hdc, 10);
	                m_Style = 0;
	                m_Width = 1;
	                m_Color =16711680;
					break;
	            case DrawMode.Delete:
	                Win32API.SetROP2(hdc, 13);
	                m_Style = 0;
	                m_Width = 1;
	                m_Color =16777215;
					break;
	       }
			int[] penPara={m_Style,m_Width,m_Color};
		   return penPara;
		}
	}