搜索
bottom↓
回复: 24

emWin做界面如何实现界面和业务分离?

[复制链接]

出0入0汤圆

发表于 2019-5-13 10:05:06 来自手机 | 显示全部楼层 |阅读模式
stm32f7运行emWin做界面。
由于市场需求,同一产品需要支持不同风格的界面,业务逻辑基本一样,只是界面布局贴图等不同。

比较笨的做法:将代码复制一遍,将ui部分重新设计编写,但这样需要同时维护两份代码;
目前想参考mvc等模式,做到业务和界面分离,这样一套代码做两份不同的UI界面,编译的时候选择相应的界面文件编译即可,而其它代码(业务等)只需维护一份。

但是具体到gui实现的时候,不知道如何下手了,是将界面布局单独放一个文件,事件回调函数单独提出来作为一个文件?然后回调里再调用业务函数?
qt里有信号槽机制,好像更容易实现。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出100入143汤圆

发表于 2019-5-13 10:24:46 | 显示全部楼层
界面只调用业务逻辑数据显示,要反向操作都是传消息到业务逻辑处理;界面切换用宏或者存一个参数,在UI界面管理员模式可选择界面风格

出0入0汤圆

发表于 2019-5-13 10:26:27 | 显示全部楼层
把界面元素做成一个个文件,然后项目里包含不同的文件即可

出0入0汤圆

 楼主| 发表于 2019-5-13 14:35:29 来自手机 | 显示全部楼层
myxiaonia 发表于 2019-5-13 10:26
把界面元素做成一个个文件,然后项目里包含不同的文件即可

是说一个界面一个文件?

出0入264汤圆

发表于 2019-5-13 15:12:01 | 显示全部楼层
数据驱动。

出40入42汤圆

发表于 2019-5-13 15:28:08 | 显示全部楼层
用一个参数表示界面风格;
如果不同风格在同一个界面相差不大,同一个文件可以通过调用不同模式的界面初始化函数来切换显示;
如果界面相差较大,就分开来独立文件,通过框架和参数判断来切换新界面

出140入8汤圆

发表于 2019-5-13 20:01:39 | 显示全部楼层
#if #include 很好用的啊

出0入0汤圆

发表于 2019-5-13 21:20:03 | 显示全部楼层
等大神讲解

出0入8汤圆

发表于 2019-5-13 22:54:58 | 显示全部楼层

大师可以再进一步提示吗

出0入0汤圆

发表于 2019-5-14 08:35:51 | 显示全部楼层
参考MVVM设计模式

出0入0汤圆

 楼主| 发表于 2019-5-14 14:54:20 来自手机 | 显示全部楼层
GoingDown 发表于 2019-5-14 08:35
参考MVVM设计模式

看了下,前后端用的,这个要应用到嵌入式中,具体咋实施呀

出0入0汤圆

发表于 2019-5-14 16:26:21 | 显示全部楼层
显示图片按图片的文件名来显示,对齐用相对对齐方式。

出0入0汤圆

 楼主| 发表于 2019-5-14 17:48:50 来自手机 | 显示全部楼层
落叶知秋 发表于 2019-5-13 15:28
用一个参数表示界面风格;
如果不同风格在同一个界面相差不大,同一个文件可以通过调用不同模式的界面初始 ...

忘了说了,是一台机器换个界面并重新换个外壳,作为一个新的品牌或型号进行销售(功能其实差不多)。
因为不想维护两套代码,为了减少代码的维护工作才有这个需求,想着能不能一套源代码,通过界面、业务分离或者其他手段 实现编译出两套程序。
不需要在一台机器上同时实现两套界面的切换。

出0入0汤圆

 楼主| 发表于 2019-5-14 17:51:25 来自手机 | 显示全部楼层
zzh90513 发表于 2019-5-13 10:24
界面只调用业务逻辑数据显示,要反向操作都是传消息到业务逻辑处理;界面切换用宏或者存一个参数,在UI界面 ...

界面只调用业务逻辑数据显示可以理解,
反向操作是传消息到业务处理。这个如何理解呀

出100入143汤圆

发表于 2019-5-14 18:23:08 | 显示全部楼层
wq_601840968 发表于 2019-5-14 17:51
界面只调用业务逻辑数据显示可以理解,
反向操作是传消息到业务处理。这个如何理解呀 ...

1)用了RTOS,就是具体业务逻辑处理还是在业务源码内定义函数,界面通过发消息(消息队列,事件等),然后业务处理反馈结果;
2)每个模块或者窗口一个GUI文件,通过LCD选择界面风格就行了(emWin调用不同的窗口创建函数)

出40入42汤圆

发表于 2019-5-15 08:59:36 | 显示全部楼层
wq_601840968 发表于 2019-5-14 17:48
忘了说了,是一台机器换个界面并重新换个外壳,作为一个新的品牌或型号进行销售(功能其实差不多)。
因 ...

宏定义开关加上版本管理就可以了
如果一开始界面显示和数据逻辑处理就分开了,就改起来快一点
如果没有分开,也无所谓,代码熟悉的话也改起来快点,就改改界面

出0入0汤圆

 楼主| 发表于 2019-5-17 16:24:28 来自手机 | 显示全部楼层
落叶知秋 发表于 2019-5-15 08:59
宏定义开关加上版本管理就可以了
如果一开始界面显示和数据逻辑处理就分开了,就改起来快一点
如果没有分 ...

关键是现在界面显示和业务处理咋分开呀

出0入0汤圆

 楼主| 发表于 2019-5-17 16:28:31 来自手机 | 显示全部楼层
zzh90513 发表于 2019-5-14 18:23
1)用了RTOS,就是具体业务逻辑处理还是在业务源码内定义函数,界面通过发消息(消息队列,事件等),然后 ...

关于第一点:“界面通过发消息(消息队列,事件等),然后业务处理反馈结果”
界面发消息给业务吗,业务收到消息后执行处理函数;
“然后业务处理反馈结果” 业务的反馈结果如何反馈给界面?

出100入143汤圆

发表于 2019-5-17 16:39:48 | 显示全部楼层
wq_601840968 发表于 2019-5-17 16:28
关于第一点:“界面通过发消息(消息队列,事件等),然后业务处理反馈结果”
界面发消息给业务吗,业务 ...

看情况啊,不等待的业务直接调用函数,需要等待的也一样用信号量或者队列传递状态;

出0入0汤圆

 楼主| 发表于 2019-5-17 16:47:36 来自手机 | 显示全部楼层
mcu_lover 发表于 2019-5-13 15:12
数据驱动。

大神说的是这个吗?
https://www.cnblogs.com/ztfjs/p/data_engine.html

看了下,我理解数据模型是界面和业务之间的桥梁,界面和业务之间不会直接耦合,不知道理解有没有问题?

另外有些疑问:
1、建立数据模型没有问题;
2、界面如果要修改数据模型,直接调用数据模型修改接口,那么业务如何能够做到立即做出反应;比如我要控制加热器,界面设定温度和开关,那么业务如何知道开始加热?
3、同样道理,业务调用数据修改接口修改了数据,界面如何能够立即刷新?

出0入0汤圆

 楼主| 发表于 2019-5-17 16:52:04 来自手机 | 显示全部楼层
zzh90513 发表于 2019-5-17 16:39
看情况啊,不等待的业务直接调用函数,需要等待的也一样用信号量或者队列传递状态; ...

对于需要等待的,gui发送完消息给业务以后 再阻塞等待业务反馈的信号?

出0入0汤圆

发表于 2020-3-14 22:46:59 来自手机 | 显示全部楼层
数据业务和界面密不可分,分开更麻烦

出0入8汤圆

发表于 2020-3-15 08:04:42 来自手机 | 显示全部楼层
听取大神的意见

出0入0汤圆

发表于 2020-3-15 11:53:50 来自手机 | 显示全部楼层
MVC设计模式,软件工程中基本的软件架构,读书加实践

出0入0汤圆

发表于 2020-3-15 19:31:16 来自手机 | 显示全部楼层
上面大佬都已经回答了,mvvc设计模式,简单点,数据驱动,ui模块成对象,按情况加载
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 07:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表