使用VC开发程序经验谈(二 续)
2003-12-22 18:19
561 查看
//下面是上面三个类的实现,注意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的方法解决
//////////////////////////////////////////////////////////////////////
// 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的方法解决
相关文章推荐
- 使用VC开发程序经验谈(二 续)
- 使用VC开发程序经验谈(二)
- 使用VC开发程序经验谈(二)
- 使用VC开发程序经验谈(三)
- 使用VC开发程序经验谈(一)
- 使用MFC开发网页提取程序的经验总结
- 使用VS2010开发Qt程序的4点经验(QT4到QT5的升级,更改sln文件,切换工程使用的Qt库,在VS的Solution Explorer视图中建立文件夹)
- SkinMagic的使用方法-——为VC开发程序换皮肤
- 使用VC进行程序开发时,如何引用外部的库
- 关于怎么在vc++开发的程序中使用SkinMagic Toolkit的问题
- 使用VS2010开发Qt程序的一点经验
- 使用VS2010开发Qt程序的一点经验(转载)
- 将QT开发的界面程序封装成DLL,在VC中成功调用(必须有消息循环,所以使用了QTWinmigrate,附CSDN可下载的Demo)
- 如何使用VC开发wxWidgets程序?
- VC++ 环境 使用开发GTK+程序的中文显示问题
- MAC下使用Tomcat+eclipse+mysql+git+jdk开发网游后台程序经验总结
- JAVA程序开发小经验 - 使用ObjectStream会出现的问题
- 使用Dependency Walker查看可执行程序的引用关系(Windows+VC开发)
- VC开发的程序使用Sybase数据库在Vista系统中报错的问题
- 使用VS2010开发Qt程序的一点经验