您的位置:首页 > 其它

使用VC开发程序经验谈(二 续)

2008-04-28 00:05 381 查看
//下面是上面三个类的实现,注意list的用法//////////////////////////////////////////////////////////////////////// CMyArc Class////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CMyArc::CMyArc(MYXYZ i_pc, MYXYZ i_ps, MYXYZ i_pe){ m_pc=i_pc; m_ps=i_ps; m_pe=i_pe;}int CMyArc::Draw(long lDevice){ double dR=sqrt((m_ps.x-m_pc.x)*(m_ps.x-m_pc.x)+(m_ps.y-m_pc.y)*(m_ps.y-m_pc.y)+(m_ps.z-m_pc.z)*(m_ps.z-m_pc.z)); ::Arc((HDC)lDevice,m_pc.x-dR,m_pc.y-dR,m_pc.x+dR,m_pc.y+dR,m_ps.x,m_ps.y,m_pe.x,m_pe.y); return 0;}//////////////////////////////////////////////////////////////////////// CMyPolyLn Class////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CMyPolyLn::~CMyPolyLn(){ MYPOLYLN::iterator iter; for(iter=m_PolyLn.begin();iter!=m_PolyLn.end();iter++) { delete (*iter); } m_PolyLn.clear();} int CMyPolyLn::AddPoint(MYXYZ *pxyz){ MYXYZ *p=new MYXYZ; *p=*pxyz; m_PolyLn.insert(m_PolyLn.end(),p); return 0;}int CMyPolyLn::Draw(long lDevice){ HDC hdc=(HDC)lDevice; MYPOLYLN::iterator iter=m_PolyLn.begin();//该处为了图形的显示更明显,扩大了线的比例,更改了线的位置,正常情况下应该使用注释中的语句 MoveToEx(hdc,(*iter)->x*100+100,-(*iter)->y*100+200,NULL); //MoveToEx(hdc,(*iter)->x,(*iter)->y,NULL); for(iter=m_PolyLn.begin();iter!=m_PolyLn.end();iter++) { //该处为了图形的显示更明显,扩大了线的比例,更改了线的位置,正常情况下应该使用注释中的语句 LineTo(hdc,(*iter)->x*100+100,-(*iter)->y*100+200); // LineTo(hdc,(*iter)->x,(*iter)->y); } return 0;}//////////////////////////////////////////////////////////////////////// CShape Class////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CShape::~CShape(){ list<CMyBase*>::iterator iter; for(iter=m_List.begin();iter!=m_List.end();iter++) { delete (*iter); } m_List.clear();}int CShape::Draw(long lDevice){ list<CMyBase*>::iterator iter; for(iter=m_List.begin();iter!=m_List.end();iter++) { (*iter)->Draw(lDevice); } return 0;} 至此,几何元素对象类实现完成,可以在主程序中进行测试:void CShapeView::OnDraw(CDC* pDC){ CShapeDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); { CShape Shape; CMyArc *pArc=new CMyArc(CMyXYZ(100,100,0),CMyXYZ(100,20,0),CMyXYZ(180,100,0)); Shape.m_List.insert(Shape.m_List.end(),pArc); CMyPolyLn *pPolyln=new CMyPolyLn; CMyXYZ xyz(1,1,0); pPolyln->AddPoint(&xyz); xyz.x=2; xyz.y=2; pPolyln->AddPoint(&xyz); xyz.x=2; xyz.y=1; pPolyln->AddPoint(&xyz); Shape.m_List.insert(Shape.m_List.end(),pPolyln); Shape.Draw((long)pDC->m_hDC); }} 先不要急着运行,现在运行的话会出现一些断言的错误,这是由于你在主程序中new出来空间,而在DLL中释放而造成的(CShape的析构函数在DLL中释放内存),解决该问题的方法详细说明如下: 用GlobalAlloc()代替new, 用GlobalFree() 代替delete就不会出错了 其实还有一个办法,就是把dll的Settings的C/C++选项卡的Code Generation的Use Run-time liberary改成Debug Multithreaded DLL,在Release版本中改成Multithreaded DLL,就可以直接使用new和delete了,没问题 比较规范点的做法一般是DLL分配的内存由DLL释放。 这里采用设置Debug Multithreaded DLL的方法解决
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: