资源描述
辽 宁 工 业 大 学
《C++语言程序设计》课程设计(论文)
题目: 操作调色板
院(系): 软 件 学 院
专业班级: 软件工程113班
学 号: 111301070
学生姓名: 安凯辰
指导教师: 翟宝峰
教师职称: 副教授
起止时间:2011.12.12-2011.12.25
课程设计(论文)任务及评语
院(系):软件学院 教研室:软件教研室
学 号
111301070
学生姓名
安凯辰
专业班级
软件工程113班
课程设计(论文)题目
操作调色板
课程设计(论文)任务
程序设计的任务与要求:
(1). 掌握面向对象程序设计语言C++的基本语法
(2). 掌握C++面向对象设计的思想
(3). 掌握VC++6.0与DEV C++ 开发工具的使用
(4). 运用标准C++规范设计应用程序
设计过程中,要严格遵守设计的时间安排,听从指导教师的指导。正确地完成上述内容,规范完整地撰写出设计报告。
指导教师评语及成绩
成绩: 指导教师签字:
年 月 日
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
目 录
第1章 课程设计目的与要求 1
1.1 设计目的 1
1.2实验环境 1
1.3预备知识 1
1.4设计要求 1
第2章 课程设计内容 2
2.1 课题描述 2
2.2 系统设计 2
2.2.1功能分析 2
2.2.2面向对象设计 2
2.2.2类成员描述 3
2.3程序实现 6
2.3.1源码分析 8
2.3.2运行结果 8
第3章 课程设计总结 14
参考文献 15
第1章 课程设计目的与要求
1.1 设计目的
将理论教学中涉及到的知识点贯穿起来,对不同的数据类型、程序控制结构、数据结构作一比较和总结,结合设计题目进行综合性应用,对所学知识达到融会贯通的程度。
通过课程设计,学生在下述各方面的能力应该得到锻炼:
(1)进一步巩固、加深学生所学专业课程《C++语言教程》的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。
(2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。
(3)利用所学知识,开发小型应用系统,掌握运用C++语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。
(4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。
(5)掌握面向对象程序设计的方法。
(6)熟练掌握C++语言的基本语法,灵活运用各种数据类型。
(7)进一步掌握在集成环境下如何调试程序和修改程序。
1.2实验环境
硬件要求能运行Windows 操作系统的微机系统。C++语言应用程序开发软件使用:VC++ 系统,或其他C++语言应用程序开发软件。
1.3预备知识
熟悉C++语言程序设计的基本知识及VC++编辑器的使用方法。
1.4设计要求
1.仔细分析设计题目,画出程序流程图,编写程序源代码。
2.积极上机调试源程序,增强编程技巧与调程能力。
3.认真书写课程设计预习报告,课程设计说明书。
4.遵守课程设计要求和机房管理制度,服从指导教师的安排,确保课程设计的顺利完成课程设计内容。
第2章 课程设计内容
2.1 课题描述
Visual C++通过绘图应用程序和控件来处理许多基本的绘图任务。Visual C++也提供了许多用于在程序窗口客户区中画图的工具。但当创建特殊效果,比如动画效果而需要操作图像时,就只能使用Windows API。
许多Windows绘图函数存储在一个叫图形设备接口的DLL中。当创建和运行任何Visual C++程序时,都隐含调用了许多GDI(Graphic Device Interface)函数。这使用户无需知道象素、调色板或光栅操作。但在编写操作图形图像的程序时,读者需要知道这些知识和如何直接使用GDI函数。理解GDI函数最容易的方法,是首先理解它们所操作的数据结构,尤其是位图和彩色调色板的数据结构。
在屏幕上显示的每一幅图像都有自己的调色板。此外,每一活动窗口都可以按自己的目的操作当前的调色板。但记住,当调色板的256种颜色是用于整个屏幕的,而不是对每个窗口或应用程序,有如此限制,就必须要解决这个限制,于是就出现了Windows调色板管理器。Windows使用调色板管理器来决定在某时刻哪个窗口有调色板的控制权。活动窗口,也就是前台窗口,一般都有优先权。若该窗口没有使用调色板,优先权就按顺序传给下一个窗口(这种顺序就是窗口在操作台中的顺序)。具有最高优先级的窗口实现自己的调色板作为前台调色板,其他窗口就由调色板管理器按顺序通知,使其实现自己的调色板为后台调色板。
2.2 系统设计
2.2.1功能分析
Windows环境下的颜色处理过程与DOS环境下的颜色处理过程有着明显的差别。在Windows环境下,程序设计人员不必对各种不同的硬件功能编制各自的规定条款,因而具有更大的灵活性,这也恰恰是Windows操作平台优越性的一个体现。
功能说明:利用调色板来达到火焰模拟效果这个程序,简单介绍了PC的颜色和显示系统,全面剖析了Windows操作系统处理色彩的关键“部件”——逻辑调色板的结构。此外,简单地介绍了Windows操作系统提供的逻辑调色板操作函数,详细地介绍了Windows应用程序和使用逻辑调色板、进而处理高质量图形图像的操作过程。
在该程序中,利用操作调色板绘制火苗的不同部位的颜色,来达到火焰的效果。本程序的功能如下:
在程序中,火焰的效果分为3种:Wood,Natural Gas和Kryptonite;
利用Max滑动控件可以改变火焰的高度;
在“Properties”组件栏中,可以选择“Fire”和“Render”效果,单击Apply按钮实现选择的效果。
2.2.2面向对象设计
UML语言是一种典型的面向对象建模语言,但不是一种编程语言,在UML语言中用符号描述概念间的关系描述为连接符号的线。UML类图中最基本的是要图形化描述类,要表示类的名称、数据成员和函数成员,以及各成员的访问控制属性。在UML语言中,用一个由上到下分为三段的矩形来表示一个类,类名写在顶部区域,数据成员(数据UML中称为属性)在中间区域,函数成员(行为UML中称为操作)出现在底部区域。当然,也可以看作就是用三个矩形上下相叠,分别表示类的名称、属性和操作,而且,除了名称这个部分外,其他两个部分是可选的,即类的属性和操作可以不表示出来,也就是说,一个写了类名的矩形就可以代表一个类。操作调色板中CfireWnd类的完整表示如图2.1所示。
CfireWnd
+ m_nDecay:int
+ m_nFlammability:int
+ m_nMaxHeat:int
+ m_nSpreadRate:int
+ m_nSize:int
+ m_nSmoothness:int
+ m_nDistribution:int
+ m_nChaos:int
# m_MaxBurn:int
# m_Fire:BYTE*
# m_pMenDC:CDC*
# m_pWinDC:CwindowDC
# m_rgbpalette[256]:RGBQUAD
# m_Palette:Cpalette
# m_pOldPalette: Cpalette*
# m_Bitmap:Cbitmap
# m_pOldBitmap: Cbitmap*
# m_pBits: BYTE*
+ InitFire(nColor:int=0):void
+ Getpalette():Cpalette*
+ RenderFlame():void
+ RenderFlame():void
+ PaintFlame(Pdc:CDC*=NULL):void
+ SetMaxBurn(nMax:int):void
+ GetMaxBurn():int
+ GetBitmapSize():CSize
# CreatePalette(nColor:int):void
# CreateBitmap():void
+ InitFire(nColor:int=0):void
+ Getpalette():Cpalette*
+ RenderFlame():void
+ PaintFlame(Pdc:CDC*=NULL):void
+ SetMaxBurn(nMax:int):void
+ GetMaxBurn():int
+ GetBitmapSize():CSize
# CreatePalette(nColor:int):void
# CreateBitmap():void
# BurnPoint(pRow:BYTE*,pNextRow:BYTE*):void
# Rand():unsigned long
# OnPaint():void
# OnDestroy():void
# OnPaletteCHanged(pFocusWnd:CWnd*):void
# OnQueryNewPalette():BOOL
图2.1 CfireWnd类的完整表示
流程图是使用图形表示算法的思路的一种方法,简单说应该就是程序运行的路线,在设计程序时就是你自己的思路,你要程序如何走,可以用一个图画出来,首先从一个程序的入口点开始,然后在每一个选择句或循环句什么的地方,用箭头表达出下一部行进的路线。这个图是程序设计初期完成,在你开始用编辑器写代码前,用来理清你的思路。绘制流程图的习惯做法是:事实描述用椭圆形表示、行动方案用矩形表示、问题用菱形表示,箭头代表流动方向。操作调色板的主要函数流程图如图2.4所示。
开始
选择火焰效果
设置Fire中属性值
Apply
设置Render中的属性值
Apply
显示火焰效果
结束
F
T
T
F
图2.4操作调色板的主要函数流程图
2.2.2类成员描述
1.算法设计:
1)使用ClassWizard创建一个新类CfireWnd,实现文件为FireWnd.cpp,类定义文件为FireWnd.h。
2)编辑FireWnd.h,FIRE为应用程序的主文件,增加成员函数和成员变量。
3)编辑CfireWnd的构造函数,在构造函数中,初始化成员变量。
4)在FireWnd中,初始化随机数生成种子。
5)在PaintFlame()中,检查是否已经创建了一个新的调色板,若标志是TURE,用适当的CDC成员函数选择和实现调色板。
注意:这是一个两步的过程:用新颜色显示之前,必须用SelectPalette()函数选择调色板,然后用RealizePalette()函数来实现它。
若用户选择了一个新的调色板而不实现它,就不可能画出任何东西来,因为所有的颜色都将是黑色的。
6)SelectPalette()函数返回一个指向被取代的逻辑调色板的指针;声明一个Cpalette类型的对象m_palette,但该对象本身并不能自己创建一个调色板,为了生成一个调色板,必须调用Cpalette的成员函数CreateCpalette()函数。
7)创建火焰位图,编辑CfireWnd其他的成员函数,实现火焰的特殊效果,在对话框成员函数中被调用,实现火焰的特殊效果。
使用的主要技术如下:
1)Windows颜色的管理方法;
2)使用调色板;
3)配置调色板的基本步骤;
4)使用Cbitmap类;
5)传送和扩展位图的方法。
2.调色板的工作原理:
一个256色显示模式中的调色板的工作原理如图2.2所示。
图2.2调色板的工作原理
在Windows中,应用程序是通过一个或多个逻辑调色板来使用系统调色板(物理调色板)。在256色系统调色板中,Windows保留了20种颜色作为静态颜色,这些颜色用作显示Windows界面,应用程序一般不能改变。缺省的系统调色板只包含这20种静态颜色,调色板的其它项为空。应用程序要想使用新的颜色,必须将包含有所需颜色的逻辑调色板实现到系统调色板中。在实现过程中,Windows首先将逻辑调色板中的项与系统调色板中的项作完全匹配,对于逻辑调色板中不能完全匹配的项,Windows将其加入到系统调色板的空白项中,系统调色板总共有236个空白项可供使用,若系统调色板已满,则Windows将逻辑调色板的剩余项匹配到系统调色板中尽可能接近的颜色上。在逻辑调色板被实现到系统调色板时,Windows会建立一个调色板映射表。当设备上下文用逻辑调色板中的颜色绘图时,GDI绘图函数会查询调色板映射表以把像素值从逻辑调色板的索引转换成系统调色板的索引,这样当像素被输出到视频内存中时就具有了正确的颜色值。逻辑调色板与系统调色板的映射关系如图2.3所示。
图2.3逻辑调色板与系统调色板的映射
2.3程序实现
2.3.1源码分析
// 应用程序的主头文件,增加成员函数和成员变量
class CFireWnd : public CStatic
{
// 构造函数
public:
CFireWnd();
// 与属性有关的成员变量
public:
// 定义火焰的属性,各种效果见程序执行结果
int m_nDecay;
int m_nFlammability;
int m_nMaxHeat;
int m_nSpreadRate;
int m_nSize;
int m_nSmoothness;
int m_nDistribution;
int m_nChaos;
protected:
int m_MaxBurn;
BYTE* m_Fire;
static unsigned long m_RandSeed;
// Seed被Rand()应用
//设备场景的属性
CDC* m_pMemDC;
CWindowDC* m_pWinDC;
//调色板属性
RGBQUAD m_rgbPalette[256];
CPalette m_Palette;
CPalette* m_pOldPalette;
// 位图属性
CBitmap m_Bitmap;
CBitmap* m_pOldBitmap;
BYTE* m_pBits;
// 操作各种成员函数
public:
enum { red = 1, green = 2, blue = 3 };
void InitFire(int nColor);
CPalette* GetPalette();
void RenderFlame();
void PaintFlame(CDC* pDC = NULL);
void SetMaxBurn(int nMax);
int GetMaxBurn();
CSize GetBitmapSize();
protected:
void CreatePalette(int nColor);
void CreateBitmap();
void BurnPoint(BYTE* pRow, BYTE* pNextRow);
// 由下面的函数替代crt库函数Rand()
// crt库函数Rand()的执行速度比较慢
// 因为在绘制火焰的图形时,对Rand()的调用非常频繁
// 所以有必要对其进行优化
// 该函数为内联函数,它的计算机非常简单
unsigned long Rand();
public:
virtual ~CFireWnd();
// 消息映射函数
protected:
//{{AFX_MSG(CFireWnd)
afx_msg void OnPaint();
afx_msg void OnDestroy();
afx_msg void OnPaletteChanged(CWnd* pFocusWnd);
afx_msg BOOL OnQueryNewPalette();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
// 内联函数Rand()
inline unsigned long CFireWnd::Rand()
{
// 使用当前的种子,生成一个新的随机值和种子,并且返回其值
// 随机值交替产生,这样减少了噪声,从而产生更逼真的火焰效果
return (m_RandSeed = 1664525L * m_RandSeed + 1013904223L) >> 5;
}
// 内联函数BurnPoint(),绘制火焰的各个位置点
inline void CFireWnd::BurnPoint(BYTE* pRow, BYTE* pNextRow)
{
BYTE* pTarget;
int off = Rand() % (m_nDistribution + 1);
int val = m_nDecay + 1;
val = Rand() % val;
val = *pNextRow - val;
if (Rand() & 1)
pTarget = pRow + off;
else
pTarget = pRow - off;
if (val > 16)
*pTarget = (BYTE)val;
else
*pTarget = 16;
}
// 在构造函数中,初始化成员变量
CFireWnd::CFireWnd()
{
m_nDecay = 5;
m_nFlammability = 385;
m_nMaxHeat = 223;
m_nSpreadRate = 20;
m_nSmoothness = 1;
m_nDistribution = 1;
m_nChaos = 50;
m_nSize = 0;
m_MaxBurn = 0;
m_Fire = NULL;
m_pMemDC = NULL;
m_pWinDC = NULL;
m_pOldPalette = NULL;
m_pOldBitmap = NULL;
}
2.3.2运行结果
1.系统主界面如图2.5所示。
图2.5系统主界面
2.选择火焰颜色,滑动Max控件改变火焰的高度如图2.6所示。
图2.6火焰最大高度的效果
3.设置Fire中的效果属性值效果如图2.7所示。
图2.7 Fire中实现的效果
4.设置Render中的属性值效果如图2.8所示。
图2.8 Render中实现的效果
第3章 课程设计总结
随着现代科学技术的迅猛发展,计算机技术已经渗透到各个领域,成为各行业必不可少的工具,随之而来就有很多的计算机的语言。如C、C++、VB、VC、DEPHI语言等等。但是C++语言是应用最广泛,它的语言简洁灵活,运算符和数据结构丰富,具有结构化控制语句,程序执行效率高。因此近年来,C++语言已经成为国内外广泛流行的一种通用的计算机程序设计语言。
C++从C语言发展而来,比C更好,C++的优点主要包括:与C语言兼容,既支持面向对象的程序设计,也支持结构化的程序设计;修补了C语言中的一些漏洞,提供更好的类型检查和编译时的分析,使得程序员在C++环境下继续写C代码,也能得到直接的好处;生成目标程序质量高,程序执行效率高,一般来说,用面向对象的C++编写的程序执行速度与C语言程序不相上下;提供了异常处理机制,简化了程序的出错处理,利用throw、try和catch关键字,出错处理程序不必与正常的代码紧密结合,提高了程序的可靠性和可读性; 函数可以重载及可以使用缺省参数,重载允许相同的函数名具有不同参数表,系统根据参数的个数和类型匹配相应的函数,缺省参数可以使得程序员能够以不同的方法调用同一个函数,并自动对某些缺省参数提供缺省值;提供了模板机制,摸板包括类摸板和函数模板两种,它们将数据类型作为参数,对于具体数据类型,编译器自动生成模板类或模板函数,它提供了源代码复用的一种手段。
本次课设的题目是操作调色板,C++语言程序设计要求结构紧凑,概念准确,在程序中有一点小小错误,都会致使整个程序无法运行,直到修改准确无误。通过Visual C++的设计,使我学会了它的函数的定义与使用发法类的定义、实现以及如何利用类来解决具体问题等。在掌握基本算法的基础上,逐步提高了分析程序的能力和良好的思维方式,以及编写程序的能力。
通过这次课程设计,我不仅加深了对书本知识的理解和巩固,还学到了很多课本以外的知识,让我了解到了自己的不足,我会继续努力学习,来弥补自己的不足。在实践的过程中也遇到了不少困难,但是最后通过大家的努力,我们终于实现了调色板的运行。可以将自己所掌握的理论知识运用于工作和生活实际,还能提高我们在理论知识的指导下观察、分析和解决问题的实际工作能力,同时也提高了我的动手能力。
参考文献
[1] 徐孝凯.C++基础教程.北京:清华大学出版社,2008
[2] 网冠科技.Visual C++ 6.0 MFC时尚编程百例.北京:机械工业出版社,2006
[3] 潘嘉杰.易学C++.北京:人民邮电出版社,2007
[4] Decoder.C/C++程序设计.北京:中国铁道出版社,2007
[5] 黄迪明.C++语言程序设计基础.北京:电子工业出版社,2003
[6] 严华峰.C++课程设计案例精编.北京:中国水利水电出版社,2002
[7] 吴访升.C++程序设计.北京:机械工业出版社,2000
[8] 郑莉.C++语言程序设计案例教程.北京:清华大学出版社,2005
[9] 埃克尔.C++编程思想实用编程技术—计算机科学丛书.北京:机械工业出版社,2008
[10] 李春葆,章启俊.C++程序设计.北京:清华大学出版社,2006
15
展开阅读全文