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

原创 2003年12月22日 18:19:00

//下面是上面三个类的实现,注意list的用法

//////////////////////////////////////////////////////////////////////<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

// 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就不会出错了

    其实还有一个办法,就是把dllSettingsC/C++选项卡的Code GenerationUse Run-time liberary改成Debug Multithreaded DLL,在Release版本中改成Multithreaded DLL,就可以直接使用newdelete了,没问题

    比较规范点的做法一般是DLL分配的内存由DLL释放。

 

       这里采用设置Debug Multithreaded DLL的方法解决

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

二:建立几何元素对象类:       AutoCAD字体轮廓由圆弧和多义线(几个点顺次连接形成的一条曲线)的集合构成,圆弧和多义线具有一些相同的属性和方法,比如绘制,如果进一步开发,还可能有相关的线型...
  • bluebohe
  • bluebohe
  • 2003年12月22日 18:19
  • 1621

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

三:建立读AutoCAD字体文件类       该部分由CShapeInfo读AutoCAD字体文件,该部分没有太多可以涉及到的知识面,只要知道AutoCAD字体文件格式即可,因此不作具体说明。   ...
  • bluebohe
  • bluebohe
  • 2004年04月16日 10:07
  • 2521

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

       本文章结合一个读AutoCAD字体文件的实例说明使用C++开发程序的一些经验,本例中,进行读取AutoCAD字体文件,将其字体轮廓读入自定义结构中,显示在屏幕上  图一:工程运行结果  ...
  • bluebohe
  • bluebohe
  • 2003年12月19日 23:21
  • 2291

vc编写简易画图程序

       记得很久以前附件里的画图程序是我最喜欢捣鼓的,今天心血来潮突然想自己写个画图程序,难得做不了,做个简单的吧。       画图无非是画点,setpixel函数就可以了,关键是窗体的重绘,...
  • sx1989827
  • sx1989827
  • 2010年09月29日 15:39
  • 1565

Cardboard虚拟现实开发初步(二)

Google Cardboard 虚拟现实眼镜开发初步(二) Cardboard SDK for Unity的使用 上一篇文章作为系列的开篇,主要是讲了一些虚拟现实的技术和原理,本篇就会带领大家去...
  • sunmc1204953974
  • sunmc1204953974
  • 2015年08月02日 09:06
  • 9593

详解:Windows系统安装OpenSSL 以及在VC环境下编写一个简单OpenSSL程序

一、Windows系统安装OpenSSL 1、  环境: 操作系统:Windows7(32位)64位没有测试,不保证本方法可以成功 VC:VC 6.0(其他VC环境也大同小异,只不过路径有所不同...
  • wowowoc
  • wowowoc
  • 2014年06月09日 23:55
  • 2584

如何实现复杂FPGA设计的时序收敛

“打鼹鼠”是一个古老(电子时代之前)的休闲游戏。在桌面上有许多洞,每个洞里都藏着鼹鼠。当有鼹鼠从洞里钻出来时,你就用锤子打它,让鼹鼠退回洞里,你因此而得分。当鼹鼠返回洞里时,又有一只鼹鼠会随机地从另外...
  • flyingforever_wl
  • flyingforever_wl
  • 2011年11月29日 08:46
  • 867

如何用VC6.0编写Windows Service程序

如何用VC6.0编写Windows Service程序 2005/10/11杨登峰(MSN:dengfengyang@hotmail.com)本人在项目开发要用到创建Service应用程序。但是网络好...
  • ydfok
  • ydfok
  • 2005年10月11日 21:46
  • 4998

用VC++写ISAPI的一点经验

vc写ISAPI不算复杂,因为有向导生成框架,不过估计现在ISAPI用的也不多了吧。.net、asp、jsp、php都不错~。不过vc写的ISAPI可以很灵活、效率高。刚刚开始写ISAPI,一定要接触...
  • itclock
  • itclock
  • 2007年03月09日 16:27
  • 1862

读书笔记(二)_VC++深入详解&Android应用开发教程

这一周忙着小学期的项目结束,之后又匆匆忙忙地赶回家,很可惜没能把VC++看完,看到现在印象比较深的是图像绘制部分,本来以为会比较简单,结果实践时意外出了很多问题。        其中比较简单的位图的...
  • Mr_PrinCR
  • Mr_PrinCR
  • 2016年08月03日 19:15
  • 452
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用VC开发程序经验谈(二 续)
举报原因:
原因补充:

(最多只允许输入30个字)