搜索
bottom↓
回复: 15

自己编的一个GUI 用时两个星期实现了基本的创建window删除window 和一种字体 在Wind

[复制链接]

出0入0汤圆

发表于 2011-1-16 13:12:05 | 显示全部楼层 |阅读模式
点击此处下载 ourdev_611378QIZBCH.rar(文件大小:340K) (原文件名:MyGUI演示.rar)

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2011-1-16 13:13:08 | 显示全部楼层
以上是朋友帮忙做的演示

出0入0汤圆

 楼主| 发表于 2011-1-16 13:26:32 | 显示全部楼层
源码 VC 6.0的工程  键盘 a, b, c  分别建立1,2,3 三个窗口 x y z 分别关闭三个窗口  
每个窗口都有回调函数 和WIN32 的概念差不多


点击此处下载 ourdev_611382T02SHR.rar(文件大小:2.25M) (原文件名:MyGUI.rar)

出0入0汤圆

 楼主| 发表于 2011-1-16 13:36:39 | 显示全部楼层
上图


(原文件名:DeskTop.jpg)


(原文件名:window 1  created.jpg)


(原文件名:three window created.jpg)


(原文件名:Change window 1 to top layer.jpg)

出0入0汤圆

 楼主| 发表于 2011-1-16 13:39:38 | 显示全部楼层
可以移植到嵌入式系统 当前的功能用 ADS1.2 ARM指令编译 10KB 的 flash ROM 2KB 的SRAM

出0入0汤圆

发表于 2011-1-17 08:46:50 | 显示全部楼层
回复【4楼】YFM_LMM  
可以移植到嵌入式系统 当前的功能用 ads1.2 arm指令编译 10kb 的 flash rom 2kb 的sram
-----------------------------------------------------------------------

看到这个就要先顶了

出0入0汤圆

发表于 2011-1-17 09:16:49 | 显示全部楼层
现在看不了,回去再看下

出0入0汤圆

 楼主| 发表于 2011-1-17 10:31:38 | 显示全部楼层
回复【5楼】amwox
-----------------------------------------------------------------------

那个是我估计的值 我用的是uC/OS 加上MyGUI 在ADS上编译flash是23KB sram是5.1KB 先前单独编译过uC/OS使能所有功能时是15KB Flash 所以我估计我的GUI是10KB

出0入0汤圆

发表于 2011-1-17 10:40:59 | 显示全部楼层
好东西!~

出0入0汤圆

 楼主| 发表于 2011-1-17 11:44:14 | 显示全部楼层
需要说明几点:这个GUI将桌面当作一个特殊的Window来控制,它也有他的回调函数,所以可以修改这个回调函数来美化桌面,整个GUI

没有用SRAM存储图像,所有的窗口操作全部基于消息机制和回调函数,所以在删除一个Window和将一个Window翻到最顶层时可能会很费

时间,这一点有待优化,当前删除Window时和将一个Window翻到最顶层时用的重画策略是给每一个剩下的Window发送一个

GUI_WININVALID_SYS 消息到其消息队列中。每个以创建Window都有一个私有的数据结构-> "WCB"即 Window Control Block 这个思想和

命名方式借用了uC/OS 。所有已创建的Window的WCB组成了一个有序链表,注意它是有序的,因为桌面上的Window有层次之分所以越靠下

层的Window的WCB在链表中越靠前,这是为了GUI的一个核心函数 void GUI_SendMSGToCallBack(void) 在定时检索WCB中消息队列中的消

息并将消息发给Window 的 callback 时方便而定的结构,也就是说如果所有Window都需要修改客户区的内容那就会是最底层的Window先

修改然后一层一层往上。 新建一个Window时其总是出现在最顶层,可以用void GUI_ChangeWindowToTop(INT8U ID) 这个函数来把一个

Window置为最高层,ID 为要操作Window的ID。整个GUI的窗口管理采用集中的管理方法: GUI 有两个核心函数   

void GUI_WindowManager(void) 和 void GUI_SendMSGToCallBack(void) 这两个函数总是同步执行 WindowManager 在前

SendToCallBack 在后,且都在一个固定的时间点执行(就像uC/OS中的 Tick),且都加入了一个状态变量使其不可重入。

WindowManager 每次依次检查已建Window的状态并转换为消息放置在对应Window的消息队列里,然后SendMSGToCallBack 依次检查每个

Window 的消息队列是否为空,如果不是就将消息作为这个Window的CallBack函数的输入参数并调用这个CallBack(相当于发信息)

CallBack 根据消息进行一些操作:比如画图,输出文字。。。。。。 。也就是说所有的显示器操作在SendMSGToCallBack函数内完成

且下一轮的void GUI_WindowManager(void) 和 void GUI_SendMSGToCallBack(void) 函数的执行在上一轮的SendMSGToCallBack函数没

有返回前不会开始。 Window Create, Window Delete 等用户可操作的函数都只是改变Window的状态而此状态会在下一轮的

GUI_WindowManager 函数的执行中被识别


最后 这个GUI可以由用户规定最多可用多少Window 每个Window消息队列有多长,以及使用多大的显示器。

出0入0汤圆

 楼主| 发表于 2011-1-17 11:50:32 | 显示全部楼层
对了还有可以指定窗口的风格 :有无边框, 有无最大化,最小化,以及关闭按钮,以后会有滚动条,且会支持鼠标等定位设备

出0入0汤圆

发表于 2011-1-17 12:14:34 | 显示全部楼层
GUI是否还会不断增加控件?

出0入0汤圆

发表于 2011-1-17 16:20:25 | 显示全部楼层
支持一下,一直打算写一个,只完成了底层的函数,窗口控件的消息传递机制还没有找到一个非常好的

出0入0汤圆

 楼主| 发表于 2011-1-17 19:00:03 | 显示全部楼层
回复【11楼】ljt8015
-----------------------------------------------------------------------

会,但我对控件的概念还不是太懂,将来看看Windows是怎么做的。

出0入0汤圆

发表于 2011-1-17 23:40:54 | 显示全部楼层
顶一个~~~~~~

出0入0汤圆

 楼主| 发表于 2011-2-15 16:55:03 | 显示全部楼层
过年的十天,完成了基本的GDI 函数和控件的框架。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-24 01:29

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

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