MFC—课程设计
}
break;
case 1:
m_TuYuanTyp=EnumTuYuanTyp_Rectangle;
break;
case 2:
m_TuYuanTyp=EnumTuYuanTyp_Triangle;
break;
case 3:
m_TuYuanTyp=EnumTuYuanTyp_Circle;
break;
case 4:
m_TuYuanTyp=EnumTuYuanTyp_Ellipse; break;
case 5:
m_TuYuanTyp=EnumTuYuanTyp_Text; break;
default: }
CDialog::OnOK();
ASSERT(0);
6.定义动态数组
1)定义(LwhDoc.h) public:
CObArray m_Elements; 2)清除(LwhDoc.cpp) //清除图元地址,释放空间 CLwhDoc::~CLwhDoc()
11
MFC—课程设计
{ }
for(int i=0;i m_Elements.RemoveAll(); delete m_Elements[i]; m_Elements[i]=NULL; 7.建立Shape类及其子类 一个类要支持支持序列化Serialize,必须从CObject派生,并且在类的声明(.h文件)中包含DECLARE_SERIAL申明,在类的实现(.cpp)中包含IMPLEMENT_SERIAL申明。所以,要建立支持序列化的Shape类,首先选择ClassView,鼠标右键单击工程名,选择New Class,在类的类型中选择Generic Class,输入类名CShape,并在下方Derived From中输入CObject,继承类型为public,点击确定,系统会生成相应的Shape.cpp文件和Shape.h文件。 在Shape.h中定义其成员变量和成员函数,注意OnDraw函数应定义为纯虚函数(参见附表1.函数定义与功能一览表)。然后由Shape类派生其六个子类CSquare,CRectangle,CTriangle,CCircle,CEllipse,CText,继承方式均为public,在子类中也定义其成员函数及变量(以CSquare为例) class CShape : public CObject { public: CShape(); virtual ~CShape(); virtual void Draw(CDC*pDC)=0;//绘制图元 virtual bool IsMatched(CPoint pnt)=0;//点是否落在图形内部 virtual void Serialize(CArchive& ar) = 0; int OrgX; 12 MFC—课程设计 int OrgY; int width; int high; int linewidth; int R1,R2,G1,G2,B1,B2; }; class CSquare:public CShape { public: CSquare(); CSquare(int x,int y,int w,int line,int r1,int g1,int b1,int r2,int b2,int g2); void Draw(CDC*pDC);//绘制 bool IsMatched(CPoint pnt);//重载点pnt是否落在图元内 virtual void Serialize(CArchive& ar );//序列化正方形图元 private: }; 在Shape.cpp中对Shape类极其子类进行序列化,并写入子类的成员函数,完成绘图和进行图元匹配功能(以CSquare为例) IMPLEMENT_SERIAL(CSquare, CObject, 1) //实现类CSquare的序列化,指定版本为1 void CSquare::Serialize(CArchive &ar) { if (ar.IsStoring()) { ar << OrgX<< OrgY;//原点坐标 ar < DECLARE_SERIAL(CSquare)//声明类CSquare支持序列化 13 MFC—课程设计 } } ar<< linewidth;//线宽 else { } ar >> OrgX >>OrgY;//原点坐标 ar >>width; ar >> linewidth;//线宽 CSquare::CSquare()//缺省构造函数,初始化 { } CSquare::CSquare(int x, int y, int w,int line,int r1,int g1,int b1,int r2,int b2,int g2) { OrgX = x;//原点坐标 OrgY = y; OrgX = 400;//原点坐标 OrgY = 400; linewidth= 1;//线宽 width = 100; linewidth=line; width = w; R1=r1; R2=r2; G1=g1; G2=g2; B1=b1; B2=b2; 14 MFC—课程设计 } void CSquare::Draw(CDC*pDC)//绘制函数 { CPen pen, *pOldPen; pen.CreatePen(PS_SOLID, linewidth,RGB(R1,G1,B1)); pOldPen = (CPen*)pDC->SelectObject(&pen); CBrush brush, *pOldBrush; brush.CreateHatchBrush(HS_DIAGCROSS, RGB(R2,G2,B2)); pOldBrush = (CBrush*)pDC->SelectObject(&brush); pDC->Rectangle(OrgX - width / 2, OrgY -width / 2, OrgX + width / 2, OrgY + width / 2); } bool CSquare::IsMatched(CPoint pnt)//图元匹配函数 { if ((OrgX-width/2 <= pnt.x && pnt.x <= OrgX + width/2) && (OrgY - pDC->SelectObject(pOldPen); pDC->SelectObject(pOldBrush); width/2 <= pnt.y && pnt.y <= OrgY+width/2)) } return true; else return false; 8.OnDraw() 由于Shape.cpp调用了Ondraw()函数,而OnDraw()函数的定义是在LwhView.cpp中(参见附表1.函数定义与功能一览表),故应该在LwhView.cpp中对Ondraw()进行调用声明,代码如下: void CLwhView::OnDraw(CDC* pDC) { 15