VC6生成发布设置

VC++ 6.0如何生成发布
1、确定Debug版无错,注意Trace等调试方法可能造成的错误
2、Release版的exe文件链接的是标准的MFC DLL,比如MFC42.dll。

这些DL L在安装Windows的时候,就会装到系统中。

因此,这样的exe在没安装Visua l C++ 6.0 的机器上也能运行。

而
Debug版不能,除非使用静态链接生成release版的步骤:
build->set Active configuration->工程名-win32 Release
我遇到的一个错误:
Release/Server.pch No such file or directory
Server是我的程序名。

解决方法:
工程——设置——C/C++——分类:预编译的头文件——不使用预补偿页眉——确定——全部重建
3、debug版本和release版本的区别:
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。

Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。

Debug 和Release 的真正秘密,在于一组编译选项。

下面列出了分别针对二者的选项
Debug 版本:
/MDd /MLd 或/MTd 使用Debug runtime library(调试版本的运行时刻函数库) /Od 关闭优化开关
/D "_DEBUG" 相当于#define _DEBUG,打开编译调试代码开关(主要针对asser t函数)
/ZI 创建Edit and continue(编辑继续)数据库,这样在调试过程中如果修改了源代码不需重新编译
/GZ 可以帮助捕获内存错误
/Gm 打开最小化重链接开关,减少链接时间
Release 版本:
/MD /ML 或/MT 使用发布版本的运行时刻函数库
/O1 或/O2 优化开关,使程序最小或最快
/D "NDEBUG" 关闭条件编译调试代码开关(即不编译assert函数)
/GF 合并重复的字符串,并将字符串常量放到只读内存,防止被修改
实际上,Debug 和Release 并没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动。

事实上,我们甚至可以修改这些选项,从而得到优化过的调试版本或是带跟踪语句的发布版本。

合集下载

VC6.0与matlab7.0程序发布及一些问题

VC6.0与matlab7.0程序发布及一些问题

<matlab7.0 安装目录> \Extern\Include;
Tools—>Options—>Directories—>Show directories for: Library 添加
<matlab7.0 安装目录> \Extern\Lib\Win32\Microsoft\msvc60;
Tools—>Options—>Directories—>Show directories for: Library 添加
<MCR 安装目录>\MathWorks\MATLAB Component Runtime\v71\extern\lib\win32\microsoft\msvc60
四.警告:找不到JAVA库 Warning: Unable to find Java library:
*:\***\release\/sys\java\jre\win32\jre\bin\classic\jvm.dll
这个错误可见mathwork网站的解决方案,/support/solutions/data/1-ZITAA.html?product=CO&solution=1-ZITAA 具体原因是由于*:\***\release\目录下存在 mclmcrrt71.dll,mclmcr.dll,
启动matalb7.01,在命令窗口中输入 mex -setup 回车 按照提示,根据实际情况设置;
输入mbuild -setup 回车,按照提示,根据实际情况设置;
2 利用mcc 将Matlab函数转成DLL函数
在你要处理的m文件所在目录 输入 mcc -W cpplib:dllname -T link:lib filename.m

VC6使用教程

VC6使用教程

VC6使⽤教程Visual C++ 6.0⼀些基本概念:⼯程(Project):VC6 以⼯程为单位对整个程序开发过程涉及到的资源、⽐如代码⽂件、图标⽂件等进⾏管理,扩展名为dsw ,⼀个完整程序的新建、打开或者保存是对⼯程⽂件进⾏的,代码⽂件只是⼯程⽂件中的⼀部分。

⼯作区(Workspace):当⼀个项⽬⽐较⼤,由多个⼯程组成时,可以将其归属于⼀个⼯作区,新建项⽬时,可以指定该项⽬是否属于当前所在的⼯作区,如果不属于⽽是⼀个新项⽬,则VC6 会⾃动新建⼀个⼯作区包含该项⽬。

⼯作区扩展名为 .dsw。

⼯作区同⼀时刻只能有⼀个活动项⽬,通过在项⽬上点击右键可以将其设置为活动项⽬。

代码⽂件:⽤于存储程序的⽂件,C++ 代码⽂件的扩展名为 .cpp ,C 语⾔代码⽂件的扩展名为 .c ,存储函数或者变量声明的头⽂件扩展名⼀般为 .h 。

调试(DEBUG):输⼊代码、编译、连接、运⾏并不断修正错误的整个过程。

发布(RELEASE):指程序完成代码的编写和功能调试,最终编译和分发给⽤户的过程。

Console 和MFC:Console:指没有图形界⾯的字符程序,通常⽤于学习基本语法和⽆需复杂界⾯的计算程序MFC:微软基础类库,通常图形界⾯的Windows 应⽤程序可以使⽤该类库快速构架。

⽅法/步骤1. 1启动Visual C++ 6.0安装完毕之后从开始i菜单中可以启动VC6 ,启动之后的界⾯如图,左侧停靠窗⼝为⼯程资源管理器,⽤于从不同⾓度对⼯程资源进⾏查看和快速定位,下侧为信息输出窗⼝、调试信息、查找信息等都会从该窗⼝输出,主要显⽰区显⽰程序代码或者资源。

2. 2建⽴新⼯程从“File”菜单选择“New”,切换到“Project”标签,根据需要选择⼯程类型,初学者可以选择简单的“Win32 Console Application”来学习基本C++ 语法,在右侧输⼊⼯程的名称及存储位置,点击“OK”,系统会启⽤向导来给⽤户⽣成程序框架以便快速进⼊开发,作为初学者,选择“An Empty Project”⼿动来添加⼯程⽂件,点击“Finish”结束向导,界⾯如图所⽰。

vc6.0配置及使用教程

vc6.0配置及使用教程

步骤是:(先工程—后文件—编译—连接---运行)1,建立一个工程,“文件”——“新建”,出现下面界面:选择“Win32 Console Application”(控制台应用程序,左边倒数第三个),命名工程名称,选择保存位置,点击“确定”,进入下一步,看到如下提示界面:建立一个空工程,对应其他需要的你一可以建立别的工程;点击“完成”,之后:显示你创建的工程的信息。

2,再在有一个的工程的条件下,我们再建立一个源文件;“文件”——“新建”(快捷键Ctri+N),出现:建立源文件,选择“C++ Source ”,一般都是建立这种文件的(适用在当文件中适用)如果要建立头文件的话,选择“C/C++ Header File”,(适用在多文件工程中使用)命名,文件名称,点击“确定”,之后:进入编辑区,在主界面编写代码:如下编写完之后呢:可以按编译按钮调试程序,看看有没有错误,有的话改正,没有的话就可以再按连接按钮检查连接(多文件工程时常用,检查文件间是否正常连接),最后,点运行按钮,就可以运行了。

如果是您有代码如:cpp文件,或 .h 文件,想添加都VC6.0里来测试的话,可以这样做:首先,要理解一下文件扩展名为:cpp和.h文件扩张名是.h,代表的是头文件,一般是书写一些函数原型,以及一些在整个程序中常用到的结构体,频繁使用的函数说明,定义等等;文件扩张名为,cpp的,是C++中的源文件,也是最常用到的文件,每建立一个工程都要至少一个源文件(至少要有一个函数入口——主函数main() ),包含了核心代码;建立与运行说明:(以VC 6.0编译器为例,其他编译器类似)首先,打开VC 6.0编译环境;在菜单栏——文件(的下拉菜单中选择“新建”),在弹出的选择窗口中,选择Win32 Console Application(控制台应用程序),在填写工程名称,选择一个程序保存路径,点击“完成”,查看工程信息。

在点击“确定”,就建立一个简单的工程了。

vc6的使用流程

vc6的使用流程

VC6的使用流程1. 准备工作在开始使用VC6进行开发之前,需要准备以下工作:•安装VC6软件,确保已经正确安装。

•确保已经安装了适当的编译器和调试器。

•确保已经安装了所需的库文件和依赖项。

2. 创建项目VC6中创建项目的方法如下:1.打开VC6软件。

2.在菜单栏中选择“文件” -> “新建” -> “项目”。

3.在弹出的对话框中选择“Win32应用程序”或其他合适的模板。

4.输入项目的名称和保存路径。

5.点击“确定”按钮创建项目。

3. 设置项目属性在创建项目后,需要设置项目的属性以满足开发需求。

以下是设置项目属性的一般步骤:1.在VC6的“项目视图”中,选择项目文件。

2.在菜单栏中选择“项目” -> “设置”。

3.在弹出的对话框中,选择需要设置的属性,如“C/C++”、“链接器”等。

4.根据需求进行属性设置,例如指定包含目录、库文件路径等。

5.点击“确定”按钮保存设置。

4. 编写代码在VC6中,可以使用C或C++语言编写代码。

以下是编写代码的一般步骤:1.在“资源视图”中,选择需要编辑的源文件。

2.在代码编辑器中编写代码。

3.可以使用VC6提供的自动完成、语法高亮等功能来提升编码效率。

4.完成代码编写后,保存文件。

5. 编译和调试在代码编写完成后,可以进行编译和调试。

以下是编译和调试的一般步骤:1.在菜单栏中选择“生成” -> “全部重新生成”或“生成” -> “生成解决方案”。

2.编译器将会编译代码,并生成可执行文件。

3.在VC6中可以进行单步调试、断点设置等操作,以便于调试代码。

4.调试完成后,可以查看调试结果并进行必要的修正。

6. 运行和发布在完成编译和调试后,可以运行和发布项目。

以下是运行和发布的一般步骤:1.点击菜单栏中的“调试” -> “开始执行”或使用快捷键F5,运行程序。

2.程序将会在VC6中启动,并在控制台或窗口中显示运行结果。

3.如果需要发布项目,可以通过“生成”菜单中的“发布…”选项来进行发布设置。

vc6调试技巧

vc6调试技巧

vc6调试技巧难怪很多前辈说调试是⼀个程序员最基本的技能,其重要性甚⾄超过学习⼀门语⾔。

不会调试的程序员就意味着他即使会⼀门语⾔,却不能编制出任何好的软件。

我以前接触的程序⼤多是有⽐较成形的思路和⽅法,调试起来出的问题都⽐较⼩,最近这个是我⾃⼰慢慢摸索调试,接触了很多新的调试⽅法,并查了很多前辈的总结,受益匪浅,总结以前的和新的收获如下:VC调试篇设置为了调试⼀个程序,⾸先必须使程序中包含调试信息。

⼀般情况下,⼀个从AppWizard创建的⼯程中包含的Debug Configuration⾃动包含调试信息,但是是不是Debug版本并不是程序包含调试信息的决定因素,程序设计者可以在任意的Configuration中增加调试信息,包括Release版本。

为了增加调试信息,可以按照下述步骤进⾏:打开Project settings对话框(可以通过快捷键ALT+F7打开,也可以通过IDE菜单Project/Settings打开)选择C/C++页,Category中选择general ,则出现⼀个Debug Info下拉列表框,可供选择的调试信息⽅式包括:选择Link页,选中复选框"Generate Debug Info",这个选项将使连接器把调试信息写进可执⾏⽂件和DLL如果C/C++页中设置了Program Database以上的选项,则Link incrementally可以选择。

选中这个选项,将使程序可以在上⼀次编译的基础上被编译(即增量编译),⽽不必每次都从头开始编译。

调试⽅法:1、使⽤ Assert(原则:尽量简单)assert只在debug下⽣效,release下不会被编译。

2、防御性的编程3、使⽤Trace4、⽤GetLastError来检测返回值,通过得到错误代码来分析错误原因5、把错误信息记录到⽂件中位置断点(Location Breakpoint)⼤家最常⽤的断点是普通的位置断点,在源程序的某⼀⾏按F9就设置了⼀个位置断点。

使用VC6.0创建工程

使用VC6.0创建工程
13
使用Microsoft Visual C++ 6.0
VC6程序开发的结构:
每次开发必须有一个workspace
一个workspace可以包含多个project
porject即工程,工程可以生成可执行文件(exe), 静态链接库(lib)和动态链接库(dll)以及其他一些 类型的程序文件
一个Project可以包含多个头文件(*.h)和实现文件(*.c), 不过整个工程至多只能有一个main函数
14
使用Microsoft Visual C++ 6.0
WorkSpace Project
.h .C .C ... Project
WorkSpace Project .c
工程唯一的main函数
15
使用Microsoft Visual C++ 6.0
对于大型程序的开发,把所有的代码放入 一个c文件显然是不合适的,VC++6.0的工 程管理结构可以帮助开发人员把大型程序 分散为多个逻辑部分,以便管理
.h----- 这种文件为头文件,包含的主要是 自定义数据类型、函数等的定义和声明放 置在头文件中。 .c----- 代码实现文件。
10
在VC++6.0中
.dsw---- Developer Studio Workspace,最高级别的配置 文件,记录了整个工作空间的配置信息,是一个纯文本 的文件,在vc创建新项目的时候自动生成。 .dsp---- VC开发环境生成的工程文件,文本格式。在VC 中,应用程序是以Project的形式存在的,Project文件的 扩展名为.dsp,在Workspace文件中可以包含多个Project, 由Workspace文件对它们进行统一的协调和管理,每个 工程都对应一个dsp文件。 .opt---- VC开发环境自动生成的用来存放WorkSpace中各 种选项的文件。工程关于开发环境的参数文件。如工具 条位置信息等。 .ncb----无编译浏览文件(no compile browser), NCB为 VC++自动创建的跟踪文件,其中存放了供ClassView、 WizardBar和Component Gallery使用的信息,由VC开发 环境自动生成。无编译浏览文件。当自动完成功能出问 题时可以删除此文件。build编译工程后会自动生成。

VISUALC6.0工程设置解读

VISUALC6.0工程设置解读VC6.0的工程设置解读Project--Settings做开发差不多一年多了,突然感觉对VC的工程设置都不是很清楚,天天要和VC见面,虽然通常情况下一般都不会修改工程设置,但是还是有必要对它的一些设置项的来龙去脉有一定的了解,所以狂查资料,稍作整理,总结一篇文档,方便以后查阅,总得记录点什么,温故而知新嘛。

进入工程设置界面有两种方法:方法一,选择法:【Project】->【Settings】方法二,快捷键:【Alt+F7】打开工程设置对话框,如下图:左边的列表可以选择要设置的工程编译方式(Debug或Release),如果多个工程,还可以选择要设置的工程。

右边是一个属性页,内容十分丰富,依次是:General,Debug,C/C++,Link,Resource, MIDL,Browse Info,Custom Build,Pre-link Step,Post-build step下面主要介绍各个选项的功能:【General】设置工程的一般特性。

1.Microsoft Foundation Classes连接MFC静态库的方式,默认为共享的DLL方式,对一些不支持MFC42的机器环境来说,选择静态编译还是有必要的。

2.Intermediate files中间文件输出路径,比如:*.obj、*.pch、*.res、*.sbr、*.idb、*.pdb3.Output files输出文件路径,比如:*.exe。

4.Allow per-configuration dependencies按外部制作文件(exported makefile)方式为每个工程配置导出不同的可建立项目。

【Debug】设置工程调试的选项。

Category选项种类,先看看General种类选项卡1.Executable for debug session如果是dll的工程,需要指定启动它的exe文件路径,如果是exe工程,默认当前工程路径。

vc6.0下载、安装、及环境变量配置

vc6.0下载、安装、及环境变量配置Vc6.0下载地址/softdown/program/VC60sp6chs.rar粘贴到迅雷或者旋风中的新建任务中vc6.0的安装过程1.首先解压安装文件的压缩包,镜像iso文件可以用winrar解压;2.然后再选择安装的版本,VC6CN 表示的是中文版,VC6EN表示英文版。

3.打开VC6CN文件夹,其中有如下图标,鼠标双击。

4.如下图所示就是我们安装的第一步,单击下一步。

5.选择“接受协议”后单击下一步。

6.本软件属于破解版,故无需输入产品ID号码,直接单击下一步。

7.选择“安装visual c++6.0中文企业版(I)”,这就是我们要安装的程序,单击下一步。

8.安装位置自己改,单击下一步。

9.如下界面,单击“继续”,开始安装软件。

10.点击“确定”。

11.选择“是”,继续安装。

12.选择“typical”继续安装13.选择“ok”。

14.选择“确定”15.选择“确定”16.取消“安装MSDN”前面的勾号,选择“退出”。

17.选择“是”,取消MSDN的安装。

18.程序安装完毕,再电脑的“开始菜单”中,选择“所有程序”,在“Microsoft Visual C++ 6.0”目录中选择“Microsoft Visual C++ 6.0”就可以运行程序了。

也可以将这个图标发送到桌面快捷方式,这样就可以直接在桌面上运行程序。

配置环境变量想用CMD直接编译连接cpp形成exe文件,就像配置好jre后直接在DOS里运行java程序一样。

1、首先配置环境变量:在path中添加D:/Program Files(x86)/Microsoft Visual Studio /VC98/bin;D是我的VC的安装盘,你可以根据自己前边安装路径的修改但是现在在CMD里输入cl ***.cpp时,DOS里提示连CL的命令都不存在,原来在刚才路径的文件夹里少了一个文件mspdb60.dll为了证明这一点,可以点击X:/Program Files/Microsoft Visual Studio /VC98/bin 中的cl.exe,它会提示你缺少mspdb60.dll文件,建议重新安装。

vc6.0工程的setting选项


在这个对话框 中,左上方的下拉列表框用于选择一种工程配置,包括有Win32 Debug、Win32 Release和All Configurations(指前两种配置一起),某些选项在不同的工程配置中有不同的缺省值。左边的树形视图给出了当前工程所有的文件及分类情况。如果我们把工程“Schedule”置为高亮显示(正如图9-1那样),对话框的右边就会出现总共十个选项卡,其中列出了与工程有关的各种选项,不少选项卡中有一个Reset按钮,按下它后可以把选项卡内的各项设置恢复到生成工程时的初始值。如果我们在树形视图中选择一个文件类或一个文件,那么对话框右边的选项卡会自动减少到一个或两个,其中列出的都是与选中的文件类或文件有关的选项。下面我们就以Win32 Debug为例来看看与工程有关的十个选项卡各自的功能与含义,与文件有关的选项卡则请大家自己琢磨一下。
Resources
Resources选项卡控制着VC6的资源编译器。如图9-5所示,我们可以指定编译后生成的资源文件的路径,资源的语言类型,以及额外的资源包含目录。
MIDL
这个选项卡与COM(组件对象模型)编程有关,我们不讨论它。
Browse Info
在Customize类别中,从上到下六个选项的含义分别为:是否禁止使用Microsoft对C++的扩 展;是否允许函数级别的连接;是否消除重复的字符串;是否允许进行最小化的重建;是否允许递增编译方式;是否允许编译器在开始运行时向Output窗口中 输出自己的版本信息。其中第二、三两项为灰色是因为它们与即编即调功能不兼容,如果在General类别中选择生成其它类型的调试信息,那么就可以更改这 两个选项。
ቤተ መጻሕፍቲ ባይዱ Debug
Debug选项卡中是一些与调试有关的选项,如图9-2所示,由于选项比较多,它们被分成了几个类,我们可以从Category中选择不同的类别,选项卡就会切换显示出相应的选项,后面的C/C++和Link选项卡也有这种情况。

Dev-C++下配置EasyXVC2010vc6

Dev-C++下配置EasyXVC2010vc6vc6 与 easyX1,下载绿⾊版vc6. 仅43m。

解压后,点击执⾏ShortCut.exe,会⽣成桌⾯快捷 vc6. 运⾏即可。

vc6在win10下运⾏,⽆法单步调试。

需要把来源注解选项关掉:2,下载该版本⽀持 VC6~VC2019。

这个下载下来的包是个exe⽂件。

⽤7zip打包的。

可以直接⽤7zip解压或者后缀改成7z后解压。

因为我们要⼿动配置环境。

3,设置vc6环境:3.1 新加⼯程:添加cpp⽂件3.2 头⽂件⽬录设置,从⼯程 -> 设置3.3 添加库⽂件最后,点击run 运⾏,编制执⾏代码。

⽤⿏标选中区域可以放⼤,enjoy it.源码:1// 程序名称:分形学 - 可以⽆穷放⼤的 Mandelbrot Set (曼德布洛特集)2// 编译环境:Visual C++ 6.0 ~ 2019,EasyX_202107303// 最后更新:2010-9-94//5 #include <graphics.h>6 #include <conio.h>78// 定义常量9#define ITERATIONS 1000 // 迭代次数,越⾼,图像越精细10#define MAXCOLOR 64 // 颜⾊数111213/////////////////////////////////////////////////14// 定义复数及乘、加运算17// 定义复数18struct COMPLEX19 {20double re;21double im;22 };2324// 定义复数“乘”运算25 COMPLEX operator * (COMPLEX a, COMPLEX b)26 {27 COMPLEX c;28 c.re = a.re * b.re - a.im * b.im;29 c.im = a.im * b.re + a.re * b.im;30return c;31 }3233// 定义复数“加”运算34 COMPLEX operator + (COMPLEX a, COMPLEX b)35 {36 COMPLEX c;37 c.re = a.re + b.re;38 c.im = a.im + b.im;39return c;40 }414243/////////////////////////////////////////////////44// 定义颜⾊及初始化颜⾊45/////////////////////////////////////////////////4647// 定义颜⾊48int Color[MAXCOLOR];4950// 初始化颜⾊51void InitColor()52 {53// 使⽤ HSL 颜⾊模式产⽣⾓度 h1 到 h2 的渐变⾊54int h1 = 240, h2 = 30;55for (int i = 0; i < MAXCOLOR / 2; i++)56 {57 Color[i] = HSLtoRGB((float)h1, 1.0f, i * 2.0f / MAXCOLOR);58 Color[MAXCOLOR - 1 - i] = HSLtoRGB((float)h2, 1.0f, i * 2.0f / MAXCOLOR);59 }60 }616263/////////////////////////////////////////////////64// 绘制 Mandelbrot Set (曼德布洛特集)65/////////////////////////////////////////////////66void Draw(double fromx, double fromy, double tox, double toy)67 {68 COMPLEX z, c;69int x, y, k; // 定义循环变量70for (x = 0; x < 640; x++)71 {72 c.re = fromx + (tox - fromx) * (x / 640.0);73for (y = 0; y < 480; y++)74 {75 c.im = fromy + (toy - fromy) * (y / 480.0);76 z.re = z.im = 0;77for (k = 0; k < ITERATIONS; k++)78 {79if (z.re * z.re + z.im * z.im > 4.0) break;80 z = z * z + c;81 }82 putpixel(x, y, (k >= ITERATIONS) ? 0 : Color[k % MAXCOLOR]);83 }84 }85 }868788/////////////////////////////////////////////////89// 主函数90/////////////////////////////////////////////////91int main()92 {93// 初始化绘图窗⼝及颜⾊94 initgraph(640, 480);95 InitColor();9697101 fromy = -1.2; toy = 1.2;102 Draw(fromx, fromy, tox, toy);103104105// 捕获⿏标操作,实现放⼤⿏标选中区域106 ExMessage m;107bool isLDown = false;108int selfx, selfy, seltx, selty; // 定义选区109110do111 {112 getmessage(&m, EM_MOUSE | EM_KEY); // 获取⼀条⿏标消息113114switch (m.message)115 {116case WM_KEYDOWN:117break;118119// 按⿏标中键恢复原图形坐标系120case WM_MBUTTONUP:121 fromx = -2.1; tox = 1.1;122 fromy = -1.2; toy = 1.2;123 Draw(fromx, fromy, tox, toy);124break;125126// 按⿏标左键并拖动,选择区域127case WM_MOUSEMOVE:128if (isLDown)129 {130 rectangle(selfx, selfy, seltx, selty);131 seltx = m.x;132 selty = m.y;133 rectangle(selfx, selfy, seltx, selty);134 }135break;136137// 按⿏标左键并拖动,选择区域138case WM_LBUTTONDOWN:139 setlinecolor(WHITE);140 setrop2(R2_XORPEN);141 isLDown = true;142 selfx = seltx = m.x;143 selfy = selty = m.y;144 rectangle(selfx, selfy, seltx, selty);145146break;147148// 按⿏标左键并拖动,选择区域149case WM_LBUTTONUP:150 rectangle(selfx, selfy, seltx, selty);151 setrop2(R2_COPYPEN);152 isLDown = false;153 seltx = m.x;154 selty = m.y;155156if (selfx == seltx || selfy == selty) break;157158// 修正选区为 4:3159int tmp;160if (selfx > seltx) { tmp = selfx; selfx = seltx; seltx = tmp; }161if (selfy > selty) { tmp = selfy; selfy = selty; selty = tmp; }162163if ((seltx - selfx) * 0.75 < (selty - selfy))164 {165 selty += (3 - (selty - selfy) % 3);166 selfx -= (selty - selfy) / 3 * 4 / 2 - (seltx - selfx) / 2;167 seltx = selfx + (selty - selfy) / 3 * 4;168 }169else170 {171 seltx += (4 - (seltx - selfx) % 4);172 selfy -= (seltx - selfx) * 3 / 4 / 2 - (selty - selfy) / 2;173 selty = selfy + (seltx - selfx) * 3 / 4;174 }175176// 更新坐标系177double f, t;178 f = fromx + (tox - fromx) * selfx / 640;179 t = fromx + (tox - fromx) * seltx / 640;180 fromx = f;181 tox = t;185 toy = t;186187// 画图形188 Draw(fromx, fromy, tox, toy);189190break;191 }192 } while (m.message != WM_KEYDOWN);193194 closegraph();195return0;196 }View Code汉诺塔移动⽰例:///////////////////////////////////////////////////// 程序名称:汉诺塔移动动画// 编译环境:Visual C++ 6.0,EasyX_20130506(beta)// 作 者:Ronald Email:ryl910527@// 最后修改:2011-5-26//#include <graphics.h>#include <conio.h>#include <stdio.h>#define MAX 64 // 圆盘的最⼤数⽬#define NULL 0// 定义栈struct STKNODE{int a[4];};struct STK{STKNODE* stack[MAX];int top;};// 定义全局变量STK s[3]; // 声明三个栈,分别代表⼀号⼆号三号钢针上圆盘的状态int v = 5; // 调整速度// 函数声明void Initstk(STK* s); // 初始化栈void Hannoi(int n, char a, char b, char c); // 汉诺塔递归void start(); // 开始画⾯void Move(int n, char a, char b); // 移动过程int switchab(char a); // 返回钢针号void adjust(); // 调整速度暂停// 主函数void main(){int n, ta[4] = {115, 500, 285, 518}; // 第⼀个圆盘的位置printf("尽量⼩于16\n"); // 因为⼤于⼗六时就会显⽰有误,但程序可以正常运⾏printf("请输⼊汉诺塔的层数(1~64):");scanf("%d", &n);STKNODE** p;p = (STKNODE**)malloc(n * sizeof(STKNODE **)); // 声明⼀个元素为 n 个的动态 STKNODE 型指针数组for (int i2 = 0; i2 < n; i2 ++){p[i2] = (STKNODE *)malloc(sizeof(STKNODE)); // 为每⼀个指针申请空间}Initstk(&s[0]);Initstk(&s[1]);Initstk(&s[2]); // 将三个栈初始化start(); // 呈现开始画⾯setfillcolor(GREEN); // 圆盘的颜⾊for (int i=0; i < n; i++){ta[0] += 5;ta[1] -= 20;solidrectangle(ta[0], ta[1], ta[2], ta[3]); // 画出n个从⼤到⼩⼀次叠放的黄⾊圆盘++s[0].top; // 进栈for (int i1 = 0; i1 < 4; i1++){p[i]->a[i1] = ta[i1];s[0].stack[s[0].top] = p[i]; // 记录每个矩形的位置,top为圆盘的个数}}Hannoi(n, 'a', 'b', 'c'); // 汉诺塔递归函数system("pause");printf("\t\t\t\tGame Over!\n");}///////////////////////////////////////////////////// 函数定义// 汉诺塔的递归void Hannoi(int n, char a, char b, char c){if(n == 1)Move(1, a, c);else{Hannoi(n-1, a, c, b);Move(n, a, c);Hannoi(n-1, b, a, c);}}// 栈的初始化void Initstk(STK *s){int i;s->top = 0;for (i = 0; i <= MAX; i++)s->stack[++s->top] = NULL;s->top = 0;}// 移动过程void Move(int n, char a, char b){int i3, i4 = 0, i5 = 0;i3 = b - a; // ⽬的钢针与源钢针的位置差值i4 = switchab(a); // 源钢针钢针号i5 = switchab(b); // ⽬的钢针号STKNODE *q1, *q0; // 两个中间结点⽤于源栈和⽬的栈间的值得传递,q1为⽬的栈,q0为源栈 q1 = (STKNODE *)malloc(sizeof(STKNODE));q0 = (STKNODE *)malloc(sizeof(STKNODE));// 源栈与⽬的栈值的传递q0 = s[i4].stack[s[i4].top];++s[i5].top; // 进栈q1->a[0] = q0->a[0] + i3 * 200;q1->a[1] = 500 - s[i5].top * 20;q1->a[2] = q0->a[2] + i3 * 200;q1->a[3] = 500 - s[i5].top * 20 + 18;s[i5].stack[s[i5].top] = q1;--s[i4].top; // 出栈// 向上运动while (q0->a[1] >= 100){setfillcolor(GREEN);solidrectangle(q0->a[0], q0->a[1], q0->a[2], q0->a[3]);adjust(); // 调整函数Sleep(10 * v); // 暂停(ms)setfillcolor(WHITE);solidrectangle(q0->a[0], q0->a[1], q0->a[2], q0->a[3]);setlinecolor(RED);line((q0->a[0] + q0->a[2]) / 2, q0->a[1], (q0->a[0] + q0->a[2]) / 2, q0->a[3]); // 重新画上被擦掉原有的红线q0->a[1] -= 10;q0->a[3] -= 10;}// 向左或右运动,与 i3 的正负有关while (q0->a[2] != q1->a[2]){setfillcolor(GREEN);solidrectangle(q0->a[0], q0->a[1], q0->a[2], q0->a[3]);setfillcolor(WHITE);solidrectangle(q0->a[0], q0->a[1], q0->a[2], q0->a[3]);if (i3 < 0) // i3<0向左移{q0->a[0] -= 20;q0->a[2] -= 20;}else// i3>0向右移{q0->a[0] += 20;q0->a[2] += 20;}}// 向下运动while (q0->a[3] <= q1->a[3]){setfillcolor(GREEN);solidrectangle(q0->a[0], q0->a[1], q0->a[2], q0->a[3]);adjust();Sleep(10 * v);setfillcolor(WHITE);solidrectangle(q0->a[0], q0->a[1], q0->a[2], q0->a[3]);setlinecolor(RED);if (q0->a[1] > 100) // 重画被擦掉的红线{line((q0->a[0] + q0->a[2]) / 2, q0->a[1], (q0->a[0] + q0->a[2]) / 2, q0->a[3]); }q0->a[1] += 10;q0->a[3] += 10;}// 在⽬的钢针上的相应位置绘制出黄⾊矩形块setfillcolor(GREEN);solidrectangle(q1->a[0], q1->a[1], q1->a[2], q1->a[3]);}// 绘制开始界⾯void start(){// 初始化画⾯⼤⼩initgraph(800, 650);// 背景设为⽩⾊setbkcolor(WHITE);// ⽤⽩⾊填充整个画⾯cleardevice();// 绘制彩虹,形成⼀道彩虹,摘⾃ easyx 帮助⽂档⽰例程序float H, S, L;H = 0; // ⾊相S = 1; // 饱和度L = 0.5f; // 亮度setlinestyle(PS_SOLID,2, NULL, 0); // 设置线宽为 2for(int r = 600; r > 544; r--){H += 5;setlinecolor( HSLtoRGB(H, S, L) );circle(750, 900, r);}// 说明settextstyle(50, 0, "华⽂楷体");settextcolor(RED);outtextxy(200, 150, "汉诺塔移动动画");settextstyle(20, 0, "⿊体");outtextxy(600, 200, "BY:Ronald");outtextxy(500, 200, "版本V1.1");settextstyle(50, 0, "⿊体");settextcolor(GREEN);outtextxy(200, 350, "随便按⼀个键开始吧!");// 检测键盘敲击getch();// 清空开始界⾯cleardevice();// 绘制运动画⾯的的环境line(400, 110, 400, 500);line(600, 110, 600, 500);line(200, 110, 200, 500);// 长⽅体形的底座setfillcolor(LIGHTGRAY);fillrectangle(80, 501, 720, 510);// 暂停按钮solidrectangle(360, 540, 440, 580);settextstyle(30, 0, "⿊体");settextcolor(GREEN);outtextxy(370, 550, "暂停");settextstyle(20, 0, "宋体");settextcolor(RED);outtextxy(300, 580, "⿏标暂停后请按空格继续");// 加速按钮solidrectangle(160, 540, 240, 580);settextstyle(30, 0, "⿊体");settextcolor(GREEN);outtextxy(170, 550, "加速");settextstyle(20, 0, "宋体");settextcolor(RED);outtextxy(170, 580, "请按 d");// 减速按钮solidrectangle(560, 540, 640, 580);settextstyle(30, 0, "⿊体");settextcolor(GREEN);outtextxy(570, 550, "减速");settextstyle(20, 0, "宋体");settextcolor(RED);outtextxy(570, 580, "请按 a");// 说明settextstyle(50, 0, "宋体");settextcolor(GREEN);outtextxy(10, 10, "正在进⾏中请欣赏:");}// 判断⽬的钢针与源钢针的钢针号返回钢针号int switchab(char a){switch (a){case'a':return0;case'b':return1;case'c':return2;default:return0;}}// 调整函数,实现加速,减速,暂停void adjust(){char f; // 接收键盘敲进去的按钮和⿏标点击时赋予的变化值// ⽤ f 接受键盘的键⼊值if(kbhit())f = getch();// 检测⿏标消息if (MouseHit()==true){// 接收⿏标消息MOUSEMSG Mouse;Mouse = GetMouseMsg();// 响应⿏标消息if (Mouse.x >= 360 && Mouse.x <= 440 && Mouse.y >= 540 && Mouse.y <= 580 && Mouse.mkLButton) {f = '';}if (Mouse.x >= 160 && Mouse.x <= 240 && Mouse.y >= 540 && Mouse.y <= 580 && Mouse.mkLButton) {{f = 'a';}}// 作⽤于动画switch(f){// 暂停case'':// ⽤‘继续’覆盖‘暂停’settextstyle(30, 0, "⿊体");settextcolor(GREEN);outtextxy(370, 550, "继续");getch();// 继续后变回显⽰‘暂停’settextstyle(30, 0, "⿊体");settextcolor(GREEN);outtextxy(370, 550, "暂停");break;// 减速case'a':// 当被点击时,‘减速’位置震动⼀下setfillcolor(LIGHTGRAY);solidrectangle(560, 540, 640, 580);settextstyle(30, 0, "⿊体");settextcolor(GREEN);outtextxy(575, 545, "减速");Sleep(30);// 减速v++;// 回原位setfillcolor(LIGHTGRAY);solidrectangle(560, 540, 640, 580);settextstyle(30, 0, "⿊体");settextcolor(GREEN);outtextxy(570, 550, "减速");break;// 加速case'd':setfillcolor(LIGHTGRAY);solidrectangle(160, 540, 240, 580);settextstyle(30, 0, "⿊体");settextcolor(GREEN);outtextxy(165, 545, "加速");Sleep(30);setfillcolor(LIGHTGRAY);solidrectangle(160, 540, 240, 580);settextstyle(30, 0, "⿊体");settextcolor(GREEN);outtextxy(170, 550, "加速");// 加速v--;// v 最⼩为1if (v <= 0){v = 1;}break;default:break;}f = 'r'; // f 初始化为 rFlushMouseMsgBuffer(); // 清空⿏标消息}View Code。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档