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;
}
}