PowerBuilder编程新思维5:包装(界面美化与WebUI+React)

前一节,分析了三种界面美化方案,都是控件级的美化。今天再来分析一下窗口级的美化。上一次讲的DirectUI,大家反响一般,效果和创新都不足。那是没有讲完的原故。今天……还是没有讲完,不过效果应该还行吧:)。

PB界面美化方案四:DirectUI包装

Hook的方式使用DirectUI,是局限在控件里。如果创建一个类似Canvas的可视控件,把所有控件包装在一个(或几个)控件里面,我把这种方式称之包装(Wrap)。

在现有界面上改造,不需要改动原有代码,只需在界面open事件中打开u_dui控件,并of_load("ui.xml")即可,所有消息转到相应名称的控件的事件中。ui.xml是DirectUI的界面定义文件,如下图(所有资源来源于网络)

PB界面美化方案五:Sciter(WebUI)包装

相比DirectUI的界面包装,WebUI的界面包装更为流行。使用Web控件替代原有控件,可以做出非常好的效果。

Sciter及其前身HtmlLayout,都是大名鼎鼎的WebUI控件,使用广泛。Sciter的Powerbuilder封装,在PowerFramework中有提供。

Sciter是最早一批专业的WebUI解决方案,相比Cef近百兆的体积,它的只有几兆。所以在通用软件中广泛使用。

Sciter的缺点就是不完全与Js兼容,在体积与速度方面有优势,在兼容性方面就有劣势了。由于前端饱受IE的折磨,建议对体积与速度方面不太敏感的应用不要使用。

Sciter的效果还是很赞的,下图是QQ动态登录界面。

PB界面美化方案六:Miniblink(WebUI)包装

Miniblink是这两年冒出的嵌入式Web新秀,更新非常快,所以用起来很放心。它的大小20多兆,比Cef小很多,而且使用的是比较新的Chrome内核版本,相比Sciter,Miniblink几乎没有兼容性的问题。可以顺利运行几乎所有的前端框架。

PowerFramework也封装了Miniblink,而且还全面导出了Powerbuilder的JS接口,使用方便。在PowerPlume里面,也封装了Miniblink(u_wui),但是没有像n_lua对象,或者PowerFramework一样导出JS接口。至于为什么,往下看就知道了。使用效果如下图:

PB界面美化方案七:DirectUI自动包装

前面所说的包装(Wrap)全部都手工进行的,就是手工编写相应的XML,或者HTML。对于个别的界面美化是可行的,如果对于大型管理软件做这样的美化修改是不可能的。界面的数量太多,手工编写工作量太大,而且测试工作量同样巨大。这时,我们要求对现有界面进行自动包装,生成相应的XML或者HTML。

DriectUI的自动包装工作,比较好做。只需在控件的相应位置,添加一个控件,把原有控件置为底层即可。

u_dui控件使用方法如下:

 1 if not isvalid(iu_dui) then
 2     cb_unwrap.event clicked()
 3     OpenUserObject(iu_dui, "u_dui", 0, 0)
 4     iu_dui.of_load("ui2.xml")
 5
 6     iu_dui.of_wrap(cb_dui, "")
 7     iu_dui.of_wrap(cb_wui, "")
 8     iu_dui.of_wrap(cb_unwrap, "")
 9
10     iu_dui.of_wrap(st_1, "")
11     iu_dui.of_wrap(st_2, "")
12     iu_dui.of_wrap(sle_1, "")
13     iu_dui.of_wrap(sle_2, "")
14 end if

对于Datawindow这样的控件,暂时没有包装方案,所以不动即可。

PB界面美化方案八:WebUI自动包装

这个部分最难。涉及的方面非常多。

要求生成的代码必须要有通用性、可定制化、简单清晰。要达到这个要求,必须是动态页面,而非静态HTML。所以选型的时候,重点考虑了React、Vue、Angular,而不是传统的JQuery+Bootstrap。

React作为大热的前端框架,这里就不详细介绍了。React只负责View的部分,这正是我们需要的,相比大而全的Angular更适合WebUI包装。而基于MVVM模型的Vue,则可能在接口方面有更底层的修改需求,所以最终选择了React。

完整的MVC框架,应该是React+Redux组合,则使用PB替换Redux就是我们的目标。首先,我们来分析一下Redux。下面是简化版Redux:

// Mini Reduxconst createStore = (reducer) => {let state;let listeners = [];const getState = () => state;const dispatch = (action) => {state = reducer(state, action);listeners.forEach(listener => listener());};const subscribe = (listener) => {listeners.push(listener);return () => {listeners = listeners.filter(l => l !== listener);}};dispatch({});return { getState, dispatch, subscribe };};const reducer = function (state, action) {...return null;};const store = createStore(reducer);const state = store.getState();

由于Redux的灵感来自于Flux的单向数据流,所有的数据只有一个入口Reducer。所以,最终设计的JS接口只有一个(又双叒叕是一个接口?!)

pbSend( { type: 'clicked', payload: {name: 'button', value: ''} } );

u_wui的使用方式与u_dui类似,只多了一个of_render(template, output)接口

 1     OpenUserObject(iu_wui, "u_wui", 0, 0)
 2     iu_wui.width = parent.width
 3     iu_wui.height = parent.height
 4
 5     iu_wui.of_wrap(cb_dui, "")
 6     iu_wui.of_wrap(cb_wui, "")
 7     iu_wui.of_wrap(cb_unwrap, "")
 8
 9     iu_wui.of_wrap(st_1, "")
10     iu_wui.of_wrap(st_2, "")
11     iu_wui.of_wrap(sle_1, "")
12     iu_wui.of_wrap(sle_2, "")
13
14     iu_wui.of_render("res/html/wui.tpl", "res/html/wui.html")

WebUI在使用时,加载会有一段时间的空白页面, 可以使用各种技术手段来解决,比如加载动画,比如服务端渲染(缓存的方式)等等,本节就不深入了。


 预告:PowerPlume共分为内外上下后前6部分18篇,敬请期待。

有人留言说,PB9能不能支持,当然能支持(多了pblua.pbd,pbdui.pbd,pbwui.pbd三个文件)。PB8及以下的由于不支持PBNI,所以不能支持。

WindowsXP不能运行的问题,没有测试过,本次试着降级VC++版本为VC2010进行编译。

源码: PowerPlumeDemoV0.5.3.rar

提供了PB9.0 PB10.5 PB11.5 PB12.5四个版本

 Miniblink node.dll: node.rar

Miniblink由于太大,所以没有包含在源码内,采用的是miniblink-190226版本,使用其它版本可能会找不到API。

<本节完>

转载于:https://www.cnblogs.com/windfic/p/10687748.html

PowerBuilder编程新思维5:包装(界面美化与WebUI+React)相关推荐

  1. python三维建模_3D One 2.5引爆新思维,用趣味编程来实现3D建模!

    原标题:3D One 2.5引爆新思维,用趣味编程来实现3D建模! 3D One2.5正式版终于和大家见面啦!新版本全新推出趣味编程,让3D模型也能通过编程逻辑来完成,丰富你的创新想象力.这给有计划开 ...

  2. 《JavaScript设计与开发新思维》——1.7 JavaScript编程目标

    本节书摘来自异步社区<JavaScript设计与开发新思维>一书中的第1章,第1.7节,作者:[美]Larry Ullman著,更多章节内容可以访问云栖社区"异步社区" ...

  3. 【Qt编程】基于Qt的词典开发系列六--界面美化设计

    本文讲一讲界面设计,作品要面向用户,界面设计的好坏直接影响到用户的体验.现在的窗口设计基本都是扁平化的,你可以从window XP与window 8的窗口可以明显感觉出来.当然除了窗口本身的效果,窗口 ...

  4. Widget-苹果.谷歌和诺基亚着迷的网络新思维

    Widget-苹果.谷歌和诺基亚着迷的网络新思维 2007.09.10  来自:环球企业家      共有评论(4)条 发表评论   [收藏到我的网摘] 这家网络巨头的方向调整,折射出一个有趣的现实: ...

  5. 博客园开发征途又添新书《.NET软件设计新思维——像搭积木一样搭建软件》出版...

    经过半年的编写,这本书终于与大家见面了,希望本书能给朋友们更多的编程帮助.     特别感谢微软MVP中国区最有价值专家主管--林思绮 为本书作序,还有MVP好友王涛.周金桥.郑健为本书做的校验与书评 ...

  6. linux界面美化 简书,Ubuntu 18.04 LTS 界面美化方法

    Ubuntu 系统是一款非常入门级的Linux操作系统, 简单易用 , 软件源也比较丰富, 大多数软件工具可以直接下载安装使用,对于不会编程的小白来说,省去了不少折腾时间. 当我们第一次安装Ubunt ...

  7. 《.Net 软件设计新思维:像搭积木一样搭建软件》成书背后的故事

    本文节选自<.Net 软件设计新思维:像搭积木一样搭建软件 >一书 前   言 一个真实的故事 1996 年 10 月,一套经历了 2 年多时间开发出来的商务管理软件终于问世了,它带给我们 ...

  8. C语言设计新思维分享

    没有任何套路,直接获取资源 C语言已经有几十年的历史了,经过长时间的发展和普及,C语言的应用场景也有了很大的变化,一些的老的观念已经不在适用,在这里给大家推荐一本讲C语言特别好的书,<C语言设计 ...

  9. 【响应式编程的思维艺术】 (3)flatMap背后的代数理论Monad

    [摘要]本文是Rxjs 响应式编程-第二章:序列的深入研究这篇文章的学习笔记. 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 划重点 文中使用到 ...

最新文章

  1. CVPR 2021接收结果出炉!录用1663篇,接受率显著提升,你的论文中了吗?(附论文下载)...
  2. sql将一列拆分为多列_【Excel实用技巧】把一列数据拆分为多列的三个菜鸟招数,你还有更菜的方法吗?...
  3. 【Android】系统目录理解
  4. 百度php editor图片上传到其他盘,百度编辑器Editor图片独立上传
  5. java json 去除空_详解Java去除json数据中的null空值问题
  6. UITableView基本用法
  7. java中的变量是原子的_Java原子变量
  8. angularJS使用编写KindEditor,UEidtor,jQuery指令,双重绑定
  9. mac 安装php swoole扩展
  10. python 迭代器 删除_Python学习100天-Day08(迭代器解析)
  11. python验证码校验代码_python 图片验证码代码
  12. 安卓GLSurfaceView使用简单范例
  13. C# 读取TXT文本文档 搜索指定字符串所在的行 保存到集合
  14. LaTeX 排版(二)——排版数学公式
  15. No administrator rights detected!
  16. 电子科技大学计算机学院拟录取,2021年电子科技大学硕士研究生拟录取名单
  17. 迅捷pdf转换器:如何将pdf转换成word
  18. Matlab实现滤波器,进行ASK、FSK、多音信号的滤波
  19. 出现“连接到服务器失败。错误: 0x80080005”错误的解决办法
  20. 百分点大数据技术团队:BI嵌入式分析实践

热门文章

  1. PHP大道至简之swoole请求必应壁纸
  2. 【对讲机的那点事】手把手教你玩转特易通TH-F8对讲机恢复出厂设置
  3. 智慧城市同城V4 v2.1.2
  4. 我的世界服务器加皮肤不显示不出来,我的世界启动器添加皮肤,启动器为什么换不了皮肤...
  5. viper4android蓝牙耳机,1more ibfree蓝牙耳机音质怎么样
  6. cf两边黑屏怎么解决win10_win10屏幕黑屏就剩鼠标怎么回事 开机黑屏只有鼠标的五种解决方法...
  7. LaTeX支持中文英文混排编译的三种方式—Slager!
  8. 【黎曼积分】第一型曲面积分公式推导
  9. HHUOJ 1846 呆子
  10. echo服务编写Linux,linux – inetd和echo服务