MFC工具栏扩展实战:CToolBarEx在Visual C++中的集成与避坑指南
简介这份资源围绕MFC扩展工具栏类CToolBarEx在Visual C中的应用展开面向具备一定MFC基础的Windows客户端开发者帮助解决标准CToolBar功能单一、界面定制受限的问题。压缩包共30个文件约43KB以h头文件与cpp源文件为主体配合ico图标、bmp位图、rc资源脚本及dsp、dsw工程文件构成一套可直接编译运行的完整示例工程。示例程序演示了自定义按钮图像、按钮与下拉菜单关联、图标文字并存以及禁用、隐藏、分组等状态管理并展示了AddButton添加按钮、消息映射绑定、SetButtonInfo调整样式等关键用法。已有93人学习适合希望提升界面交互性与美观度的开发者参考通过阅读源码可快速掌握CToolBarEx的集成方式与扩展思路。1. 从 TB.rar 里翻出 CToolBarEx一个被低估的 MFC 工具栏扩展类如果你手头有一个叫TB.rar的压缩包里面躺着一份CToolBarEx的源码而你的开发环境又是 Visual C不管是 VC6 还是 VS 各版本那你大概率正卡在一个很具体的需求上标准CToolBar太素了想给它加下拉按钮、想让它记住用户拖拽后的位置、想让它支持 24 位色图标还不闪。CToolBarEx就是干这个的——它是对 MFC 原生CToolBar的派生扩展把工具栏从“能用”推到“好用”。这篇笔记不聊虚的就按“拿到 TB.rar 之后怎么读、怎么编、怎么改、怎么避坑”的顺序走一遍。适合两类人一是刚接手老 MFC 项目、被工具栏需求逼到墙角的二是想给现有 VC 工程换一套更灵活工具栏控件的。下面所有步骤都按 Visual C 的常规工程结构来不依赖任何外部包管理器。2. CToolBarEx 到底扩展了什么从 CToolBar 的四个硬伤说起2.1 原生 CToolBar 在真实项目里为什么不够用MFC 自带的CToolBar从 VC6 时代就没怎么大改过它的设计目标只是“把一排按钮贴到窗口顶部”。一旦项目进入真实交付阶段四个硬伤会依次暴露。第一按钮状态和图标管理是割裂的SetButtonStyle改的是行为LoadBitmap管的是外观想动态换图标得自己维护CToolBarCtrl的 image list。第二停靠docking行为依赖CFrameWnd的EnableDocking但工具栏自身的“记忆位置”能力几乎为零用户把工具栏拖到左边下次启动又弹回顶部。第三自定义绘制owner draw支持很弱想做扁平化、hover 高亮、禁用态灰度得重写DrawItem并处理NM_CUSTOMDRAW代码量不小。第四多工具栏并存时CToolBar之间的换行、伸缩、隐藏逻辑要手动算RecalcLayout经常算不准。CToolBarEx的价值就在于它把这四件事收进一个派生类里。它通常继承自CToolBar或CToolBarCtrl内部持有一个CImageList管理普通态、热态、禁用态三套图标重写OnPaint或DrawItem做自绘并暴露SaveState/LoadState接口把停靠位置写进注册表或 ini。你拿到TB.rar后第一件事不是急着编译而是先确认它继承自谁、用了哪些消息映射。2.2 读源码前先确认三件事基类、消息映射、资源依赖打开TB.rar解压后的目录通常能看到ToolBarEx.h、ToolBarEx.cpp可能还有ToolBarEx.rc片段或一张bmp位图。先看头文件里的类声明// ToolBarEx.h 典型结构 class CToolBarEx : public CToolBar { DECLARE_DYNAMIC(CToolBarEx) public: CToolBarEx(); virtual ~CToolBarEx(); BOOL CreateEx(CWnd* pParentWnd, DWORD dwCtrlStyle TBSTYLE_FLAT, DWORD dwStyle WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP, CRect rcBorders CRect(1, 1, 1, 1), UINT nID AFX_IDW_TOOLBAR); void SetImageList(UINT nBitmapID, int nButtonWidth, int nButtonHeight); void EnableDockingState(BOOL bSave); // ... protected: CImageList m_imgList; BOOL m_bSaveState; afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult); DECLARE_MESSAGE_MAP() };看到public CToolBar就说明它是标准派生路线消息映射里大概率有ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, CToolBarEx::OnCustomDraw)。这一步确认完你才知道后面改绘制逻辑该动哪个函数。如果它继承的是CToolBarCtrl那CreateEx的参数和停靠逻辑会不一样得走CFrameWnd::CreateEx那套。资源依赖也要提前看SetImageList里引用的位图 ID 是否在你工程的resource.h里存在不存在就得先补资源否则编译能过、运行直接断言。2.3 把 TB.rar 挂进 Visual C 工程的最小步骤假设你用的是 VS2019/2022工程是 MFC 对话框或 SDI。步骤不复杂但顺序错了会报一堆链接错。第一步把ToolBarEx.h和ToolBarEx.cpp复制到工程目录在“解决方案资源管理器”里右键头文件/源文件分别添加现有项。第二步打开stdafx.h或pch.h确认#include afxext.h和#include afxcmn.h已经存在CToolBar和CImageList都靠它们。第三步在MainFrm.h里把原来的CToolBar m_wndToolBar;换成CToolBarEx m_wndToolBar;并#include ToolBarEx.h。第四步改MainFrm.cpp的OnCreate// MainFrm.cpp 中替换原有工具栏创建 if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS, CRect(1, 1, 1, 1), AFX_IDW_TOOLBAR) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0(Failed to create toolbar\n); return -1; } m_wndToolBar.SetImageList(IDB_TOOLBAR24, 24, 24); // 换成你的位图资源 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(m_wndToolBar);这里CreateEx的dwCtrlStyle传TBSTYLE_FLAT是为了扁平外观CBRS_GRIPPER让用户能拖动CRect(1,1,1,1)是边框内缩避免贴边太死。SetImageList的 24 是图标宽高必须和位图里每格实际像素一致否则图标会错位或拉伸。第五步编译。如果报LNK2001: unresolved external symbol九成是.cpp没加进工程或者ToolBarEx.cpp里用了某个你没包含的 MFC 头。提示VC6 工程迁移到高版本 VS 时TBSTYLE_FLAT等常量仍在但CImageList::Create的ILC_COLOR32支持更好建议在SetImageList内部把ILC_COLOR24改成ILC_COLOR32否则高 DPI 下图标边缘会有锯齿。3. 让 CToolBarEx 跑起来创建、图标、停靠与状态保存3.1 CreateEx 的参数怎么设才不翻车CreateEx是CToolBarEx的入口参数设错的表现通常是工具栏不显示、显示但按钮全灰、或者一拖动就崩。逐个说。pParentWnd传this主框架别传NULL。dwCtrlStyle常用TBSTYLE_FLAT想要透明背景加TBSTYLE_TRANSPARENT但后者在 XP 以后视觉风格下容易和主题冲突我一般只保留TBSTYLE_FLAT。dwStyle里WS_CHILD | WS_VISIBLE必须有CBRS_TOP决定初始停靠边CBRS_GRIPPER给拖拽手柄CBRS_TOOLTIPS开提示CBRS_SIZE_DYNAMIC允许用户改大小。rcBorders四个值分别是左、上、右、下内边距默认(1,1,1,1)够用如果图标是 32×32建议改成(2,2,2,2)留呼吸感。nID用AFX_IDW_TOOLBAR或自定义唯一 ID多个工具栏时不能重复。一个常见翻车点CreateEx返回FALSE但没打TRACE你以为是资源问题其实是父窗口还没创建完。确保在OnCreate里、CFrameWnd的OnCreate返回 0 之前调用。另一个dwStyle里漏了CBRS_ALIGN_TOP只写CBRS_TOP在部分 VS 版本里停靠行为会异常两个都写上最稳。3.2 三态图标与 CImageList 的绑定细节CToolBarEx通常要求你提供一张包含三组图标的位图普通态、热态hover、禁用态。位图横向排列每组 N 个图标每个图标宽高一致。SetImageList内部会m_imgList.Create然后Add或直接FromHandle。如果你拿到的TB.rar里SetImageList只处理了普通态那 hover 高亮就得自己补void CToolBarEx::SetImageList(UINT nBitmapID, int nW, int nH) { CBitmap bmp; bmp.LoadBitmap(nBitmapID); BITMAP bm; bmp.GetBitmap(bm); int nCount bm.bmWidth / nW; // 总图标数 int nNormal nCount / 3; // 假设三等分 m_imgList.Create(nW, nH, ILC_COLOR32 | ILC_MASK, nNormal, 1); m_imgList.Add(bmp, RGB(255, 0, 255)); // 品红做透明色 GetToolBarCtrl().SetImageList(m_imgList); GetToolBarCtrl().SetHotImageList(m_imgList); // 热态 GetToolBarCtrl().SetDisabledImageList(m_imgList); bmp.DeleteObject(); }ILC_COLOR32比ILC_COLOR24多一个 alpha 通道PNG 转 BMP 时保留透明更干净。RGB(255,0,255)是传统遮罩色如果你的位图背景是白色改成RGB(255,255,255)。SetHotImageList和SetDisabledImageList在CToolBarCtrl上可用但前提是TBSTYLE_FLAT已设否则热态不触发。参数nW、nH必须和位图实际格子一致差一个像素就会整体偏移这种问题肉眼很难第一时间发现建议先用画图工具量一下。3.3 停靠状态保存写注册表还是 ini用户拖完工具栏下次启动要还原这是CToolBarEx相对原生最大的体验提升。常见做法是在MainFrm的OnClose里调m_wndToolBar.SaveState(Software\\MyApp\\ToolBar)在OnCreate里调LoadState。SaveState内部一般用AfxGetApp()-WriteProfileInt或CRegKey写m_dockBar的m_pDockBar-GetDockState。如果你拿到的源码没实现可以自己补一个轻量版void CToolBarEx::SaveState(LPCTSTR lpszSection) { if (!m_bSaveState) return; CString str; str.Format(_T(%d,%d,%d,%d), m_dockBar ? m_dockBar-m_dockStyle : 0, m_rect.left, m_rect.top, m_rect.right); AfxGetApp()-WriteProfileString(lpszSection, _T(BarState), str); } void CToolBarEx::LoadState(LPCTSTR lpszSection) { CString str AfxGetApp()-GetProfileString(lpszSection, _T(BarState)); if (str.IsEmpty()) return; int a, b, c, d; _stscanf_s(str, _T(%d,%d,%d,%d), a, b, c, d); // 根据 a 恢复停靠边b/c/d 恢复位置 }m_bSaveState是个开关默认FALSE在EnableDockingState(TRUE)后置真避免调试时反复写注册表。_stscanf_s在 VS2005 以后才安全VC6 用_stscanf。写注册表路径别用HKEY_LOCAL_MACHINE用HKEY_CURRENT_USER否则非管理员权限下静默失败。如果你更倾向 ini把WriteProfileString换成WritePrivateProfileString路径用GetModuleFileName拼。4. 避坑与排查CToolBarEx 在 Visual C 里最容易翻车的五件事4.1 现象工具栏显示但按钮全是灰的点不动原因通常是LoadToolBar加载的资源 ID 和SetImageList的位图 ID 不匹配或者CToolBarCtrl的按钮状态被SetState误设成TBSTATE_INDETERMINATE。解决先确认IDR_MAINFRAME对应的TOOLBAR资源里按钮数量和位图图标数一致多一个少一个都会导致后续按钮错位并变灰。然后在OnCreate末尾加m_wndToolBar.GetToolBarCtrl().SetState(ID_XXX, TBSTATE_ENABLED)强制启用。如果还不行检查MainFrm的OnUpdate里有没有pCmdUI-Enable(FALSE)把命令全禁了。4.2 现象拖动工具栏后松手窗口布局错乱或工具栏消失这是RecalcLayout和EnableDocking调用顺序问题。必须在DockControlBar之前对主框架调EnableDocking(CBRS_ALIGN_ANY)且CToolBarEx自己的EnableDocking也要调。顺序反了m_pDockBar为空SaveState里访问m_dockBar-m_dockStyle直接崩。解决严格按CreateEx→LoadToolBar→SetImageList→EnableDocking→DockControlBar的顺序。如果已经错乱删掉注册表里保存的状态键重启工程。4.3 现象高 DPI 下图标模糊或按钮间距异常MFC 老工程默认不感知 DPICToolBarEx里写死的 24×24 在 150% 缩放下会被系统拉伸。解决在MainFrm构造函数里加SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2)需windows.h和 Win10 SDK然后把SetImageList的宽高改成MulDiv(24, GetDpiForWindow(), 96)。如果不想动 DPI至少把ILC_COLOR24换成ILC_COLOR32并让位图本身是 32 位模糊会减轻。注意SetProcessDpiAwarenessContext必须在任何窗口创建前调用放在InitInstance最前面。4.4 现象编译报error C2065: TBSTYLE_FLAT : undeclared identifier这是头文件包含顺序问题。TBSTYLE_FLAT定义在commctrl.h里MFC 工程通常由afxcmn.h间接引入。如果你在stdafx.h里先包含了ToolBarEx.h再包含afxcmn.h就会报未声明。解决把#include afxcmn.h提到ToolBarEx.h之前或者直接在ToolBarEx.h顶部加#include afxcmn.h。VC6 下TBSTYLE_FLAT需要_WIN32_IE 0x0300在stdafx.h里#define _WIN32_IE 0x0500再包含。4.5 现象Release 版正常Debug 版一运行就断言ASSERT(::IsWindow(m_hWnd))CToolBarEx的某个成员函数在窗口句柄还没创建时被调用了常见于SetImageList在CreateEx之前执行或者LoadState在OnCreate里调得太早。解决把SetImageList和LoadState都挪到CreateEx成功返回之后。如果LoadState里需要访问m_dockBar确保DockControlBar已经执行。Debug 断言是帮你定位顺序问题的别用#ifdef NDEBUG绕过去绕了 Release 下就是随机崩。5. 进阶给 CToolBarEx 加下拉按钮和动态换肤的实操技巧下拉按钮是CToolBarEx最常被要求加的功能原生CToolBar做起来很别扭。思路是给某个按钮设TBSTYLE_DROPDOWN然后在MainFrm里处理ON_NOTIFY(TBN_DROPDOWN, ...)弹出菜单。具体做法在LoadToolBar之后用GetToolBarCtrl().SetButtonStyle或SetButtonInfo把目标按钮的 style 改成TBSTYLE_DROPDOWN | TBSTYLE_FLAT然后在MainFrm消息映射里加ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, CMainFrame::OnToolbarDropdown)。处理函数里用TrackPopupMenu在按钮下方弹菜单坐标从pNMHDR的rc取。注意TBN_DROPDOWN的idFrom是工具栏 ID不是按钮 ID按钮 ID 在pnm-hdr.idFrom里别搞混。动态换肤是另一个高频需求。CToolBarEx如果已经重写了OnCustomDraw换肤就简单在OnCustomDraw里根据当前主题变量决定clrText、clrBk、clrBtnFace。我一般会加一个SetTheme(int nTheme)接口内部改几个COLORREF成员然后Invalidate()。如果源码没走NM_CUSTOMDRAW而是走DrawItem那就重写DrawItem并调CDC::FillSolidRect和DrawState。换肤时最容易忽略的是禁用态图标SetDisabledImageList如果没跟着换禁用按钮还是旧主题的灰度图视觉上很割裂。建议把三态图标都做成资源换肤时一起SetImageList。验证换肤是否生效别只看主界面把工具栏拖成浮动窗口再看一遍浮动状态下m_pDockBar为空部分绘制分支会走不同路径。我自己的习惯是每次改完CToolBarEx的绘制逻辑先跑 Debug 版拖三次顶部、左侧、浮动再跑 Release 版拖三次确认没有断言、没有残影、没有图标错位。这套流程帮我省过至少两次上线后的紧急回滚。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

文献管理工具选型与Zotero高效使用全攻略

文献管理工具选型与Zotero高效使用全攻略

1. 文献管理工具的核心价值与选型逻辑1.1 为什么我们需要一个趁手的文献管理工具做研究、写论文、搞技术调研的人,几乎都经历过这样的场景:电脑里躺着几百个PDF,文件名从“1.pdf”到“最终版真的最终版.pdf”五花八门;想找半年前看…

2026/10/10 11:56:15 阅读更多 →
Python 3D游戏开发实战:Ursina与Panda3D引擎选型及性能优化指南

Python 3D游戏开发实战:Ursina与Panda3D引擎选型及性能优化指南

1. 为什么用 Python 写 3D 游戏是个被低估的选择很多人第一次听到"用 Python 写 3D 游戏",第一反应是"性能不行吧"。这个判断放在十年前或许成立,但放到今天,如果你还停留在"Python 只能写脚本、做数据分析"的…

2026/10/9 11:02:50 阅读更多 →
筹码分布没有公开接口?stock-sdk本地复刻行情软件CYQ筹码图全解析

筹码分布没有公开接口?stock-sdk本地复刻行情软件CYQ筹码图全解析

筹码分布没有公开接口?stock-sdk本地复刻行情软件CYQ筹码图全解析 【免费下载链接】stock-sdk 为前端设计的无需 Python、无需后端服务、零依赖的获取股票数据 JavaScript SDK。 项目地址: https://gitcode.com/gh_mirrors/st/stock-sdk stock-sdk 是一款专为…

2026/10/10 19:55:43 阅读更多 →

最新新闻

Navop跨设备同步与凭据保险箱:连接与密码如何加密同步,安全机制全解析

Navop跨设备同步与凭据保险箱:连接与密码如何加密同步,安全机制全解析

【免费下载链接】navop A native, all-in-one workspace for databases, SSH, SFTP, terminals, remote desktop, monitoring, and AI. 项目地址: https://gitcode.com/gh_mirrors/na/navop 点击查看 免费下载 Navop 是一款集数据库、SSH、SFTP、终端、远程桌面与 …

2026/10/10 20:23:11 阅读更多 →
Wan2.1分布式中间件深度解析:存储引擎、一致性协议与部署调优

Wan2.1分布式中间件深度解析:存储引擎、一致性协议与部署调优

这半年我们一直在折腾 Wan2.1 的升级,从年初拿到预览版到最近全量上线,中间踩过的坑、推翻过的方案、调优时发现的细节,足够写一篇长文了。很多人看到"Wan2.1"第一反应是问"这到底是什么",网上资料零零散散&a…

2026/10/10 20:23:11 阅读更多 →
用PyQGIS自动化MapBiomas土地利用分类分析:从下载到出图全流程

用PyQGIS自动化MapBiomas土地利用分类分析:从下载到出图全流程

搞遥感土地利用分析的同行,应该都有这种体验:手动下载影像、裁剪、掩膜、统计、出图,一套流程走下来,单一年份还行,一旦涉及十几年、几十个年份、十几个分类类别,纯手点鼠标能把人累到怀疑人生。我这次把 Q…

2026/10/10 20:23:11 阅读更多 →
用 bark-notify 把 Claude Code 完成提醒推送到 iPhone:TaoToken 统一 Key 通道配置大纲

用 bark-notify 把 Claude Code 完成提醒推送到 iPhone: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/10 20:23:11 阅读更多 →
告别 PPT 纺织工!用 TaoToken 统一 Key 打通 AI Agent 一键生成技术汇报

告别 PPT 纺织工!用 TaoToken 统一 Key 打通 AI Agent 一键生成技术汇报

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

2026/10/10 20:23:11 阅读更多 →
Python图像分割实战:UNet原理与训练调参全攻略

Python图像分割实战:UNet原理与训练调参全攻略

简介:面向Python图像处理开发者的U-Net图像分割实践资源包,覆盖从数据准备、模型构建、损失函数选择到训练与预测的完整流程。资源定位在Python开发与图片处理方向,适合具备一定深度学习基础、想动手实现语义分割任务的读者。压缩包内共21个文…

2026/10/10 20:22:10 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/10 5:23:50 阅读更多 →
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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/10 10:38:42 阅读更多 →