程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 使用VC開發程序經驗談(二 續)

使用VC開發程序經驗談(二 續)

編輯:vc教程

//下面是上面三個類的實現,注意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的方法解決

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved