回 帖 发 新 帖 刷新版面

主题:C++单元测试工具CppUnit使用简介编程技术

1. 到 http://sourceforge.net/projects/cppunit/下载CppUnit测试框架的源代码

2. 解压文件,进入src文件夹,打开CppUnitLibraries.dsw.分别编译这两个project,输出位置均为lib文件夹。

3.在VC的tools/options/directories/include files和library files中设置include路径和lib路径。

4.右键我的电脑设定->高级->环境变量->系统变量->Path中,将Cppuint的目录的lib路径设置为系统搜索路径

创建测试工程:

1.打开VC新建基于MFC对话框的Project,在stdafx.h中添

#include

#include

#include

#ifdef _DEBUG

#pragma comment( lib, "testrunnerd.lib" )

#pragma comment( lib, "CppUnitd.lib" )

#else

#pragma comment( lib, "testrunner.lib" )

#pragma comment( lib, "CppUnit.lib" )

#endif

using namespace CppUnit;

2.修改对话框初始化函数

CUnitTestApp::InitInstance()

{

MfcUi::TestRunner runner;

runner.addTest( TestFactoryRegistry::getRegistry("SamepleUnitTest").makeTest() );

runner.run(); //show UI

/*

CUnitTestDlg dlg;

m_pMainWnd = &dlg;

INT_PTR nResponse = dlg.DoModal();

if (nResponse == IDOK)

{......}

*/

}

3.将要测试的project加入到本project中,实现测试用例类

class CSamepleTestCase : public TestCase

{

public:

CSamepleTestCase(void);

virtual ~CSamepleTestCase(void);

CPPUNIT_TEST_SUITE(CSamepleTestCase);

CPPUNIT_TEST( TestAdd );

CPPUNIT_TEST_SUITE_END();

VOID TestAdd( );

};

在CPP文件中

CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( CSamepleTestCase,"SamepleUnitTest" );

#include <另一个工程中的头文件>

void CSamepleTestCase::TestAdd( void )

{

//在这里写测试用例

CPPUNIT_ASSERT_EQUAL( 1, 1);

}

基于VC++中ATL创建ActiveX控件的探讨编程技术

ActiveX控件是微软公司提供的功能强大的程序设计和开发技术,是COM组件开发技术的重要组成部分。它是OLE的第三个版本,对原先OLE控件的最大扩展是增加了Internet功能,它不仅可以在支持OLE控件的容器中使用,更可以作为一个Internet控件,直接成为网页的一部分。另外,ActiveX控件作为一种可重用的组件,相当于一个封装好的代码模块,它是通过其方法、属性、事件来与应用程序进行通信的,此外,ActiveX控件是与开发语言无关的。用户在使用控件时不必考虑它是VC还是用VB等其它语言开发的,应用程序都是通过COM与控件进行通信的。可见,任何支持ActiveX控件的软件平台上都可以使用ActiveX控件,它使得不同厂商所开发的控件可以真正地组装在一起,从而令软件的生产过程类似于硬件业的各个插件的装配过程一样,实现了软件的工业化,大大降低了软件的开发成本,极大地提高了软件的生产效率,实现了软件资源的共享。

ATL技术

1)ATL

ATL是ActiveX Template Library 的缩写,它是一套C++模板库。使用ATL能够快速地开发出高效、简洁的代码(Effective and Slim code),同时对COM组件的开发提供最大限度的代码自动生成以及可视化支持。从Microsoft Visual C++ 5.0版本开始,Microsoft把ATL集成到Visual C++开发环境中。目前,ATL已经成为Microsoft标准开发工具中的一个重要成员,日益受到C++开发人员的重视。

在ATL产生以前,开发COM组件的方法主要有两种:一是使用COM SDK直接开发COM组件,另一种方式是通过MFC提供的COM支持来实现。

直接使用COM SDK开发COM组件是最基本也是最灵活的方式。但是,这种开发方式的难度和工作量都很大,一方面,要求开发者对于COM的技术原理具有比较深入的了解,另一方面,直接使用COM SDK要求开发人员自己去实现COM应用的每一个细节,完成大量的重复性工作。

使用MFC提供的COM支持开发COM应用可以说在使用COM SDK基础上提高了自动化程度,缩短了开发时间。MFC采用面向对象的方式将COM的基本功能封装在若干MFC的C++类中,开发者通过继承这些类得到COM支持功能。但使用MFC开发的COM组件,尤其是ActiveX控件的开发,会产生相当大的代码冗余,而且必须要依赖于MFC的运行时刻库才能正确地运行。

ATL技术是目前开发COM组件的一种比较理想的技术。ATL中所使用的基本技术包括COM技术、C++模板类技术(Template)以及C++多继承技术(Multi-Inheritance) .

2) ATL的基本使用

使用ATL开发一个COM应用基本可以分为以下几个步骤:

(1)创建一个新的ATL工程,并对工程的选项进行适当的配置。

(2)向新创建的工程添加新的ATL类,并对该类进行一些初始配置工作。

(3)根据COM应用的基本要求向新的ATL类加入新的接口定义,并实现相应的接口成员函数。

(4)编译连接工程,注册COM应用。

利用ATL技术创建ActiveX控件CircleCtl

1) 创建ATL项目

使用ATL COM AppWizard 创建ATL框架为该项目命名为Circle,按照向导提示向下做,采用默认设置,即Server Type类型为Dynamic Link Library(DLL)。

2) 向ATL项目添加ActiveX控件

首先从Insert菜单项中选择New ATL Object…调出 ATL Object Wizard对话框,然后左边Category列表选择Object,右边相应地选择Full Control,如图(1)所示。按Next继续,出现 ATL Object Wizard属性对话框,如图(2),在Names选项卡中,我们只需要在Short Name 编辑框输入CircleCtl即可,其它系统就会自动给定,也可以修改,我们这里保持系统给定状态;在Attributes 选项卡中,选择 Support ISupportErrorInfo 和 Support Connection Points 两个复选框,这两项分别支持出错信息和连接点;Miscellaneous选项卡保持默认设置;Stock Properties中我们把FillColor添加到支栏中,确定之后就把该控件加到项目中了。

3)为ActiveX控件添加自定义属性

现在来添加Circle控件的一个基本属性——Radius.

在Workspace Windows中Class View状态下,右击 ICircleCtl接口,选择Add Property,属性类型为short,名为Radius,参数为空。系统会自动生成get_Radius和put_Radius两个成员函数。在CCircleCtl中添加m_radius变量,用来存储半径。在CCircleCtl的构造函数中将其初始化为50,并在get_Radius函数中添加*pVal=m_radius; 在put_Radius函数中添加m_radius=newVal; FireViewChange();用来及时更新视图。对于Radius的属性,我们通过修改控件的绘制代码来使它起作用。

4) 修改ActiveX控件的绘制代码实现属性交换

首先,在CCircleCtl的构造函数中对绘制圆的填充色进行初始化,将它的初始值设为红色,即m_clrFillColor=RGB(255,0, 0)。

接下来,我们需要几个全局变量来保存控件区域的信息,在CircleCtl.h中添加如下变量:

static POINT CenterPt;

static long RectHt = 0;

static long RectWd = 0;

然后修改OnDraw函数,在该绘制函数中,使用 Windows API中标准的HDC、HPEN、HBRUSH以及SelectObject、Ellipse等结构和函数来实现绘制的。例如:

// 创建画笔和画刷并选中颜色画圆

hPen = (HPEN)GetStockObject(BLACK_PEN);

hOldPen = (HPEN)SelectObject(hdc, hPen);

hBrush = (HBRUSH)GetStockObject(WHITE_BRUSH);

hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);

hBrush = CreateSolidBrush(colFore);

SelectObject(hdc, hBrush);

Ellipse (hdc, (CenterPt.x - m_radius), (CenterPt.y - m_radius), (CenterPt.x +m_radius),(CenterPt.y+ m_radius));

5) 为ActiveX控件添加事件

现在将向ATL控件中添加Click和RClick事件。如果用户在矩形区内点击,则会激发相应事件。现在要向ICircleCtlEvents接口添加Click方法,首先在“ClassView”中选中“ICircleCtlEvents”右击,选择Add Method,出现如下对话框,并按下图设置,最后点“OK”按钮就可以添加Click事件的实现方法。用同样的方法添加RClick事件,参数与Click事件一致。接下来我们要为控件实现连接点接口IConnectionPoint和连接点容器接口IConnectionPointContainer.编译好Circle.idl文件,生成对应的Circle.tlb,在“ClassView”中选中“CCircleCtl”,右击,在Popup菜单中选择“Implement Connection Point”命令,在弹出的对话框中选中“_ICircleCtlEvents”接口。在类中定义了以两个坐标为参数的Fire_Click和Fire_RClick方法,调用这两个方法就可以在控件中激发响应的事件。

最后,添加激发事件的代码,我们分别在鼠标左键和右键按下的消息响应中进行处理,激发响应的事件,例如OnLButtonDown函数部分代码如下:

WORD xPos = LOWORD(lParam); //鼠标水平坐标

WORD yPos = HIWORD(lParam); // 鼠标垂直坐标

Fire_Click (xPos, yPos); //执行触发函数

至此,可以在ActiveX Control Test Container中测试该控件。

网页中使用ActiveX控件

在控件生成时,系统同时生成了一个CircleCtl.htm文件,在VC编辑环境下打开该文件,在和之间加上如下的VBScript:



注意保存。然后在“我的电脑”中打开该htm文件,用鼠标单击圆,半径变大,右击圆半径变小。

结束语

本文介绍了基于ATL技术以及使用该技术实现了一个简单的圆的控件CircleCtl并且介绍了其在网页中的使用。ActiveX控件作为可重用的代码组件,不仅应用广泛,还可节约开发时间。它将大量的实现细节隐藏起来,以简明的接口与用户名交互,易于使用。对ActiveX技术的研究已经成为当今软件业的热点和潮流。

C语言中使用穷举法的一些算法编程技术

★最大公约数和最小公倍数

用穷举法求最大公约数iloop的思路:

1、穷举的范围是1到两个整数中的最小数;

2、可能的解是两个数分别除以iloop时都能整除,余数为0的那个iloop.

而最小公倍数等于两个数的积除以最大公约数。

#include

int max(int first,int second);

int min(int first,int second);

void main()

{

int n1=0,n2=0,imax=0,imin=0;

printf("please input two number:\n");

scanf("%d%d",&n1,&n2);

imax=max(n1,n2);

imin=min(n1,n2);

printf("max number is: %d\n",imax);

printf("min number is: %d\n",imin);

}

int max(int first,int second)

{

int itmp=0,iloop=1;

if(first>second)

{

itmp=first;

first=second;

second=itmp;

}

while(iloop<=first)

{

if(((first%iloop)==0)&&((second%iloop)==0))

itmp=iloop;

iloop=iloop+1;

}

return itmp;

}

int min(int first,int second)

{

int itmp=0;

itmp=first*second/max(first,second);

return itmp;

}

★数字分解算法

试想想十进制数123,要怎样才能分解出1、2和3呢?

个位3当然是:123%10=3;十位2有点难度,不过想想就出来啦:12%10=2嘛,那12怎么来呢?123/10就等于12了嘛~~~至于1,用123除以100就出来啦~程序如下:

#include

void main()

{

int no=0,itmp=0;

scanf("%d",&no);

while(no>0)

{

itmp=no%10;

printf("%d\n",itmp);

no=no/10;

}

}

★水仙花数

所谓水仙花数,是指一个3位的十进制数,该数各位数字的立方和等于该数本身。例如153是一个水仙花数,因为13+53+33=153.100到1000里当然还有几个水仙数,我们就交给电脑算吧~

#include

void main()

{

int ge=0,shi=0,bai=0,itmp=0,ino=0;

for(ino=100;ino<1000;ino++)

{

ge=ino%10;

shi=(ino/10)%10;

bai=(ino/100)%10;

itmp=ge*ge*ge+shi*shi*shi+bai*bai*bai;

if(itmp==ino)

printf("no is: %d\n",ino);

}

}


文章来源博彩网:http://bocaitong2013.com

回复列表 (共1个回复)

沙发

分析的不错------------------------------------------ using the same to build the body of the shoes.[url=http://www.freesaleaustralia.com/nike-free-run-3-c-7.html]Nike Free Run 3[/url],[url=http://www.freesaleaustralia.com/nike-free-50-c-10.html]Nike Free 5.0[/url] , [url=http://www.freesaleaustralia.com/nike-free-40-c-16.html]Nike Free 4.0[/url]

我来回复

您尚未登录,请登录后再回复。点此登录或注册