资源描述
VB.NET期末大作业
——单机播放器的制作
学 院: 计算机科学学院
专 业: 计算机科学与技术
班 级: 一班
姓 名:
学 号:
日 期: 2014年12月7日
注:这里只列出设计控件,代码详见源代码文档
一、 设计目的
设计一款单机版的播放器,练习并熟练掌握课堂上学习到的知识。相关知识包括数据类型的使用和转换以及强制数据类型转换、选择结构与循环结构的使用、数组与字符串、过程与异常处理的练习、相关控件(包括label控件、timer控件、tooltip控件、textbox控件等等)的使用、鼠标事件的应用、数据库的链接与访问、多项目开发、多媒体播放。
二、 设计思想及关键技术
我的作业中共设计了7个窗体和一个模块,他们分别被命名为frmloading,frmadduser,frmloadrunning,frmVmediaplayer,frmabout,frmsetusermsg,frmcrystal_reports和模块mdl。下面分别讲解他们的作用以及附着在他们上面的控件的作用。
1、 frmloading:
(1)各个控件及其名字:
mainpanel
btnloading
btnadduser
btnexit
btncolor
Picmark
Picshow
btnbackcolor
tkbGreen
ckbcolor
lblGreen
gpxcolorset
ckxkeepname
btnuserbook
btnx
lblBlue
lblRed
tkbBlue
tkbRed
ckxexit
lblkey
tbxkey
cbxname
lblname
lblmark
还有隐藏的控件:
(2)控件属性设置
Name
Text
其他
Form
Frmloading
Formborderstyle设置为None
Picturebox
Picmark
添加了一张图片
Button
btncolor
添加了一张图片,Flatstyle设置为flat
Button
btnadduser
注册用户
背景为transparent,flatstyle为flat
Button
btnloading
登录
背景为transparent,flatstyle为flat
Button
btnexit
退出
背景为transparent,flatstyle为flat
Panel
mainpanel
背景添加了一张图片
Label
lblmark
V播放器
Button
btnuserbook
使用说明
背景为transparent,flatstyle为flat
Label
lblname
用户名:
背景为transparent
Combobox
cbxname
Label
lblkey
密码:
背景为transparent
Textbox
tbxkey
Checkbox
ckxkeepname
记住账户
背景为transparent
Checkbox
ckxexit
退出提醒
背景为transparent
Button
btnbackcolor
背景色:
背景为transparent,Flatstyle设置为flat
Checkbox
ckbcolor
随机颜色
背景为transparent
Label
lblRed
设置了背景色
Picturebox
Picshow
Button
btnx
添加了一张图片,Flatstyle设置为flat
Trackbar
tkbRed
设置了背景色
Trackbar
tkbGreen
设置了背景色
Trackbar
tkbBlue
设置了背景色
Label
lblGreen
设置了背景色
Label
lblBlue
设置了背景色
Groupbox
gpxcolorset
背景设置
Timer
Timadduser
程序控制enabled和interval
Tooltip
Tooltip1
Timer
Timcolor
程序控制enabled和interval
Timer
Timcolorgroup
程序控制enabled和interval
(3)关键技术:
.1利用timer控件实现动画效果有frmadduser出现、gpxcolorset的出现和消失、随机颜色的实现。
.2当ckxkeepname被勾选,并成功登陆后,程序会自动将用户名和密码记录入数据库usermsg的表usermsg2中。当以后再次登陆时,cbxname 失去光标的时候,程序会检查数据库usermsg的表usermsg2的USERID字段,如果cbxname.text在usermsg2中有记录,则在tbxkey中自动输入密码,实现保存的用户自动登录的效果。具体实现的时候,首先如果用户选择了“记住账户”,就将此用户名保存到表usermsg2中,我用datatable来把表usermsg2中的已经记住的用户名拿出来放到数组中,以便和输入的用户名作对比,当用户第二次登录的时候,如果在表usermsg2中的话,就说明之前“记住账户”过了,所以,这时在表一中把用户名对应的密码拿出来,完成自动输出密码。
.3利用函数random 产生了三个0~255的随机数给RGB,然后利用timer实现颜色的随机变换。
.4利用 System.Diagnostics.Process.Start()实现打开word文档,利用了动态路径就不用怕路径找不到的情况了。
.5退出提醒被勾选后,当点击退出时,会弹出一个是否退出的提醒对话框。这是利用msgbox函数实现的动态窗体。
.6利用 Trackbar将Trackbar.value的值给RGB实现手动控制窗体背景色
2、 frmadduser
(1) 各个控件及其名字:
btnadd
lbljobs
lblsex
lblbirthday
gpxchoose
Lblkey2
lblkey
lbluser
btnclose
lbxjob
rbtman
rbtwoman
dtpbirth
Txbkey2
txbkey1
cbxuser
btnx
lblmark
picmark
隐藏控件有:
(2)控件属性设置
Name
Text
其他
Form
Frmadduser
Formborderstyle设置为None
Picturebox
picmark
添加了一张图片
Label
lbluser
用户名:
背景为transparent
Label
lblkey
密码:
背景为transparent
Label
Lblkey2
确认密码:
背景为transparent
Groupbox
gpxchoose
选填项目
Label
lblbirthday
生日:
背景为transparent
Label
lblsex
性别:
背景为transparent
Label
lbljobs
职业:
背景为transparent
Button
btnadd
立即注册
Flatstyle设置为flat
Label
lblmark
注册新用户
背景为transparent
Button
btnx
添加了一张图片,Flatstyle设置为flat
Combobox
cbxuser
Textbox
txbkey1
Passwordchar设置为 *
Textbox
Txbkey2
Passwordchar设置为 *
Datetimepicker
dtpbirth
Value设置为2000/1/1星期六
Radiobuttn
rbtwoman
女
背景为transparent
Radiobuttn
rbtman
男
背景为transparent
Listbox
lbxjob
Tooltip
Tooltip1
Button
btnclose
取消
Flatstyle设置为flat
(3)关键技术:
.1当确认密码栏txbkey2失去光标时,与密码栏txbkey.text对比一下,如果不一样,则提示“两次密码不一样”。这个虽然简单,但是这是我第一次发现LostFocus这个事件,当时发现了很高兴,项目的其他地方也有用到这个事件。
.2点击注册用户后,首先判断一下用户名栏、密码栏和确认密码栏是否都填写。前面的问题都正确了以后开始判断正在注册的用户名是否已经注册过了,如果没有则注册新用户。这个方法与之前的“记住账号”原理一样,就是利用datatable将所有用户名拿出来放到数组中,然后和输入的用户名对比,如果存在,就提示“用户已被注册”,如果没有就将所有信息存入数据库中。
3、 frmloadrunning
(1)各个控件及其名字:
lblloadword
lblloadnum
隐藏控件有:
(2)控件属性设置
Name
Text
其他
Form
Frmloadrunning
Formborderstyle设置为None
Label
lblloadnum
背景为transparent
Label
lblloadword
正在登陆,请稍后……
背景为transparent
Timer
Timloadrunning
程序控制enabled和interval
(3)关键技术
此窗体用于在登录成功后做一个缓冲,不然显得播放器突然跳出来一样。
.1利用timer控制lblloadnum上的数字每10ms加1
.2lblloadnum上的数字加到100后开始加载窗体frmVmediaplayer,并关闭窗体frmloading和窗体frmloadfunning
4、 frmVmediaplayer
(1) 各个控件及其名字:
AxWindowsMediaPlayer1
picshowlist
Listpanel
btn口1,btn口2
btnx
btnopenfile
btnchoose1
pichand
tabpanel
picmark
lbltime
listbox
btnlist
btn一
lblname
lblmark
pichidelist
pic_mesize
btnsplitter
***基本信息框中的控件有:
btnbackcolor
gpxset
ckbcolor
panel_btnset
panel_btnhelp
panel_btnusermsg
tkbBlue
tkbGreen
tkbRed
picShow
lblBlue
lblGreen
lblRed
***用户信息框中控件有:
btndeleteuser
lblusername
lblusername1
lblsex
lblbirthday
lbljobs
btnmsgset
btnuserdate
gpxusermsg
***帮助系统框中控件有:
gpxhelp
btnfeedback
btnreport
btnabout
btnusehelp
lblweb
***隐藏的控件有:
(2) 控件属性设置
Name
Text
其他
Form
frmVmediaplayer
Formborderstyle设置为None
Picturebox
picmark
添加了一张图片
Label
lblmark
V播放器
Picturebox
pichand
Dock设置为top,背景为Transparent
Label
Lblname
背景为Transparent
Button
btnchoose1
添加了一张图片,Flatstyle设置为flat
Button
btnopenfile
添加了一张图片,Flatstyle设置为flat
Button
btn一
添加了一张图片,Flatstyle设置为flat
Button
btn口1
添加了一张图片,Flatstyle设置为flat
Button
btn口2
添加了一张图片,Flatstyle设置为flat
Button
btnx
添加了一张图片,Flatstyle设置为flat
Button
btnlist
播放列表
Listbox
listbox
Panel
tabpanel
Dock设为right
AxWindowsMediaPlayer
AxWindowsMediaPlayer
Label
lbltime
Picturebox
picshowlist
添加了一张图片
Picturebox
pichidelist
添加了一张图片
Picturebox
pic_mesize
添加了一张图片,背景设置为black
Button
btnsplitt
Cursor设置为VSplit
Panel
Listpanel
***基本信息框中的控件属性设置:
此处与窗体frmloading的部分控件一样,故此不在赘述,这里是列出不一样的控件。如有需要,请参照窗体frmloading
Name
Text
其他
Button
panel_btnset
基本设置
Flatstyle设置为flat
Button
panel_btnusermsg
用户信息
Flatstyle设置为flat
Button
panel_btnhelp
帮助系统
Flatstyle设置为flat
Groupbox
gpxset
基本设置
***用户信息框中控件属性设置:
Name
Text
其他
Label
lblsex
性别:
背景为Transparent
Label
lblbirthday
生日:
背景为Transparent
Label
lbljobs
职业:
背景为Transparent
Button
btnmsgset
更改信息
Flatstyle设置为flat
Button
btnuserdate
客户数据表
Flatstyle设置为flat
Groupbox
gpxusermsg
用户信息
Label
lblusername1
用户:
背景为Transparent
Button
btndeleteuser
注销用户
Flatstyle设置为flat
Label
lblusername
背景为Transparent
***帮助系统框中控件属性设置:
Name
Text
其他
Groupbox
gpxhelp
帮助系统
Label
lblweb
官方网站:
背景为Transparent
Button
btnusehelp
使用帮助
Flatstyle设置为flat
Button
btnfeedback
反馈意见
Flatstyle设置为flat
Button
btnabout
关于我们
Flatstyle设置为flat
Button
btnreport
举报
Flatstyle设置为flat
***隐藏的控件属性设置:
(3) 关键技术
.1大部分控件都是通过代码控制的大小和位置,包括窗体大小的变化时的大小和位置变化。麻烦主要是因为一个控件的大小由几个事件控制,其控制曲折复杂难以想象,反正我是不想在看那些控制大小的代码了。
.2点击设置按钮btnchoose1将换回到初始界面,这里最难得就是各个控件大小及位置的控制,本来应该很简单,但是考虑到还有几个控件隐藏与显示的后,大小应该也要变化,因此变得不简单。
.3 利用控件OpenFileDialog1打开所需要的影音材料。
.4用两个picturebox(pic口1,pic口2)实现了窗体最大化和还原,先记住最大化前的位置和大小,然后点击还原后再对应的赋值给我的窗体的大小和位置。这里也要考虑到变化后各个控件大小及位置的变化情况。在实现这个效果的时候,我没有用Maximized因为遇到了个问题,不是我想要的(我忘了那个问题了,反正Maximized后有我不想要的东西),所以我就自己让窗体的长宽等于屏幕的长宽。
.5用listbox作为播放器的播放列表。这里专门为它建立了一个数据库,用于存放已经播放过的影音材料:如果是第一次播放,则将名称和地址存放在数据库里,然后单击已经播放过的名称(也就是listbox里的项)就可以直接播放了。具体实现是,在openFileDialog1打开影音材料时,就将材料的名字和路径保存到数据库moviemsg中,然后再单击已经播放过的材料时就可以根据路径直接播放了。
.6用button做成一个splitter的样子,并具有splitter的功能,即可以左右移动来改变右边播放列表和左边视频窗口的大小。至于我为什么不直接用splitter,是因为它存在一些问题,不能满足我的需要。
.7用两个picturebox(picshowlist,pichidelist)实现播放列表的隐藏和显示。当我在设置其他控件大小和位置时,这个功能给我造成了不小的麻烦,也是麻烦的主要来源。
.8利用timer控件实现影音材料播放时长的显示,就是每隔100ms刷新一次材料播放的当前位置(这个当前位置是控件AxWindowsMediaPlayer1本来就有的,只是它没有显示,而且它最小单位是秒,但是它不会像秒表一样动,需要一个事件让他刷新一下,所以我就100ms刷新一次,反正在观众看来它只不过是一秒一动。)。
.9窗体的移动:当鼠标左键按下的时候,记住光标和窗体上边缘和左边缘的两个距离,然后再光标拖动窗体的过程中让那两个距离不改变即可,也就是光标移动后,为了保持那两个距离不变,则窗体也要跟着移动。这样就实现了窗体的移动。
.10窗体的大小:当光标处于右下角黑色图片处时,光标由箭头变成了西北-东南双向箭头,实现原理与窗体移动差不多。首先记住窗体原点到屏幕上边缘和左边缘的两个距离a b,当鼠标左键按下的拖动时候,光标移动到哪儿,me.width就等于光标位置减去左边缘的距离b,me.height就等于光标位置减去上边缘距离a
.11用户信息的呈现是利用select的查询命令,在窗体加载的时候就查询出来。更改信息是利用了update更新命令,注销是利用了delete删除命令
.12窗体加载的时候就将登录用户的信息(除密码意外)查询出来。
5、 frmabout
(1) 各个控件及其名字:
Tbxmsg
Pichand
(2) 控件属性设置
Name
其他
Form
Frmabout
Formborderstyle设置为SizableToolWindow
Picturebox
Pichand
添加了一张图片
Textbox
Tbxmsg
Text设为V播放器
Build版本:1.0
陕西师范大学计算机科学学院学生个人保留所有权
(3)关键技术
本窗体用于当用户点击了“关于我们”而设置,没有代码。
6、 frmsetusermsg
(1) 各个控件及其名字:
btnusermsg
lbxjob
Rbtman
rbtwomen
dtpbirth
lblusernam
Btnx
lblsetuserms
Lbljobs
Lblsex
Lblbirthday
lbluser
picmark
(2) 控件属性设置
由于此窗体与窗体frmadduser部分控件一样,此处只列出不同控件的属性设置,如果需要,请参照frmadduser。
Name
Text
其他
Form
Frmsetusermsg
Formborderstyle设置为None
Label
lblsetuserms
更改用户信息
Label
lblusernam
Button
btnusermsg
确认更改
Flatstyle设置为flat
(3)关键技术
.1利用update更新数据库里客户信息
7、 frmcrystal_reports
(1) 各个控件及其名字:
CrystalReportViewer1
(2) 控件属性设置
Name
Text
其他
Form
frmcrystal_reports
客户数据表
CrystalReportViewer1
CrystalReportViewer1
Dock设置为fill
(3)关键技术
.1练习使用了CrystalReportViewer1控件,关于路径问题,我理解的是数据库在debug里就不用担心路径找不到,但是打包安装之后好像不能用了。
8、 mdl
(1) 关键技术
做了一个Public Function,用于解决个别窗体内单引号的问题。
代码如下:
Public Function getsqlstr(ByVal str As String) As String
Return Replace(str, "'", "''")
End Function
三、 自我评价
无框架窗体的拖动问题。其中遇到的问题:1、很轻松就可以把窗体的框架去掉,但之后我就发现一个问题,这个窗体没了标题栏,要怎么拖动?通过查书和上网终于解决了拖动的问题。2、一个简简单单的窗体拖动的问题还真不少。大体做完了之后,运行的时候发现不仅左键可以拖动,右键也可以,好神奇。但是跟我们的习惯有冲突,最后在老师给我们的书P264中找到了答案。3、运行时还有一个问题,就是第一次按下去,在拖动的一瞬间窗体莫名其妙的往上平移了一段距离,虽然之后依然能继续拖动,但这个平移是不应该存在的。就这花了我个小时,看书,上网,最后才发现移动的向量里,Y多加了个标题栏的高,明明就把标题去掉了,怎么可能还存在这个高度!
上述问题是我在一个月前做的时候存在的问题,现在我又找到了另一个更简单易懂的方法。就是:当鼠标左键按下的时候,记住光标和窗体上边缘和左边缘的两个距离,然后再光标拖动窗体的过程中让那两个距离不改变即可,也就是光标移动后,为了保持那两个距离不变,则窗体也要跟着移动,这样就实现了窗体的移动。
新用户注册遇到的问题:1、在做一个信息录入(新用户注册)的功能的时候,在用insert into插入的时候,将相应变量对应到字段,老是提醒我说“insert into语句的语法错误”我对着insert into那句话看了两个小时,找了各种原因,符号错误的可能性最大,可就是找不出来哪儿错了。最后还是无意中发现生日的返回值是字符串,外层要加上单引号。2、我自己注册了很多组数据,在注册的过程中发现,注册已存在的用户名的时候程序就崩溃了,所以此处应该加上一个判断, 为了加这个判断, 我用到了书上的datatable来取得整个表, 然后就可以理所当然的利用datatable来获取数据总行数count和第i-1行第列(也就是用户名),再用数组的时候用的有点晕,感觉好像有问题,但我已经没有勇气检查了,因为程序能按照预想的结果走。3、还有个问题:dtpbirth.Value.Date(datetimepicker)的数据类型到底是什么?三个星期前我在录入信息的时候把它当做字符串是没有问题的,能成功录入,但现在它有提醒我说数据类型不匹配,最后我就只能把它强制类型转换成了字符串CStr(dtpbirth.Value.Date)。
最烦的一个问题就是关于播放器界面控件的大小及位置的问题,我用了大量的代码和大量的时间去实现这个。本来一般的可以用anchor属性来设置,但我的这个不适用,因为这个属性最多只让我实现控件随着窗体大小变化而变化,我想要的效果是点击btnchoose1就可以缩小到初始比例,然后单击两个页面中的一个就可以把那个界面放大充满窗口,并且也能满足控件随着窗体大小变化而变化。而且窗体上还有播放列表,这个表是可以隐藏和显示的,当它隐藏后,窗体就会多出来一部分width,这部分width应该被减掉,那么控件的大小是不是又应该跟着变化。几个事件可能都控制着同一个控件的大小和位置,这种情况我只能设置布尔类型的数据去控制它。
由于时间问题,此应用也存在着问题:播放列表目前只能单击已有的项播放,没有过多的其他操作,比如一般播放器都有的右键单击已有项后弹出菜单等等对播放列表的操作。
四、 参考来源及其他
五、 源代码
本软件共有7个窗体和一个模块:
1、 frmloading
2、 frmadduser
3、 frmloadrunning
4、 frmVmediaplayer
5、 frmabout
6、 frmsetusermsg
7、 frmcrystal_reports
8、 模块mdl
下面分别介绍他们的源代码:
1、 frmloading
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Data
Imports system.Data.OleDb
Public Class frmloading
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
lblmark.Location = New Point(picmark.Width, picmark.Height / 2 - lblmark.Height / 2)
Me.WindowState = FormWindowState.Maximized
Timadduser.Interval = 50
Timadduser.Enabled = False
mainpanel.Location = New Point(Me.Width / 2 - mainpanel.Width / 2, Me.Height / 2 - mainpanel.Height / 2)
'对背景颜色初始化
gpxcolorset.Hide()
timcolor.Enabled = True
timcolor.Interval = 1000
timcolorgroup.Enabled = False
timcolorgroup.Interval = 50
AddHandler tkbRed.Scroll, AddressOf DisplayRGB
AddHandler tkbGreen.Scroll, AddressOf DisplayRGB
AddHandler tkbBlue.Scroll, AddressOf DisplayRGB
tkbRed.Value = 0
tkbGreen.Value = 192
tkbBlue.Value = 192
lblRed.Text = tkbRed.Value.ToString()
lblGreen.Text = tkbGreen.Value.ToString()
lblBlue.Text = tkbBlue.Value.ToString()
picShow.BackColor = Color.FromArgb(tkbRed.Value, tkbGreen.Value, tkbBlue.Value)
Me.BackColor = picShow.BackColor
ckbcolor.Checked = False
End Sub
'——————————————————————————
'******************各个按钮控制**********************
Private Sub btnexit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnexit.Click
If ckxexit.Checked = True Then
Dim message, title As String
Dim style As BorderStyle
Dim response As MsgBoxResult
message = "是否要退出程序?"
title = "提示"
style = MsgBoxStyle.Question Or MsgBoxStyle.YesNo
response = MsgBox(message, style, title)
If response = MsgBoxResult.Yes Then
Me.Close()
Frmadduser.Close()
End If
Else
Me.Close()
Frmadduser.Close()
End If
End Sub
Private Sub btnadduser_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnadduser.Click
'注册新用户信息
Frmadduser.Show()
Timadduser.Enabled = True
Frmadduser.Location = New Point(0, 0)
Frmadduser.Height = 0
Frmadduser.BackColor = Me.BackColor
End Sub
Private Sub Tim_pic_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timadduser.Tick
If Timadduser.Enabled = True Then
If Frmadduser.Height <= 500 Then
Frmadduser.Height += 50
End If
End If
End Sub
Private Sub btnloading_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnloading.Click
'如果勾选了保存用户,那么点击登录的时候,就把此用户的用户名保存到数据库usermsg2中
If ckxkeepname.Checked Then
Dim connstr, insertcmd As String
connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=usermsg.mdb" ';Jet(OleDb):Database(Password = 123456);"
insertcmd = "Insert Into usermsg2([USERID]) values ('" & getsqlstr(cbxname.Text) & "')"
Dim conn As OleDbConnection, cmd As OleDbCommand
conn = New OleDbConnection(connstr)
conn.Open()
cmd = New OleDbCommand(insertcmd, conn)
cmd.ExecuteNonQuery()
conn.Close()
End If
'检查一下用户名和密码是否都填写
If cbxname.Text = "" Or tbxkey.Text = "" Then
Dim message, title As String
Dim style As BorderStyle
Dim response As MsgBoxResult
message = "用户名或密码未填写!"
title = "提示"
style = MsgBoxStyle.Exclamation
response = MsgBox(message, style, title)
Else
'开始校验用户,从数据库中读取用户名和相应的密码,如果用户是注册过的,则登陆成功
Dim connstr, selectcmd As String
selectcmd = "SELECT * FROM usermsg1 WHERE USERID = '"
展开阅读全文