中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-07-31 21:58
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » giCell 真正的GUI窗口系统(已共享源码) 查看 15,180 回复 35
楼 主 giCell 真正的GUI窗口系统(已共享源码) 发表于 2006-12-06 08:48 ·  中国 辽宁 沈阳 联通
高级用户
★★
积分 739
发帖 111
注册 2004-11-30 00:00
21年会员
UID 34209
性别 男
来自 辽宁沈阳
状态 离线
源代码下载:http://www.cn-dos.net/forum/attachment.php?aid=3573&checkid=01076&download=1
注意:C_code.rar文件纠正了回调函数无法使用浮点数操作的问题...
演示下载:http://zhenlove.com.cn/cndos/fileup/files/gui_demo.rar


完整功能如下所述:

rtCell 实时微内核-具有下列功能:

1. 完全抢占的实时微内核结构,独立的内核栈,中断和系统调用均切换到内核栈执行;

2. 256(64、32)个优先级,0为最高优先级(系统保留),256(64、32)为空闲优先级;

3. 不同优先级任务完全抢占,同优先级之间可按先进先出或时间片轮转方式执行;

4. 在一系统(定时器服务)任务中实现内核定时器,用于超时等待内核对象、周期性定时器、任务延迟、一次定时(此时需定义一超时后执行的过程);此服务任务的优先级由其客户任务的最高优先级驱动,随之动态改变,以消除隐式优先级反转现象;

5. 提供任务(Task)、互斥锁(Mutex)、信号量(Semaphore)、位域标志(Flag定时器(Timer)、优先级消息(Message)和环形队列(Ring buffer)内核对象;

6. 任何内核对象用一整数ID标识,而非指针,从而可避免用户任务野指针的副作用,内核对象总数不超过61440(即60K);

7. 互斥锁支持优先级继承和优先级置顶协议,在创建时设置该协议,且总按优先级等待,优先级继承协议时仅支持同一互斥锁的嵌套调用,优先级置顶协议还可支持不同互斥锁的多次嵌套调用;

8. 其它对象的等待方式有:优先级等待和先进先出(节省内存)等待,在创建时设置;

9. 内核数据的同步,除在任务切换,及任务和内核之间切换堆栈时暂时关中断外,其它地方均以延迟过程调用(DPC)方式执行;

10. 任务对象支持异步过程调用(Window用语APC,相当于UNIX中的信号机制),从而可引导任务异步的执行一个过程(前提是任务栈不小于1024字节),此过程将在该任务下次被调度时执行;

11. 删除避免机制,拥有互斥锁的任务及处于占有状态的互斥锁均具有防止被删除的机制,要删除拥有互斥锁的任务必须自行终止或调用任务终止函数,而要删除任一个互斥锁则必须先使其处于空闲状态,即没有任何任务占有此互斥锁,否则禁止删除;

12. 对象命名机制,同类内核对象可用唯一的名称标识来获取其ID,达到引用目的。

13. 在内核中实现了中断的进出接口,因此用户中断处理只需写标准的C函数,而不必关心中断底层处理的细节;

14. 系统调用以陷阱指令(x86中int指令)实现,易于扩展到“内存保护”的进程模式;

15. 在内核库之外提供了一个简单的堆内存分配机制,用于内核对象动态内存分配时调用;

16. 支持毫秒级定时器,内核定时器周期为一毫秒;

17. 支持 X387/287 硬件浮点协处理器的任务状态保护,被动方式的任务浮点状态切换(开中断执行,由于使用了特权指令实现,因此只能在纯DOS实模式下或虚拟机X386/X387及后续机型上执行,而无法在Windows的DOS窗口中运行)。



giCell 视口裁减及消隐处理引擎-功能如下:

1. 完善而精巧的多视口裁剪和消隐处理引擎,与微内核rtCell紧密结合;

2. 真正的事件(或消息)驱动的多窗口(视口)技术,支持顶层窗口和透明窗口的显示和裁剪处理;

3. 当前支持Label、Edit、Botton、Slider、Listbox、TreeView和Checkbox控件,其中的Edit控件支持剪切、复制和粘贴(ctrl+x,ctrl+c,ctrl+v);

4. 支持窗口的平移、缩放,光标切换和窗口系统按钮,及窗口和控件的过程回调;

5. 基于透明视口(或窗口)的裁剪和消隐处理,可生成任何非矩形(多态)窗口,本示例中的三角形窗口就是基于透明视口来实现的;

7. 支持图形内存设备(GDC),有效避免窗口重绘时闪烁,易于实现视频及动画处理;

6. 内存需求小,窗口和控件的缺省状态均不使用GDC(而是采用直接屏技术),所耗内存小,因此实用性强,包括rtCell调度器、鼠标、键盘及图形驱动的库文件在DOS下仅77K。



关于可文件Engine.lib和mcOutLib.obj:

1. 考虑到DOS内存的限制,库文件Engine.lib中的rtCell内核仅支持32个任务优先级(因为优先级队列太占用内存),这样即使在640K内存下,也可创建上数百个内核及GUI对象,可满足一定规模的应用程序要求;

2. 库文件mcOutLib.obj是目录giCell\mcOSLib下文件的编译结果,用于处理任务的浮点协处理器(硬件)状态切换,任务浮点数状态初始化,内存分配,信息显示等操作(主要用于内核),用户也可自己编译giCell\mcOSLib目录下的文件,注意:Borland C/C++ 3.1可能无法识别其中的某些浮点数操作指令;

3. 文件MAIN.C是对Engine.lib使用的具体实例,在Borland C/C++ 3.1中编译时必须打开X387/287选项和C函数参数传递约定,此文件还对任何使用透明窗口来生成非矩形窗口,以及如何使用GDC生成动画进行了演示;

4. 注意其中的一些执行顺序:浮点数操作不得放到回调函数中执行,而只能在其它任务中执行(可从回调函数中向其它任务发送消息来实现),否则程序将进行无限循环;

5. 因为浮点协处理器的任务状态切换机制使用了特权指令,所生成的可执行文件只能在纯DOS实模式下或虚拟机X386/X387及后续机型上执行,而无法在Windows的DOS窗口中运行;

6. 由MAIN.C所生成的可执行文件在AMD机器DOS实模式、X86虚拟机qemu-0.9.0-windows以及Bochs-2.1.1下均执行良好,注意:生成的可执行文件依然是16位实模式。


压缩文件C_lib.rar中包含窗口及其子控件的源代码,演示文件MAIN.C和DateTime.c,以及一个专用于Borland C/C++ 3.1的工程文件。

注意:使用浮点数操作时最好把相关任务的栈设置到2K以上。


联系邮件:taowentao_twt@163.com, taowentao_twt@sohu.com

源代码下载:


汉字字库为Windows XP 标准9号宋体(http://www.cn-dos.net/forum/attachment.php?aid=3840&checkid=6c12e&download=1)

注意DOS不可重入,在GUI任务之外调用DOS功能之前应加GUI锁,调用之后应解锁,而且调用DOS功能的任务优先级应低于16:
void _cdecl_ GUILock(void); /* 锁定GUI,保护共享数据安全 */
void _cdecl_ GUIUnLock(void); /* 解锁GUI,加解锁应成对出现 */


此外,在此演示中还需矢量字库文件:KTDOT.PS,请到“矢量汉字显示实例——happybasic”(http://www.cn-dos.net/forum/viewthread.php?tid=27441&fpage=3) 中下载此文件

[ Last edited by taowentao on 2007-8-23 at 10:06 PM ]
[已使用 Gemini 解答]
Gemini 解答

技术实现说明

1. 核心机制:rtCell 微内核与 GUI 引擎的结合

  • 实时内核设计:rtCell 采用抢占式调度,通过独立内核栈隔离中断/系统调用与用户任务栈,避免野指针影响内核稳定性。内核对象使用整数 ID 而非指针,进一步降低用户态错误的副作用。
  • 优先级管理:支持最多 256 级优先级,通过「定时器服务任务动态调整优先级」的机制缓解隐式优先级反转(即低优先级任务占用资源导致高优先级任务等待)。互斥锁的优先级继承/置顶协议则针对显式优先级反转场景(如任务持有互斥锁时被高优先级任务抢占)。
  • GUI 与内核的协同:窗口系统基于事件驱动模型,通过微内核的消息队列(Message 对象)实现任务间通信。透明窗口的裁剪依赖「视口消隐引擎」对图形输出的逐像素判断,非矩形窗口通过标记透明区域实现(如三角形窗口的透明像素不参与绘制)。

2. 关键技术细节与限制

  • 浮点协处理器支持:任务切换时保存 X387/287 状态依赖特权指令(如 FNSTCW/FLDCW 结合内核态操作),因此仅能在纯 DOS 实模式或支持实模式的虚拟机(如 QEMU、Bochs)中运行,Windows DOS 窗口因权限限制无法使用。回调函数禁止浮点操作的原因是:回调通常在中断/内核上下文执行,此时浮点状态未被正确保存,易导致无限循环或数据损坏。
  • DOS 兼容性处理:DOS 系统调用(如文件操作)为单任务设计,不可重入。因此调用 DOS 前需通过 GUILock() 锁定 GUI(本质是暂停高优先级 GUI 任务),且调用任务优先级需低于 16(避免抢占内核接管的硬件中断)。
  • 图形性能优化:默认使用「直接屏技术」减少内存占用,重绘时通过「内存设备上下文(GDC)」预渲染再一次性输出,避免闪烁。TreeView、ListView 等复杂控件的滚动/缩放依赖独立的视口裁剪逻辑,确保仅更新可见区域。

3. 历史语境下的技术定位

2000 年代前后,DOS 平台的多任务 GUI 多基于协作式调度(如 Windows 3.x)或简单抢占式内核,rtCell 引入的优先级继承、APC(异步过程调用)等机制接近现代实时操作系统(如 VxWorks)的设计。但受限于 DOS 实模式的内存(640KB 基础内存)和硬件限制,内核仅支持 32 级优先级(默认编译选项),且任务总数受内核对象 ID 数量(61440)约束。

4. 后续讨论补充

  • 跟帖中用户提到「关键代码缺失」,可能是指 rtCell 内核的核心实现(如任务切换、调度器)未完全开源,仅提供了 GUI 控件层的代码。
  • 「Windows DOS 窗口无鼠标」的问题源于:Windows 下的 DOS 窗口未模拟实模式鼠标中断(如 IRQ12),而纯 DOS 下程序通过直接访问鼠标硬件端口实现输入。
本帖最近评分记录 (共 2 条) 点击查看详情
评分人分数时间
henrya2 +4 2007-06-16 10:14
AlexZhang +2 2007-06-30 12:47
附件
C_code.rar (105.64 KiB, 下载次数: 1121)
C_lib_hz.rar (243.62 KiB, 下载次数: 521)
来自山东,现居沈阳
2 发表于 2006-12-06 09:29 ·  中国 浙江 台州 玉环市 电信
管理员
★★★★
DOS非常爱好者
积分 6,215
发帖 2,601
注册 2006-01-20 13:00
20年会员
UID 49256
状态 离线
下载地址怎么有两个,试用了一下,都是一样的!
3 看你目录下有个sdl.dll,就知道是SDL库做出来的,没有移植性 发表于 2006-12-06 21:20 ·  中国 广东 清远 电信
荣誉版主
积分 57
发帖 23
注册 2006-10-28 21:37
19年会员
UID 68686
性别 男
状态 离线
不过看起来差不多
4 发表于 2007-01-02 12:53 ·  中国 江苏 连云港 赣榆区 电信
初级用户
积分 28
发帖 14
注册 2006-10-18 10:55
19年会员
UID 66342
性别 男
状态 离线
基本上比较客观,也比较全面
5 发表于 2007-01-03 03:15 ·  中国 辽宁 沈阳 移动
高级用户
★★
积分 739
发帖 111
注册 2004-11-30 00:00
21年会员
UID 34209
性别 男
来自 辽宁沈阳
状态 离线
主要是怕上传文件无法解压缩,因此准备了两份不同的压缩格式.请各位网友原谅.

另外请各位网友指点软件中的不妥之处,谢谢!

[ Last edited by taowentao on 2007-1-3 at 03:17 AM ]
来自山东,现居沈阳
6 发表于 2007-01-03 07:29 ·  中国 浙江 台州 玉环市 电信
管理员
★★★★
DOS非常爱好者
积分 6,215
发帖 2,601
注册 2006-01-20 13:00
20年会员
UID 49256
状态 离线
不会吧,能在这混的,应该都有压缩软件的,要不搞成自解压的也行
7 发表于 2007-04-04 10:32 ·  中国 辽宁 沈阳 联通
高级用户
★★
积分 739
发帖 111
注册 2004-11-30 00:00
21年会员
UID 34209
性别 男
来自 辽宁沈阳
状态 离线
最新演示:https://gro.clinux.org/frs/download.php/2000/giCell.rar

自带鼠标、键盘驱动。

演示方法:解压缩 giCell.rar,在windows下(双击)执行my_gui.bat,或在纯dos下直接执行my_gui.exe(在windows的dos窗口中无鼠标)。

rtCell 内核的新增功能:

1. 256(64、32)个优先级,0为最高优先级(系统保留),256(64、32)为空闲优先级;

2. 一次定时(此时需定义一超时后执行的过程);

3. 互斥锁支持优先级继承和优先级置顶协议,在创建时设置该协议,且总按优先级等待,优先级继承协议时仅支持同一互斥锁的嵌套调用,优先级置顶协议还可支持不同互斥锁的多次嵌套调用;

4. 任务对象支持异步过程调用(Window用语APC,相当于UNIX中的信号机制),从而可引导任务异步的执行一个过程(前提是任务栈不小于1024字节),此过程将在该任务下次被调度时执行;

5. 删除避免机制,拥有互斥锁的任务及处于占有状态的互斥锁均具有防止被删除的机制,要删除拥有互斥锁的任务必须自行终止或调用任务终止函数,而要删除任一个互斥锁则必须先使其处于空闲状态,即没有任何任务占有此互斥锁,否则禁止删除;

6. 对象命名机制,同类内核对象可用唯一的名称标识来获取其ID,达到引用目的。


giCell 图形多窗口的新增功能:

1. 鼠标功能改进,与window的鼠标事件更接近;

2. 基于透明视口(或窗口)裁剪和消隐处理,可生成任何非矩形窗口,本示例中的三角窗口 就是通过透明视口的功能来实现的。

[ Last edited by taowentao on 2007-5-2 at 04:53 PM ]
来自山东,现居沈阳
8 发表于 2007-05-25 02:58 ·  中国 广东 深圳 龙岗区 电信
新手上路
积分 8
发帖 4
注册 2007-05-24 02:38
19年会员
UID 89121
性别 男
状态 离线
能共享代码么?
9 源代码已经共享 发表于 2007-05-27 22:16 ·  中国 辽宁 沈阳 联通
高级用户
★★
积分 739
发帖 111
注册 2004-11-30 00:00
21年会员
UID 34209
性别 男
来自 辽宁沈阳
状态 离线
源代码下载:http://zhenlove.com.cn/cndos/fileup/files/C_lib.rar
http://www.cn-dos.net/forum/attachment.php?aid=3573&checkid=01076&download=1
演示下载:http://zhenlove.com.cn/cndos/fileup/files/gui_demo.rar
最新虚拟机(qemu-0.9.0-windows)演示:http://zhenlove.com.cn/cndos/fileup/files/qemu-0.9.0-windows.rar


完整功能如下所述:

rtCell 实时微内核-具有下列功能:

1. 完全抢占的实时微内核结构,独立的内核栈,中断和系统调用均切换到内核栈执行;

2. 256(64、32)个优先级,0为最高优先级(系统保留),256(64、32)为空闲优先级;

3. 不同优先级任务完全抢占,同优先级之间可按先进先出或时间片轮转方式执行;

4. 在一系统(定时器服务)任务中实现内核定时器,用于超时等待内核对象、周期性定时器、任务延迟、一次定时(此时需定义一超时后执行的过程);此服务任务的优先级由其客户任务的最高优先级驱动,随之动态改变,以消除隐式优先级反转现象;

5. 提供任务(Task)、互斥锁(Mutex)、信号量(Semaphore)、位域标志(Flag定时器(Timer)、优先级消息(Message)和环形队列(Ring buffer)内核对象;

6. 任何内核对象用一整数ID标识,而非指针,从而可避免用户任务野指针的副作用,内核对象总数不超过61440(即60K);

7. 互斥锁支持优先级继承和优先级置顶协议,在创建时设置该协议,且总按优先级等待,优先级继承协议时仅支持同一互斥锁的嵌套调用,优先级置顶协议还可支持不同互斥锁的多次嵌套调用;

8. 其它对象的等待方式有:优先级等待和先进先出(节省内存)等待,在创建时设置;

9. 内核数据的同步,除在任务切换,及任务和内核之间切换堆栈时暂时关中断外,其它地方均以延迟过程调用(DPC)方式执行;

10. 任务对象支持异步过程调用(Window用语APC,相当于UNIX中的信号机制),从而可引导任务异步的执行一个过程(前提是任务栈不小于1024字节),此过程将在该任务下次被调度时执行;

11. 删除避免机制,拥有互斥锁的任务及处于占有状态的互斥锁均具有防止被删除的机制,要删除拥有互斥锁的任务必须自行终止或调用任务终止函数,而要删除任一个互斥锁则必须先使其处于空闲状态,即没有任何任务占有此互斥锁,否则禁止删除;

12. 对象命名机制,同类内核对象可用唯一的名称标识来获取其ID,达到引用目的。

13. 在内核中实现了中断的进出接口,因此用户中断处理只需写标准的C函数,而不必关心中断底层处理的细节;

14. 系统调用以陷阱指令(x86中int指令)实现,易于扩展到“内存保护”的进程模式;

15. 在内核库之外提供了一个简单的堆内存分配机制,用于内核对象动态内存分配时调用;

16. 支持毫秒级定时器,内核定时器周期为一毫秒;

17. 支持 X387/287 硬件浮点协处理器的任务状态保护,被动方式的任务浮点状态切换(开中断执行,由于使用了特权指令实现,因此只能在纯DOS实模式下或虚拟机X386/X387及后续机型上执行,而无法在Windows的DOS窗口中运行)。



giCell 视口裁减及消隐处理引擎-功能如下:

1. 完善而精巧的多视口裁剪和消隐处理引擎,与微内核rtCell紧密结合;

2. 真正的事件(或消息)驱动的多窗口(视口)技术,支持顶层窗口和透明窗口的显示和裁剪处理;

3. 当前支持Label、Edit、Botton、Slider、Listbox、TreeView和Checkbox控件,其中的Edit控件支持剪切、复制和粘贴(ctrl+x,ctrl+c,ctrl+v);

4. 支持窗口的平移、缩放,光标切换和窗口系统按钮,及窗口和控件的过程回调;

5. 基于透明视口(或窗口)的裁剪和消隐处理,可生成任何非矩形(多态)窗口,本示例中的三角形窗口就是基于透明视口来实现的;

7. 支持图形内存设备(GDC),有效避免窗口重绘时闪烁,易于实现视频及动画处理;

6. 内存需求小,窗口和控件的缺省状态均不使用GDC(而是采用直接屏技术),所耗内存小,因此实用性强,包括rtCell调度器、鼠标、键盘及图形驱动的库文件在DOS下仅77K。



关于可文件Engine.lib和mcOutLib.obj:

1. 考虑到DOS内存的限制,库文件Engine.lib中的rtCell内核仅支持32个任务优先级(因为优先级队列太占用内存),这样即使在640K内存下,也可创建上数百个内核及GUI对象,可满足一定规模的应用程序要求;

2. 库文件mcOutLib.obj是目录giCell\mcOSLib下文件的编译结果,用于处理任务的浮点协处理器(硬件)状态切换,任务浮点数状态初始化,内存分配,信息显示等操作(主要用于内核),用户也可自己编译giCell\mcOSLib目录下的文件,注意:Borland C/C++ 3.1可能无法识别其中的某些浮点数操作指令;

3. 文件MAIN.C是对Engine.lib使用的具体实例,在Borland C/C++ 3.1中编译时必须打开X387/287选项和C函数参数传递约定,此文件还对任何使用透明窗口来生成非矩形窗口,以及如何使用GDC生成动画进行了演示;

4. 注意其中的一些执行顺序:浮点数操作不得放到回调函数中执行,而只能在其它任务中执行(可从回调函数中向其它任务发送消息来实现),否则程序将进行无限循环;

5. 因为浮点协处理器的任务状态切换机制使用了特权指令,所生成的可执行文件只能在纯DOS实模式下或虚拟机X386/X387及后续机型上执行,而无法在Windows的DOS窗口中运行;

6. 由MAIN.C所生成的可执行文件在AMD机器DOS实模式、X86虚拟机qemu-0.9.0-windows以及Bochs-2.1.1下均执行良好,注意:生成的可执行文件依然是16位实模式。


压缩文件C_lib.rar中包含窗口及其子控件的源代码,演示文件MAIN.C和DateTime.c,以及一个专用于Borland C/C++ 3.1的工程文件。

注意:使用浮点数操作时最好把相关任务的栈设置到2K以上。




联系邮件:taowentao_twt@163.com, taowentao_twt@sohu.com

[ Last edited by taowentao on 2007-6-21 at 10:03 PM ]
附件
演示截图.JPG
来自山东,现居沈阳
10 怎么得到积分 发表于 2007-06-12 03:50 ·  中国 江苏 南通 中移铁通
新手上路
积分 6
发帖 3
注册 2006-02-19 17:49
20年会员
UID 50632
性别 男
来自 wuhan
状态 离线
怎么得到积分?
11 不需积分 发表于 2007-06-12 21:06 ·  中国 辽宁 沈阳 联通
高级用户
★★
积分 739
发帖 111
注册 2004-11-30 00:00
21年会员
UID 34209
性别 男
来自 辽宁沈阳
状态 离线
原来没注意积分问题,现已改成不需积分。
来自山东,现居沈阳
12 发表于 2007-06-14 14:28 ·  中国 广西 南宁 电信
新手上路
积分 13
发帖 12
注册 2007-06-14 01:54
19年会员
UID 91247
性别 男
状态 离线
厉害了!支持高手
13 发表于 2007-06-20 12:23 ·  中国 河南 驻马店 联通
新手上路
积分 4
发帖 2
注册 2007-03-16 08:46
19年会员
UID 81928
性别 男
状态 离线
我顶
14 最新演示:TreeView 及ListView 演示 发表于 2007-06-30 03:44 ·  中国 辽宁 沈阳 联通
高级用户
★★
积分 739
发帖 111
注册 2004-11-30 00:00
21年会员
UID 34209
性别 男
来自 辽宁沈阳
状态 离线
TreeView 及ListView 演示:
http://zhenlove.com.cn/cndos/fileup/files/giCell_demo.rar

虚拟机运行截图:


[ Last edited by taowentao on 2007-7-1 at 01:19 PM ]
来自山东,现居沈阳
15 发表于 2007-06-30 12:45 ·  中国 山东 聊城 电信
系统支持
★★★
积分 1,010
发帖 434
注册 2007-02-08 00:00
19年会员
UID 78999
性别 男
状态 离线
先顶後看

放出SDK看看

[ Last edited by AlexZhang on 2007-6-30 at 12:56 PM ]
论坛跳转: