多媒体软件设计技术.docx
《多媒体软件设计技术.docx》由会员分享,可在线阅读,更多相关《多媒体软件设计技术.docx(14页珍藏版)》请在冰豆网上搜索。
多媒体软件设计技术
《多媒体软件设计技术》
课程设计报告书
课程名称:
多媒体软件设计技术
指导教师:
杨岚老师
二○一二年六月
一.引言
本次课程设计是为了考察我们对VisualBasic的综合运用能力,着重于多媒体方面的设计。
在程序设计的过程中曾参考过有关的资料,并借鉴了一些内容。
要求:
1、用VisualBasic6.0编写程序,设计并实现一个多媒体应用程序。
2、程序必须带注释,分为“注释到过程(函数)”和“注释到单条语句”两种注释方式,其中“注释到单条语句”评分较高,“注释到过程(函数)”评分较低;无注释或少注释将酌情扣分。
3、所有相关文件保存在文件名:
学号_姓名文件夹内。
4、选题说明:
学号最后一位数字表示所选题号,如:
201004134112选题为2号题;201004134130选题为10号题;
5、严禁抄袭,一旦发现有雷同设计,同时取消成绩。
二.设计课题
设计图像多种切换效果。
要求:
1:
必须有淡入、淡出、翻转、滑入、旋转引入等效果;2;设计菜单
三.程序设计内容
程序运行情况
设计界面
程序界面
图片的切换效果
滑入
程序源代码
PublicStopProgramAsBoolean'定义开始按钮的能否开始
PublicSwapPicsAsBoolean
PrivateEnumSideSelecting
Off=0
HV=1
LRDU=2
All=3
EndEnum
DimAAsInteger'A进入速度变量
DimBAsInteger'B单步刷新变量
DimCAsInteger'C条宽度
PrivateSubcmdStart_Click()
StaticStartModeAsBoolean'设置开始按钮的caption属性
IfNotStartModeThen
IfNotIsReadyThenExitSub
cmdStart.Caption="停止"
StartMode=True
RunEffect
Picture1.Refresh
StartMode=False
IfStopProgramThenExitSub
IfSwapPicsThen
'BitBltPicture2.hdc,0,0,640,480,Picture3.hdc,0,0,SRCCOPY
'BitBltPicture3.hdc,0,0,640,480,Picture1.hdc,0,0,SRCCOPY
SwapPicturesPicture1,Picture2,Picture3
EndIf
Picture2.Refresh
Picture3.Refresh
cmdStart.Caption="开始"
Else
mblnRunning=False
cmdStart.Caption="开始"
StartMode=False
EndIf
EndSub
PrivateSubForm_Load()
WithList1'list的选项
.AddItem"滑入"
.AddItem"从外向内滑入"
.AddItem"从内向外滑入"
.AddItem"缩放推入"
.AddItem"从内缩放推入"
.AddItem"淡入"
.AddItem"融入"
.AddItem"百叶窗"
.AddItem"旋转引入"
.AddItem"圆形切出"
.AddItem"扇形切入"
.AddItem"双面斜切入"
.AddItem"斜切入"
.AddItem"斜切出"
EndWith
StopProgram=False
lngSpeed=1
List1.ListIndex=0
SetPicture1.Picture=LoadPicture(App.Path&"\Effect-x1.jpg")
SetPicture2.Picture=LoadPicture(App.Path&"\Effect2-x1.jpg")
SetPicture3.Picture=LoadPicture(App.Path&"\Effect-x1.jpg")
EndSub
PrivateSubForm_QueryUnload(CancelAsInteger,UnloadModeAsInteger)
mblnRunning=False
StopProgram=True
UnloadMe
EndSub
PrivateSubFrame6_DragDrop(SourceAsControl,xAsSingle,yAsSingle)
EndSub
PrivateSubList1_Click()
A=1'滑入速度设为1
SelectCaseList1.ListIndex'选择list的内容风别为0到13
Case0'滑入
B=5'B单步刷新变量设为5
Case1'从外向内滑入
B=4'B单步刷新变量设为4
Case2'从内向外滑入
B=4'B单步刷新变量设为4
Case3'缩放推入
B=5
Case4'从外向内推入
B=5'B单步刷新变量
Case5'淡入
B=2'B单步刷新变量
Case6'融入
B=5
C=1'设置条大小为1
Case7'百叶窗
A=50
B=1
C=20
SelectCaseList1.ListIndex
Case8
B=5
Case9
B=5
Case10
B=5
Case11To13
B=10
EndSelect
CaseElse
EndSelect
EndSub
PrivateFunctionGetSideLRDU()AsLong
GetSideLRDU=4
EndFunction
PrivateFunctionGetSideHV()AsLong
GetSideHV=1
EndFunction
PrivateFunctionGetPushMode()AsLong
GetPushMode=1
EndFunction
PrivateSubRunEffect()
SwapPics=True
SelectCaseList1.ListIndex
Case0
WipePicture1,Picture2,GetSideLRDU,CLng(B)'执行滑入函数
Case1
Wipe_InPicture1,Picture2,GetSideHV,CLng(B)'执行从外向内滑入
Case2
Wipe_OutPicture1,Picture2,GetSideHV,CLng(B)'执行从内向外滑入
Case3
DimiAsLong
i=1
StretchingPicture1,Picture3,Picture2,i,CLng(B),,GetPushMode'执行缩放推入
Case4
Stretching_Wipe_InPicture1,Picture3,Picture2,GetSideHV,CLng(B),,GetPushMode'执行从外向内推入
Case5
RandomLinesPicture1,Picture2,GetSideHV,CLng(B)'执行淡入
Case6
Bars_DrawPicture1,Picture2,GetSideHV,CLng(B),CLng(C)'执行融入
Case7
Bars_WipePicture1,Picture2,GetSideLRDU,CLng(B),CLng(C)'执行百叶窗
Case8
MaskEffectPicture1,Picture2,1,Me.hdc,CLng(B)'执行旋转引入
Case9
MaskEffectPicture1,Picture2,2,Me.hdc,CLng(B)'执行圆形切出
Case10
MaskEffectPicture1,Picture2,3,Me.hdc,CLng(B)'执行扇形切入
Case11
MaskEffectPicture1,Picture2,4,Me.hdc,CLng(B)'执行双面斜切入
Case12
MaskEffectPicture1,Picture2,5,Me.hdc,CLng(B)'执行斜切入
Case13
MaskEffectPicture1,Picture2,6,Me.hdc,CLng(B)'执行斜切出
EndSelect
EndSub
PrivateSubquit_Click()
End
EndSub
(部分模块)
PublicSubAlpha_Wipe(DestPicAsPictureBox,PrevPicAsPictureBox,NewPicAsPictureBox,FlagAsLong,OptionalBarSizeAsLong=50,OptionalStepsAsLong=5)
Dimr1AsLong,g1AsLong,b1AsLong
Dimr2AsLong,g2AsLong,b2AsLong
DimrmAsLong,gmAsLong,bmAsLong
DimyAsLong
IfIsReadyThen
Ended=False
DimpxWidthAsLong,pxHeightAsLong
DimScreenTXAsLong,ScreenTYAsLong
DimXlengAsLong,CntrAsLong
Dimt1AsLong,t2AsLong
ScreenTX=Screen.TwipsPerPixelX
ScreenTY=Screen.TwipsPerPixelY
pxWidth=DestPic.ScaleWidth\ScreenTX
pxHeight=DestPic.ScaleHeight\ScreenTY
SelectCaseFlag
Case1'擦除
Xleng=pxWidth+BarSize
Case2'过渡
Xleng=255
Case3
Cntr=1
Xleng=Sqr(pxWidth*pxWidth+pxHeight*pxHeight)/2
Xleng=Xleng+BarSize
EndSelect
DimUBAsLong,UB2AsLong
GetObjectAPIDestPic.Picture,Len(Bmp1),Bmp1
GetObjectAPIPrevPic.Picture,Len(Bmp3),Bmp3
GetObjectAPINewPic.Picture,Len(Bmp2),Bmp2
WithSA1
.cbElements=1
.cDims=2
.Bounds(0).lLbound=0
.Bounds(0).cElements=Bmp1.bmHeight
.Bounds
(1).lLbound=0
.Bounds
(1).cElements=Bmp1.bmWidthBytes
.pvData=Bmp1.bmBits
EndWith
WithSA2
.cbElements=1
.cDims=2
.Bounds(0).lLbound=0
.Bounds(0).cElements=Bmp2.bmHeight
.Bounds
(1).lLbound=0
.Bounds
(1).cElements=Bmp2.bmWidthBytes
.pvData=Bmp2.bmBits
EndWith
WithSA3
.cbElements=1
.cDims=2
.Bounds(0).lLbound=0
.Bounds(0).cElements=Bmp3.bmHeight
.Bounds
(1).lLbound=0
.Bounds
(1).cElements=Bmp3.bmWidthBytes
.pvData=Bmp3.bmBits
EndWith
CopyMemoryByValVarPtrArray(Pic1),VarPtr(SA1),4
CopyMemoryByValVarPtrArray(Pic2),VarPtr(SA2),4
CopyMemoryByValVarPtrArray(Pic3),VarPtr(SA3),4
mblnRunning=True'开始循环
DoWhilemblnRunning
IfmlngTimer+lngSpeed<=GetTickCount()Then
'BitBlting
IfCntr>=XlengThen
SetDestPic.Picture=DestPic.Picture
UB=UBound(Pic1,1)+1
UB2=UBound(Pic1,2)+1
CopyMemoryPic1(0,0),Pic2(0,0),UB*UB2
CopyMemoryPic2(0,0),Pic3(0,0),UB*UB2
CopyMemoryPic3(0,0),Pic1(0,0),UB*UB
CopyMemoryByValVarPtrArray(Pic1),0&,4
CopyMemoryByValVarPtrArray(Pic2),0&,4
CopyMemoryByValVarPtrArray(Pic3),0&,4'停止
mblnRunning=False'新图片可以使用更多的bitblt.
ExitSub
EndIf
SelectCaseFlag
Case1'擦除
t2=UBound(Pic1,1)-3
t1=UBound(Pic1,2)
Forint_i=0Tot2Step3
Forint_j=0Tot1
GetRGBr1,g1,b1,3
GetRGBr2,g2,b2,2
y=int_i/3
Ifyr1=r2
b1=b2
g1=g2
ElseIfy<=CntrAndy>=Cntr-BarSizeThen
rm=255-(((Cntr-y)/BarSize)*255)
CheckRGBrm,0,0
r1=((r1*rm)+(r2*(255-rm)))\255
g1=((g1*rm)+(g2*(255-rm)))\255
b1=((b1*rm)+(b2*(255-rm)))\255
EndIf
CheckRGBr1,g1,b1
Pic1(int_i,int_j)=b1
Pic1(int_i+1,int_j)=g1
Pic1(int_i+2,int_j)=r1
Nextint_j
Nextint_i
Cntr=Cntr+Steps
Case2'过渡
Forint_i=0ToUBound(Pic1,1)-3Step3
Forint_j=0ToUBound(Pic1,2)
GetRGBr1,g1,b1,3
GetRGBr2,g2,b2,2
rm=255-Cntr
CheckRGBrm,0,0
r1=((r1*rm)+(r2*(255-rm)))\255
g1=((g1*rm)+(g2*(255-rm)))\255
b1=((b1*rm)+(b2*(255-rm)))\255
CheckRGBr1,g1,b1
Pic1(int_i,int_j)=b1
Pic1(int_i+1,int_j)=g1
Pic1(int_i+2,int_j)=r1
Nextint_j
Nextint_i
Cntr=Cntr+Steps
Case3'透明圆型擦除
DimpxCenterWidthAsLong,pxCenterHeight
pxCenterWidth=pxWidth\2
pxCenterHeight=pxHeight\2
Forint_i=0ToUBound(Pic1,1)-3Step3
Forint_j=0ToUBound(Pic1,2)
GetRGBr1,g1,b1,3
GetRGBr2,g2,b2,2
y=int_i\3
rm=Sqr((pxCenterWidth-y)*(pxCenterWidth-y)+(pxCenterHeight-int_j)*(pxCenterHeight-int_j))
Ifrm>CntrThen
rm=255
ElseIfrmrm=0
Else
rm=255-(((Cntr-rm)/BarSize)*255)
EndIf
CheckRGBrm,0,0
r1=((r1*rm)+(r2*(255-rm)))\255
g1=((g1*rm)+(g2*(255-rm)))\255
b1=((b1*rm)+(b2*(255-rm)))\255
CheckRGBr1,g1,b1
Pic1(int_i,int_j)=b1
Pic1(int_i+1,int_j)=g1
Pic1(int_i+2,int_j)=r1
Nextint_j
Nextint_i
Cntr=Cntr+20
EndSelect
'刷新图片
DestPic.Refresh
'刷新时间
mlngTimer=GetTickCount()'复位时间变量
EndIf
DoEvents
Loop
mblnRunning=False
EndIf
UB=UBound(Pic1,1)+1
UB2=UBound(Pic1,2)+1
CopyMemoryPic1(0,0),Pic2(0,0),UB*UB2
CopyMemoryPic2(0,0),Pic3(0,0),UB*UB2
CopyMemoryPic3(0,0),Pic1(0,0),UB*UB2
CopyMemoryByValVarPtrArray(Pic1),0&,4
CopyMemoryByValVarPtrArray(Pic2),0&,4
CopyMemoryByValVarPtrArray(Pic3),0&,4
Ended=True
EndSub
6)程序问题分析
1.图片的进入速度控制不住,有时候图片变化很快,有时候很慢,不好控制。
可以再加入程序,使其控制图片的进出速度。
2.由于以原有的程序进行了大部分的改动,但所学知识有限,模块中的程序无法全部看懂,希望在以后自学过程中搞懂它。
7)总结
通过这次设计,我对VB的运用更加灵活,对知识的掌握更加牢固。
在程序设计的过程中,遇到了一些问题,通过查阅资料和借助网络,解决了一部分问题,但仍有一部分还无法解决。
我还需继续努力,继续学习VB,充实自己。