中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
« [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] »
作者:
标题: DOS的界面开发终结者 上一主题 | 下一主题
firstsail
高级用户





积分 668
发帖 295
注册 2005-7-26
来自 广东深圳
状态 离线
『第 256 楼』:  



  Quote:
Originally posted by fgckfl at 2008-4-4 11:26:
封装了新表格和列表控件,如何画一闪一闪的光标呢?

(1)在Swapping函数里面,做一个时间标记,假设为1秒钟


if (abs(现在时间- 时间标记) >= 1)
{
    (1)假设已经显示则隐去闪烁光标,否则显示闪烁光标
   (2)更新时间标记为现在时间,即时间标记=现在时间
}

(2)由于Swapping函数是一直被调用的,在函数里面尽量不要有“new”、"delete"等C语言语句,因为频繁地分配和删除内存易造成内存碎片,从而引起程序的蹦匮。

(3)在最终程序的Release版本中,分配内存后,尽量不用验证分配内存的成功,

   CEdit* pEdit1 = new CEdit;
    if (pEdit1 == NULL)
    {
        ::AfxMessageBox("分配内存","分配内存失败!", MB_OK);
    }


    上面一段代码,则有两个方面的不利之处:
   <1>代码段增加了,由于DOS程序受640K内存限制,应尽量减少代码量!这是DOS下编程的注意点!
    <2>数据段增加了,由于C语言大模式只有一个64K的数据段,尽量做到错误信息用错误处理函数处理!

[ Last edited by firstsail on 2008-4-12 at 06:28 PM ]

2008-4-12 15:14
查看资料  访问主页  发短消息 网志   编辑帖子  回复  引用回复
godai
初级用户





积分 28
发帖 13
注册 2008-2-18
状态 离线
『第 257 楼』:  

刚刚出差了一个月左右回来。 郭兄不用客气! :-)

关于DOS640K常规内存的问题,郭兄有没有考虑过用覆盖模式来编译代码?

2008-4-16 17:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
godai
初级用户





积分 28
发帖 13
注册 2008-2-18
状态 离线
『第 258 楼』:  

这么好的东西, 怎么能沉下去了?
发个贴, 顶上来! ^_^

另: 郭兄, 看看CComboBox中是否有个小BUG: 当CComboBox中只有一项可选的时候, 这时拉动下拉滚动条则有异常。 请查下。

2008-5-5 16:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
firstsail
高级用户





积分 668
发帖 295
注册 2005-7-26
来自 广东深圳
状态 离线
『第 259 楼』:  原因找到,请重新到网站下载

1:Bug找到,主要是由CScrollBar::SetRange()函数引起

void   CScrollBar::SetRange(DWORD dwMin,DWORD dwMax)
{
        if (dwMax > dwMin)
        {
                m_dwMax=dwMax;
                m_dwMin=dwMin;

        }
}

当项为1个时,则dwMin = 0, dwMax = 0,此时上面代码导致“值”没有更新


现修正代码如下:
void   CScrollBar::SetRange(DWORD dwMin,DWORD dwMax)
{
        if (dwMax >= dwMin)
        {
                m_dwMax=dwMax;
                m_dwMin=dwMin;

                if (m_dwLocation < m_dwMin)
                {
                        m_dwLocation = m_dwMin;
                }
                else if (m_dwLocation > m_dwMax)
                {
                        m_dwLocation = m_dwMax;
                }
        }
}

2008-5-6 15:08
查看资料  访问主页  发短消息 网志   编辑帖子  回复  引用回复
firstsail
高级用户





积分 668
发帖 295
注册 2005-7-26
来自 广东深圳
状态 离线
『第 260 楼』:  大数据量的数组

由于C语言大模式只有一个64K的数据段,用户又需要大数据量的全局变量时,建议将该变量的数据类型设置成“far”类型的数据变量。

现有一个全局变量数组,占用16K字节。如果配置成

WORD  wsGobalArray[4][2048];

此时,可能导致64K断溢出。故正确应配置如下:

WORD far wsGobalArray[4][2048];

大数组一般用于“AD采样”!

2008-5-6 19:13
查看资料  访问主页  发短消息 网志   编辑帖子  回复  引用回复
godai
初级用户





积分 28
发帖 13
注册 2008-2-18
状态 离线
『第 261 楼』:  

郭兄:CComboBox已测试正常。

在BC编译环境Large模式下,好像我理解的是编译器自动把所有的函数和指针变成far的。不知道理解的对不对。

BC下的说明如下:
“ Use Large model for very large applications only.
Far pointers are used for both codes and data, giving both a 1MB range. All function and data pointers are far by default. ”

2008-5-8 12:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
firstsail
高级用户





积分 668
发帖 295
注册 2005-7-26
来自 广东深圳
状态 离线
『第 262 楼』:  

(1)对于指针和函数,在大模式下,全部都是far类型
(2)对于全局变量来说,没有far类型的变量是“DATA”数据段,而far类型的数据类型是“FAR_DATA”数据段

假设有如下的一个abc.Cpp文件,内容如下
#include <Symbol.h>

WORD wAfxData1;
WORD far wAfxData2;


void Abcd()
{
    wAfxData1 = 0;
    wAfxData2 = 0;
}

对于上面的abc.Cpp文件在large模式下编译,注意选中菜单
[Options]->[Compile]->Generate Assembler Source
此时编译后会在磁盘中留下“abc.asm”汇编文件,用notepad或edit程序打开并阅读它,可看到“DATA”和“FAR_DATA”数据段

<1>当仿问“DATA”数据段时,CPU自动用DS寄存器作为段寄存器,所以访问速度较快

<2>当仿问“FAR_DATA”数据段时,程序将FAR_DATA段的段地址加载到ES寄存器中,然后正确访问该变量,所以访问速度较慢

上面Abcd函数对应汇编语言如下
   ;        void Abcd()
   ;       
        assume        cs:ABC_TEXT
@Abcd$qv        proc        far
        push        bp
        mov        bp,sp
   ;       
   ;        {
   ;            wAfxData1 = 0;
   ;       
        mov        word ptr DGROUP:_wAfxData1,0
   ;       
   ;            wAfxData2 = 0;
   ;       
        mov        ax,seg _wAfxData2
        mov        es,ax
        mov        word ptr es:_wAfxData2,0
   ;       
   ;        }
   ;       
        pop        bp
        ret       
@Abcd$qv        endp

[ Last edited by firstsail on 2008-5-8 at 12:54 PM ]

2008-5-8 12:37
查看资料  访问主页  发短消息 网志   编辑帖子  回复  引用回复
firstsail
高级用户





积分 668
发帖 295
注册 2005-7-26
来自 广东深圳
状态 离线
『第 263 楼』:  完善图片保存功能

由于WinSail老的版本,当窗口中按下“F3”功能键时,会将当前窗口以固定的文件名-----“A.Bmp”文件存贮,这样在工业现场往往很不方便。现改为:

  当窗口中按下“F3”功能键时,会弹出输入框让用户输入文件名,然后用输入的文件名来存贮图片。


下载地址:“http://www.firstsail.com.cn/software.html

2008-7-10 13:37
查看资料  访问主页  发短消息 网志   编辑帖子  回复  引用回复
dama_01
初级用户




积分 161
发帖 15
注册 2003-11-12
状态 离线
『第 264 楼』:  能支持中断吗?

工业PC104的板子,很多应用需要用到硬终端,比如IRQ10等,并在中断程序中做计算,IO操作等
用楼主的系统,能支持吗?

2008-7-16 11:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
godai
初级用户





积分 28
发帖 13
注册 2008-2-18
状态 离线
『第 265 楼』:  鼠标 INT33H 问题

郭大大, 您的winsail程序在试用中出现一个现象: 就是在振动环境中有时候偶尔会发生PS2鼠标指针乱飞掉的情况。 初步判断是干扰引起的鼠标通讯错误。
您的鼠标驱动是用的加载标准驱动, 然后调用INT33h来驱动鼠标的吗?
有没有可能我自己能控制鼠标的调用?
比如发现数据错位引起的乱飞情况后重新调用鼠标初始化之类的操作。

2008-7-17 12:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
firstsail
高级用户





积分 668
发帖 295
注册 2005-7-26
来自 广东深圳
状态 离线
『第 266 楼』:  WinSail 已经支持16位(64K)色了

1)WinSail 已经支持64K色了,即16位色。

    如果是640x680x16位色,Config.Sys设置如下:
        Device = 11
        Mode = 111

    如果是800x600x16位色,Config.Sys设置如下:
        Device = 11
        Mode = 114

   如果是1024x768x16位色,Config.Sys设置如下:
        Device = 11
        Mode = 117


(2)下载解压后,有一文件Sail3000\bmp3\Color1.Bmp可供测试,它是一幅24位真彩色图片



(3)测试程序可用下面的一段代码
void Demo_DisplayBmp()
{

        char bufFile[256];

        //调用打开文件框函数选择“BMP”文件
        while (::AfxOpenFileDialog(TRUE, bufFile, NULL))
        {
                       
                //保存鼠标状态               
                int nMouse = ::GetMouse();
                //画图前,须将鼠标关闭
                ::CloseMouse();

                //清除视窗
                ::ClearViewPort();

                //显示图片
                ::DisplayBmpFile(0, 0, bufFile);

                //恢复鼠标状态
                ::SetMouse(nMouse);
        }

        return;
}




WinSail的下载地址:http://www.firstsail.com.cn/Software.html

[ Last edited by firstsail on 2008-10-5 at 17:51 ]

2008-9-19 18:57
查看资料  访问主页  发短消息 网志   编辑帖子  回复  引用回复
firstsail
高级用户





积分 668
发帖 295
注册 2005-7-26
来自 广东深圳
状态 离线
『第 267 楼』:  WinSail增加动画控件了

WinSail增加了动画控件CAnimalCtrl,目前只能播放GIF文件.



(1)类定义在头文件"MyFrame.h"中,
(2)文档名是:“界面控件类_CAnimalCtrl动画控件详细设计.doc”。

(3)应用该控件非常简单,一般仅需要三行代码

//分配实例
CAnimalCtrl* pAnimalCtrl1 = new CAnimalCtrl(pDialog);
//建立控件
pAnimalCtrl1->CreateObject(100, 100, 50, 50, NULL);
//装入GIF文件
pAnimalCtrl1->LoadFile("Bmp\\Earth3.Gif");


下载WinSail解压后,运行sail3000里面的Sai2000程序,在桌面右上角可以看到有一个地球在转动
建议将WinSail调整到256色或“16位=64K色”,此时动画控件的颜色最逼真。


注意:使用动画控件CAnimalCtrl后,Exe文件增加7K左右的代码量。

7        举例
#include <bios.h>
#include <Stdio.h>
#include <Stdlib.h>
#include <conio.h>
#include <dos.h>
#include <String.h>
#include <math.h>

#include <Symbol.H>
#include <MyFrame.h>
#include <gif.h>
#include <Lzw.h>

int far TransrateKey(CObject *)

{

        return(0);

}

unsigned _stklen = 60u * 1024u;

//动画控件演示函数的一个按钮对应的回调函数
void far ClickButton1_DemoAnimalCtrl(CObject *pObj)
{
    //得到动画控件对应父窗口的指针
        CDialog* pDialog = (CDialog *)pObj->GetParent();
    //得到动画控件的指针
        CAnimalCtrl* pAnimalCtrl = (CAnimalCtrl *)
                pDialog->ObjectFromID(ANIMALBASE + 1 - 1);

    //选择新的一个GIF文件
        char bufFile[256];
        if (!AfxOpenFileDialog(TRUE, bufFile, NULL))
        {
                return;
        }

    //装入新的GIF文件
        pAnimalCtrl->LoadFile(bufFile);
    //由于每个动画的大小不同,所以必须重刷新窗口
        pDialog->ShowWindow();

        return;
}

//动画控件演示函数
void far Demo_AnimalCtrl()
{
    //分配对话框实例
        CDialog* pDialog = new CDialog;
//建立对话框
        pDialog->CreateWindow(0,0,640,480,"动画控件演示程序");
    //将窗口居中
        pDialog->Center();

    // 分配动画控件的实例
        CAnimalCtrl* pAnimalCtrl = new CAnimalCtrl(pDialog);
// 建立动画控件,该控件的宽度和高度的意义不大。
        pAnimalCtrl->CreateObject(5,30,40,100, NULL);
    //装入动画GIF文件
        pAnimalCtrl->LoadFile("Bmp\\Earth3.gif");
    //设置动画控件的ID号
        pAnimalCtrl->SetID(ANIMALBASE + 1 - 1);

        //分配按钮实例
CButton* pButton1 = new CButton(pDialog);
//建立按钮
        pButton1->CreateObject(500, 50, 80, 24, "Load");
    //设置控钮对应的回调函数
        pButton1->SetFc(ClickButton1_DemoAnimalCtrl);

    //显示对话框
        pDialog->ShowWindow();
    //进入对话框的消息循环
        pDialog->DoModal();

    //删除对话框实例
        delete pDialog;
    //函数返回
        return;
}

int main(int argc, char** argv)
{
    //初始化WinSail系统
        if (!::InitSystem(argc, argv))
        {
                ::CloseSystem();
                return(0);
        }

     //调用动画演示程序
         ::Demo_AnimalCtrl();

    //退出WinSail系统
        ::CloseSystem();
        return(1);
}

WinSail的下载地址:http://www.firstsail.com.cn/Software.html

[ Last edited by firstsail on 2008-10-5 at 17:53 ]

2008-10-5 17:13
查看资料  访问主页  发短消息 网志   编辑帖子  回复  引用回复
firstsail
高级用户





积分 668
发帖 295
注册 2005-7-26
来自 广东深圳
状态 离线
『第 268 楼』:  

为了增加动画控件,WinSail增加了系统全局定时器,目前暂时定为最多20个


(1)函数WinSail_SetTimer();
原    型:int  WinSail_SetTimer(DWORD dwParam, WORD wTime,
              void far(*pFc)(DWORD dwParam),DWORD dwWindow);
作    用:建立系统定时器
入口参数:DWORD dwParam ----------   定时器回调函数的入口指针
         WORD  wTime-------------   定时器的时间,以55mS(即1/18.2S)为单位
         void far(*pFc)(DWORD)---   定时器回调函数
         DWORD dwWindow----------   隶属窗口指针,没有隶实时为NULL
出口参数:无
返 回 值:成功返回定时器名柄0,1,2,....;失改返回"-1".


(2)函数WinSail_KillTimer()
原    型:void WinSail_KillTimer(int nTimer);
作    用:删除指定的定时器
入口参数:int nTimer -------------   定时器名柄
出口参数:无
返 回 值:无



注意:如果建立了有隶属窗口的定时器,在窗口销毁之前必定要先销毁该定时器!


WinSail的下载地址:http://www.firstsail.com.cn/Software.html

[ Last edited by firstsail on 2008-10-5 at 17:55 ]

2008-10-5 17:31
查看资料  访问主页  发短消息 网志   编辑帖子  回复  引用回复
firstsail
高级用户





积分 668
发帖 295
注册 2005-7-26
来自 广东深圳
状态 离线
『第 269 楼』:  WinSail已经支持JPG文件的显示了

WinSail支持JPG文件的显示,系统必须配置成64K色以上

[display]

device=11
mode = 117

;mode=111 是640*480*64K色
;mode=114 是800*600*64K色
;mode=117 是1024*768*64K色


目前解压“1024*768”且Y:Cb:Cr = 1:1:1分辨率的JPG文件,解压并显示的时间大约需要2秒左右,还不太满意。目前正在优化代码!






2008-11-2 12:40
查看资料  访问主页  发短消息 网志   编辑帖子  回复  引用回复
firstsail
高级用户





积分 668
发帖 295
注册 2005-7-26
来自 广东深圳
状态 离线
『第 270 楼』:  



  Quote:
Originally posted by dama_01 at 2008-7-16 11:59:
工业PC104的板子,很多应用需要用到硬终端,比如IRQ10等,并在中断程序中做计算,IO操作等
用楼主的系统,能支持吗?

WinSail是一个完全与BC31兼容的嵌入式开发系统,特别适用于电力、电子系统的PC104应用,您所提到的问题是完全支持的。

[ Last edited by firstsail on 2008-11-20 at 11:21 ]

2008-11-20 11:15
查看资料  访问主页  发短消息 网志   编辑帖子  回复  引用回复
« [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: