中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
English/Chinese Fix Translation
作者:
标题: 个人编写的GUI图形界面软件 上一主题 | 下一主题
taowentao
高级用户





积分 739
发帖 111
注册 2004-11-30
来自 辽宁沈阳
状态 离线
『楼 主』:  个人编写的GUI图形界面软件 [已使用 LLM 解释]

rtCell 真正的图形模式多窗口 - 用 Borland C 编写,具有下列功能:

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

2. 真正的事件(或消息)驱动的多窗口技术,且支持顶层窗口和透明窗口;

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

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

5. 内存需求小(不到64K),窗口和控件所耗内存很小(全部采用直接读写显存技术,没有内存设备),
因此实用性强,包括rtCell、鼠标、键盘及图形驱动,在DOS下也仅 100 多 K 字节。


演示方法:解压缩gui_Test.rar,在windows下(双击)执行gui_Test.bat,

或在纯dos下直接执行bc_gui.exe(在windows的dos窗口中无鼠标)。

注意:本演示中由于包含一个说明性位图而使得bc_gui.exe比较大。

下载地址:
http://zhenlove.com.cn/cndos/fileup/files/bc_gui.rar
http://zhenlove.com.cn/cndos/fileup/files/bc_gui.zip
LLM 解释

技术实现背景与关键机制

rtCell 作为 DOS 下的图形界面库,其设计针对 DOS 环境的核心限制(如内存、硬件直接访问)进行了优化,以下是对其功能的技术解释:

1. 多视口裁剪与消隐

DOS 图形模式(如 VGA 320×200×256 色)无硬件窗口管理,所有图形操作需直接读写显存(如 VGA 的 A000:0000 段)。rtCell 通过软件视口裁剪实现多窗口:每个窗口维护自身的坐标范围(如左上角 (x1,y1)、右下角 (x2,y2)),绘制图形时先判断像素是否在视口内,仅对有效区域执行显存写入。消隐处理则通过窗口 Z 序管理(顶层窗口优先绘制)实现,覆盖下层窗口的区域会被直接重写,无需额外内存缓存。

2. 事件驱动与窗口类型

DOS 无原生消息队列,rtCell 的“事件驱动”需通过轮询硬件中断模拟:

  • 键盘事件:通过 BIOS 中断 16h 轮询按键状态;
  • 鼠标事件:依赖鼠标驱动(如 Microsoft Mouse Driver)提供的中断 33h,获取鼠标位置与按键状态;
  • 窗口消息:库内部维护消息队列,将硬件事件转换为窗口消息(如 WM_MOUSEMOVEWM_KEYDOWN),并分发给目标窗口的回调函数。

透明窗口的实现依赖显存直接读写:绘制透明区域时,仅修改指定颜色的像素(如跳过背景色),无需额外内存存储原背景数据。

3. 控件与编辑功能

Label、Button 等控件本质是预定义图形元素,通过固定的绘制逻辑(如 Button 的边框、按下状态)实现;Edit 控件的剪切/复制/粘贴功能需:

  • 维护文本缓冲区(存储输入字符);
  • 拦截键盘组合键(通过 int 16h 检测 Ctrl + X/C/V);
  • 利用 DOS 系统调用 int 21h 的剪贴板功能(部分鼠标驱动支持,或库自身模拟剪贴板缓冲区)。

4. 窗口操作与回调机制

窗口平移/缩放通过重绘整个窗口实现:拖动窗口时,先擦除原位置(用背景色覆盖),再在新位置重新绘制窗口边框、控件与内容;缩放则需调整窗口视口范围并重新计算控件布局。

回调机制通过函数指针实现(Borland C 支持函数指针语法):窗口或控件创建时注册回调函数,当事件发生时(如按钮被点击),库直接调用该函数处理逻辑。

5. 内存优化策略

  • 无内存设备上下文:DOS 常规内存(640KB)紧张,rtCell 避免为窗口分配额外内存缓冲区,所有绘制直接操作显存,仅用少量内存存储窗口元数据(如坐标、Z 序、回调函数指针);
  • 微内核设计:核心功能(裁剪、事件轮询、窗口管理)被压缩到 64KB 以内,结合 Borland C 的小内存模型(数据段、代码段各 64KB)编译,确保库本身内存占用极小。

环境依赖与限制

rtCell 的运行需满足以下条件:

  1. 图形模式支持:依赖 VGA 或兼容显卡(如 SVGA,但需驱动支持),若显卡不支持目标分辨率(如 320×200),则无法正常显示;
  2. 鼠标驱动:需预先加载鼠标驱动(如 mouse.com),否则鼠标事件无效;
  3. 纯 DOS 环境:Windows DOS 窗口(如 Windows 98/XP 的命令提示符)可能限制硬件直接访问,导致鼠标无响应或图形显示异常;
  4. 内存模型限制:若使用 Borland C 的大内存模型,库的内存占用可能超过 64KB,需重新编译调整。

历史意义与局限性

rtCell 代表了 DOS 晚期图形界面开发的典型思路:通过软件模拟弥补硬件不足,在严格的资源限制下实现接近 Windows 的交互体验。但受限于 DOS 环境,其存在固有局限性:

  • 无多任务支持:所有窗口与控件需在单线程内处理,复杂界面可能出现卡顿;
  • 显存访问速度:VGA 显存读写速度有限,大窗口重绘时可能出现闪烁;
  • 兼容性:不同显卡(如 S3、Trident)的显存布局差异可能导致图形显示错误。

尽管如此,rtCell 仍为 DOS 应用提供了轻量且实用的图形界面解决方案,适合资源受限的嵌入式或复古计算场景。





来自山东,现居沈阳
2007-1-3 03:19
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
zqlcch
初级用户





积分 178
发帖 85
注册 2006-7-6
状态 离线
『第 2 楼』:   使用 LLM 解释/回答一下

从演示上看不错啊,楼主怎么不放出开发包呢?让兄弟们用用
要收费的吗?
用过QbWin和WinSail,QbWin太弱,Winsail功能和你的看起来差不多,但它太丑了。。。。。


2007-1-9 00:57
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
happybasic
中级用户





积分 298
发帖 118
注册 2006-3-1
状态 离线
『第 3 楼』:   使用 LLM 解释/回答一下

Originally posted by zqlcch at 2007-1-9 00:57:
从演示上看不错啊,楼主怎么不放出开发包呢?让兄弟们用用
要收费的吗?
用过QbWin和WinSail,QbWin太弱,Winsail功能和你的看起来差不多,但它太丑了 ...


QBWIN太弱... 想必这位兄弟一定是高手了,可否做一个更强一的出来
让所有的QB爱好者们爱惠一下,包括偶...




欢迎光临happyBASIC小站:http://yxbasic.51.net
2007-1-9 02:01
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
zqlcch
初级用户





积分 178
发帖 85
注册 2006-7-6
状态 离线
『第 4 楼』:   使用 LLM 解释/回答一下

QbWin的缺点是要写C盘,会产生~Qbwin.0等4个文件,每个38K,就是640x480x16色环境下显存四个位面的镜像文件,不能在只读的环境中使用,比如硬盘上所有的分区都是NTFS的情况,当初很认真地学习一段时间的QBWin,也做了一些基于QbWin的程序,后面就放弃了。另外Qbasic的数据段只有64k,建立大一些的数组就比较麻烦了。调用XMS也没有现成的包可以用,如果真要用XMS写还不如用C了,大量现成的包可以使用,以上这些都算是Qb无法解决的缺点了吧,除非谁能再写一个QB的编译器。

建议三楼的去用一下WinSail,基于BC的GUI库,编程方便多了。

象“想必这位兄弟一定是高手了,可否做一个更强一的出来”这样赌气伤感情的话就不要再说了,就算是一个基于应用层面的编程者(比如我)对语言的喜好也不能被自己的感情所左右,编程自然是哪个好用就用哪个,提高生产率何乐而不为,某种语言的优点自然要发杨光大,但缺点也要老老实实承认。。。。

Last edited by zqlcch on 2007-1-9 at 05:45 AM ]


2007-1-9 05:42
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
happybasic
中级用户





积分 298
发帖 118
注册 2006-3-1
状态 离线
『第 5 楼』:   使用 LLM 解释/回答一下

呵呵,楼上兄弟莫介意。。。我是真希望有一个更好的QB开发库, 因为QBWIN停止开发了,而且作者现在一直很忙... Hoker一直建议他开源,目前尚无消息。。。

所以,我在我的小站已经在开始自已做的QBCH开发库就是想取代bas原来的那个showfnt开发库(DOS字符界面的中文库),但GUI界面的目前还未敢试 ....

兄弟有任何意见,关于QB or QBWIN的尽管提,,当然最好的是改进意见,或开发意见。。。。




欢迎光临happyBASIC小站:http://yxbasic.51.net
2007-1-9 07:05
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
zqlcch
初级用户





积分 178
发帖 85
注册 2006-7-6
状态 离线
『第 6 楼』:   使用 LLM 解释/回答一下

真的吗?QbWin的窗口风格和界面我一直都非常喜欢,很漂亮很舒服,就是那该死的临时文件受不了,应该是用bload和bsave函数产生的吧,能把这个改了我就满足了。


2007-1-9 07:36
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
happybasic
中级用户





积分 298
发帖 118
注册 2006-3-1
状态 离线
『第 7 楼』:   使用 LLM 解释/回答一下

但目前还缺少不少知识,最好是bas能开源,QBWIN还是有很多地方可以优化的...

我正在研究一个问题就是在程式中抓自已的文件名,但还没做好,不知兄弟会不会,会的话,就指点一二,这个主要用于捆绑字库




欢迎光临happyBASIC小站:http://yxbasic.51.net
2007-1-9 08:08
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
zqlcch
初级用户





积分 178
发帖 85
注册 2006-7-6
状态 离线
『第 8 楼』:   使用 LLM 解释/回答一下

运行程序时,第0个参数就是自身的文件名。
在Pascal中函数ParamStr(0),返回的就是自身的文件名。。。
在Qb中找到相对应的函数就OK了。
现在居然连Qb都下不到了。。。。汗


2007-1-9 09:57
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
happybasic
中级用户





积分 298
发帖 118
注册 2006-3-1
状态 离线
『第 9 楼』:   使用 LLM 解释/回答一下

C中也是第0个参数,但是QB中的参数是COMMAND$, 是一个字符串不是数组....

qb的下载地址:
http://vb.lihuasoft.net/showdown.php?id=419

帮忙解决一下,thanks!




欢迎光临happyBASIC小站:http://yxbasic.51.net
2007-1-9 12:07
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
xugaohui
高级用户




积分 774
发帖 293
注册 2003-4-16
来自 湖北仙桃
状态 离线
『第 10 楼』:   使用 LLM 解释/回答一下

Originally posted by happybasic at 2007-1-9 02:01 AM:


QBWIN太弱... 想必这位兄弟一定是高手了,可否做一个更强一的出来
让所有的QB爱好者们爱惠一下,包括偶...


qbwin是不错,但遗留的问题太多了,根本不打算用这个。在vmware正准备用qbwin,发现它显示窗体十分慢。鼠标移动一下都不容易。还有很多人说qbwin 编写的程序在部分液晶显示器上无法显示,显示器上只显示出刷新率超出范围。
qbwin的msgbox正好与vbdos冲突。这些问题作者都不打算去解决它。

Last edited by xugaohui on 2007-1-10 at 04:44 AM ]




下载
09年7月7日 更新
感谢网友 囧HQY 提供空间
2007-1-10 00:48
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
happybasic
中级用户





积分 298
发帖 118
注册 2006-3-1
状态 离线
『第 11 楼』:   使用 LLM 解释/回答一下

1.窗体刷新速度是有些慢,不过不能用倒是没听说过...
ps: 可以先加载smartdrv.exe后速度就快多了

2.与VBDOS的MSGBOX冲突,QBWIN是for QBX 7.1的, 根本没有打算for VBDOS
(虽然可以兼容), VBDOS只是诱导大家去用VB的饵,不想用,呵呵,而且界面也太丑了




欢迎光临happyBASIC小站:http://yxbasic.51.net
2007-1-10 01:03
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
zqlcch
初级用户





积分 178
发帖 85
注册 2006-7-6
状态 离线
『第 12 楼』:   使用 LLM 解释/回答一下

查找DOS中断编程相关资料,没有找到与此有关的中断服务,程序的PSP段中也只有参数而没有自身文件名,无法。。。


2007-1-10 06:41
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
happybasic
中级用户





积分 298
发帖 118
注册 2006-3-1
状态 离线
『第 13 楼』:   使用 LLM 解释/回答一下

查到资料说PSP段 2Ch开始,查找0010之后就是文件名称,可是在QB中不知怎
么实现, 我原来弄过一段汇编程序是OK的,

代码如下,你看能不能用QB实现它:

cseg segment
assume cs:cseg,ds:cseg
org 100h
start: mov si,2ch
lodsw
mov ds,ax
mov si,0
push cs ;exe格式需要这两句
pop es ;com格式 cs==ds==es 可以不要
mov di, offset buf
cld
loc_1: lodsb
cmp al,0 ;0
jnz loc_1

lodsb
cmp al,0 ;0
jnz loc_1

lodsb
cmp al,1 ;1
jnz loc_1

lodsb ;0

loc_2:lodsb ;文件名开始
cmp al,0
jz disp_1

stosb
jmp loc_2

disp_1:push cs
pop ds

mov dx, offset buf
mov ah,9
int 21h ;显示文件名

mov ah,4ch
int 21h ;返回DOS

buf db 256 dup('$')

cseg ends
end start




欢迎光临happyBASIC小站:http://yxbasic.51.net
2007-1-10 09:44
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
zqlcch
初级用户





积分 178
发帖 85
注册 2006-7-6
状态 离线
『第 14 楼』:   使用 LLM 解释/回答一下

有资料就容易
先运行qbx /L qbx.qlb载入qbx库,如果你没有在QB中设置路径就要在/L后加路径了

代码如下:
//先调用DOS中断21的子功能62来取PSP的地址
'$INCLUDE: 'e:\programs\qb71\src\qbx.bi'
CLS
DIM s AS RegType
s.ax = &H6200
CALL Interrupt(&H21, s, s) //调用中断
//定义段地址
DEF SEG = s.bx
//从2C取两个字节,这两个字节就是环境变量的段地址
s1 = PEEK(&H2C)
PRINT s1
s2 = PEEK(&H2D)
PRINT s2
//这里计算段地址
DEF SEG = s2 * 16 * 16 + s1
//这里取环境变量的内容,自身的文件名是以01,00打头的,查找以01,00找头,后面的一串以0结尾的字符串就是自己的文件,自己补些代码吧
//这里我偷懒了,把全部都取出来了,自己修改吧,要喝酒去了
a$ = ""
FOR aa = 0 TO 1855
a$ = a$ + CHR$(PEEK(aa))
NEXT
PRINT a$

汗,QB还是先天不足,操作起来实在麻烦,在C或PASCAL中一个指针就搞定了。。。。。。

Last edited by zqlcch on 2007-1-10 at 10:40 AM ]


2007-1-10 10:38
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
happybasic
中级用户





积分 298
发帖 118
注册 2006-3-1
状态 离线
『第 15 楼』:   使用 LLM 解释/回答一下

做好了,去看看吧!多提提意见!
http://yxbasic.51.net/library/qbch.htm




欢迎光临happyBASIC小站:http://yxbasic.51.net
2007-1-11 22:45
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: