目录
| 每一次阅读《兰亭集序》,你会不会感到心潮澎湃?会不会被其博大的情怀所感染?会不会因其丰富的想象力而产生共鸣? |
|
当我们将绝大多数“顶层桌面窗口对象”视为:
意味着桌面应用软件开始以“宇宙结构为参照系”考虑相关的问题,开发者一定可以在绝大多数“顶层窗口对象”之中找到无数个对等于宇宙之中巨大星系之星系核的子窗口;这也意味着,每一个桌面应用都隐藏着一个
| 处于休眠状态、可媲美“宇宙结构”的对象体系。 |
在运行时唤醒一个桌面软件处于“休眠状态的宇宙结构”是一件值得我们倾注情怀的事情。如果这一愿景成真,那么很多你熟悉的窗口对象,将转化为外围环绕“无数星体”的星系核,或者转化为一个“Hubble深空场”,一个桌面应用程序将会演化出无穷多个“平行宇宙”,每一个平行的个体,都足以让你产生堪比《兰亭集序》的情怀。因此,如果您有机会阅读我们的系列文章,希望可以为您打开一扇门,拉开一个全新的帷幕……
| 一个窗口对象满足如下条件:
那么该窗口称为其父窗口链中所有窗口的“窗口核”,父窗口链中每一个窗口称为“有核窗口”。 “窗口核”仅强调与其“父窗口”之间存在
这一点确保了“窗口核”对象普遍存在于桌面应用软件之中。 |
|
我们目前已知的绝大多数“顶层窗口”都是“有核窗口”,并且存在不止一个窗口核。以下几类窗口对象是典型的“窗口核”对象:
|
“唤醒”意味着“目标”原本就存在,只不过处于“静默、休眠”状态。也就是说“唤醒桌面应用中休眠的宇宙结构”仅仅是应用“状态”的切换。在源代码方面开发者需要完成的工作如下:
| .NET | C++(适合于应用、动态链接库工程) |
| 添加AIGC.cs到.NET桌面应用工程,并将 “Application.Run” 替换为 “AIGC.AIGCApp.Run” | 复制AIGC.*到pch.h(或stdafx.h)所在文件夹,在pch.*(或stdafx.*)中分别添加 |
一旦你的桌面软件工程完成了调整源代码部分指定的步骤,接下来的工作是:
开发者将桌面应用工程的“编译输出”路径指向
| AIGCAssistant文件夹, |
“唤醒”工作就完成了。“唤醒行为”的本质是激活了桌面应用系统之中
| “窗口核”周围以前完全没有呈现出来的全新功能、内容维度, |
从这一刻起你打开了一个潘多拉魔盒:
| 你的应用系统将支持无限数量的窗口对象类型……。 |
以及:
| 无限多个基于WebPage或者XML的 “启动开关”……。 |
由于绝大多数桌面应用都是基于.NET Core/.NET Framework、 C++/MFC/ATL等成熟技术开发,因此,本文将侧重点聚焦在这些成熟的技术资产之中,我们只考虑64位桌面应用(所有的编译必须是64位编译,这一点在后续的行文之中不再强调)。
这是一个Web开发者与桌面应用开发者共同拥有的时刻,Web DOM定义桌面窗口意味着DHTML技术延伸到更大、更广阔的应用领域,当普通桌面窗口对象进化为一种相当于“二进制div”之类的DOM元素,其隐藏已久的Web基因将会被激活:
![]() | 如果你突然意识到:Web浏览器仅仅是一类最小的桌面应用软件,而WebView也不是浏览器窗口之中唯一的内容承载者,是不是意味着规则的颠覆?如果果真如此,准备好了吗? |
这个出发点允许软件开发者在构建应用的各个阶段充分利用成熟组件技术按照“Web DOM描述规则”在运行时动态合成诸如上面或下面看到的窗口类型:
|
| 从窗口对象“几何”拼接的角度看,各类异构技术实现的窗口对象,不应该被其实现途径采用的技术架构所制约,因此应该存在一种“仅依赖于几何规则的”窗口对象组装模式,允许开发者忘记参与组装的对象其本身的技术实现方式,…… |
一旦一个exe文件拥有对这个规则直接的支持能力,那么许多异构技术架构之间的互操作“障碍”,就会被极大的削弱甚至消失,其直接、现实的意义就是你的应用系统具备
| 基于规则的“生态能力”。 |
开发者需要一个务实的规则:
| 我们应该遵循什么样的法则构造桌面应用,进而使得软件系统可以支持这里描述的“Web DOM描述规则”? |
如果我们可以填平Web技术与桌面应用技术之间长期存在的鸿沟,桌面应用与Web浏览器之间的边界就会变得模糊进而逐步消失,绝大多数可编程对象会显示出其一直没有被挖掘出来的Web特征,我们希望您可以重新审视您创造力的涉猎范围,将您强大的Web创造能力延伸到桌面端,这里应该是您可以大显身手的一个新天地,一旦您可驾驭的应用元素得以充分的扩展,那么您完全可以成为一个全新应用领域之中的超级开发者。
从全新的视角看,WebView的“内容矩形”约束了Web开发者的创造力,或许是开发者头上的一个紧箍咒,这个矩形形成了一个“画地为牢”的现实效应,将开发者的创造力在相当大的一个技术群体之中限制在一个“矩形”区域之内,现在到了清除羁绊的时刻了。
如果Web浏览器就是一类最小的“桌面应用结构”,我们希望协助您工作在一个充分大的内容空间之上,以完美驾驭“桌面应用技术”与“Web技术”之间的互操作。如果我们可以填平Web技术与桌面应用技术之间长期存在的鸿沟,那么,桌面应用开发者将会面对一个全新的应用模式:
|
您完全可以驾驭一个全新的“Web-Desktop融合”模式,使得你原有的创造力提升到一个更高的水准。中国人相信一个永恒的道理:
| 不破不立 |
我们希望可以为您揭示一系列全新的技术维度,冲破“地心说”性质的思维制约,那么您对应用软件的视角就会有本质的改变……
现在,您可以以全局、整体的视角全面整合“桌面组件资源”与“Web组件资源”,当绝大多数应用资源在合理的约束条件之下拥有“自由拼接”的能力,那么,您的构思能力就不再受制于具体技术的约束,这个时候,您的想象力有可能转化为巨大的生产力。
AIGCSDK的设计目标是:让开发者在“现有的”或者“新创建的”软件项目基础之上,调整非常非常少量的源代码(通常情况之下不超过3行),使得开发者的项目
| 处于与Microsoft Edge、Chrome等著名软件平行的位置。 |
自从Web技术形成体系之后,桌面窗口对象就被刻上了“原生窗口对象”的烙印。在软件开发领域,由于软件开发领域一直没有找到行之有效的
| 将普通窗口对象“Web化”的切入点 |
所以普通“窗口对象”一直游离于“Web作用域”之外。进而使得桌面应用领域与Web应用领域之间一直存在一道鸿沟,二者一直处于两个阵营各自发展的状态。
有没有办法打破僵局,弥合这一道由来已久的“鸿沟”?现代天文观测告诉我们:巨大天体的外围,一定环绕着一个“空间尺度更大的附属世界”,当我们将视线投向窗口对象对应窗口矩形的外围,我们发现:
| 如果一个窗口是其父窗口的一个窗口核 |
那么其周围一定会环绕着一个
| 无限维的动态窗口对象世界。 |
这一现象的发现,彻底改变了我们对窗口对象的认知:对于绝大多数桌面窗口而言:
| 拥有“一个”子窗口,意味着拥有无限数量的动态子窗口。 |
基于此,在原生代码之中为Web技术找到了全新的切入点:
| 用Web驱动的规则描述“窗口核”对象的外围环绕空间。 |
这一思考方式决定了桌面应用领域必将迎来一次深刻的巨变。
AIGCSDK通过窗口核的窗口句柄,将“窗口核”与如下Web DOM元素绑定在一起:
| <somename> <nucleus> <xobj objid="nucleus">xobj> nucleus> somename> | DOM元素的tagName的值不限于“somename”可以是任何一个合适的名字,例如“xyz”。
|
“nucleus元素”包含的“xobj元素”
| <xobj objid="nucleus">xobj> |
可以按照如下规则生成一个无限维“xobj DOM树”集合:
| 逐层次插入“子xobj元素队列”形成xobj多层次DOM树 |
例如,在xobj元素之中插入9个下一级“子xobj元素”,获得如下表达的DOM树结构,
| <somename> <nucleus> <xobj rows="3" cols="3" width="150,100,100" height="200,180,100"> <xobj>xobj> <xobj>xobj> <xobj>xobj> <xobj>xobj> <xobj objid="nucleus">xobj> <xobj>xobj> <xobj>xobj> <xobj>xobj> <xobj>xobj> xobj> nucleus> somename> | 从DOM的视角看,形成DOM树,仅仅是在相关子元素之中插入下一级子元素队列。这种子元素队列的批量插入工作,会为我们产生无限数量的DOM元素树…… “窗口核内在的控制能力”使得每一个“xobj元素”形成的“DOM树”在运行时转化为其周围的一个“环绕对象布局”:
这一点是“窗口核”可以媲美“星系核”的依据…… |
| 一旦“窗口核”对象完成了“Web DOM绑定”,“窗口核”对象将成为一个“窗口制造机”,每一个“xobj DOM树”将转化为一个环绕“窗口核的对象布局结构”…… | ![]() |
AIGCSDK的视角之下:
|
| 左侧的窗口转化为右侧的窗口,是一种DOM元素之中插入子元素队列形成的结果…… |
|
左侧窗口之中位于中心位置的是一个MFC CFormView对象,是其父窗口的窗口核。从DOM的视角看,基于DOM元素操作处于左侧的窗口对象,完全可以在运行时呈现为:

这里看到的转化机制导致“窗口核周围”产生了剧烈的“几何震荡 ”,进而形成:
| 环绕“窗口核”对象的无限维几何布局层 |
为桌面应用开发带来了无数个全新的入口,如图:
|
| 这个布局结构在窗口核周围产生了3个“布局空位”,如何填充这些空位以形成全新的窗体? |
通过调整、修改xobj DOM树之中
| 每一个xobj元素的“objid、rows、cols”等属性 |
“窗口制造机”分别将每一个对应的xobj元素转化为如下类型之一的“窗口核”对象:
|
这个转换工作使得:
| 开发者可以充分利用各种窗口对象类型“填充”每一种“xobj元素树”对应的环绕布局结构 | 在运行时形成 | 功能强大、表现力丰富的复合窗口对象。 |
进而确保类似如下呈现的窗口对象创建工作归结为针对“Web/XML DOM元素”的描述化处理工作:
|
| |
![]() |
|
以“窗口制造机”为基础我们看到:在每一个窗口核的周围,事实上环绕着一个
| Web驱动、包罗万象的无限维窗口对象世界。 |
“窗口核”因此成为桌面应用之中可以与现实宇宙之中“星系核”相匹配的一类关键对象,更进一步,由于在每一个窗口核环绕布局之中,每一个与xobj元素对应的“布局成员窗口”依然是“窗口核”对象,而每一个窗口核都拥有自己的“无限维窗口对象环绕空间”,这一点表明每一个“窗口核”的周围都是一个完全可以媲美“哈勃深空场”的“局部世界”:
| 我们在窗口核的周围看到了一个拥有无限对象层次、Web描述驱动的对象世界,每一个“窗口核”周围环绕着无限数量的下一级“窗口核”…… |
事实上,这种“DOM树”转化为“窗口核环绕布局结构”的过程会发生在每一个“桌面应用”之中(只不过在对应的软件之中需要激活这个机制):

(Visual Studio、Office等应用中,“窗口核”周围空间形成的环绕结构)
一个“窗口核”的周围,存在任意数量异构技术体系开发的其他类型环绕窗口对象,意味着开发者将面临着一次颠覆性的思维震荡,我们在开发领域中看到的诸如MFC、.NET Core、.NET Framework、COM、Web等等基础技术架构之间的“隔离墙”会荡然无存,将被全新的思维“维度”衔接在一起。由于窗口核的周围存在“无限维的环绕空间”,所以环绕空间之中的每一个成员或者每一组成员都会成为窗口核的
| 一个装饰物或者一组“装饰物的组合搭配”, |
在需要的时候,窗口核只需将其直接“取出来”、以合适的方式“展现”给外界即可。例如,开发者如下设计一个.NET UI组件:

在运行时可以给其穿上一件由MFC制作的“外衣”,同时给其中的一个“子控件”再搭配一个“MFC FormView”,将不会有任何技术障碍:
|
| 我们需要以下几点:
|
从Web DOM的视角看,就是一段“DOM”描述而已。开发者可以根据需要决定其中的子控件的运行时环绕结构,例如,开发者可以将子控件呈现为如下显示的结构:
![]() |
|
几乎所有的“个性化窗口对象”,都会以合适的方式转化为普通窗口核外围的“装饰物、服饰或者首饰”之类的“窗口核可佩戴附属品”。开发者如下设计一个普通的WinForm对象:

然后,给其穿一件“Chromium Browser”外套,不是一种想象力的展示:

而是一种无障碍的文本描述驱动的结果,这是一种与“窗口对象”之间展开“文本交互”的对话方式:
| 运行时给“窗口核”对象发送一段“描述方案” |
“窗口核”对象给你一个基于
| “组合内容的” |
实时反馈。例如,针对如下左侧窗口对象:
|
|
| ![]() |
我们再看一个例子,注意如下显示的环绕在“MDI”客户区的浏览器标签结构:

开发者应该忘记这里看到的具体技术的实现细节,浏览器标签结构,仅仅只是一个“窗口核”对象(在其环绕空间之中)的一个平凡附属物,开发者随时可以在窗口核环绕空间之中取出一组对象,然后基于DOM规则将取出来的“对象组”呈现在其外围的一个具体布局结构之中。
| 将来自于不同成熟技术架构之中的“个性化”窗口对象,转化为“普通窗口核”对象的“环绕物”或者“装饰物”, |
是AIGCSDK独一无二的设计思路,这个设计原则使得:
等个性化窗口对象成为普通桌面应用的公共资产,也就是说,这些窗口对象将成为构建桌面应用的基础性素材库。 |
|
每一个应用程序都可以拥有任意数量的相关窗口类型运行时实例。开发者即将面临一个全新的阶段,如同宇宙之中星际物质制造恒星或者更大的天体一样,如果我们将形形色色的窗口对象看作星际物质,当这些星际物质汇聚在一起的时候,新的“天体”将形成。
“环绕物”或者“装饰物”与对应的窗口核之间的衔接归结为Web描述驱动技术,为弥合桌面软件与Web技术之间的鸿沟提供了决定性的思路。一旦我们意识到,一个窗口核的周围世界是一个Web可控的描述驱动世界,那么,标准的Web技术就会显得“狭窄”了,将Web描述机制从WebView的内部拓展到普通窗口对象的外围,是对现有Web技术的一次里程碑性质的推进。
当Web DOM成为一种
| 通用的描述规则, |
“窗口核”对象将成为“WebView”的替代者,Web浏览器将失去其专属的特权地位,原生代码技术与Web代码技术之间的鸿沟也会逐步的消失。开发者将迎来一个全新的工作模式:
|
如果不能实现“文本”、“图片”、“音频”、“视频”等基础数字内容的“自由组合拼接”,那么我们今天所看到的数字内容时代将不复存在。
窗口动态拼接,是指在软件运行时以一个窗口对象为基点,在这个窗口的“上下”、“左右”、“前后”等几个几何维度方向
| 插入一个或者一组“其他窗口对象”。 |
由于普通“窗口对象”在适当的“几何位置约束条件”之下将成为其父窗口的窗口核,在“窗口核”的周围存在一个“窗口对象制造机”,这个“制造机”使得以“窗口核”对象为基点,在其周围展开
| “窗口对象实时拼接” |
是完全可行的。因此合适的条件之下普通“窗口对象”将如同“文本、图片等对象”一样拥有“动态、自由组合拼接”能力。
将每一个“有核窗口”视为一个无限维“动态窗口对象拼板”,在其窗口矩形之内形成一个
| “文本”、“图片”、“视频”、“窗口对象” |
自然拼接的内容生态模式,是对开发者“窗口对象组织能力”、“思维格局”等方面的一个全新挑战,现在,到了需要开发者突破局限、开启丰富想象力的时刻了。对如下图显示的一个.NET WinForm对象:
![]() | 在这个WinForm对象之中有一个Dock属性为“DockNone”的panel对象:
|
以这个panel对象为“基点”,在其各个几何维度上“运行时动态接入”一组窗口对象完全可以通过合理的运用“xobj DOM树”转化为“窗口对象树”的机制实现。由于“窗口拼接”在运行时完成,因此,对不同的场合,“拼接形成的具体形态”会有很大差异:

由于窗口核的周围存在一个无限维的环绕对象空间,因此:
| 窗口核与其环绕对象空间之间会形成无限多种调度策略, 使得“窗口核”可以与其环绕空间之中的元素充分互操作 |
AIGCSDK就是一种基于Web/XML驱动的调度策略,依托这个策略,“窗口核”对象动态拼接可以理解为是在“窗口核”各个几何维度方向形成针对“软件内容、软件功能”的扩展机制:
| 以窗口核为局部中心,按照Web DOM可描述的布局模式将其环绕空间之中的一组元素“动态组织在一起”。同时,在Web作用域之内,建立这一组窗口对象的互操作机制,包括处理相关对象的事件处理、消息响应等等……。 |
这意味着每个窗口核的周围都会呈现一个前所未有的“局部软件内容生态”,使得桌面窗口表现出全新的Web动态特征,这类特征彻底改变了“桌面窗口对象”的基础结构。
毫无疑问,对所有开发者而言,一个通用的运行时窗口动态拼接机制,是促进其创造力的一个重要因素。用Web DOM的规则组织窗口对象,使得一组对象围绕“窗口核”组合、拼接“功能强大的复合窗口”,其意义不仅仅是简化了开发者的工作复杂度,对开发者的创新能力、AI技术的运用等方面都会形成极大的推动力。
现代AIGC(AI Generated Content)技术领域,大模型技术使得开发者很容易将一段“文本上下文描述”转化为:
| 富有弹性、创意以及具备合理精准度的Web DOM描述…… |
结合运行时窗口动态拼接机制,AIGCSDK为AI大模型技术实现:
| 基于“上下文描述、图片”,创建表现力强大的桌面窗口对象 |
提供可靠的技术途径,为AIGC技术在桌面应用领域之中发挥关键作用奠定基础。如果AI文本驱动技术可以有效的将
| “文本”、“图片”、“视频”、“窗口对象” |
充分的衔接在一起,那么AI技术将会带来更加强悍的冲击力。
用Wizard生成一个.NET Framework C# WinForm工程Tangram,以及一个标准MFC SDI FormView工程MFCSDIApp,其中:
| Tangram工程中WinForm对象包含:
panel1、treeView1的Dock属性为DockNone或者DockFill。 |
|
按上面步骤分别增加“Tangram、MFCSDIApp”对AIGCSDK支持后编译这两个工程。
第一次运行Tangram.exe以及MFCSDIApp.exe,会看到两个普通的窗口对象:

除了用Wizard生成了代码,我们几乎没有做什么特别的工作,然而……
当我们将“Tangram.exe、MFCSDIApp.exe”复制到文件夹AIGCAssistant,在这个文件夹中重新运行这两个可执行文件,会看到令人震惊的变化:
![]() | 与第一次运行Tangram相比,panel1与其父窗口之间,增加了全新的UI结构:一组Chromium标签页,从效果上看panel1出现在Chromium标签页的内部,这一点现有的WebView组件,例如Edge的WebView2以及Chromium CEF都无法实现。 |
![]() | 与第一次运行MFCSDIApp相比,FormView与其父窗口之间增加了全新的UI结构:一组Chromium标签页,从效果上看FormView出现在Chromium标签页的内部,这一点现有的WebView组件,例如Edge的WebView2以及Chromium CEF都无法实现。 |
在Tangram.exe、MFCSDIApp.exe处于运行状态时,我们需要注意两个对象:

在这两个对象与其父窗口对象之间,都出现了开发者从未遇到的现象:
|
| 对开发者而言,在Wizard生成代码的过程中,他们完全没有看到任何与这里显示的“新UI表现层”相关联的线索,只是将“可执行文件”换了一个文件夹,这个位置改变,导致panel对象以及CFormView对象的外围出现了全新的元素。 |
由于两个工程都是新生成的,相关联的因素不会比以前的方式增加太多,但运行时带来的变化,却值得开发者深入思考。
当开发者第一次运行“Tangram.exe、MFCSDIApp.exe”时,开发者看到的是他们一直认为的“这两个可执行文件应该具备的面目”。然而,当这两个可执行文件放在文件夹“AIGCAssistant”之中运行的时候,情况完全变了。我们仔细考察文件夹AIGCAssistant之后,发现了两个Web页面:

一旦删除这两个文件,即使在“AIGCAssistant”文件夹之中再次运行这两个exe,刚刚呈现的所有变化将会彻底消失。故事结束了吗?当然没有!我们在文件夹AIGCAssistant之中发现了另外一个Web页面Tangram1.html:
| 如果我们删除Tangram.app.html,然后将Tangram1.html重命名为: Tangram.html 关闭Tangram.exe的所有运行时实例之后重新运行Tangram.exe,如右图所示:一个开发者完全没有见过的运行时场景出现了…… |
|
不用说,这正是一款“Chromium-Based”Web浏览器,而我们在Tangram工程中设计的WinForm对象,处于“新标签页”的“侧边栏”位置。
如果在AIGCAssistant文件夹之中删除Tangram.app.html,然后将demo.app.html更名为Tangram.app.html,运行Tangram.exe:
|
|
当你点击左侧treeView1的树节点,你会看到:
![]() | 在Tangram中设计WinForm窗体的时候,仅仅在panel1对象之中添加了这个treeView1,并没有为这个控件添加任何树节点,这些树节点是什么时间被填充的?点击节点的事件处理是什么时候添加的?这里看到的一切,设计Tangram工程的时候完全不存在…… |
然后点击不同的树节点我们看到形态各异的变化:
|
|
|
我们强烈建议读者将treeView1之中包含的全部树节点遍历一次,这样会看到一个完全不一样的动态环绕变化:Web内容窗口会呈现出超出开发者预期的表现力。
我们这里已经看到Tangram至少拥有3个完全不同的“运行时状态”:

到目前为止,我们所知道的桌面软件进程基本上工作在第一种形态之上,一个桌面应用对接AIGCSDK之后,如果其可执行文件是“Abc.exe”,那么它需要如下Web页面:
| Abc.app.html 引导一个面向应用的桌面软件运行时状态 | Abc.html 引导面向应用的 “Web浏览器运行态” |
事实上:一个桌面软件进程在运行时存在“无数个运行态”,每一个运行态看上去彼此差异极大……。一旦我们意识到需要重新审视桌面软件的基础结构,那么一个全新的生产力模式正在悄然走近我们的视野。
即使你的应用是来自于Wizard生成的最普通的桌面应用,你的应用也会拥有一系列关键的维度,开发者需要一个简明的途径激活或者部分激活这些维度。如下图所示:这里蓝色部分代表应用系统原始模型提供的维度,其中包含了开发者自己提供的模型部分;绿色代表.NET提供的维度;红色表示Web内容形成的维度,除这几个维度之外,还存在COM、C++、Java 等其他维度……:
![]() | 由于开发者自己的桌面应用工程与这里描述的维度“之间一直处于隔离”的状态,所以这些维度一直没有进入开发者的视线。“唤醒行为”完成之后,开发者的应用进程将转化为(取决于初始化方式):
|
开发者的应用将包容“完整的现代浏览器模型”,作为应用模型的一部分,桌面应用会支持任意数量面向应用的浏览器窗口或者浏览器子窗口:
![]() | 一旦你的应用完成了对AIGCSDK的支持,编译之后,你的应用本身就是Chromium Project的一个浏览进程。这个时候,你的应用事实上是处于与Microsoft Edge、Google Chrome平行的位置之上,…… |
开发者的应用会拥有属于自己应用体系的Web页面,这个Web页面完全支持开发者自己的对象模型,同时也会支持其他应用组件。
AIGCSDK将揭开一个迄今为止一直不为开发者所知的“宇宙尺度”的秘密:
| 在每一个桌面窗口对象的周围,都隐藏着一个包罗万象、Web驱动、无限维的窗口对象世界,一旦“父窗口是确定子窗口屏幕位置的唯一因素”,那么子窗口周围隐藏的对象世界即可通过Web技术显示出来。 |
窗口对象这种与生俱来的Web本质,让我们清楚的看到:窗口对象的外围隐藏着一个无限维尺度、Web驱动的对象世界,使得我们对Web技术的作用域产生一个全新的认识:
| Web技术与原生代码技术应该是一种彼此交融的存在,你的原生代码周围环绕着Web代码,反之亦然。 |
这种交织的状态,让我们联想到类似电场与磁场之间的关系,决定了桌面软件技术与Web软件技术之间存在无法割裂的“共生效应”。如下图:WebView周围的环绕世界,让我们看到了类似星系核凝聚恒星的强大引力机制:
![]() | 现有的Web技术基本上只是激活了WebView窗口之内的Web DOM元素,而一般窗口矩形边界之外的那些对象还处于“休眠、静默”状态,这些维度的“缺失”导致了Web技术的作用域被极大的限制了…… |
如下图所示,在一个包含CFormView对象的MFC Frame窗口之中:

由于Web技术发展的历史原因,开发者事实上已经在潜意识之中形成根深蒂固的认知模式,如上图中标记的那样:
| 我们一直将标准Web内容习惯性的固化在WebView的窗口矩形之内…… |
这一点非常类似于人类早期数学发展之中对“数”的认知,由于认知水平的发展,数的概念经历了从“有理数”到“无理数”再到“复数”,最终数学界形成了完美的“代数数域”理论。
事实上,人类科学理论的发展史就是突破禁忌的历史,一个典型的案例就是“原子”的不可分割到“原子核”概念的形成。现在我们又一次面临类似的分歧点:
| WebView的窗口边界是不是Web内容边界的“禁区”? 我们的思考模式能否被WebView的边界“画地为牢”? |
AIGCSDK将Web内容从单一、特殊的WebView的内部延伸到普通窗口对象(当然包含WebView)的外围,这个思考模式将Web内容的边界近乎最大限度的扩展了,也动摇了WebView的特权位置:Web编程模式不再是针对WebView的特殊设计,而是所有窗口对象都具备的通用模式。
我们的目标是:协助你挖掘你现有的、或新创建的桌面应用之中内蕴的无限潜能。当相当大一部分窗口对象可以被视为“外围环绕无限数量窗口对象的星系核”,开发者的视角将会被近乎无限的放大,他们即将面对的是一个波澜壮阔的“新型宇宙”,需要考虑的问题是:如何接受以及怎样充分利用这些“宇宙级”对象(其中的每一个都拥有自己的无限维环绕对象世界……)。
正如我们所期待的:你的桌面应用之中将复现“哈勃深空场”、激活可媲美宇宙中“恒星制造机制”的窗口制造机、允许你自由驾驭更多窗口类型、掌控近乎无限的软件组件资源……。一旦无穷无尽的窗口对象类型、软件资源如宇宙风暴般涌向开发者,将对开发者的思维格局、组织能力、思考方式、驾驭能力等诸多方面形成巨大的冲击……
你当前可以看到的窗口对象,例如左侧的窗口:
|
| 其真实的“运行时形态”应该是类似右侧呈现的场景… |
|
通过将窗口对象纳入到Web DOM的作用域,当一个窗口对象是其父窗口的“窗口核”时:
| 以该对象为局部中心,开发者可以基于Web技术激活其周围无穷无尽的窗口对象资源,依托Web规则构建“无限维局部内容生态”,可以说Web内容一直以另外一个“维度”存在于桌面窗口的周围…… |
AIGCSDK允许开发者在Web DOM作用域之中完成如下工作:
|
进而为弥合:
| “桌面开发技术”与“Web开发技术”之间的“鸿沟” |
提供技术策略与解决方案。
|
|
.NET UI包括WinForm/.NET Control/WPF Object,如同“实数系”就是“复数系”之中的一个“维度”一样,只要你的应用系统之中有一个“窗口核”对象,那么“.NET UI”对象就存在于窗口核的周围。一旦开发者将窗口核与一个Web DOM元素在运行时绑定,绑定元素的DOM树之中的每一个xobj元素的“objid”属性决定了其在窗口核周围对应什么类型的窗口对象。我们知道,每一个.NET UI对象都有一个“AssemblyQualifiedName”属性,一旦一个xobj元素的“objid”属性值指定为一个.NET UI对象的完整“AssemblyQualifiedName”,或者只需取“AssemblyQualifiedName”的一个“子串”:
| FullName+“,”+“LibName” |
其中“Libname”是组件库对应的dll名字,那么在运行时,xobj元素即可被转化为对应的.NET UI对象。例如,如果你的.NET组件的工程名字为“testXobj”,其中包含一个.NET控件“testCtrl”,其对应的“NameSpace”为“SomeNameSpace”,如果这个组件库的输出库为“testXobj.dll”,那么“objid”属性值即为“somenamespace.testctrl,testxobj”,属性值会忽略大小写。
如果xobj对应的.NET Control包含一组“子控件”,对于其中“Dock属性值”为“DockFill”或者“DockNone”的一组子控件,xobj元素之中可以插入一组如下类型的子元素:
| <SubCtrlName> <default> <nucleus> <xobj>xobj> nucleus> default> SubCtrlName> | 这里“SubCtrlName”是.NET Control包含的一个子控件在WinForm设计器之中的名字,例如“panel1”或者“treeView1”,我们需要强调的是这个子控件的“Dock属性值”必须是“DockFill”或者“DockNone”,左侧DOM元素包含的xobj元素事实上是一个xobj元素树…… |
每一个子控件对应的xobj元素的子节点,会给出下一层次的UI复合细节,所有这些Web描述化处理,都是.NET对象在设计阶段无法系统兼顾的,可以良好的弥补软件设计时、编译后的“刚性”缺陷。
如果你熟悉MS Office中的VBA,你一定会对VBA的Form系统有深刻的印象。每一个WinForm对象都会包含自己的子控件集合,如果希望将WinForm对象看作为一个独立的“顶层窗口对象”,需要在Web页面之中用如下DOM元素描述一个WinForm对象:
| <SomeFormName objid="namespacename.formname,formlib" caption="somecaption" id="some_form_id" width="x" height="y"> <somesubctrl_1> <default> <nucleus> <xobj>xobj> nucleus> default> somesubctrl_1>
<somesubctrl_n> <default> <nucleus> <xobj>xobj> nucleus> default> somesubctrl_n> SomeFormName> | 这里“SomeFormName”是一个DOM元素的tagName,一个有意义的字符串即可。
|
开发者可以在Web页面之中描述任意数量的WinForm DOM结构,同时在Web脚本中创建任意数量的WinForm对象实例。
类似于.NET UI对象,我们知道,每一个ActiveX Control对象都有一个“ProgID”属性,一旦一个xobj元素的“objid”属性值指定为一个ActiveX Control对象的“ProgID”,那么在运行时,xobj元素即可被转化为对应的ActiveX Control对象。
开发者可以运用C++技术开发自己的xobj包装窗口,使得自己个性化的窗口成为动态UI的一部分,我们这里只针对MFC 的CView/CWnd对象做一个系统的说明。
首先需要用Visual Studio Wizard生成一个支持MFC的动态链接库工程,工程生成之后,按照规定的步骤增加AIGCSDK支持。开发者需要在生成的工程之中添加一组“基类”为“CView或者CWnd”的MFC类:
| 特别强调的是每一个添加的“CWnd派生类”都需要实现如下“一对MFC宏”: |
每一个支持AIGCSDK的MFC工程(应用程序工程、动态链接库工程),其“CWinApp派生类”之中有一个“字典类m_mapDOMObj”,开发者按照如下表格显示的方式在“InitInstance”函数中插入“CString-CRuntimeClass” 键值对:
| #include "SomeView.h" #include "SomeWnd.h" BOOL CTangramApp::InitInstance() { m_mapDOMObj[_T("someview")] = RUNTIME_CLASS(CSomeView); m_mapDOMObj[_T("somewnd")] = RUNTIME_CLASS(CSomeWnd); return __super::InitInstance(); } |
开发者可以根据需要插入任意数量的“键值对”,同时需要注意“include”关系处理:
| #include "SomeView.h" #include "SomeWnd.h" |
如果我们希望xobj元素支持MFC/C++类,需要开发者按如下方式指定xobj元素的相关属性:
| <xobj objid="libname" xobjtype="keyname">xobj> |
xobj的“objid”属性指定“C++窗口对象类”的来源:
|
如果您是Java开发者,AIGCSDK会使得您的可执行文件直接成为一个“Eclipse Launcher”,在Eclipse Workbench、Eclipse View以及SWT Form之中,直接使用xobj元素:
![]() | 如左图所示,开发者的应用工程,会直接做为一个java宿主应用,同时,由于Eclipse之中的SWT窗口对象基本上都是“窗口核”对象,因此Eclipse会直接成为集Java、COM、.NET、Web的应用平台。左侧图片显示的是开发者的MFC应用与Eclipse控制台直接合并之后的窗体。 |
我们会在后续的文章中做进一步、详细的介绍。