- 其余 21 个实验的 task.md:控件名照示例代码,"在平台上怎么试"和评分步骤一致,列出书上的印刷错误和控件名不一致 - 窗体改名:属性窗口里选中窗体可以改名称,类名、构造函数、new X()、Program.cs 和两个文件名一起改;方法名和字符串不变 - 11 个主窗体不叫 Form1 的实验,任务说明提示先改窗体名再双击生成 Load 事件 - 测试:表头只认分隔行上面那一行,数据行里出现"名称"不再被当成表头 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5.2 KiB
5.2 KiB
任务目标
在主界面上接通"校园安防":新建 Security 窗体,打开时连上网络摄像机显示实时画面,后台线程每秒检查一次红外对射,有人闯入时显示"发现入侵"并把当前画面存进数据库;四个方向键控制摄像机转动;"拍照"把画面存成图片文件、同时存进数据库;返回主窗体时关掉摄像机。"查看历史图像"按钮先放好,任务 5 再做。
练习重点:摄像机的 ImageRead 事件、后台线程、图片框的鼠标按下 / 松开事件(MouseDown / MouseUp)、换背景图片、保存图片文件。详细步骤见书 p174–180。
先准备数据库
用任务 3 的 WisdomCampus 库,入侵和拍照的图片存进 SecurityData 表(报警时间 EvenTime、图片 EvenImage),存的方法是任务 3 写好的 SQLBLL.SecurityUpData。还没有这个库或数据弄乱了,到数据库页面点恢复实验初始数据,选这个实验。
界面和控件名
接着任务 3 的程序做。Security 窗体顶部和 Environment 一样:标题栏 + "< 返回主窗体"。
| 窗体 | 名称(Name) | 文字(Text)和用途 |
|---|---|---|
| 主界面 | pic_security |
"校园安防":打开 Security 窗体 |
| 校园安防 | Security |
无边框、屏幕居中 |
| 校园安防 | panel1、panel3 |
标题栏(放标题图 ico_title)、返回栏,都停靠 Top |
| 校园安防 | lb_return |
< 返回主窗体 |
| 校园安防 | panel_bg_video |
停靠 Fill,白色背景,下面的控件都放在它上面 |
| 校园安防 | panel2 |
灰色(DimGray)的视频区 |
| 校园安防 | pic_video |
放在 panel2 上,显示摄像机画面;背景图片 icon_monitor,背景排列 Center |
| 校园安防 | lb_infrared |
放在 panel2 上,标签"入侵:"的右边,开始是 N/A,之后显示"发现入侵"或"正常" |
| 校园安防 | panel_video_ctrl |
方向盘:背景图片 panel_video_ctrl,背景排列 Stretch |
| 校园安防 | pic_up、pic_down、pic_left、pic_right |
放在方向盘上的四个方向键,背景图片 btn_arrow_up_normal 等,背景排列 Stretch |
| 校园安防 | btn_camera |
拍照 |
| 校园安防 | btn_history |
查看历史图像(任务 5 再写代码) |
实现步骤
- 项目资源里再勾选
icon_monitor、panel_video_ctrl和四个方向键的btn_arrow_*_normal、btn_arrow_*_press(共 8 张)。 - 点 + 新建窗体 建
Security,按上表搭界面。 - 主窗体
pic_security的 Click:new Security().Show();。 - 在 Security 里引用
System.IO、System.Threading、DeviceCtrlLibrary、智慧校园.SQLHelpers,声明字段:入侵标志IsInfrared、图片文件夹ImgDir(程序目录下的 Camera 文件夹)、线程、SynchronizationContext、当前画面img。 - 写 ipCameraHelper_ImageRead(ImageReadEvenArgs e):把
e.img记到img,并显示到pic_video。 - 写 tick():
while (true)循环,读 ADAM-4150 的infraredValue,用_main.Send把"发现入侵"或"正常"显示到lb_infrared;有入侵且有画面时调用SQLBLL.SecurityUpData(img);Thread.Sleep(1000)。 - Security_Load:打开摄像机(AppSet 里的 IP、用户名、密码),挂上 ImageRead 事件,
Start();启动 tick 线程;Camera 文件夹不存在就建一个。 - Security_FormClosed:摄像机
Stop()、Close(),停止线程。 - btn_camera 的 Click:把
pic_video.Image存成ImgDir + 年月日_时分秒 + ".jpg",再调用SQLBLL.SecurityUpData存进数据库。 - 四个方向键:在 ⚡ 事件里双击"鼠标按下"和"鼠标松开"生成方法。按下时换成
_press图片并调用PanUp()(或 PanDown / PanLeft / PanRight),松开时换回_normal图片并再调用一次同一个方法。 - lb_return 的 Click:
this.Close();。
和书上不一样的地方
摄像机每次调用转一格:平台的摄像机左右 7 格、上下 3 格,开始在正中,
PanUp()等方法每调用一次转一格。书上按下、松开各调用一次,所以点一下方向键会转两格。
面板的名字:示例(取自配套工程)里白色的大面板叫
panel_bg_video、灰色视频区叫panel2,书上叫panel_bg、panel_bg_video。面板的名字不评分,照书上起名也可以。
书上的路径
"Camera\\"照写就行,平台会换成服务器上能用的路径。
在平台上怎么试
- 运行后点"校园安防",打开 Security 窗体,几秒内
pic_video里出现摄像机画面(校园东围墙)。 - 点实训台的红外对射遮挡光束,"入侵:"后面显示"发现入侵",画面里出现翻墙的人;再点一次恢复,显示"正常"。
- 点四个方向键,画面跟着转;松开后方向键换回原来的图片。把鼠标放在实训台的网络摄像头上能看到云台的位置。
- 点"拍照",运行区下面的"程序保存的图片"里多出一张 Camera 文件夹下的照片(文件名是拍照的日期和时间);到数据库页面查询 SecurityData 表,能看到拍照和入侵时存的记录。
- 点"< 返回主窗体",Security 关闭,摄像机也关闭。