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

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

二:建立几何元素对象类:

       AutoCAD字体轮廓由圆弧和多义线(几个点顺次连接形成的一条曲线)的集合构成,圆弧和多义线具有一些相同的属性和方法,比如绘制,如果进一步开发,还可能有相关的线型和颜色等等属性,要把这些公共的属性和方法抽象出来,形成基类。

       首先形成三维点结构以及对它的封装:

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

{

         double x;

         double y;

         double z;

};

class READSHX_API CMyXYZ:public MYXYZ 

{

public:

         CMyXYZ(){x=0;y=0;z=0;};

         CMyXYZ(MYXYZ xyz){this->x=xyz.x;this->y=xyz.y;this->z=xyz.z;};

         CMyXYZ(double x,double y,double z){         this->x=x;this->y=y;this->z=z;};

         virtual ~CMyXYZ(){};

         operator MYXYZ() const{return MYXYZ(*this);};

         const CMyXYZ& operator =(MYXYZ &xyz){this->x=xyz.x;this->y=xyz.y;this->z=xyz.z;return *this;};

};

点数据用double数来表示并且使用三维点便于日后该结构体的重用性更广泛,而从MYXYZ结构体派生出类CMyXYZ可以方便地对MYXYZ结构进行管理,比如所有参数中使用MYXYZ结构体的函数,都可以直接应用CMyXYZ类对象代替,CMyXYZ(MYXYZ xyz)声明了该类的拷贝构造函数,使得两个CMyXYZ类对象能够互相直接赋值,比如:

         MYXYZ xyz1;

         xyz1.x=0;

         xyz1.y=1;

         xyz1.z=2;

         CMyXYZ xyz2=xyz1;

最后一行的操作使用了CMyXYZ(MYXYZ xyz);函数,注意这个操作并没有使用const CMyXYZ& operator =(MYXYZ &xyz)函数,这个函数在初始化以外的地方使用,比如xyz2已经声明了,这时我在执行xyz2=xyz1;操作,就是使用重载等号操作符的定义了,当然,如果没有重载等号操作符,则还会使用拷贝构造函数。CMyXYZ(double x,double y,double z);构造函数多用于临时的点对象当作参数,比如Line(CMyXYZ(0,0,0),CMyXYZ(100,100,0));这样就不必事先声明两个点了,operator MYXYZ() const;操作将CMyXYZ对象直接转化为MYXYZ对象,有了这个操作符转化,就可以将CMyXYZ的对象直接赋值给MYXYZ对象了。

上面这些构造函数以及操作符重载的方式再C++中广泛应用,希望读者对其能够深入了解。

下面声明几何元素基类

class READSHX_API CMyBase 

{

protected:

         CMyBase(){};

public:

         virtual int GetType()=0;

         virtual int Draw(long lDevice)=0;

         virtual ~CMyBase(){};

};

CMyBase类的构造函数声明成保护类型可以防止用户直接创建CMyBase对象,使其只能用于派生其他类。

而纯虚函数virtual int GetType()=0;virtual int Draw(long lDevice)=0;保证了所有从CMyBase类派生的类必须重载这两个成员函数,以得到一个几何元素的类型(比如这个几何元素是一个多义线还是一个圆弧)以及在指定的设备上进行绘制。注意virtual int Draw(long lDevice)=0中设备的描述使用了简单的long型而不是HDC或者CDC等类型,这也是考虑到接口的扩充性,比如该程序在其他操作系统中可能找不到HDC的定义,因此只是使用了一个long型参数描述设备属性,这在Windows操作系统中可以把HDC或者CDC指针强制转化成long数传入参数。

       在多义线类中,要有一个多义线顶点指针的列表成员,列表采用标准C++模板库(STL)中的list实现,这样的话,可以方便地向列表中添加元素,以及遍历该列表

       使用起来list的方法一般是这样子:

#pragma warning(disable:4786)

#pragma warning(disable:4251)

#pragma warning(disable:4273)

//上面这三行是为了去掉使用STL过程中容易出现的一些警告,注意要放在STL包括文件的前面才起作用

#include <list>

using namespace std;

typedef list<MYXYZ *> MYPOLYLN; //定义了一个点指针的列表,注意考虑效率问题,STL容器一般存放指针

         至于具体用法参见接下来的源程序:

#define ISARC 1

#define ISPOLYLN 2

#define ISSHAPE 3

//声明一个圆弧类

class READSHX_API CMyBase 

{

protected:

         CMyBase(){};

public:

         virtual int GetType()=0;

         virtual int Draw(long lDevice)=0;

         virtual ~CMyBase(){};

};

class READSHX_API CMyArc:public CMyBase 

{

public:

         virtual int Draw(long lDevice);

         CMyArc(MYXYZ i_pc,MYXYZ i_ps,MYXYZ i_pe);

         virtual int GetType(){return ISARC;};

         CMyArc(){};

         virtual ~CMyArc(){};

         MYXYZ m_pc;

         MYXYZ m_ps;

         MYXYZ m_pe;

};

typedef list<MYXYZ *> MYPOLYLN;

//声明一个多义线类

class READSHX_API CMyPolyLn: public CMyBase 

{

public:

         virtual int Draw(long lDevice);

         virtual int GetType(){return ISPOLYLN;};

         virtual int AddPoint(MYXYZ* pxyz);

         CMyPolyLn(){m_PolyLn.clear();};

         virtual ~CMyPolyLn();

         MYPOLYLN m_PolyLn;

};

//声明一个字型类,其实就是一个几何对象的集合

class READSHX_API CShape : public CMyBase 

{

public:

         virtual int Draw(long lDevice);

         virtual int GetType(){return ISSHAPE;};

         CShape(){m_List.clear();};

         virtual ~CShape();

         list<CMyBase*> m_List;

};

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

//下面是上面三个类的实现,注意list的用法//////////////////////////////////////////////////////////////////////// CMyA...
  • bluebohe
  • bluebohe
  • 2003年12月22日 18:19
  • 1459

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

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

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

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

vc编写简易画图程序

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

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

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

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

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

用VC++写ISAPI的一点经验

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

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

这一周忙着小学期的项目结束,之后又匆匆忙忙地赶回家,很可惜没能把VC++看完,看到现在印象比较深的是图像绘制部分,本来以为会比较简单,结果实践时意外出了很多问题。        其中比较简单的位图的...
  • Mr_PrinCR
  • Mr_PrinCR
  • 2016年08月03日 19:15
  • 454

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

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

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

“打鼹鼠”是一个古老(电子时代之前)的休闲游戏。在桌面上有许多洞,每个洞里都藏着鼹鼠。当有鼹鼠从洞里钻出来时,你就用锤子打它,让鼹鼠退回洞里,你因此而得分。当鼹鼠返回洞里时,又有一只鼹鼠会随机地从另外...
  • flyingforever_wl
  • flyingforever_wl
  • 2011年11月29日 08:46
  • 868
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用VC开发程序经验谈(二)
举报原因:
原因补充:

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