MFC Dialog中稳定添加状态栏的四步实现方法
简介本资源是一份面向MFC初学者与Windows桌面开发者的实战型教学项目聚焦在VS2010环境下为普通MFC对话框Dialog添加并定制状态栏StatusBar的完整实现方案。资源解决了对话框界面缺乏实时状态反馈、信息提示能力弱等常见痛点适用于课程设计、毕业项目及企业级MFC应用界面优化场景。压缩包共47个文件涵盖5个核心头文件.h、3个实现源码.cpp、1个解决方案.sln、1个资源脚本.rc、1个文本说明.txt及若干编译中间文件.obj/.pdb/.tlog等总大小29.05MB结构完整、可直接编译运行。目前已有737人学习下载包含完整的类声明、OnInitDialog初始化逻辑、多分区状态栏配置、定时器驱动的时间动态刷新及SetPaneText文本更新示例代码组织规范目录层次清晰便于理解MFC控件生命周期与UI组件协同机制。1. MFC Dialog 对话框添加状态栏为什么默认不带、加了却总“消失”、新手三步就卡在 OnCreateControl 上你在写一个基于 MFC 的桌面工具比如一个日志查看器、配置编辑器或设备调试面板用的是CDialog派生类不是CFormView或CFrameWnd界面清爽、逻辑集中——但用户突然提了个刚需“能不能在底部显示当前操作状态比如‘正在连接…’‘加载完成127 条’‘校验失败端口忙’”你一查 MSDN发现CStatusBarCtrl明明存在可往CDialog里Create()一把编译过、运行起、窗口一闪——状态栏压根没影或者更玄学它短暂出现半秒随对话框重绘就彻底“蒸发”。这不是 Bug是 MFC Dialog 的生命周期和窗口层级机制在悄悄设障CDialog默认不参与WM_SIZE的标准框架消息分发链DockControlBar类接口根本不可用而CStatusBarCtrl又极度依赖父窗口的RepositionBars协调。更现实的是很多团队还在维护十年前的 VS2010/2013 工程CMFCToolBar等现代封装根本不能用。本文就带你用纯 Win32 原生 MFC 控件在任意CDialog子类中稳定嵌入状态栏——不改框架、不升 VS 版本、不引入第三方库从零手敲四段关键代码把“消失”的状态栏钉死在对话框底部。适合所有仍在维护传统 MFC Dialog 项目的工程师尤其当你已经翻过三遍《深入浅出MFC》却卡在OnCreate返回 -1 的那一刻。2. 状态栏不是“加个控件”理解 CDialog 与 CStatusBarCtrl 的窗口父子关系本质2.1 为什么直接 Create() 失败——对话框没有“客户区管理权”CDialog是模态/非模态对话框的封装其窗口风格默认为WS_POPUP或WS_CHILD取决于创建方式不带WS_CLIPCHILDREN和WS_CLIPSIBLINGS的严格组合控制且CDialog::OnSize不自动转发WM_SIZE给子控件。而CStatusBarCtrl的核心行为是在父窗口WM_SIZE消息中通过MoveWindow()将自身定位到底部依赖父窗口调用RepositionBars()触发内部重排哪怕只有一格自身Create()时若父窗口尚未完成WM_CREATE流程或未设置好WS_CHILD | WS_VISIBLE | WS_BORDER则创建后立即被系统忽略可见性。提示别信网上“在OnInitDialog()里Create()就行”的说法——OnInitDialog()执行时对话框窗口已创建完毕但客户区尺寸尚未最终确认此时MoveWindow()计算的坐标极可能越界导致状态栏被裁剪为 0 高度。2.2 正确的嵌入路径绕过框架限制用“子窗口托管”模式我们放弃让CDialog充当状态栏的“逻辑父窗口”转而让它成为物理父窗口由CDialog主动管理状态栏的生命周期。具体分三步预留空间在对话框资源.rc中为状态栏留出固定高度区域如 24px用STATIC占位符或直接空出底部空白延迟创建不在OnInitDialog()而在OnCreate()中创建CStatusBarCtrl确保此时对话框窗口句柄m_hWnd已有效且能捕获WM_CREATE后首个WM_SIZE手动锚定重载OnSize()用GetClientRect()获取当前对话框客户区计算状态栏应占矩形再MoveWindow()强制定位。这种模式不依赖CFrameWnd的DockControlBar完全符合 Win32 原生窗口管理逻辑VS2008 至 VS2022 全版本兼容。2.3 代码实现四段关键函数缺一不可1头文件声明YourDialog.h// 在 class CYourDialog : public CDialogEx { ... }; 的 private 区域 private: CStatusBarCtrl m_wndStatusBar; // 状态栏控件实例 CRect m_rectStatusBar; // 缓存状态栏目标矩形用于 OnSize 重绘 int m_nStatusBarHeight; // 状态栏固定高度建议 242OnCreate 创建状态栏YourDialog.cppint CYourDialog::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialogEx::OnCreate(lpCreateStruct) -1) return -1; // 1. 初始化高度可读取系统 GetSystemMetrics(SM_CYSTATUSBAR) m_nStatusBarHeight 24; // 2. 创建状态栏控件 —— 关键必须指定 WS_CHILD | WS_VISIBLE | WS_BORDER // 父窗口为 this-m_hWndID 任意如 AFX_IDW_STATUS_BAR if (!m_wndStatusBar.Create(WS_CHILD | WS_VISIBLE | WS_BORDER, CRect(0, 0, 100, m_nStatusBarHeight), this, AFX_IDW_STATUS_BAR)) { TRACE(_T(Failed to create status bar\n)); return -1; } // 3. 设置状态栏分栏至少 1 栏否则不显示文字 int nParts[] { 100 }; // 单栏宽度 100%像素值非百分比 m_wndStatusBar.SetParts(1, nParts); // 4. 初始文本可选 m_wndStatusBar.SetPaneText(0, _T(Ready), TRUE); return 0; }逻辑说明OnCreate()是窗口句柄m_hWnd生效后的第一个消息此时调用Create()最安全。SetParts(1, nParts)是硬性要求——CStatusBarCtrl默认无分栏即使只设一栏也必须显式调用否则SetPaneText()无效。nParts数组值为像素宽度非百分比若需自适应后续在OnSize()中动态重算。3OnSize 重定位YourDialog.cppvoid CYourDialog::OnSize(UINT nType, int cx, int cy) { CDialogEx::OnSize(nType, cx, cy); // 仅当窗口已创建且状态栏存在时执行 if (m_wndStatusBar.GetSafeHwnd() cx 0 cy 0) { // 1. 获取对话框客户区不含边框、标题栏 CRect rectClient; GetClientRect(rectClient); // 2. 计算状态栏目标矩形底部对齐宽度铺满高度固定 m_rectStatusBar rectClient; m_rectStatusBar.top rectClient.bottom - m_nStatusBarHeight; m_rectStatusBar.bottom rectClient.bottom; // 3. 强制移动并调整大小 m_wndStatusBar.MoveWindow(m_rectStatusBar, TRUE); } }参数说明MoveWindow(..., TRUE)的TRUE表示同步重绘避免闪烁rectClient.bottom - m_nStatusBarHeight是关键偏移确保状态栏紧贴底部。此函数会在每次窗口缩放、最大化、还原时触发保证状态栏始终“钉”在底部。4OnDestroy 清理YourDialog.cppvoid CYourDialog::OnDestroy() { CDialogEx::OnDestroy(); // 安全销毁状态栏控件 if (m_wndStatusBar.GetSafeHwnd()) { m_wndStatusBar.DestroyWindow(); } }为什么必须写CStatusBarCtrl是子窗口若不显式DestroyWindow()在对话框析构时可能引发句柄悬空或 GDI 资源泄漏尤其在多实例反复打开关闭场景下。3. 状态栏内容动态更新SetPaneText 的三个隐藏陷阱与线程安全方案3.1 SetPaneText 为什么有时“不生效”——文本长度、刷新时机与 Unicode 陷阱CStatusBarCtrl::SetPaneText(int nIndex, LPCTSTR lpszText, BOOL bUpdate TRUE)表面简单实则暗藏三坑现象原因解决文本截断只显示前 5 个字lpszText指向的字符串含\0提前终止或CString未正确构造用CString str _T(...); m_wndStatusBar.SetPaneText(0, str);禁用const char*直接传参调用后界面无变化bUpdateFALSE未手动Invalidate()或状态栏未获得焦点总设bUpdateTRUE若仍无效追加m_wndStatusBar.Invalidate(); m_wndStatusBar.UpdateWindow();Unicode 文本显示为方块工程字符集设为“使用多字节字符集”MBCS但传入wchar_t*统一用_T(...)宏或工程属性 → 常规 → 字符集 → “使用 Unicode 字符集”3.2 线程安全更新禁止在工作线程直接调用 SetPaneTextMFC 控件方法必须在创建它的 UI 线程中调用。若你在AfxBeginThread启动的工作线程中直接m_wndStatusBar.SetPaneText()程序大概率崩溃Access Violation。正确做法是发消息到主线程处理。方案用 PostMessage 发送自定义消息推荐1定义消息YourDialog.h// 在头文件顶部#pragma once 下方 #define WM_UPDATE_STATUSBAR (WM_USER 1001) // 在 class CYourDialog 声明中添加消息映射函数 public: afx_msg LRESULT OnUpdateStatusBar(WPARAM wParam, LPARAM lParam);2消息映射与处理YourDialog.cpp// 在 BEGIN_MESSAGE_MAP 和 END_MESSAGE_MAP 之间添加 ON_MESSAGE(WM_UPDATE_STATUSBAR, CYourDialog::OnUpdateStatusBar) // 消息处理函数 LRESULT CYourDialog::OnUpdateStatusBar(WPARAM wParam, LPARAM lParam) { // wParam: 分栏索引int // lParam: 字符串指针需全局或堆分配此处用 CString 临时存储 CString* pStr reinterpret_castCString*(lParam); if (pStr !pStr-IsEmpty()) { m_wndStatusBar.SetPaneText(static_castint(wParam), *pStr, TRUE); delete pStr; // 释放堆内存 } return 0; }3工作线程中调用示例// 在你的工作线程函数中如 ThreadFunc CString* pMsg new CString(_T(Processing file: abc.txt)); ::PostMessage(hWndDialog, WM_UPDATE_STATUSBAR, 0, reinterpret_castLPARAM(pMsg));注意hWndDialog是对话框窗口句柄需在线程启动时传入如AfxBeginThread(..., param)中的param包含m_hWnd。4. 避坑MFC Dialog 添加状态栏的 4 个血泪经验与排查清单4.1 现象状态栏创建成功但SetPaneText()后文字不显示GetPaneText()返回空原因SetParts()未调用或nParts数组值为 0 / 负数导致内部分栏表为空。CStatusBarCtrl无分栏即无绘制区域。解决检查OnCreate()中SetParts()是否执行打印m_wndStatusBar.GetPartCount()应返回 ≥1确保nParts数组元素 0。4.2 现象状态栏在对话框最大化时被“顶出”窗口外只显示上半部分原因OnSize()中GetClientRect()获取的是客户区但若对话框样式含WS_THICKFRAME可缩放最大化时客户区高度 ≠ 屏幕高度rectClient.bottom - m_nStatusBarHeight计算溢出。解决在OnSize()开头加判断if (nType SIZE_MAXIMIZED || nType SIZE_RESTORED)此时用GetWindowRect()获取屏幕坐标再转换或统一用GetClientRect()ScreenToClient()校准。4.3 现象对话框关闭后再次打开新实例状态栏文字残留旧内容原因CStatusBarCtrl实例未在OnDestroy()中销毁新对话框复用了旧句柄或SetPaneText()未清空上一次内容。解决严格保证OnDestroy()中DestroyWindow()在OnInitDialog()或OnCreate()结尾调用m_wndStatusBar.SetPaneText(0, _T(), TRUE)清屏。4.4 现象资源编辑器中拖入STATUSBAR控件编译报错error C2065: IDC_STATUSBAR : undeclared identifier原因.rc文件中STATUSBAR控件 ID 未在resource.h中声明或 ID 冲突如与菜单 ID 重复。解决不要用资源编辑器拖 STATUSBARMFC Dialog 资源不支持原生状态栏控件。所有状态栏必须代码创建。删除.rc中任何STATUSBAR相关行用STATIC占位符替代视觉参考。5. 进阶技巧多分栏状态栏、图标文字混合显示、响应鼠标点击事件5.1 三栏状态栏时间、状态、进度提示的实战配置单栏太单调实际项目常需左对齐状态如“就绪”、中对齐时间“14:22:05”、右对齐操作“保存成功”。只需修改SetParts()参数与SetPaneInfo()// OnCreate() 中替换 SetParts 部分 int nParts[] { 120, 200, -1 }; // 左栏宽120px中栏200px右栏自适应剩余宽度 m_wndStatusBar.SetParts(3, nParts); // 设置各栏对齐方式可选 m_wndStatusBar.SetPaneInfo(0, 0, SBPS_NOBORDERS, 0); // 左栏无边框 m_wndStatusBar.SetPaneInfo(1, 0, SBPS_STRETCH, 0); // 中栏拉伸居中 m_wndStatusBar.SetPaneInfo(2, 0, SBPS_NOBORDERS, 0); // 右栏无边框 // 更新文本索引 0,1,2 m_wndStatusBar.SetPaneText(0, _T(Connected), TRUE); m_wndStatusBar.SetPaneText(1, _T(14:22:05), TRUE); m_wndStatusBar.SetPaneText(2, _T(Idle), TRUE);关键点nParts[2] -1表示该栏占据剩余全部宽度SBPS_STRETCH使文本在栏内居中SBPS_NOBORDERS去掉分隔线视觉更干净。5.2 图标文字混合在状态栏左侧嵌入小图标如连接状态灯CStatusBarCtrl本身不支持图标但可用CImageListSetPaneInfo()模拟// OnCreate() 中添加需提前准备 16x16 图标资源 IDI_STATUS_ICON CImageList* pImageList new CImageList(); pImageList-Create(16, 16, ILC_COLOR32 | ILC_MASK, 1, 1); pImageList-Add(AfxGetApp()-LoadIcon(IDI_STATUS_ICON)); m_wndStatusBar.SetImageList(pImageList); // 关联图库 // 设置第 0 栏显示图标索引 0和文字 m_wndStatusBar.SetPaneInfo(0, 0, SBPS_NOBORDERS, 0); m_wndStatusBar.SetPaneText(0, _T(Online), TRUE); // 注图标需在资源中定义且 SetImageList 后 SetPaneText 才生效图标注意此法图标位置固定在栏左文字紧随其后若需精确控制建议用CStatic子窗口替代但会增加管理复杂度。5.3 响应鼠标点击让状态栏变成“可点击区域”CStatusBarCtrl默认不接收鼠标消息需子类化并重载OnLButtonDown// 在 YourDialog.h 中声明 class CMyStatusBar : public CStatusBarCtrl { DECLARE_DYNAMIC(CMyStatusBar) public: afx_msg void OnLButtonDown(UINT nFlags, CPoint point); DECLARE_MESSAGE_MAP() }; // YourDialog.cpp 中实现 BEGIN_MESSAGE_MAP(CMyStatusBar, CStatusBarCtrl) ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() void CMyStatusBar::OnLButtonDown(UINT nFlags, CPoint point) { // 转发到父对话框处理 GetParent()-PostMessage(WM_COMMAND, MAKEWPARAM(IDC_STATUSBAR, BN_CLICKED), 0L); CStatusBarCtrl::OnLButtonDown(nFlags, point); } // 在 CYourDialog 中将 m_wndStatusBar 类型改为 CMyStatusBar // 并在 OnCreate() 中 new CMyStatusBar 替代 CStatusBarCtrl注意内存管理这样点击状态栏任意位置即可触发对话框的ON_COMMAND(IDC_STATUSBAR, ...)处理函数实现“点击弹出设置页”等交互。我带过的几个项目里最深的教训是永远在OnCreate()创建状态栏永远在OnDestroy()销毁它永远用PostMessage更新文本。这三句话写在注释里比写一百行文档都管用。曾有个项目因为SetParts()忘写调试三天最后发现日志里GetPartCount()返回 0——那种恍然大悟又想撞墙的感觉希望你不用经历。状态栏不是炫技组件它是用户和系统间最沉默的翻译官把后台的“正在加密”、“校验中”、“写入磁盘…”转化成眼睛能立刻读懂的信号。把它钉牢就是给整个对话框装上呼吸感。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

漫剧老李部署到哪个平台?OpenClaw、Coze、Dify、WorkBuddy 多 Agent 平台适配全指南

漫剧老李部署到哪个平台?OpenClaw、Coze、Dify、WorkBuddy 多 Agent 平台适配全指南

AI 技能人工智能媒体生成提示工程AI 评测 【免费下载链接】manju-laoli-skill 漫剧老李 AIGC 创作全流程 Skill V6.9.8 轻量版(Short-Drama Director Suite):面向 AIGC 视听创作的工业化全流程技能包——前置模型三选一锁(Seedan…

2026/10/15 18:22:34 阅读更多 →
Google Play pepk工具详解:上传密钥更换的密钥委托协议

Google Play pepk工具详解:上传密钥更换的密钥委托协议

简介:本资源为 Google Play 应用签名更新工具 PEPK(Play Encrypt Private Key)的完整 Java 源码实现,面向 Android 开发者、安全工程师及签名流程自动化需求者,解决官方 PEPK 工具闭源、不可定制、难以集成到 CI/CD 流…

2026/10/15 18:22:34 阅读更多 →
Qt6 CMake配置实战:跨平台构建与自动化可靠性指南

Qt6 CMake配置实战:跨平台构建与自动化可靠性指南

1. 项目概述:为什么一个CMakeLists.txt文件值得专门写一篇长文 在Qt开发圈里,但凡做过跨平台项目、参与过团队协作、或者从Qt Creator默认模板之外尝试过自定义构建流程的人,都绕不开那个看似简单却暗藏玄机的 CMakeLists.txt 文件。它不是…

2026/10/15 18:21:32 阅读更多 →

最新新闻

LED流水灯+蜂鸣器

LED流水灯+蜂鸣器

1、GPIO最常用时钟:RCC_AHBPeriphClockCmd() ; RCC_AHBP2eriphClockCmd() ; RCC_AHBP1eriphClockCmd()GPIO的功能GPIO_DeInit :所有外设都会被复位 GPIO_AFIODeInit :也是复位,是复位AFIO的外设GPIO_Init :用结构体…

2026/10/15 19:06:56 阅读更多 →
售货机屏幕接广告每月多赚800元,但接错了反而亏钱~YH

售货机屏幕接广告每月多赚800元,但接错了反而亏钱~YH

2026年Q2,一个运营商在30台设备的屏幕上接入了广告——每天播放某饮料品牌的促销视频。一个月后,运营商收到了800元/台的广告分成,看起来不错。但同期,这30台设备的销售额平均下降了12%。一、现象:广告收入增加&#x…

2026/10/15 19:06:56 阅读更多 →
教育 AI 小程序开发分析

教育 AI 小程序开发分析

教育 AI 小程序依托微信小程序免安装、即用即走、社交传播便捷的特性,结合大语言模型、OCR 识别、语音评测等 AI 能力,打造轻量化线上学习工具。区别于传统在线教育 APP,教育 AI 小程序降低用户使用门槛,覆盖课前预习、习题解答、…

2026/10/15 19:06:56 阅读更多 →
客户都在问AI“哪家好”了,答案里却没有你:一文讲清AI搜索优化是什么

客户都在问AI“哪家好”了,答案里却没有你:一文讲清AI搜索优化是什么

一、AI搜索优化是什么——让大模型在答案里主动提到你,而不是让用户翻到你的官网AI搜索优化(AIO/GEO),指的是通过内容、信源和数据监测,让豆包、DeepSeek、通义千问、腾讯元宝等生成式引擎在回答用户问题时主动检索、理…

2026/10/15 19:06:56 阅读更多 →
Flutter鸿蒙化适配实践:sql_crdt离线数据同步

Flutter鸿蒙化适配实践:sql_crdt离线数据同步

从“离线优先”这个思路第一次出现在我们内部讨论会上,到最终把 Flutter 三方库 sql_crdt 成功跑通在鸿蒙设备上,整整花了三周。期间踩过的坑、查过的源码、推翻过的方案,我觉得比最终能跑通的结论更有价值。这篇东西不是官方文档翻译&#x…

2026/10/15 19:06:56 阅读更多 →
SAP系统拆分:注意事项与规避做法(下篇)

SAP系统拆分:注意事项与规避做法(下篇)

上篇梳理了拆分项目的风险:模块集成带来的牵连、数据关联被切断、自开发处理工作量被低估、停机窗口受交易时间表约束、合规敞口放大、跨部门协同吃紧、测试被压缩,以及源系统遗留数据的处理。 本篇说明相应的规避做法,按启动前、执行中、上线…

2026/10/15 19:05:56 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →