VB日历课程设计报告样本.docx

上传人:b****8 文档编号:11335563 上传时间:2023-02-27 格式:DOCX 页数:39 大小:26.73KB
下载 相关 举报
VB日历课程设计报告样本.docx_第1页
第1页 / 共39页
VB日历课程设计报告样本.docx_第2页
第2页 / 共39页
VB日历课程设计报告样本.docx_第3页
第3页 / 共39页
VB日历课程设计报告样本.docx_第4页
第4页 / 共39页
VB日历课程设计报告样本.docx_第5页
第5页 / 共39页
点击查看更多>>
下载资源
资源描述

VB日历课程设计报告样本.docx

《VB日历课程设计报告样本.docx》由会员分享,可在线阅读,更多相关《VB日历课程设计报告样本.docx(39页珍藏版)》请在冰豆网上搜索。

VB日历课程设计报告样本.docx

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

DoWhilej

lblDay(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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 历史学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1