4.0相对于3.x最大的区别就是4.0的核心模块全部使用类COM接口导出。
为了实现这个目标,原来的SOUI的一些重要的设计到了4.0需要做重新设计。
### 3.0升级4.0注意事项
1. 原SOUI_CLASS_NAME替换为DEF_SOBJECT, 且第一个参数是它的基类
2. 事件定义使用DEF_EVENT/DEF_EVENT_EXT这两个宏来定义,使用使用方法参见系统事件
3. 内置的ResProvider使用SouiFactory来创建,不再提供全局函数创建。
4. resbuilder重写,定R,UIRES的方法有点变化。参考demo
5. SEventArgs替换为IEvtArgs
6. 原代码中直接使用pugi_xml,4.0中统一使用SOUI包装后的SXmlDoc, SXmlNode, SXmlAttribute。对应的接口为IXmlDoc, IXmlNode, IXmlAttribute。
7. 原代码中使用的IPen, IBrush, IBitmap, IRegion, IPath等IRenderObj对象统一增加S后缀,变为IPenS, IBrushS, IBitmapS, IRegionS, IPathS等,主要是C接口中不支持命名空间,导致可能和系统接口重名。(最新修改在C++版本中增加了兼容定义)
8. 为了兼容C接口,所有接口的方法都没有了默认参数。比如IRenderTarget.SelectObject,3.0第二个参数默认为NULL, 新版本没有默认参数,必须写全参数。(最新修改已经可以兼容默认参数)
9. XxxView的适配器接口有调整,所有方法都统一使用WINAPI调用,原SWindow*的参数替换为SItemPanel*, 原pugi::xml_node替换为SXmlNode。
10. SHostWnd不直接继承自SWindow,而是只继承SNativeWnd, 需要使用GetRoot()来获取顶层SWindow*
11. SXmlDoc对象和pugi::xml_document一个区别在于SXmlDoc不继承SXmlNode, 要获取root节点,可以使用SXmlDoc.root()方法。
前面几点,通常不修改对,编译就会失败,最后一点可能比较容易忽略。
在pugixml只,xml_document也是一个xml_node,但是SXmlDoc并不是SXmlNode,要获取原来的xml_document所代表的节点,必须使用SXmlDoc.root()方法来获取。
此外,在定义新的事件的时候,如果事件只不需要扩展事件字段,则应该加入一个任意的简单数据类型字段,防止C接口版本编译失败,例如:
[C++] 纯文本查看 复制代码 DEF_EVT(EventInit, EVT_INIT, on_init, { int fake; });
此处的int fake;即为一个不需要的事件字段。
|