电气工程学院08级通信3班孙明辉VC++课程设计报告.docx
- 文档编号:17815429
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:20
- 大小:103.04KB
电气工程学院08级通信3班孙明辉VC++课程设计报告.docx
《电气工程学院08级通信3班孙明辉VC++课程设计报告.docx》由会员分享,可在线阅读,更多相关《电气工程学院08级通信3班孙明辉VC++课程设计报告.docx(20页珍藏版)》请在冰点文库上搜索。
电气工程学院08级通信3班孙明辉VC++课程设计报告
VC++课程设计报告
字体滚动系统设计
姓名:
孙明辉
学号:
P081513227
学院:
电气工程学院
班级:
2008级通信工程3班
日期:
2009年12月20日
(同组人:
黄鑫、尹春雷、郭超龙、孙明辉、白志壮、郭伟男)
目录
一、设计任务………………………………………1
二、程序设计与实现………………………………1
1,需求分析、可行性研究和概要设计………………1
2,详细设计和编码………………………………2
3,测试…………………………………………7
三、设计难点与解决方法…………………………8
四、设计效果与不足之处……………………………8
六、学习体会………………………………………8
附录一:
程序使用说明……………………………9
附录二:
TestView.cpp源代码………………………9
附录三:
参考文献……………………………………13
一、设计任务
1,选题意义
起初人们只能用作画来记录自然界的一切,但作画既不真实也不是每个人都能作出好画来;随着时间的推移,照相机诞生了,照相机用极其逼真的图片来记录大自然的一切,但照相机只能记录大自然的静态特征,不能记录其动态的过程。
所以摄像机便应运而生了,它能将自然界的一起动态过程记录下来。
如今动画对人们来说已是生活中必不可少的东西。
当今风靡全球的动画设计软件当属Flash软件了,但Flash软件为什么能实现动画呢?
其实Flash软件只是做了一些前台工作,真正实现动画的是Flash软件后台强大的程序设计语言。
为了能实现像浏览Internet一样从只有少数人能上网到每个人都能享受互联网地跨越。
我们小组这次VC++的课程设计就选择了动态实现文字滚动这个题目。
希望通过本次VC++课程设计来增加大家对用程序设计语言来实现动态过程的兴趣。
2,设计目标
通过本次VC++动态实现文字滚动这个课程设计主要要达到以下几个目标:
1)进一步熟悉VC++的上机环境,进一步探索VC++的强大功能和它的动态编程方法及技巧。
2)掌握用VC++动态编程实现文字滚动。
在窗口上显示一行文字;这一行文字从左向右滚动显示;每显示一轮,改变一次颜色和字体;一个周期为5种颜色,分别为红、紫、蓝、绿、黄,5种字体分别为宋体、楷体、仿宋体、黑体、隶书。
3)揭开VC++动态编程太神秘面纱,增加大家对用程序设计语言来实现动态过程的兴趣。
使动态编程能够像浏览Internet实现大众化。
二、程序设计与实现
1,需求分析、可行性研究和概要设计
本系统程序总的一个组成框图如下图:
第1页共13页
控制文字输出
图1程序总流程图
本程序需要创建移动的文字,需要实现在窗口上显示一行文字;这一行文字从左向右滚动显示;每显示一轮,改变一次颜色和字体;一个周期为5种颜色,分别为红、紫、蓝、绿、黄,5种字体分别为宋体、楷体、仿宋体、黑体、隶书的功能。
因此需建立文字所需的字体库和颜色库。
实现动态移动时需要一个计时器,用来控制文字的移动。
2,详细设计和编码
本系统程序的主要工作可均在ClassView中实现。
而在ClassView中主要是构造函数CTestView()、功能实现的OnDraw()函数和计时器OnTimer()函数。
这三个函数中实现。
我们小组在ClassView中的实现过程流程图如下图:
第2页共13页
N
Y
图2ClassView中的实现过程流程图
1.数据描述——结构体类型定义说明
说明:
该程序在工程视图CtextView中添加了如下公有数据成员:
(1)int型变量x,用来设置字体位置坐标;
(2)Cstring型的字体格式变量temp、u、v、x、y、z,其中temp为空值,作为动态过程中字体格式转换中间变量;
(3)COLORREF型的字体颜色变量a、b、c、d、e、f,其中f为空值,作为动态过程中字体颜色转换的中间变量。
2.函数功能说明
(1)视图类的构造函数CTestView()
函数功能:
按要求为字体格式和颜色变量赋初值。
算法描述:
将在工程视图CtextView中为添加的公有成员变量一一赋初值。
(2)功能实现的OnDraw()函数
函数功能:
实现对屏幕中输出的“大家要为理想努力奋斗哦!
O(∩_∩)O”字体格式和颜色的不断转换。
第3页共13页
算法描述:
背景模式和文本输出颜色接受默认值。
接着调用SetTextColor()函数和CreatePointFont()函数分别用来设置字体颜色和让文字以不同的字体显示。
然后调用TextOut()在初始位置输出:
大家要为理想努力奋斗哦!
O(∩_∩)O,用if语句判断当文字“大家要为理想努力奋斗哦!
O(∩_∩)O”从左往右扫描一次结束后,改变文字的字体及颜色。
最后SetTimer(1,50,NULL)语句设置并启动计时器,即每个50ms让文字向前移动一次。
因为此程序的主要功能均在OnDraw()函数实现,输一次函数的流程图同ClassView中的实现过程流程图,即图2ClassView中的实现过程流程图。
(3)计时器OnTimer()函数
函数功能:
使文字的横坐标每次向前移动10个像素并不断刷新以用来控制文字向前移动。
算法描述:
周期性地按一定的时间间隔向应用程序发送WM_TIMER消息,它能实现“实时更新”以及“后台运行”等功能。
应用程序是通过CWnd类的SetTimer函数来设置并启动计时器的。
使文字的横坐标每次向前移动10个像素并不断刷新以用来控制文字向前移动。
根据流程图、数据的描述和函数功能说明,我们小组将这个文字滚动程序的具体设计方法、步骤以及所添加的代码描述如下:
1,打开VisualC++IDE,使用MFCAppWizard[exe]向导创建一个单文档的应用程序Text。
2,为了能在动态过程中实现颜色和字体的变化,选择项目工作区的ClassView,在CtextView视图中添加共有成员数据变量。
各个变量如下所示:
CStringu;
CStringv;
CStringw;
COLORREFf;
COLORREFe;
COLORREFd;
COLORREFa;
COLORREFb;
COLORREFc;
CStringtemp;
CStringz;
CStringy;
第4页共13页
并在构造函数中初始化个变量,代码如下:
CTestView:
:
CTestView()
{
//TODO:
addconstructioncodehere
x=0;
u="宋体";
v="楷体";
w="仿宋体";
y="黑体";
z="隶书";
temp="";
a=RGB(255,0,0);
b=RGB(128,0,128);
c=RGB(0,0,255);
d=RGB(0,255,0);
e=RGB(255,255,0);
f=RGB(0,0,0);
}
3,选择项目工作区的ClassView,展开CtextView视图,打开OnDraw()函数,在其中完成下列工作。
工作如下:
①调用SetTextColor()设置字体颜色函数,用于在动态滚动中让文字显示不同的颜色。
②调用CreatePointFont()创建字体函数,用于在动态滚动中让文字以不同的字体显示。
③调用TextOut()在初始位置输出:
大家要为理想努力奋斗哦!
O(∩_∩)O
④用if语句判断当文字“大家要为理想努力奋斗哦!
O(∩_∩)O”从左往右扫描一次结束后,改变文字的字体及颜色。
⑤设置一个计时器,以便配合OnTimer()函数共同完成文字的动态运动过程。
为完成上述功能,需在OnDraw()函数中添加如下代码:
voidCTestView:
:
OnDraw(CDC*pDC)
{
CTestDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(a);
第5页共13页
CFont*OldFont,NewFont;
NewFont.CreatePointFont(400,u,NULL);
OldFont=pDC->SelectObject(&NewFont);
pDC->TextOut(x,100,"大家要为理想努力奋斗哦!
O(∩_∩)O");
pDC->SelectObject(OldFont);
NewFont.DeleteObject();
if(x>1000){
x=0;
temp=u;
u=v;
v=w;
w=y;
y=z;
z=temp;
f=a;
a=b;
b=c;
c=d;
d=e;
e=f;
}
SetTimer(1,50,NULL);
}
4,为了实现动态过程还需要一个计时器使文字的横坐标每次向前移动10个像素并不断刷新以用来控制文字向前移动。
具体工作为利用ClassWizard选择CtestView的WM_TIMER消息,为其添加OnTimer()函数,添加代码如下:
voidCTestView:
:
OnTimer(UINTnIDEvent)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
x=x+10;
Invalidate();
CView:
:
OnTimer(nIDEvent);
}
第6页共13页
3,测试
完成所有工作后,对源代码进行编译链接后执行本程序,运行结果达到了预期的目标:
在窗口上显示一行文字;这一行文字从左向右滚动显示;每显示一轮,改变一次颜色和字体;一个周期为5种颜色,分别为红、紫、蓝、绿、黄,5种字体分别为宋体、楷体、仿宋体、黑体、隶书的功能。
运行结果如下面2张图片所示:
图3运行结果一
图4运行结果二
从上面的两张运行结果图中可以看出文字在向前移动,并且在移动过程中字体和颜色均在改变,达到预期目标。
第7页共13页
三、设计难点与解决方法
本程序设计的主要难点是如何实现动态过程以及如何在动态过程中实现颜色和字体的变化。
为了实现动态过程。
我们小组经过反复试验后使用一个计时器来控制文字的移动,具体做法是每个50ms让文字向前移动10个像素。
因为我们人的视觉神经感觉不到50ms的时间间隔,这样实质上离散的移动觉变成了连续的移动。
为了实现动态过程中实现颜色和字体的变化。
我们小组经过反复试验后使用了这样一种思想:
让存放颜色的一组变量组成一个循环队列,每当文字从左往右扫描一次时,存放颜色的一组变量依次向前移动(本实验用复制来实现)一个位置(最后一个变量移动到第一个变量),然后每次选择固定的位置。
这个思想起源于有些娱乐节目中的摇奖环节:
有一个大转盘,上边有一个固定的指针,当选手转动大转盘时,就可以进行摇奖了,看上去像指针在选择一样。
四、设计效果与不足之处
本实验只是试验了简单的文字滚动过程以及在过程中不断改变文字的颜色和字体(运行结果参见图3运行结果一、图4运行结果二),功能十分有限,没有实现更多的动态过程。
如文字移动时背景颜色不能改变;在文字移动过程中文字中只能沿着指定的直线前进,十分单调,而不能实现文字可以以某种曲线(如正弦线)向前移动;在文字移动过程中文字中文字的效果不是很理想,如不能实现像Word那样将文字变成有某种视觉效果(亦真亦幻、赤水深情、礼花绽放等等)。
在一个是不能像有些音乐软件那样在文字的运动过程中,颜色以渐进的方式逐个对文字改变颜色。
五、学习体会
通过本次VC++动态编程实现动态实现文字滚动的课程设计。
1)进一步熟悉了VC++的上机环境,进深一步探索了VC++的强大功能和它的动态编程方法及技巧。
2)掌握了用VC++动态编程实现动态实现文字滚动。
其中特别是此次课程设计中关于如何让文字运动起来和在动态过程实现字体、文字颜色的改变的设计方法和实现技巧让我受益匪浅。
本来实现这两项功能让我毫无头绪,最后通过
第8页共13页
翻阅资料让我明白原来要实现动态运动就这么简单,只是我们平时缺乏想象,缺乏思考,缺乏动手实践。
所以通过本次VC++的课程设计让我明白学习程序设计语言需要自己多动手编写程序。
也只有这样才能成为一个编程高手。
3)通过本次VC++的课程设计,和上次C语言课程设计相比让我了解到面向对象的可视化C++(即VC++)程序语言比面向过程的C语言更灵活,更简洁,更实用。
它提高了程序代码的重用性,控制了程序的复杂性并可改善程序更的可维护性。
激发了我对用程序设计语言来实现动态过程的兴趣。
4)通过本次VC++的课程设计,初步能够按一般软件的设计要求和规范来制作属于自己的小型程序。
附录一:
程序使用说明
为了使用户能够获得正确的程序运行结果,现在说明内容如下:
(1)程序运行环境:
VC++
(2)文件组成说明:
文件由多个C++源程序和多个头文件组成,运行时点击Text.dsw文件直接运行即可。
(3)操作说明:
双击Text.dsw文件,编译、链接、运行之后,便可以看到文字滚动效果。
附录二:
TestView.cpp源代码
//TestView.cpp:
implementationoftheCTestViewclass
//
#include"stdafx.h"
#include"Test.h"
#include"TestDoc.h"
#include"TestView.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
第9页共13页
/////////////////////////////////////////////////////////////////////////////
//CTestView
IMPLEMENT_DYNCREATE(CTestView,CView)
BEGIN_MESSAGE_MAP(CTestView,CView)
//{{AFX_MSG_MAP(CTestView)
ON_WM_TIMER()
//}}AFX_MSG_MAP
//Standardprintingcommands
ON_COMMAND(ID_FILE_PRINT,CView:
:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT,CView:
:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView:
:
OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CTestViewconstruction/destruction
CTestView:
:
CTestView()
{
//TODO:
addconstructioncodehere
x=0;
u="宋体";
v="楷体";
w="仿宋体";
y="黑体";
z="隶书";
temp="";
a=RGB(255,0,0);
b=RGB(128,0,128);
c=RGB(0,0,255);
d=RGB(0,255,0);
e=RGB(255,255,0);
f=RGB(0,0,0);
}
CTestView:
:
~CTestView()
{
}
第10页共13页
BOOLCTestView:
:
PreCreateWindow(CREATESTRUCT&cs)
{
//TODO:
ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
returnCView:
:
PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
//CTestViewdrawing
voidCTestView:
:
OnDraw(CDC*pDC)
{
CTestDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(a);
CFont*OldFont,NewFont;
NewFont.CreatePointFont(400,u,NULL);
OldFont=pDC->SelectObject(&NewFont);
pDC->TextOut(x,100,"大家要为理想努力奋斗哦!
O(∩_∩)O");
pDC->SelectObject(OldFont);
NewFont.DeleteObject();
if(x>1000){
x=0;
temp=u;
u=v;
v=w;
w=y;
y=z;
z=temp;
f=a;
a=b;
b=c;
c=d;
d=e;
e=f;
第11页共13页
}
SetTimer(1,50,NULL);
}
/////////////////////////////////////////////////////////////////////////////
//CTestViewprinting
BOOLCTestView:
:
OnPreparePrinting(CPrintInfo*pInfo)
{
//defaultpreparation
returnDoPreparePrinting(pInfo);
}
voidCTestView:
:
OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
{
//TODO:
addextrainitializationbeforeprinting
}
voidCTestView:
:
OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
{
//TODO:
addcleanupafterprinting
}
/////////////////////////////////////////////////////////////////////////////
//CTestViewdiagnostics
#ifdef_DEBUG
voidCTestView:
:
AssertValid()const
{
CView:
:
AssertValid();
}
voidCTestView:
:
Dump(CDumpContext&dc)const
{
CView:
:
Dump(dc);
}
CTestDoc*CTestView:
:
GetDocument()//non-debugversionisinline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTestDoc)));
return(CTestDoc*)m_pDocument;
}
第12页共13页
#endif//_DEBUG
/////////////////////////////////////////////////////////////////////////////
//CTestViewmessagehandlers
voidCTestView:
:
OnTimer(UINTnIDEvent)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
x=x+10;
Invalidate();
CView:
:
OnTimer(nIDEvent);
}
附录三:
参考文献
1.张荣梅,梁晓林。
VisualC++实用教程。
冶金工业出版社。
2004
2.郑阿奇.VisualC++实用教程(第2版).电子工业出版社.2003
3.DavidJ.Kruglinski潘爱民、王国印译.VisualC++技术内幕(第四版).清华大学出版社.1999
4.魏亮,李春葆编著.VisualC++程序设计例学与实践.清华大学出版社.2006
5.刘瑞吴跃进王宗越.VisualC++项目开发实用案例.科学出版社.2006
6.孙鑫余安萍.VC++深入详解.电子工业出版社.2006
第13页共13页
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电气工程 学院 08 通信 班孙明辉 VC 课程设计 报告