分享
 
 
 

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

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

//下面是上面三个类的实现,注意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的方法解决

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有