1、河北联合大学 软件设计基础(VB)课程设计报告设计名称: 简易日历 姓 名: 杨烁 学 号:201004010219 专业班级: 土木工程二班 学 院: 建筑工程学院 设计时间: 2011年5月10号到7月10号 设计地点: 河北联合大学计算机中心 成绩:指导教师评语: 指导教师签字: 年 月 日软件设计基础(VB)课程设计报告 第 32 页,共 32 页目 录1.课程设计目的32.课程设计任务与要求33.课程设计说明书44.课程设计成果135.程序调试过程146.设计问题的不足和改进方案157.课程设计心得168.附录179.参考文献171课程设计目的软件设计基础(VB)课程设计是这门课程的
2、实践性教学环节之一,本次设计结合实际应用的要求,使课程设计既覆盖VB的知识点,又接近工程实际需要。目的是通过课程设计的综合训练,培养学生实际分析问题、解决问题的能力,以及编程和动手能力,最终目标是通过课程设计这种形式,帮助学生系统掌握VB这门课程的主要内容,养成良好的编程习惯,更好的完成教学任务。2课程设计任务与要求:要求:本次课程设计利用软件设计基础(VB)课程中所学到的编程知识和编程技巧,完成具有一定难度和工作量的程序设计题目,帮助学生掌握编程、调试的基本技能,独立完成所布置的任务。要求:1、对系统进行功能需求分析2、设计合理的数据结构和系统框架3、界面设计美观、清楚、合理4、编程简练,程
3、序功能齐全,能正确运行5、具有一定的创新性6、说明书、流程图要清楚7、课题完成后必须按要求提交课程设计报告任务:1.窗体加载自动提取并显示当前日期2.能选择1960-2060之间的任一年份3.选择某一日期后凹陷显示并在窗体下方显示所选择的日期及其星期4.单击确定后显示所选日期5.节日等在选定日期后以MsgBox形式提示6.单击退出关闭窗体7.根据所选年份和月份,确定显示天数的个数8.年月日及下方的显示只可读不可输入3课程设计说明书功能描述窗体加载自动提取并显示当前日期。能选择1960-2060之间的任一年份。选择某一日期后凹陷显示并在窗体下方显示所选择的日期及其星期。单击确定后显示所选日期。节
4、日等在选定日期后以MsgBox形式提示。根据所选年份和月份,确定显示天数的个数。概要设计模块结构图: 根据功能分析,建立系统的体系结构,即将整个系统分解成若干子模块,用框图表示各功能模块之间的接口关系(如下图)。简易日历当前日期选择日期日期显示退出系统简易日历系统功能框图 详细设计 总体流程图:各功能模块流程图:退出系统日期显示选择日期当前日期简易日历代码实现form1、首页作用:“简易日历主窗体”。所用控件:2个combobox控件,2个textbox,2个commandbutton,1个frame控件,2个label,frame中使用1个label控件数组。设计思路:2个combobox控
5、件供用户选择年份和月份,2个textbox显示所选日期,1个frame控件和其中的1个label控件数组供用户选择日期。详细内容:属性较特殊的需要说明。代码如下:Option ExplicitDim xuanzedate%Private Sub Form_Load()xuanzedate% = CInt(Format$(Now, dd)Call tianchongbn01Call tianchongbn02Call setdateDim r%, week$r% = Weekday(Format$(Now, general date)If r% = 1 Then week$ = 星期日ElseI
6、f r% = 2 Then week = 星期一ElseIf r% = 3 Then week = 星期二ElseIf r% = 4 Then week = 星期三ElseIf r% = 5 Then week = 星期四ElseIf r% = 6 Then week = 星期五Else week = 星期六End Ifbn002.Text = week$bn001.Text = Format$(Now, yyyy & 年 & m & 月 & d & 日)End SubPrivate Sub checkdate(month%, year%)Dim i%, value%, datebn$For
7、i% = 28 To 32 datebn$ = (Str$(month%) + / + Str$(i%) + / + Str$(year%) If IsDate(datebn$) Then value% = i% Else Call visualnumber(value%) Exit Sub End IfNext i%End SubPrivate Sub setdate()Dim r%, i%r% = CInt(Format$(Now, yyyy)i% = r% - 1960bn02.ListIndex = i%r% = CInt(Format$(Now, mm)bn01.ListIndex
8、= (r% - 1)r% = CInt(Format$(Now, dd)bndate(r% - 1).BorderStyle = 1xuanzedate% = r%End SubPrivate Sub tianchongbn01()bn01.AddItem 一月bn01.AddItem 二月bn01.AddItem 三月bn01.AddItem 四月bn01.AddItem 五月bn01.AddItem 六月bn01.AddItem 七月bn01.AddItem 八月bn01.AddItem 九月bn01.AddItem 十月bn01.AddItem 十一月bn01.AddItem 十二月En
9、d SubPrivate Sub tianchongbn02() Dim i% For i% = 1960 To 2060 bn02.AddItem Str$(i%) Next i%End SubPrivate Sub bn01_click()Call setdayCall bndate_click(xuanzedate% - 1)End SubPrivate Sub bn02_Click()Static abc%If Not abc Then abc = True Exit SubEnd IfCall bn01_clickEnd SubPrivate Sub setday() Dim mon
10、th%, year% month% = setmonth() year% = setyear() Call checkdate(month%, year%)End SubPrivate Sub bndate_click(Index As Integer)Dim i%On Error GoTo err1For i% = 0 To 30 bndate(i%).BorderStyle = 0Next i%If bndate(Index).BorderStyle = 1 Then bndate(Index).BorderStyle = 0Else bndate(Index).BorderStyle =
11、 1End Ifxuanzedate% = Index + 1Dim month%, day%, year%, datebn$day% = xuanzedate%month% = bn01.ListIndex + 1year% = bn02.ListIndex + 1960datebn$ = (Str$(month%) + / + Str$(day%) + / + Str$(year%)If bn01.Text = 六月 And bndate(27).BorderStyle = 1 Then MsgBox 老师,欢迎您检阅我的设计。 ElseIf bn01.Text = 九月 And bnda
12、te(12).BorderStyle = 1 Then MsgBox 老师,欢迎您检阅我的设计。End If Dim r%Dim week$r% = Weekday(datebn$)If r% = 1 Then week$ = 星期日ElseIf r% = 2 Then week = 星期一ElseIf r% = 3 Then week = 星期二ElseIf r% = 4 Then week = 星期三ElseIf r% = 5 Then week = 星期四ElseIf r% = 6 Then week = 星期五Else week = 星期六End Ifbn002.Text = week
13、$bn001.Text = Format$(datebn$, long date)err1: If Err = 0 Then Exit Sub If Err = 13 Then xuanzedate% = xuanzedate% - 1 Exit Sub End If End SubPrivate Function setmonth%()Dim i%i% = bn01.ListIndexsetmonth% = i% + 1End FunctionPrivate Function setyear%()Dim i%i% = bn02.ListIndexIf i% = -1 Then Exit Fu
14、nctionsetyear% = CInt(Trim(bn02.List(i%)End FunctionPrivate Sub visualnumber(number%)Dim i%For i% = 28 To 30 bndate(i%).Visible = FalseNext i%For i% = 28 To number% - 1 bndate(i%).Visible = TrueNext i%End SubPrivate Sub bnyes_Click()Dim month%, day%, year%, datebn$day% = xuanzedate%month% = bn01.Lis
15、tIndex + 1year% = bn02.ListIndex + 1960datebn$ = (Str$(month%) + / + Str$(day%) + / + Str$(year%)datebn$ = Format$(datebn$, general date)MsgBox Format$(datebn$, long date), , 您选定的日期为:If bn01.Text = 十月 And bndate(0).BorderStyle = 1 Then MsgBox 国庆节快乐, , 节日/纪念日ElseIf bn01.Text = 二月 And bndate(13).Borde
16、rStyle = 1 Then MsgBox 情人节快乐:, , 节日/纪念日ElseIf bn01.Text = 一月 And bndate(0).BorderStyle = 1 Then MsgBox 元旦快乐,又一年了,加油啊, , 节日/纪念日 ElseIf bn01.Text = 三月 And bndate(11).BorderStyle = 1 Then MsgBox 植树节了,心系环保, , 节日/纪念日ElseIf bn01.Text = 四月 And bndate(0).BorderStyle = 1 Then MsgBox 愚人节的小傻瓜们,今天被骗了没?:-P, , 节日
17、/纪念日 ElseIf bn01.Text = 六月 And bndate(0).BorderStyle = 1 Then MsgBox 儿童节快乐,有颗童心会更加快乐!, , 节日/纪念日 ElseIf bn01.Text = 八月 And bndate(0).BorderStyle = 1 Then MsgBox 建军节快乐, , 节日/纪念日 ElseIf bn01.Text = 十月 And bndate(29).BorderStyle = 1 Then MsgBox 今天我生日,生日快乐!哈哈, , 节日/纪念日 ElseIf bn01.Text = 十一月 And bndate(2
18、2).BorderStyle = 1 Then MsgBox 我的宝贝,生日快乐!, , 节日/纪念日 ElseIf bn01.Text = 十二月 And bndate(24).BorderStyle = 1 Then MsgBox 圣诞节快乐, , 节日/纪念日 ElseIf bn01.Text = 三月 And bndate(7).BorderStyle = 1 Then MsgBox 妇女节快乐, , 节日/纪念日 ElseIf bn01.Text = 八月 And bndate(1).BorderStyle = 1 Then MsgBox 妈,生日快乐!, , 节日/纪念日 End
19、IfEnd SubPrivate Sub bnexit_Click() Unload MeEnd Sub4课程设计成果程序运行后显示当前日期:选择任意日期:点击“确认”:点击“确定”:5.程序调试过程系统在调试过程中存在的主要问题是的错误是变量声明部分,变量声明部分声明本程序所需要的变量和数组,主要是日期变量。另外就是设定当前日期错误,在下拉列表框添加年份和月份。Private Sub lblnumber_click(Index As Integer)最终通过各种调试和查询解决了问题,还有就是预期设想的利用函数和数组来完成日历代码的编写,运行效果不错。6.设计问题的不足和改进方案这个程序的日历
20、比较简单,不美观,而且比较单调。设想可以通过添加背景图片,设置更多的节日和添加记事本功能并且有时间提醒。7.课程设计心得学习VB编程语言是一件很枯躁的事情,需要有强大的爱好,必需要为自己的爱好而学习,这样才能有足够的动力来学习编程这门枯燥的事情,才能在枯燥的事情中找到快乐。在学习中要认认真真的把MSDN中关于VB的内容好好看一看,特别是函数和语句。 遇到问题不要直接去问别人,自己好好想一想,试着解决这个问题。当自己想过好多办法,解决一个问题,可能解决的办法并不是最好的办法,但绝对有利于自己的提高,一个人水平的提高主要是通过独立的解决问题来得到的。即使自己最后没有解决问题,你自己思考过了,然后找
21、别人帮你解决,你也会想和很深入,以后再碰到类似的问题,也就能自己找到方法解决了。学习程序设计要有一定的逻辑思维能力.逻辑思维需要长时间的锻炼,如果你觉得自己在逻辑思维能力上有不足,也没有关系,因为编写程序本身也是对逻辑思维的锻炼.初学程序设计应具备的逻辑基础可以从高中数学中学到.8.附录有些需要说明的部分。如添加ActiveX等非不标准部件,或使用文件操作时对路径有特殊要求等。若没有特殊要求,此处为“无”。1、 无9.参考文献1、 陈明锐.Visual Basic程序设计及应用教程.北京:高等教育出版社,2008.122、龙沛曾、陆慰民、杨志强 Visual Basic 程序设计简明教程高教出
22、版社3、杨克玉 VB6、0程序设计实训教程机械工业出版社4、参考网址附录资料:不需要的可以自行删除VB HOOK(钩子)超级无敌详细用法(介绍)hook是WINDOWS提供的一种消息处理机制,它使得程序员可以使用子过程来监视系统消息,并在消息到达目标过程前得到处理。 下面将介绍WINNDOWS HOOKS并且说明如何在WINDOWS 程序中使用它。关于HOOKS 使用HOOK 将会降低系统效率,因为它增加了系统处量消息的工作量。建议在必要时才使用HOOK,并在消息处理完成后立即移去该HOOK。HOOK链 WINDOWS提供了几种不同类型的HOOKS;不同的HOOK可以处理不同的消息。例如,WH
23、_MOUSE HOOK用来监视鼠标消息。 WINDOWS为这几种HOOKS维护着各自的HOOK链。HOOK链是一个由应用程序定义的回调函数队列,当某种类型的消息发生时,WINDOWS向此种类型的HOOK链的第一个函数发送该消息,在第一函数处理完该消息后由该函数向链表中的下一个函数传递消息,依次向下。如果链中某个函数没有向下传送该消息,那么链表中后面的函数将得不到此消息。(对于某些类型的HOOK,不管HOOK链中的函数是否向下传递消息,与此类型HOOK联系的所有HOOK函数都会收到系统发送的消息)HOOK过程 为了拦截特定的消息,你可以使用SetWindowsHookEx函数在该类型的HOOK链
24、中安装你自己的HOOK函数。该函数语法如下: public function MyHook(nCode,wParam,iParam) as long 加入代码 end function 其中MyHook可以随便命名,其它不能变。该函数必须放在模块段。nCode指定HOOK类型。wParam,iParam的取值随nCode不同而不同,它代表了某种类型的HOOK的某个特定的动作。 SetWindowsHookEx总是将你的HOOK函数放置在HOOK链的顶端。你可以使用CallNextHookEx函数将系统消息传递给HOOK链中的下一个函数。 注释对于某些类型的HOOK,系统将向该类的所有HOOK函
25、数发送消息,这时,HOOK函数中的CallNextHookEx语句将被忽略。 全局HOOK函数可以拦截系统中所有线程的某个特定的消息(此时该HOOK函数必须放置在DLL中),局部HOOK函数可以拦截指定线程的某特定消息(此时该HOOK函数可以放置在DLL中,也可以放置在应用程序的模块段)。 注释 建议只在调试时使用全局HOOK函数。全局HOOK函数将降低系统效率,并且会同其它使用该类HOOK的应用程序产生冲突。HOOK类型 WH_CALLWNDPROC 和 WH_CALLWNDPROCRET HOOK WH_C ALLWNDPROC 和WH_CALLWNDPROCRET HOOK可以监视Sen
26、dMessage发送的消息。系统在向窗体过程发送消息前,将调用WH_CALLWNDPROC;在窗体过程处理完该消息后系统将调用WH_CALLWNDPROCRET。 WH_CALLWNDPROCRET HOOK会向HOOK过程传送一个CWPRETSTRUCT结构的地址。该结构包含了窗体过程处理系统消息后的一些信息。 WH_CBT Hook 系统在激活,创建,消毁,最小化,最大化,移动,改变窗体前;在完成一条系统命令前;在从系统消息队列中移去鼠标或键盘事件前;在设置输入焦点前,或同步系统消息队列前,将调用WH_CBT HOOK。你可以在你的HOOK 过程拦截该类HOOK,并返回一个值,告诉系统,是
27、否继续执行上面的操作。 WH_DEBUG HOOK 系统在调用与某种HOOK类型联系的HOOK过程前,将调用WH_DEBUG ,应用程序可以使用该HOOK决定是否让系统执行某种类型的HOOK。 WH_FOREGROUNDIDLE Hook 系统在空闲时调用该HOOK,在后台执行优先权较低的应用程序。 WH_GETMESSAGE Hook WH_GETMESSAGE Hook使应用程序可以拦截GetMessage 或 PeekMessage的消息。应用程序使用WH_GETMESSAGE HOOK监视鼠标、键盘输入和发送到队列中的其它消息。 WH_JOURNALRECORD Hook WH_JOU
28、RNALRECORD Hook使应用程序可以监视输入事件。典型地,应用程序使用该HOOK记录鼠标、键盘输入事件以供以后回放。该HOOK是全局HOOK,并且不能在指定线程中使用。 WH_JOURNALPLAYBACK Hook WH_JOURNALPLAYBACK Hook使应用程序可以向系统消息队列中插入消息。该HOOK可以回放以前由WH_JOURNALRECORD HOOK录制的鼠标、键盘输入事件。在WH_JOURNALPLAYBACK Hook安装到系统时,鼠标、键盘输入事件将被屏蔽。该HOOK同样是一个全局HOOK,不能在指定线程中使用。 WH_JOURNALPLAYBACK Hook返
29、回一个时间暂停值,它告诉系统,在处理当前回放的消息时,系统等待百分之几秒。这使得此HOOK可以控制在回放时的时间事件。 WH_KEYBOARD Hook WH_KEYBOARD Hook使应用程序可以监视由GetMessage和PeekMessage返回的WM_KEYDOWN 及WM_KEYUP消息。应用程序使用该HOOK监视发送到消息队列中的键盘输入。 WH_MOUSE Hook WH_MOUSE Hook 使应用程序可以监视由GetMessage和PeekMessage返回的消息。应用程序使用该HOOK监视发送到消息队列中的鼠标输入。 WH_MSGFILTER and WH_SYSMSGF
30、ILTER Hooks WH_MSGFILTER 和WH_SYSMSGFILTER Hooks使应用程序可以监视菜单、滚动条、消息框、对话框,当用户使用ALT+TAB或ALT+ESC来切换窗体时,该HOOK也可以拦截到消息。WH_MSGFILTER仅在应用程序内部监视菜单、滚动条、消息框、对话框,而WH_SYSMSGFILTER则可以在系统内监视所有应用程序的这些事件。 WH_SHELL Hook 一个SHELL程序可以使用WH_SHELL Hook来接收重要的信息。当一个SHELL程序被激活前或当前窗体被创建、消毁时,系统会调用WH_SHELL Hook过程。 使用HOOK 安装、销毁HOO
31、K过程 监视系统事件安装、销毁HOOK过程 使用SetWindowsHookEx函数,指定一个HOOK类型,自己的HOOK过程是全局还是局部HOOK,同时给出HOOK过程的进入点,就可以轻松的安装你自己的HOOK过程。Declare Function SetWindowsHookEx Lib user32 Alias SetWindowsHookExA _ (ByVal idHook As Long, _ ByVal lpfn As Long, _ ByVal hmod As Long, _ ByVal dwThreadId As Long) As LongidHook代表是何种Hook,有以
32、下几种 Public Const WH_CALLWNDPROC = 4 Public Const WH_CALLWNDPROCRET = 12 Public Const WH_CBT = 5 Public Const WH_DEBUG = 9 Public Const WH_FOREGROUNDIDLE = 11 Public Const WH_GETMESSAGE = 3 Public Const WH_HARDWARE = 8 Public Const WH_JOURNALPLAYBACK = 1 Public Const WH_JOURNALRECORD = 0 Public Const
33、 WH_KEYBOARD = 2 Public Const WH_MOUSE = 7 Public Const WH_MSGFILTER = (-1) Public Const WH_SHELL = 10 Public Const WH_SYSMSGFILTER = 6lpfn代表Hook Function所在的Address,这是一个CallBack Fucnction,当挂上某个Hook时,我们便得定义一个Function来当作某个讯息产生时,来处理它的Function,这个Hook Function有一定的叁数格式 Private Function HookFunc(ByVal nCod
34、e As Long, _ ByVal wParam As Long, _ ByVal lParam As Long ) As Long nCode 代表是什麽请况之下所产生的Hook,随Hook的不同而有不同组的可能值。 wParam lParam 传回值则随Hook的种类和nCode的值之不同而不同。 因这个叁数是一个 Function的Address所以我们固定将Hook Function放在.Bas中,并以AddressOf HookFunc传入。至於Hook Function的名称我们可以任意给定,不一定叫 HookFunchmod 代表.DLL的hInstance,如果是Local
35、Hook,该值可以是Null(VB中可传0进去),而如果是Remote Hook,则可以使用GetModuleHandle(.dll名称)来传入。dwThreadId 代表执行这个Hook的ThreadId,如果不设定是那个Thread来做,则传0(所以一般来说,Remote Hook传0进去),而VB的Local Hook一般可传App.ThreadId进去。值回值 如果SetWindowsHookEx()成功,它会传回一个值,代表目前的Hook的Handle,这个值要记录下来。因为A程式可以有一个System Hook(Remote Hook),如KeyBoard Hook,而B程式也来设
36、一个Remote的KeyBoard Hook,那麽到底KeyBoard的讯息谁所拦截?答案是,最後的那一个所拦截,也就是说A先做keyboard Hook,而後B才做,那讯息被B拦截,那A呢?就看B的Hook Function如何做。如果B想让A的Hook Function也得这个讯息,那B就得呼叫CallNextHookEx()将这讯息Pass给A,於是产生Hook的一个连线。如果B中不想Pass这讯息给A,那就不要呼叫CallNextHookEx()。Declare Function CallNextHookEx Lib user32 Alias CallNextHookEx _ (ByV
37、al hHook As Long, _ ByVal ncode As Long, _ ByVal wParam As Long, _ lParam As Any) As LonghHook值是SetWindowsHookEx()的传回值,nCode, wParam, lParam则是Hook Procedure中的三个叁数。最後是将这Hook去除掉,请呼叫UnHookWindowHookEx()Declare Function UnhookWindowsHookEx Lib user32 Alias UnhookWindowsHookEx _ (ByVal hHook As Long) As
38、LonghHook便是SetWindowsHookEx()的传回值。此时,以上例来说,B程式结束Hook,则换A可以直接拦截讯息。KeyBoard Hook的范例Hook Function的三个叁数nCode wParam lParam 传回值HC_ACTION表按键Virtual Key与WM_KEYDOWN同若讯息要被处理传0或 反之传1HC_NOREMOVEPublic hHook as LongPublic Sub UnHookKBD ()If hnexthookproc 0 Then UnhookWindowsHookEx hHook hHook = 0End IfEnd SubPu
39、blic Function EnableKBDHook()If hHook 0 Then Exit FunctionEnd Ifhhook = SetWindowsHookEx(WH_KEYBOARD, AddressOf _ MyKBHFunc, App.hInstance, App.ThreadId)End FunctionPublic Function MyKBHFunc(ByVal iCode As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long MyKBHfunc = 0 表示要处理这个讯息 If wParam
40、= vbKeySnapshot Then 侦测 有没有按到PrintScreen键 MyKBHFunc = 1 在这个Hook便吃掉这个讯息 End If Call CallNextHookEx(hHook, iCode, wParam, lParam) 传给下一个HookEnd Function鼠标钩子的示例列下。(1)模块中输入:Public Const WM_MOUSEMOVE = &H200Public Const WM_LBUTTONDOWN = &H201Public Const WM_LBUTTONUP = &H202Public Const WM_LBUTTONDBLCLK = &H203Public Const WM_RBUTTONDOWN = &H204Public Const WM_RBUTTONUP = &H205Public Const WM_RBUTTONDBLCLK = &H206Public Const WM_MBUTTONDOWN = &H207Public Const WM_MBUTTONUP = &H208Public Const WM_MBUTTONDBLCLK = &H209Public Const WM_MOUSEACTIVATE = &H21Public Const WM_MOUSEFIRST = &H200Public