VB日历课程设计报告样本.docx
《VB日历课程设计报告样本.docx》由会员分享,可在线阅读,更多相关《VB日历课程设计报告样本.docx(39页珍藏版)》请在冰豆网上搜索。
VB日历课程设计报告样本
课程设计题目电子台历
所选题目:
电子台历
难度:
两星级**
知识点:
(1)非矩形窗口;
(2)动态数组;(3)配备文献读写;(4)图片应用;(5)控件数组;(6)弹出式菜单使用;(7)公共对话框控件;(8)多模块程序设计;(9)日期函数使用
前言
“台历”是人们办公、学习好帮手,人们把它置于案头用来查看日期、星期并可以以便地记事。
本题目便编制一种“电子台历”程序,实现台历普通功能。
一、功能
1、启动程序,显示一种圆角矩形窗口,并自动显示当前月月历。
星期从星期一开始排列,星期六和星期天以不同颜色显示。
2、鼠标单击可以查看不同年份和月份(左键增大,右键减小)。
单击某个日期会在窗口右半边显示与否有记事。
双击左下角当前日期,可以使台历及时显示当月月历。
3、在窗体空白处右击,可以弹出一种菜单,可以对显示日历日期颜色、字体,窗体背影图片加以修改。
所有颜色、字体和背影图片设立会自动保存,下次启动时会自动应用上一次设立。
4、从快捷菜单中选取“添加节日”或“添加记事”,可以分别实现对节日和记事添加。
在弹出对话框中,能同步添加各种节日或记事。
二、课程设计详细设计
1、程序界面规定是圆角矩形窗口,该功能实现用到了SetWindowRgn函数。
SetWindowRgn函数是属于API函数,在使用时要先声明。
其代码如下:
PrivateDeclareFunctionCreateRoundRectRgnLib"gdi32"(ByValX1AsLong,_
ByValY1AsLong,ByValX2AsLong,ByValY2AsLong,_
ByValX3AsLong,ByValY3AsLong)AsLong
PrivateDeclareFunctionSetWindowRgnLib"user32"(ByValhWndAsLong,_
ByValhRgnAsLong,ByValbRedrawAsBoolean)AsLong
hRgn=CreateRoundRectRgn(0,0,570,400,80,100)'创立圆角矩形区域
CallSetWindowRgn(Me.hWnd,hRgn,True)
2、年份、月份、日期和记事显示依托标签Caption属性。
其中,星期和日期显示使用了控件数组,星期显示使用了14个控件,日期显示使用了74个控件。
又把各个标签背影设为透明,这样,便实现了日历界面显示。
3、为了使文字有浮于图片之上立体感,使用了内容相似但颜色伸浅不同且位置错开一点两个控件来实现。
功能实现依托如下代码:
PublicSubGetCaption()'产生标签文字,达到字体有悬浮效果
DimjAsInteger
lblYear1.Caption=lblYear.Caption
lblYear1.FontName=lblYear.FontName
lblMonth1.Caption=lblMonth.Caption
lblMonth1.FontName=lblMonth.FontName
lblNow1.Caption=lblNow.Caption
lblNow1.FontName=lblNow.FontName
Forj=37To73
lblDay(j).Caption=lblDay(73-j).Caption
Next
lblShowNote1.Caption=lblShowNote.Caption
lblShowNote1.FontName=lblShowNote.FontName
Forj=0To6
lblWeek(13-j).FontName=lblWeek(j).FontName
Next
EndSub
4、本程序主窗口使用了美丽图片作背影,样例共提供了4个.bmp格式图片加载使用如下代码来实现:
PrivateSubPic1_Click()'日历背影图象变化
frmCalMain.Picture=Nothing
frmCalMain.Picture=LoadPicture(App.Path&"\pics\p1.bmp")
frmMenu.Pic1.Checked=True
frmMenu.Pic2.Checked=False
frmMenu.Pic3.Checked=False
frmMenu.Pic4.Checked=False
strPicName="p1"
EndSub
PrivateSubPic2_Click()
frmCalMain.Picture=Nothing
frmCalMain.Picture=LoadPicture(App.Path&"\pics\p2.bmp")
frmMenu.Pic2.Checked=True
frmMenu.Pic1.Checked=False
frmMenu.Pic3.Checked=False
frmMenu.Pic4.Checked=False
strPicName="p2"
EndSub
PrivateSubPic3_Click()
frmCalMain.Picture=Nothing
frmCalMain.Picture=LoadPicture(App.Path&"\pics\p3.bmp")
frmMenu.Pic3.Checked=True
frmMenu.Pic1.Checked=False
frmMenu.Pic2.Checked=False
frmMenu.Pic4.Checked=False
strPicName="p3"
EndSub
PrivateSubPic4_Click()
frmCalMain.Picture=Nothing
frmCalMain.Picture=LoadPicture(App.Path&"\pics\p4.bmp")
frmMenu.Pic4.Checked=True
frmMenu.Pic1.Checked=False
frmMenu.Pic2.Checked=False
frmMenu.Pic3.Checked=False
strPicName="p4"
EndSub
5、启动程序和左下角当前日期规定显示当前月历,该功能实现应用了两个过程和一种函数来实现:
PrivateSubDisplayNow()'该过程显示当前日期
DimdtmNowAsDate
dtmNow=Date
lblYear.Caption=Format(dtmNow,"yyyy年")
lblMonth.Caption=Format(dtmNow,"M月")
lblNow.Caption=Format(dtmNow,"今天是:
dddddd")
strNow=Format(dtmNow,"dddddd")'用于存储当前年、月、日字符串
intYear=Val(Format(dtmNow,"yyyy"))'用三个变量存储当前年、月、日
intMonth=Val(Format(dtmNow,"M"))
intDay=Val(Format(dtmNow,"d"))
dtmOne=DateAdd("d",(1-intDay),dtmNow)'当前月第一天
intNum=Days(intYear,intMonth)
CallSort(dtmOne,intNum)'调用过程生成每月各个日期
'使当前日期颜色对的显示
IffrmCalMain.lblYear.Caption&frmCalMain.lblMonth.Caption&_
frmCalMain.lblDay(intNowDayIndex).Caption&"日"=strNowThen
frmCalMain.lblDay(intNowDayIndex).ForeColor=frmCalMain.lblNow.ForeColor
EndIf
EndSub
PrivateSubSort(dtm1AsDate,int1AsInteger)'该过程生成每月各个日期
DimintweekAsInteger,iAsInteger,jAsInteger
DimhAsInteger
Forh=0To36'各个日期标签标题清空
lblDay(h).Caption=""
Nexth
intweek=Val(Format(dtm1,"w"))'计算每月第一天为星期几
Ifintweek-1>0Then
i=intweek-2
Else
i=6
EndIf
j=0
DoWhilejlblDay(i).Caption=j+1
lblDay(i).MousePointer=99
'使指针变成手图形
lblDay(i).MouseIcon=LoadPicture(App.Path&"\Resource\hand.cur")
j=j+1
i=i+1
Loop
Forj=0To36
IflblDay(j).Caption=""Then
lblDay(j).MousePointer=99
'使指针边成移动图形
lblDay(j).MouseIcon=LoadPicture(App.Path&"\Resource\move.cur")EndIf
Next
EndSub
PrivateFunctionDays(intYAsInteger,intMAsInteger)'该函数计算每月天数
DimkAsInteger
SelectCaseintM
Case1,3,5,7,8,10,12
k=31
Case2
IfintYMod4=0Then
k=29
Else
k=28
EndIf
CaseElse
k=30
EndSelect
Days=k
EndFunction
6、本程序使用了配备文献格式来保存关于颜色、字体和图片设立以及节日和记事内容。
配备文献是一种特殊文本文献,普通以.ini为扩展名,它可以使用记事本打开。
由于配备文献特殊格式,Windows提供了专门API函数来对起进行读写。
该功能实现用到了如下语句:
PrivateDeclareFunctionWritePrivateProfileStringLib"kernel32"Alias_
"WritePrivateProfileStringA"(ByVallpApplicationNameAsString,_
ByVallpKeyNameAsAny,ByVallpStringAsAny,ByVallpFileNameAsString)AsLong
PrivateDeclareFunctionGetPrivateProfileStringLib"kernel32"Alias_
"GetPrivateProfileStringA"(ByVallpApplicationNameAsString,_
ByVallpKeyNameAsAny,ByVallpDefaultAsString,ByVal_
lpReturnedStringAsString,ByValnSizeAsLong,ByVallpFileNameAsString)AsLong
DimsAsString*100
'获得星期一至星期五颜色参量
CallWritePrivateProfileString("SetColor","颜色1,strColor1App.Path&"\cal.set")
CallGetPrivateProfileString("SetColor","颜色1,"0",s,100,App.Path&"\cal.set")
'获得星期字体参量
DimsAsString*100,strFont1AsString
CallWritePrivateProfileString("SetFont","字体1,strFont2,App.Path&"\cal.set")
CallGetPrivateProfileString("SetFont","字体1,"0",s,100,App.Path&"\cal.set")
7、以上六个过程不是很难,对我来说花是时间最长是节日和记事读出。
由于节日和记事在记事本中保存位置不同,一种在节名为Festival中,一种在节名为Note中,而它们要在同一种标签中显示,并且以序号排列。
我用了很长时间进行调试来实现了该规定。
其代码如下:
PrivateSublblDay_Click(IndexAsInteger)
DimstrCaptionAsString,s1AsString,strFestAsString
Dims2AsString*100,strNoteAsString,strFest1AsString
DimstrMidAsString,strDate1AsString,strFest2AsString
DimstrDate2AsString,strNoteAndDateAsString,strFestAndDateAsString
DimiAsInteger,jAsInteger,kAsInteger
'strDate1保存被选取日期
strDate1=Left(lblYear.Caption,4)&"-"&Left(lblMonth.Caption,_
InStr(lblMonth.Caption,"月")-1)&"-"&lblDay(Index).Caption
strMid=strDate1+Chr(32)+Chr(32)+Chr(32)+Chr(32)+Chr(32)+_
Chr(32)+Chr(32)+Chr(32)+Chr(32)+Chr(32)+Chr(32)+Chr(32)+Chr(32)
lblShowNote.Caption=""'显示记事标签标题清空
strCaption=lblDay(Index).Caption
IfstrCaption=""ThenExitSub
strFest1=Left(lblMonth.Caption,_
InStr(lblMonth.Caption,"月")-1)&"-"&lblDay(Index).Caption
Do'此循环用于显示被选取日期有无记事
i=i+1
s1="节日"&i
s2=""
CallGetPrivateProfileString("Festival",s1,"0",s2,100,App.Path&"\cal.set")
IfTrim(Left(s2,InStr(s2,Chr(0))-1))="0"ThenExitDo
strFestAndDate=Trim(Left(s2,InStr(s2,Chr(0))-1))
strFest2=Left(strFestAndDate,InStr(strFestAndDate,":
")-1)'strFest2保存记事本中已有日期
strFest=Right(strFestAndDate,Len(strFestAndDate)-InStr(strFestAndDate,":
"))'strFest保存记事本中存储记事
IfstrFest2=strFest1Then'若条件成立,则被选取日期有记事
k=k+1
strMid=strMid+Chr(13)+Chr(10)+CStr(k)+":
"+strFest
lblShowNote.Caption=strMid
strFest2=""
EndIf
Loop
i=0
IflblShowNote.Caption=""Then
'此循环用于显示被选取日期有无记事
DoWhilestrDate2<>strDate1
i=i+1
s1="记事"&i
s2=""
CallGetPrivateProfileString("Note",s1,"0",s2,100,App.Path&"\cal.set")
IfTrim(Left(s2,InStr(s2,Chr(0))-1))="0"Then
lblShowNote.Caption=strMid+"无记事"
ExitDo
EndIf
strNoteAndDate=Trim(Left(s2,InStr(s2,Chr(0))-1))
strDate2=Left(strNoteAndDate,InStr(strNoteAndDate,":
")-1)'strDate2保存记事本中已有日期
strNote=Right(strNoteAndDate,Len(strNoteAndDate)-InStr(strNoteAndDate,":
"))'strNote保存记事本中存储记事
Loop
EndIf
i=0:
j=k
Do'此循环用于显示被选取日期有无记事
i=i+1
s1="记事"&i
s2=""
CallGetPrivateProfileString("Note",s1,"0",s2,100,App.Path&"\cal.set")
IfTrim(Left(s2,InStr(s2,Chr(0))-1))="0"ThenExitDo
strNoteAndDate=Trim(Left(s2,InStr(s2,Chr(0))-1))
strDate2=Left(strNoteAndDate,InStr(strNoteAndDate,":
")-1)'strDate2保存记事本中已有日期
strNote=Right(strNoteAndDate,Len(strNoteAndDate)-InStr(strNoteAndDate,":
"))'strNote保存记事本中存储记事
IfstrDate2=strDate1Then'若条件成立,则被选取日期有记事
j=j+1
strMid=strMid+Chr(13)+Chr(10)+CStr(j)+":
"+strNote
lblShowNote.Caption=strMid
strDate2=""
EndIf
Loop
GetCaption
EndSub
自己以为上述代码还不够简洁,还可以进行修改和简化,由于时间仓促,来不及再进行修改。
三、调试程序过程
1、在显示当前月日期时,曾一度发生错误,不容易找到实现该过程办法。
曾经想过运用当前日期所在标签Index号然后进行加或减生成各个日期,可是这样调试了好久,不但代码诸多,并且该过程不容易实现。
最后自己终于找到了一种简便算法:
先运用Format函数得到当前日期,然后生成当前月第一天,接着计算该天所在标签,得到标签Index号,最后计算输出当前月各个日期。
这样,整个过程很简洁迅速实现了。
2、在生成矩形窗口时,自己遇到了问题:
一种窗口一旦有了菜单,运用SetWindowRgn函数便不好实现对其剪切,其最后效果由于存在着标题栏(最上部存在一种绿色长条)而变难看,不符合规定。
自己调试了好久依然不成功。
最后自己又增长了一种窗体frmMenu,在该窗体放置了菜单和公共对话框控件。
这样之后,当右击主窗体frmCalMain时便弹出frmMenu窗体菜单。
这样,本来也许集中在窗体frmCalMain中代码便某些转移到了frmMenu窗体中,有助于程序调试。
3、在编写颜色对话框时不能实现对上一次操作记忆,自己调试了好久,一方面想把在显示当前日期时规定其颜色要保持和lblNow标签颜色同样,这样增长了设计难度,由于不懂得该日期是星期几,并且,在单击lblYear和lblMonth时要注意颜色一致性,即月份或年份一旦变化,本来用来显示当前日期标签颜色就要也许变化,保持所在星期颜色一致性。
自己调试了好久,运用一种全局变量intNowDayIndex满足了该规定。
其详细过程可看附件代码。
4、固然尚有许多问题,像运用CommonDialogShowFont属性无用(只要把CommonDialogFlags属性值设为2),节日和记事不能正保证存(设计时ComboBoxList属性值输入时存在大量空格)等等小问题,这里就不一一说了。
四、输入输出数据
此电子台历几乎没有涉及数据输入输出,这里也就不在列出。
五、课程设计总结
虽然说此电子台历只有两颗星,但我花时间并不短,算起来,大概有三个星期,这其中有暑假一种多星期时间。
整体说来,自己还是蛮有成就感,毕竟自己仅仅是刚学了VB一年。
在设计时,许多自己在课堂或考试中没有遇到或接触东西都是自己看书解决,这样使得自己感到在VB上知识又掌握了许多。
正如教师说,VB课程设计核心是训练学生把所学知识运用到实践当中去,自己在课堂上学到了什么,就真正掌握了什么。
自己本来就梦想要自己编制属于自己程序,可以说,自己梦想已经实现,自己的确感到很高兴。
六、附件
电子台历源代码:
frmCalMain窗体:
OptionExplicit
OptionBase1
PrivatedtmOneAsDate,lngMidColorAsLong,strNowAsString,LocalMousePlaceXAsSingle
PrivatestrSatColorAsString,strSunColorAsString,strMtoFColorAsString,LocalMousePlaceYAsSingle
PublicintMonthAsInteger,intNumAsInteger,intNowDayIndexAsInteger
PublicintYearAsInteger,intDayAsInteger
'API函数声明
PrivateDeclareFunctionCreateRoundRectRgnLib