news 2026/10/26 1:31:26

CorelDraw二次开发实战:从VBA宏入门到批量排版工具制作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CorelDraw二次开发实战:从VBA宏入门到批量排版工具制作

简介:这是一份面向C#开发者的CorelDraw二次开发示例包,演示通过程序自动化操作CorelDraw的两类关键技术:创建文档、写入文字与图形对象,以及在曲线上按等间隔生成垂线。配套详细文档说明和完整项目源代码,便于读者对照理解API调用流程与图形坐标系处理方式,适合需要在印刷、包装或图文设计领域做批量出图工具的开发人员学习参考。压缩包体积约1003KB,内容以源代码文件和说明文档为主,无需复杂环境即可在Visual Studio中打开调试。目前已有462人学习下载,覆盖面较广。通过研读源码和逐步演示,读者可以掌握利用C#与CorelDraw对象模型交互的常见模式,并据此扩展自动排版、批量修改、模板生成等实际功能,是一份兼顾原理与实战的入门级参考资料。

1. CorelDraw二次开发示例.zip:先搞清这个包能帮你省多少事

做平面设计、包装拼版、广告物料的人,早晚会遇到同一件事:几百张图要按同一套规则排版、导出,手动操作能熬到天亮。CorelDraw二次开发示例.zip这类包,解决的就是这个——把你每天重复点的鼠标动作变成一段能反复跑的脚本。这类包常见内容是一组VBA宏或GMS插件源码,思路很简单:通过CorelDRAW公开的对象模型,去控制文档、图层、形状、颜色和导出,让机器替你干活。它适合两种人:一种是被批处理逼到墙角的平面设计师,另一种是想把内部规范固化到工具里的开发。如果你在NX二次开发、CATIA二次开发、用友U8二次开发这些工业软件方向上折腾过,转过来说不定会有种“总算有个能快速上手”的感觉,因为VBA门槛比C++/COM低得多。

2. 解压后先跑通最小宏:环境确认、宏加载路径与第一次运行

拿到zip先别急着看代码,按我下面的顺序来,十几分钟就能把环境跑通。第一步不是读代码,而是确认你电脑上CorelDraw的版本和安装选项。CorelDraw从X7到2023,宏的载体主要有两种,一种是内置的VBA宏,一种是GMS脚本。GMS是Corel对VBA语法的包装,文件后缀是.gms,用记事本或VSCode就能打开,许多示例包里的核心内容就是几个这种格式的宏文件。后缀带.gms的不用编译,直接以文本形式存在,这对我们拆解别人的实现特别友好。

2.1 版本与入口:宏管理器在不同CorelDraw版本里的差异

先明确一个前提:CorelDraw的二次开发入口不是某个固定的面板,而是“工具”菜单下的宏相关子菜单。X7里常见路径是“工具 → 宏 → 宏管理器”,到了2020、2023,入口可能变成“工具 → 宏管理器”或者直接挂到顶部菜单,名字叫“脚本(Scripts)”。别死记路径,按F10打开选项设置里搜“宏”,也能找到对应开关。

更关键的是确认你的CorelDraw装的是完整版还是精简版。精简版常常把VBA组件裁掉,宏管理器打开是灰的,这时候代码写得再好也跑不起来。检查方法很简单:在任意工具菜单里找“Visual Basic编辑器”,找不到,就说明VBA组件没装,得用原版安装包修复,勾选“VBA支持”这一项。

示例包如果是GMS文件,你可以跳过宏管理器,直接右键用文本编辑器打开看逻辑。如果包里有.cdr文档,多半是文档宏,双击打开后按Alt+F11进入VB编辑器也能看到宏代码。多数示例包会按功能拆模块,比如ImportTools、ExportTools,或者把所有宏都塞在一个工程里,这点打开后扫一眼模块名就能判断。

2.2 全局宏与文档宏:示例包里的文件该放哪

宏加载位置决定了你能在哪些文档里用这个工具。全局宏存在GMS文件夹里,所有文档都能调用;文档宏嵌入在.cdr文件内,跟着文件走,换个电脑只要文件在宏就在。

宏类型存储位置适用场景主要注意点
全局宏Documents\Corel\CorelDRAW Graphics Suite 版本号\Draw\GMS跨文档的通用工具换机或重装后需要重新导入
文档宏.cdr文件内部项目专用流程文件体积增大,存为带宏的格式才能保留

实际操作时,把 .gms 复制到全局GMS目录后,要重启一次CorelDraw才能被宏管理器识别。有些老教程会让你用“工具 → 选项 → 自定义 → 命令栏”去拖按钮,那是做界面用的,初学者不用管。

2.3 跑通第一个宏:从宏管理器新建到运行

无论示例包里代码多复杂,我都建议先自己建一个空宏,把环境确认了再往里搬代码。下面是CorelDraw二次开发最常见的“Hello World”,创建矩形、填充、去轮廓,一条龙下来你就能确认API调用没问题。

Sub FirstRoutine() Dim doc As Document Set doc = Application.ActiveDocument If doc Is Nothing Then MsgBox "请先打开一个CorelDraw文档" Exit Sub End If Dim shp As Shape Set shp = doc.ActiveLayer.CreateRectangle(20, 20, 80, 60) shp.Fill.ApplyUniformFill CreateRGBColor(0, 128, 255) shp.Outline.SetNoOutline MsgBox "宏运行成功,矩形已创建" End Sub

逻辑上这段代码干了四件事:取当前文档引用、创建矩形、填充颜色、去掉轮廓线。这里最值得关注的是“取引用”那一步,用的是Application.ActiveDocument,而不是ThisDocument或者写死在代码里的文件路径。原因很简单:ActiveDocument永远指向此刻正在编辑的文档,代码换到任何文档上跑都不会因路径问题翻车。

CreateRectangle(20, 20, 80, 60)的前两个参数是矩形左下角坐标,后两个是右上角坐标。坐标值受当前文档单位影响,如果文档单位是像素而你以为在毫米,画出来尺寸会对不上。所以写严谨一点,宏开头先统一单位,这习惯我从第一次踩坑后就固定了:

doc.Unit = cdrMillimeter

ApplyUniformFill CreateRGBColor(0, 128, 255)是填充纯色,颜色值用RGB。印刷场景下建议用CreateCMYKColor,避免RGB和CMYK转换带来的色差。轮廓去不掉也是常见坑,如果SetNoOutline方法在你的版本里不存在,可以改用shp.Outline.SetProperties .Width = 0,效果等同。

跑通这个最小宏之后,再去碰示例包里的复杂代码,心态完全不一样。你已经知道宏是怎么被加载、被执行的,接下来要做的就是读懂那些代码里反复出现的对象层级——那是CorelDraw二次开发的真正骨架。

3. 拆解示例里的对象模型:Application、Document、Shape与必调参数

CorelDraw二次开发的代码,表层看起来是各种宏命令,底层其实就是一套对象调用链。你只要弄懂Application、Document、Layer、Shape这一条线上的关系,示例包里的代码在你眼里就成了“在哪个图层上干什么事”,毫无神秘感可言。

3.1 对象层级这条调用链,决定了你写代码的路数

CorelDraw对象模型的顶层是Application,代表整个应用程序;它下面挂着Documents集合,当前活动的那个就是ActiveDocument。Document下面有Pages、Layers,最常见的操作对象是ActiveLayer,即当前激活图层。图层上放着各种各样的Shape,矩形、曲线、位图、文本,全是Shape。

很多新手写代码报错“对象变量未设置”,根子就在这条链子上。比如你写Dim doc As Document; Set doc = ActiveDocument,如果当前没有打开的文档,doc就是Nothing。同理,Set shp = doc.ActiveLayer.Shapes(1),如果图层里没有任何形状,shp也是Nothing。示例包里那些看起来啰嗦的If x Is Nothing判断,不是写代码的人话多,是这套对象模型本来就容易悬空。

这个和ZW3D二次开发里cvxrootid(rootname, &idroot, &type)拿不到返回ID,或者说CATIA二次开发里BOM输出句柄失效,属于同一类问题:你拿到的引用可能因为上下文切换而失效。CorelDraw里最常见的失效场景是用户中途切换了文档,或者把某个图层删了,而你的代码还拿旧引用访问它。

3.2 必调参数:SizeWidth、MoveTo、Fill、Outline这样设

对象模型的调用最终都要落到具体参数上。我整理了做批量排版时最高频的五个属性,示例包里改成自己的东西时基本绕不开它们。

Sub SetShapeParams() Dim doc As Document Set doc = Application.ActiveDocument doc.Unit = cdrMillimeter Dim shp As Shape Set shp = doc.ActiveLayer.Shapes(1) If shp Is Nothing Then Exit Sub ' 设置尺寸 shp.SizeWidth = 120 shp.SizeHeight = 80 ' 移动位置:MoveTo的坐标原点是页面左下角 shp.MoveTo 10, 10 ' 填充纯色 shp.Fill.ApplyUniformFill CreateRGBColor(0, 128, 255) ' 去轮廓 shp.Outline.SetNoOutline End Sub

SizeWidth和SizeHeight是直接改宽度和高度,各版本都支持。要注意的是这两个属性会带着对象一起变形,如果你想等比缩放,得先取一下原始宽高比,算完再赋值,别直接填死数值。

MoveTo是移动位置的稳妥方法,尤其是老版本的GMS对Position = CreatePoint(x, y)这种写法支持不稳定,我一般都用MoveTo。坐标原点在页面左下角,往右是X正方向,往上是Y正方向,这跟数学坐标一致,但跟很多设计软件左上角为原点不一样,这是新人最常犯的坐标理解错误。如果发现图形移动到页面外面去,大概率就是把Y方向搞反了。

Fill.ApplyUniformFill是纯色填充,渐变填充用Fill.ApplyFountainFill,位图填充用Fill.ApplyBitmapFill,但二次开发里90%的场景就是纯色。Outline.SetNoOutline去掉轮廓,印刷拼版时特别有用,不然每个矩形带个默认黑色细边,导出的PDF放大看全是线。

3.3 Selection与ShapeRange:批量操作别用For Each

干活最忌讳一个一个改。CorelDraw给批量操作提供了两个好东西:Selection和ShapeRange。Selection是用户当前选中的对象集,ShapeRange是任意一组对象的集合,可以来自Selection,也可以自己收集。

Sub BatchMoveSelected() Dim doc As Document Set doc = Application.ActiveDocument doc.Unit = cdrMillimeter Dim sr As ShapeRange Set sr = doc.SelectionRange If sr Is Nothing Or sr.Count = 0 Then MsgBox "请先选中至少一个对象" Exit Sub End If Dim i As Integer For i = 1 To sr.Count sr(i).MoveTo 0, 0 Next i End Sub

这个宏的用途是把所有选中对象移到页面左下角,听起来简单,但你手动做几百个对象要多久,心里有数。关键点是doc.SelectionRange,如果当前没有选中任何对象,返回的是Nothing,所以必须先判空。另外sr.Count拿数量,sr(i)按下标访问每个Shape,注意下标从1开始,不是0。

用ShapeRange还有一个隐藏优势:一次MoveTo调用移动一个对象,几百个对象几百次调用,CorelDraw的UI刷新会拖慢速度。更高效的办法是先收集成一个ShapeRange,再对ShapeRange整体调用sr.MoveTo 0, 0,绝大多数版本支持这种批量操作。判断支不支持有个笨办法:在宏管理器里录制一段批量操作的脚本,看录出来的代码是不是按ShapeRange整体调用。

到这里,对象模型和基础参数已经拿下了。下一步就是真正动手改造,把示例包里的代码改成能给你自己批量干活的工具。

4. 把示例代码改成自己的工具:批量导入、自动排版、导出PDF一条线

看懂示例和能改出自己的工具,中间隔着一次完整的流程改造。我习惯拿“批量导入图片并排版导出”当练手项目,因为这个流程覆盖了CorelDraw二次开发的三大件:导入文件、操作形状、导出文档。下面直接按这个流程拆。

4.1 批量导入图片并按网格排版的脚本骨架

Sub BatchImportAndLayout() Dim doc As Document Set doc = Application.ActiveDocument doc.Unit = cdrMillimeter ' 布局参数:3列,单元格60x80mm,间距5mm Dim cols As Integer: cols = 3 Dim cellW As Double: cellW = 60 Dim cellH As Double: cellH = 80 Dim gap As Double: gap = 5 Dim startX As Double: startX = 10 Dim startY As Double: startY = 10 ' 模拟文件列表,实际场景换成目录扫描 Dim files(0 To 2) As String files(0) = "D:\img\1.jpg" files(1) = "D:\img\2.jpg" files(2) = "D:\img\3.jpg" Dim i As Integer For i = 0 To UBound(files) Dim shp As Shape Set shp = doc.ActiveLayer.Import(files(i)) If shp Is Nothing Then MsgBox "导入失败: " & files(i) Exit Sub End If ' 先等比缩到单元格能放下的最大尺寸 Dim ratio As Double ratio = shp.SizeHeight / shp.SizeWidth Dim targetW As Double Dim targetH As Double targetW = cellW - gap targetH = targetW * ratio If targetH > (cellH - gap) Then targetH = cellH - gap targetW = targetH / ratio End If shp.SizeWidth = targetW shp.SizeHeight = targetH ' 计算网格位置,居中对齐 Dim col As Integer: col = i Mod cols Dim row As Integer: row = i \ cols Dim x As Double Dim y As Double x = startX + col * cellW + (cellW - targetW) / 2 y = startY + row * cellH + (cellH - targetH) / 2 shp.MoveTo x, y Next i MsgBox "批量排版完成" End Sub

这段里值得背后关注的参数有三个:cols控制一行放几个,cellW和cellH是每个网格的实际大小,gap是图片之间留的白边。代码先导入图片,然后等比缩放,接着按行列算位置,核心是col * cellW和row * cellH这两个表达式,它把一维循环索引拆成了二维网格坐标。图片比例处理上,先用ratio锁定宽高比,再判断高度是否超限,宽度和高度谁超了都做修正,避免图片被拉变形。

实际跑的时候如果发现图片位置偏了,多半是startX和startY设错,或者页面上有其他对象占位。把起始坐标设成页边距加偏移量,比硬编码0,0要稳。

4.2 导出PDF/JPG时容易漏掉的三个参数

批量排版完,下一步就是导出。CorelDraw二次开发里导出PDF的坑,比排版那部分多三倍,尤其是从老版本X7迁移到新版的老脚本,经常是排版好好的,一导出就出问题。

Sub ExportToPDF() Dim doc As Document Set doc = Application.ActiveDocument doc.Unit = cdrMillimeter Dim filePath As String filePath = "D:\output\batch_" & Format(Date, "yyyymmdd") & ".pdf" Dim ok As Boolean ok = doc.ExportPDF(filePath) If ok Then MsgBox "PDF导出成功: " & filePath Else MsgBox "PDF导出失败,检查文件路径或导出权限" End If End Sub

ExportPDF是Document对象的方法,返回布尔值,核心就是给路径。真正的问题在于这个方法在CorelDraw不同版本里的签名不一样,有的版本支持直接传PDF预设选项,有的版本只能传默认路径。当你拿到一个示例包,发现里面导出PDF的代码比自己写的复杂很多,不要慌,那些多余的参数多半是版本兼容的妥协。

导出时最容易漏掉的三样:第一个是“导出范围”,不传参数时可能只导出当前页,如果文档有多个页面而你想全部导出,得先检查有没有页面范围参数;第二个是“PDF预设”,不指定预设时CorelDraw会使用最近一次手动导出时留下的设置,这会导致不同人导出结果不一样,属于典型“玄学”;第三个是“字体嵌入”,如果示例包的导出代码里没提到字体,那你导出的PDF一旦放到别的电脑上看,字体铁定变。

一个万能的排查手段:打开宏录制器,手动执行一次你要的导出操作,然后宏管理器里查看录制结果。CorelDraw会把所有参数写得一清二楚,你直接拿那段录制代码当模板,比对着帮助文档看API靠谱得多。

4.3 从InputBox到独立窗体:参数交互怎么选

批量工具如果每次都要改代码里的参数,那还不如手动操作。二次开发达到“能用”的标准,至少要做到弹窗改参数。最简单的交互就是VBA的InputBox:

Sub LayoutWithInput() Dim colsStr As String colsStr = InputBox("请输入列数", "排版参数", "3") If colsStr = "" Then Exit Sub Dim cols As Integer cols = CInt(colsStr) MsgBox "列数已设为: " & cols End Sub

InputBox的第三个参数是默认值,用户直接回车就用默认值,这个交互模式适合做工具原型。等你确定这个工具要长期用,再考虑用GMS的窗体设计器做独立界面。CorelDraw的VBA环境支持UserForm,可以放文本框、下拉框、复选框,但界面设计能力和Office VBA的窗体编辑器有一定差距,控件布局要耐心调。

给个建议:如果你是给团队做工具,先拿InputBox版本跑两周,确认流程稳定再去做独立窗体。因为大部分参数调整其实是在流程跑通以后才变得明确的,一上来就做复杂界面,后期改起来成本高到让你不想动它。

5. CorelDraw二次开发常见问题与避坑记录:现象、原因、解决

这块内容来自我多次给客户收拾烂摊子的血泪经验。CorelDraw的宏开发,代码写错反而不可怕,最烦的是代码看起来没问题,跑起来却各种幺蛾子。按“现象 → 原因 → 解决”的格式记录几条最经典的,供你排查时对照。

5.1 现象:报“对象变量或With块变量未设置”

这是VBA里最常见、也最让人上火的错误。代码写到一半,跑一个看起来没问题的宏,啪一下弹出这个对话框,你看半天也不知道哪个变量没设置。

原因:本质上是有个对象变量是Nothing,但你在代码里调用了它的属性或方法。最常见的有三个位置:一是Set doc = ActiveDocument前忘了判断有没有文档打开;二是doc.ActiveLayer.Shapes(1)时图层里根本没有形状;三是代码拿了某个Shape的引用后,用户在画布上把它删了,引用就悬空了。

解决:在每次Set一个对象后,紧跟着写判空语句。别嫌丑,CorelDraw的宏只要涉及选择集,就绕不开判空这一步。写一个公用函数专门做安全检查也行,比如GetShapeByIndex,内部判空,外部用不崩溃。

5.2 现象:图形坐标看起来没问题,但位置跑偏了

这也是高频踩坑。代码里写MoveTo 10, 10,运行后图形跑到了页面的右下角,或者干脆跑到画布外面去,完全不符合心理预期。

原因:单位不一致。CorelDraw文档单位可以是毫米、厘米、像素、点,MoveTo的坐标是跟着文档当前单位走的。你在代码里按毫米算好了坐标,但文档当前单位其实是像素,那跑出来当然不是你想要的位置。另外,坐标原点默认在页面左下角,但有些模板文档、从别处继承的文档,可能把原点移到了左上角甚至页面的某个参考点上。

解决:写宏的第一行,先执行doc.Unit = cdrMillimeter,把你的坐标系钉死在一个标准上。如果换了单位后还是跑偏,再检查页面原点设置。页面原点通常在“工具 → 选项 → 文档 → 标尺”里能看到。

5.3 现象:导出的PDF和设计稿看起来不一样

最典型的情况是字体变了、颜色发暗、或者明明排版好的东西导出后分页位置不对。这类故障很隐蔽,因为CorelDraw界面里看文档一切正常,唯独导出的PDF不对。

原因:PDF导出时采用的不是当前页面显示设置,而是“文档导出预设”。CorelDraw的导出预设是独立的一套配置,很容易跟文档实际设置脱节。字体方面,如果电脑上装了字体,界面显示没问题,但PDF预览器没内嵌字体,在别的电脑上就回退成默认字体了。

解决:不要用默认预设,自己在导出时指定PDF预设参数,至少强制字体嵌入和色彩管理。最直接的办法是回到宏录制器,手动导出一次,把录制结果里的参数项抄进自己的代码。有人说CorelDraw在色彩管理方面是个“黑匣子”,这话夸张了点,但它导出的颜色确实受“文档色彩配置”和“导出色彩配置”双重影响,填色时能直接用CMYK库就尽量不要用RGB。

5.4 现象:宏越跑越慢,最后卡死

批量处理几百个对象时,前几十个飞快,后来越来越慢,最后界面直接无响应。很多人以为是CorelDraw性能不行,其实是自己的宏在“刷屏”。

原因:每一次对Shape的修改,比如MoveTo、改变量、加颜色,CorelDraw都会触发界面重绘。当对象数量多、MAC一堆Shape循环时,重绘频率成百上千,界面自然卡死。

解决:两条路。第一条,减少操作次数,能用ShapeRange整体移动就不逐对象MoveTo;第二条,在宏的开头关闭界面刷新,跑完再开。不同版本的关闭方式略有差异,通常做法是设置Application.Optimization为True,然后结束时恢复。如果你用的版本不支持这个属性,至少做到在循环体外尽量少切换页面视图。

5.5 现象:同一个宏有时能跑有时不能跑,像在赌运气

这是最让人抓狂的问题。代码一行没改,上个月跑得好好的,今天再跑就报错。问谁都说不出所以然,只好归因于“玄学”。

原因:多半是上下文依赖。宏代码里如果直接用了Selection、ActiveLayer、ActiveDocument这种“随环境变化”的引用,那它的运行结果就取决于当前用户选了什么、打开了哪个文档、激活了哪个图层。你上次跑的时候碰巧选中了一个对象,这次没选中,宏就崩了。

解决:宏的开头做环境自检,把依赖的条件全查一遍。比如需要选中对象,就先判断doc.SelectionRange是否为空;需要指定图层,就写死从doc.Layers("图层1")拿,别依赖ActiveLayer。像ZW3D二次开发里cvxrootid(rootname, &idroot, &type)拿不到返回ID,CATIA二次开发里BOM输出时选中集变化,这些崩溃的底层原因都是一样的:环境变了,代码没有跟着变。做二次开发,核心不是语法,而是对“当前状态”的把控。

6. 从示例包到自己的工具集:验证导出结果并沉淀公共模块

跑通了示例、避开了那些坑,接下来就是进阶的一步:把一个能跑的宏,变成一个能长期用的工具。做成这件事有两个关键动作,一是导出的结果要有办法自动验证,二是把常用操作抽成公共函数。

6.1 用二次脚本验证导出结果

批量导出一百个文件,你不会想手动打开每一个去看。验证思路其实对每个领域都一样:先看文件数量对不对,再看每个文件的尺寸和页数对不对。在CorelDraw里可以再写一个验证宏,遍历某目录下的PDF,读取文件大小和页数:

Sub ValidatePDFs() Dim folder As String folder = "D:\output\" Dim fileName As String fileName = Dir(folder & "*.pdf") Dim count As Integer Dim totalSize As Double Do While fileName <> "" count = count + 1 Dim fLen As Double fLen = FileLen(folder & fileName) totalSize = totalSize + fLen ' 可以再加文件名匹配规则检查 fileName = Dir Loop MsgBox "找到 " & count & " 个PDF,总大小约 " & totalSize / 1024 & " KB" End Sub

Dir按文件名遍历文件夹,FileLen拿单个文件字节数。通过这个宏能快速判断:如果数量等于你导入的图片数,大体就没漏;如果某个文件大小明显异常,肯定有问题。更精细的验证可以逐个用PDF布局库去检测,但对多数批量导出的场景,数量加体积已经能筛掉九成“后悔药”场景。

6.2 把常用操作沉淀成公共函数

示例包里的代码往往把功能写在一个宏里,看起来直接,但复用性很差。我的习惯是把高频操作拆成独立函数,比如GetActiveDocChecked返回可用的文档对象,MoveShapeToCell按行列号移动形状,ExportDocToPDF封装导出参数。这样写新工具时,很多代码直接复制即可,不用重新调试。把第4章的批量排版拆成函数后,主流程可以浓缩成十几行,而每个函数都能单独测试。测试方式就是给入几个边界参数:空文档、只有一页的文档、单位不是毫米的文档,跑一遍看会不会崩。CorelDraw这个方向最值得投入的地方就在这里——第一次写工具是成本,复制它到所有后续项目时才开始回本。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/26 1:29:21

具身智能系统概论——具身大模型

第6章&#xff1a;具身大模型 (Embodied Foundation Models)6.1 视觉-语言-动作 (VLA) 模型&#xff1a;RT-2, PaLM-E 解析在 ChatGPT 出现之前&#xff0c;机器人领域的“大脑”通常是由无数个小模型拼凑而成的&#xff1a;一个模型负责看图&#xff0c;一个模型负责导航&…

作者头像 李华
网站建设 2026/10/26 1:26:27

java学习笔记(十七)——反射,注解,Junit单元框架

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

作者头像 李华
网站建设 2026/10/26 1:26:03

java学习笔记(四)——抽象类与接口

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

作者头像 李华
网站建设 2026/10/26 1:24:04

免费给老 Mac 装最新 macOS:OpenCore Legacy Patcher 完整指南

免费给老 Mac 装最新 macOS&#xff1a;OpenCore Legacy Patcher 完整指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 用 OpenCore Legacy Patcher 给老 …

作者头像 李华