day1搭配环境

搭建 VS2015 MFC 项目框架,完成界面布局与 OpenCV 环境配置(详细教程)

一、前期准备(前置条件)

  • 安装 Visual Studio 2026(需勾选“MFC 组件”,若未勾选,可通过 VS2015 安装程序补充安装,路径:控制面板→程序→更改→选择 VS2015→修改→勾选“MFC 和 ATL 支持”);finish

  • 下载 OpenCV 3.x 版本(推荐 3.4.16,适配 VS2015,下载地址:https://opencv.org/releases/),解压至本地(如 D:\opencv);

  • 确保 Windows 系统已安装 .NET Framework 4.5 及以上版本(VS2015 运行必要环境)。

二、搭建 VS2015 MFC 项目框架(步骤详解)

  1. 打开 VS2015,点击顶部菜单栏「文件」→「新建」→「项目」,弹出“新建项目”对话框;

  2. 在左侧模板中,展开「Visual C++」→「MFC」,选择「MFC 应用程序」,输入项目名称(如“MFCAccessControl”),选择项目保存路径,点击「确定」;

  3. 弹出“MFC 应用程序向导”,选择「基于对话框」(适合上位机界面快速开发),点击「下一步」;

  4. 在“对话框样式”中,保持默认设置(标题可修改为“门禁上位机管理系统”),取消勾选“使用 Unicode 库”(避免后续字符编码冲突),点击「下一步」;

  5. 后续步骤均保持默认设置,点击「完成」,VS2015 会自动生成 MFC 对话框项目框架,包含主对话框、资源文件、头文件和源文件(核心文件为 MFCAccessControlDlg.h/cpp)。

三、MFC 界面布局(贴合门禁上位机需求)

界面布局基于 MFC 对话框编辑器,核心控件布局如下,步骤:

  1. 打开资源视图:点击 VS2015 右侧「资源视图」(若未显示,可通过「视图」→「资源视图」调出),展开「MFCAccessControl.rc」→「Dialog」→双击「IDD_MFCACCESSCONTROL_DIALOG」,打开对话框编辑器;

  2. 删除默认控件(如“TODO: 在此放置对话框控件。”静态文本、“确定”“取消”按钮);

  3. 添加核心控件(从左侧“工具箱”拖拽,工具箱可通过「视图」→「工具箱」调出),布局如下:Picture Control(图片控件):用于显示摄像头预览,ID 改为 IDC_PIC_PREVIEW,调整大小(如宽 400、高 300),放置在对话框左侧;

  4. Static Text(静态文本):添加“门禁状态:”“当前用户:”,放置在摄像头预览区右侧上方;

  5. Button(按钮):添加“连接设备”“远程开门”“断开连接”“刷新日志”,ID 分别改为 IDC_BTN_CONNECT、IDC_BTN_OPENDOOR、IDC_BTN_DISCONNECT、IDC_BTN_REFRESHLOG,放置在静态文本下方;

  6. List Control(列表控件):用于显示门禁日志,ID 改为 IDC_LIST_LOG,调整大小,放置在按钮下方;

  7. Group Box(分组框):添加“参数配置”分组框,放置在对话框右侧下方,内部添加静态文本+Edit Control(编辑框),用于输入 IP 地址、端口号,ID 分别改为 IDC_EDIT_IP、IDC_EDIT_PORT。

  8. 调整控件对齐:选中多个控件,通过顶部菜单栏「格式」→「对齐」→「左对齐」「垂直间距相等」,统一界面布局,点击「保存」(Ctrl+S)。

四、OpenCV 环境配置(关键步骤,避免运行报错)

配置分为“项目属性配置”和“系统环境变量配置”,步骤如下:

(一)系统环境变量配置(全局生效,无需重复配置)

  1. 右键「此电脑」→「属性」→「高级系统设置」→「环境变量」;

  2. 在“系统变量”中,找到「Path」,双击编辑,添加 OpenCV 动态链接库路径: 32 位系统:添加 D:\opencv\build\x86\vc14\bin;

  3. 64 位系统:添加 D:\opencv\build\x64\vc14\bin(建议同时添加 32 位路径,避免兼容性问题)。

  4. 点击「确定」保存,关闭环境变量窗口(需重启 VS2015 使配置生效)。

(二)VS2015 项目属性配置(针对当前 MFC 项目)

  1. 回到 VS2015,选中当前项目(MFCAccessControl),右键→「属性」,弹出“项目属性页”;

  2. 配置包含目录: 点击「配置属性」→「C/C++」→「常规」,找到「附加包含目录」,点击右侧下拉框→「编辑」;

  3. 添加 OpenCV 头文件路径:D:\opencv\build\include、D:\opencv\build\include\opencv、D:\opencv\build\include\opencv2,点击「确定」。

  4. 配置库目录: 点击「配置属性」→「链接器」→「常规」,找到「附加库目录」,点击编辑;

  5. 根据系统位数添加:32 位添加 D:\opencv\build\x86\vc14\lib;64 位添加 D:\opencv\build\x64\vc14\lib,点击「确定」。

  6. 配置附加依赖项: 点击「配置属性」→「链接器」→「输入」,找到「附加依赖项」,点击编辑;

  7. 添加 OpenCV 库文件(根据 OpenCV 版本,3.4.16 版本如下): opencv_world3416d.lib(Debug 模式,带“d”)、opencv_world3416.lib(Release 模式,不带“d”);

  8. 点击「确定」,回到项目属性页,点击「应用」→「确定」。

  9. 验证配置:在 MFCAccessControlDlg.cpp 头部添加 OpenCV 头文件 #include <opencv2/opencv.hpp>,点击「生成」→「生成解决方案」(Ctrl+Shift+B),无报错则配置成功。

五、测试验证(确保框架与环境正常)

  1. 在主对话框类(CMFCAccessControlDlg)的 OnInitDialog() 函数中,添加简单的 OpenCV 初始化代码(测试摄像头调用): cv::VideoCapture cap(0); // 0 表示本地默认摄像头 if (!cap.isOpened()) { AfxMessageBox(_T("摄像头初始化失败!")); return FALSE; }

  2. 点击「调试」→「开始执行(不调试)」(Ctrl+F5),若弹出对话框,无报错、摄像头能正常启动(无提示失败),则说明 MFC 框架搭建、界面布局、OpenCV 环境配置均完成。

备注:若出现“找不到 opencv_world3416d.dll”报错,重启 VS2015 即可(环境变量生效);若摄像头无法启动,检查摄像头驱动是否正常,或更换 cap(1) 尝试。

六、交付成果

6.1工具箱内控件作用梳理

控件英文名 控件中文名 主要作用
Button 按钮 点击触发功能(开门、添加用户、退出等)
Static Text 静态文本 显示文字标签(人像显示区、提示文字等)
Edit Control 编辑框 输入文字 / 数字(IP、端口、用户名等)
Combo Box 下拉框 从列表选一项(设备选择、模式选择)
Check Box 复选框 勾选开关(自动开门、启用摄像头等)
Radio Button 单选按钮 多选一(人脸识别 / 指纹识别二选一)
Picture Control 图片控件 显示图片、摄像头画面、图标
List Control 列表控件 显示多行数据(日志、用户列表、记录)
List Box 列表框 简单单列列表(日志、提示信息)
Progress Control 进度条 显示进度(加载、识别进度)
Slider Control 滑块条 拖动调节数值(亮度、阈值)
Group Box 分组框 把控件分组,界面更整齐
Date Time Picker 日期时间选择器 选日期 / 时间
Spin Control 数值调节按钮 点上下箭头改数字

6.2UI界面移植

6.2.1所需控件清单
控件名称 中文名称 核心作用(门禁项目适用)
Static Text 静态文本 纯文字展示:标题、提示、状态说明、备注文字
Edit Control 编辑框 输入内容:账号、密码、IP、阈值、参数配置
Button 普通按钮 点击触发功能:开启摄像头、开门、注册人脸、清空日志
Check Box 复选框 勾选开关:自动抓拍、夜间模式、开机自启
Radio Button 单选按钮 二选一 / 多选一:仅人脸 / 人脸 + 指纹 识别模式
Group Box 分组框 区域分割:画面区、功能区、日志区,界面整洁
Picture Control 图片控件 核心:显示摄像头实时画面、人脸截图、图标
List Box 列表框 简易日志:逐条打印「识别成功 / 失败、开门记录」
List Control 列表视图 高级表格日志:时间 + 结果 + 人员编号,规整展示
Combo Box 下拉选择框 选择摄像头设备、选择识别算法、选择用户组
Progress Control 进度条 人脸检测加载进度、初始化进度
Slider Control 滑动条 调节摄像头亮度、识别灵敏度阈值
Spin Control 微调按钮 小幅度加减数值:超时时间、锁定时长
Date Time Picker 时间选择器 查询指定时间段开门记录
6.2.2 初始化界面控件清单
控件 自定义 ID 摆放位置 用途
Picture Control IDC_PIC_PREVIEW 窗口中间大区域 显示摄像头画面(核心)
Group Box 无修改 包裹画面四周 写「人像显示区」,框选画面
Static Text 自定义 右侧 / 下方 提示文字:识别成功、错误锁定 30s
Button IDC_BTN_ADD 右上角 添加人脸 / 注册用户
Button IDC_BTN_OPEN 右下角 模拟远程开门
List Box IDC_LIST_LOG 底部 实时打印识别日志
Edit Control 可选 右侧 预留参数配置

day2:核心模块移植(一)—— 视图层(UI)与时间模块移植(核心:完成UI控件适配,实现实时时间显示功能)

一、今日目标

1.完成MFC界面搭建,适配Qt原界面的控件布局、样式; finish

2.  移植TimeDisplay时间模块,替换Qt相关语法,实现实时北京时间显示(lb_date、lb_time对应MFC控件);finish

3.  解决UI适配过程中的编译报错。finish

1.1具体任务(拆解到可落地,明确优先级)

1.1.109:00-12:00:MFC界面搭建(高优先级)

  • 新建MFC对话框项目(单文档/对话框,贴合原门禁界面),设置窗口标题为“可视化门禁系统”,适配1024 * 600分辨率(与原Qt界面一致);
  • 添加对应控件:CStatic(对应lb_date、lb_time、视频展示区lb_view)、CButton(对应btnFace、btnFinger、btnRegister等)、CEdit(对应lineEditPassword、lineEdit),布局与原Qt界面一致,设置控件ID(与原命名对应,便于后续逻辑移植);
  • 简化控件样式,适配原Qt界面的简洁风格,避免复杂渲染,确保控件大小、字体、间距与原界面一致,适配Windows显示特性。

1.1.2 13:30-16:00:时间模块(TimeDisplay)移植(高优先级)
        

  • 将Qt TimeDisplay.h/.cpp代码迁移到MFC项目,替换Qt相关语法:QObject替换为MFC CObject,QTimer替换为MFC SetTimer/ KillTimer,信号槽替换为消息映射;
  • 实现北京时间获取逻辑:保留UTC+8转换逻辑,替换QDateTime为MFC CTime/CTimeSpan,实现时间格式化(yyyy-MM-dd、hh:mm:ss);
  • 将时间数据绑定到MFC界面控件(CStatic),实现每秒刷新,确保时间显示与原Qt功能一致,解决定时器启动、时间更新的编译报错。

1.1.3 16:10-17:30:编译调试与问题修复(中优先级)
        

  • 调试UI控件布局,确保无控件遮挡、显示异常,适配800×480分辨率;
  • 修复时间模块移植中的语法报错(如头文件引用、函数调用、数据类型转换),确保定时器正常启动,时间实时更新,无卡顿;

测试时间异常处理逻辑(定时器启动失败提示),替换Qt QMessageBox为MFC MessageBox,确保异常提示正常显示。

二、今日交付物

1.  与原Qt界面一致的MFC门禁界面(含所有核心控件);

控件类型 控件 ID 用途 位置建议
Static Text IDC_STATIC_TIME 实时时间显示 窗口顶部左侧
Static Text IDC_STATIC_DOOR_STATUS 门禁状态显示 时间控件右侧
Static Text IDC_STATIC_STATUS 系统状态提示(大字体) 时间 / 门禁状态下方
Picture Control IDC_PIC_PREVIEW 摄像头预览 + 人脸模拟框 窗口左侧(占 1/2 空间)
Picture Control IDC_PIC_FINGER 指纹识别模拟动画 右侧上方
List Control IDC_LIST_USER 已注册用户列表 右侧中间
List Control IDC_LIST_LOG 门禁操作日志 右侧下方
Button IDC_BTN_START 开启摄像头 摄像头下方左侧
Button IDC_BTN_STOP 关闭摄像头 开启摄像头按钮右侧
Button IDC_BTN_CONNECT 连接设备 摄像头下方中间
Button IDC_BTN_OPENDOOR 远程开门 摄像头下方右侧
Button IDC_BTN_REG 用户注册 右侧按钮区上方
Button IDC_BTN_FACE 人脸识别 注册按钮下方
Button IDC_BTN_FINGER 指纹识别 人脸识别按钮下方
Button IDC_BTN_ALARM 异常报警 指纹识别按钮下方

2.  可正常运行的时间模块(实时显示北京时间,支持异常提示);

图2.2正确显示北京时间效果图

3.  移植调试日志(报错及解决方案)。

  • 报错 “找不到 IDC_XXX”:检查控件 ID 是否和上面一致,重新拖控件并修改 ID
  • 摄像头打不开:检查摄像头是否被占用,或替换 m_cap.open(0)m_cap.open(1)
  • 列表控件不显示内容:确认列表控件已设置为「报告视图」,并添加了列
  • 指纹动画不显示:检查 IDC_PIC_FINGER 控件是否添加,大小调整为 100x100 左右

day3:核心模块移植(二)—— 控制层、业务逻辑与数据库移植(核心:完成核心业务功能,实现开锁、注册基础功能)

一、今日目标

1.  移植AuthControl控制层,实现MFC界面与业务逻辑的联动;finish

2.  移植Sqlite数据库模块,实现用户注册、数据比对功能;--doing

3.  实现人脸/指纹/密码开锁的基础业务逻辑,解决跨平台业务适配问题。--doing

1.1 具体任务(拆解到可落地,明确优先级)

1.1.1 09:00-11:30:控制层(AuthControl)移植(高优先级)
        
  • 迁移Qt AuthControl.h/.cpp代码,替换Qt信号槽机制为MFC消息映射,实现界面控件事件(按钮点击)与业务逻辑的联动;
  • 适配时间模块联动逻辑,确保控制层可接收时间模块的时间数据,并转发到MFC界面更新;
  • 梳理控制层与其他模块的交互逻辑,替换Qt相关接口,确保模块间数据传递正常(如界面操作信号传递到控制层,控制层调用数据库/生物识别模块)。
1.1.2 12:00-15:00:Sqlite数据库模块移植(高优先级)
        
  • 适配MFC环境下的Sqlite操作,替换Qt Sqlite接口为MFC兼容的Sqlite API,实现数据库初始化、表创建(用户表、生物信息表、密码表);
  • 移植数据存储、查询、比对逻辑:实现用户注册(用户名、生物信息、密码)的入库操作,实现人脸/指纹/密码数据的比对逻辑,确保与原Qt功能一致;
  • 调试数据库连接、数据读写异常,确保数据库操作无报错,数据唯一性(用户名不重复)、安全性(密码加密存储)符合要求。
1.1.3 15:10-17:30:核心业务逻辑移植(高优先级)
        
  • 实现人脸开锁、指纹开锁、密码开锁逻辑:绑定MFC按钮事件,通过控制层调用数据库比对逻辑,根据比对结果显示开锁成功/失败提示(MFC MessageBox);
  • 实现用户注册逻辑:绑定注册按钮、输入框、复选框事件,校验用户名合法性,调用数据库存储用户信息,反馈注册结果;
  • 调试业务逻辑流程,确保从界面操作→控制层调度→数据库处理→界面反馈的完整流程顺畅,无逻辑漏洞,解决编译及运行报错。

二、今日交付物

1.  移植完成的控制层代码(适配MFC消息映射);

2.  可正常读写的Sqlite数据库模块;

3.  可正常运行的核心业务功能(用户注册、人脸/指纹/密码开锁);

4.  业务逻辑调试日志。

5.具体实现功能汇总

功能模块 具体效果
实时时间 显示年月日、时分秒、星期,每秒自动刷新
摄像头预览 开启后显示实时画面,中央绘制绿色人脸模拟框,模拟人脸检测
门禁控制 远程开门→模拟继电器吸合→3 秒后自动关门→锁定,状态实时显示
用户注册 自动生成用户名(用户_001、002...),记录注册时间,显示在用户列表
人脸识别 开启摄像头后可触发,模拟识别耗时,匹配已注册用户后自动开门,记录日志
指纹识别 触发后显示指纹扫描动画,模拟比对耗时,匹配成功后自动开门,记录日志
异常报警 触发后状态标红、弹窗警告,模拟非法开锁,记录报警日志
操作日志 记录所有操作(启动、开门、注册、识别等),最多保留 20 条,最新日志在顶部
界面美化 统一字体、颜色,按钮 / 文本布局整洁,状态提示清晰,无 UI 卡顿

----明天补全

附录A可视化门禁系统(Linux C++)移植到MFC的需求分析

附录B可视化门禁系统(Linux C++)移植到MFC的具体每天的工作量细分

附录C可视化门禁系统(Linux C++)移植到MFC的优化总结(当前阶段)

--------------------今天会陆续补充----------------------------

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐