回 帖 发 新 帖 刷新版面

主题:[原创]qbwin的入门教程

我从来不写教程的,也最烦当老师,所以说起话来含糊不清那是正常的。
大家发现有什么错误及不明白的地方都不要再来找我。

出了个伟大的QBWIN,不会用啊,我现在想编一个这样的窗口程序,怎么办:
[img]http://qbdos.51.net/cgi-bin/bbs/qbwin/1.jpg[/img]
我还要求,点“确定”后出现以下窗口:
[img]http://qbdos.51.net/cgi-bin/bbs/qbwin/2.jpg[/img]

回复列表 (共23个回复)

沙发

以下是写此程序的全过程:
以下所有操作请在DOS下或者DOS方式下,必须有MOUSE。
如果你真想学,请务必上机,在实际环境下一步步操作,看是看不明白的。

1.安装好QBWIN及QB7,把QBWIN下的*.LIB文件拷到QB7/LIB目录下,把QBWIN.QLB,qbwin.bi
   拷到qb7/bin下。
2.运行QBSHELL,在“工程列表”下的框中点MOUSE的右键,点“新建”
  输入名字如“hello”,然后双击“hello.qwp”,再在“列表”下的框中点右键,新建,
  输入名字如"hello",然后双击hello.qwf,您将会看到一个名字叫form的空白窗体。
3.在“工具栏”下点一下那个按钮一样的东西,此时MOUSE指针变成“+”字形,然后到
   空白窗体上点一下,即会出现一个叫“botton(1)”的按钮。
4.最后,点击“工具栏”下的最后一项“生成BAS源程序”,保存为HELLO.BAS即可。
5.把hello.bas 拷到QB7/BIN目录下。
6.运行QBX  /L qbwin (如果你是QBWIN的初学者,建议在此之前运行UCDOS,调入中文系统)
7.打开hello.bas
8.现在,我们需要相应的控件的属性。比如说定义窗口的大小,名称,位置,动作等等。

首先,修改一下CONST 把各个参数的最大值改大一点:如下
(我是随便乱改的,便于以后扩充,其实不改也可以)
——————————————————————————————————————
'定义各控件最多可用的数目:
CONST MaxButton = 5, MaxCheck = 10, MaxOptG = 10, MaxOptI = 10
'        按钮           复选按钮    单选按钮(组数),(每组项目数)
CONST MaxFrame = 12, MaxList = 10, MaxListItem = 100, MaxText = 11
'        框架         列表框   ,  每一列表项目数     文本框
CONST MaxCombo = 11, MaxLabel = 10, MaxMainMenu = 10, MaxMenuItem = 5
'      下拉式列表      标签            菜单           菜单项目
CONST MaxPercent = 10, ListItemBuffer = 64
'        进度条        列表项目大小
——————————————————————————————————————

然后找到:SELECT CASE WINS 这是定义第一个窗口的属性的,改其中LOADWINDOW的值如下:
  SELECT CASE Wins
    'hello.QWF
    CASE 0:
      '格式: LoadWindow X,Y,W,H,Font,BC,Box,TC,Caption
      LoadWindow 160, 100, 244, 114, 10, 7, -1, 1, "欢迎"
      RESTORE WIN00

(其实就改了LoadWindow 这一行,其它的都没有改)
说明: LoadWindow 160, 100, 244, 114, 10, 7, -1, 1, "欢迎"
各个参数的意思是:
打开窗口:窗口的X方向的左边距为160,Y方向的上边距为100,窗口的宽为244,高为144,字体为10,CAPTION 表示窗口的显示的名字为欢迎。
(每个参数在QBWIN的说明文件里都有说明。)
这些东西在QWSHELL里就可以改的,我放在这里声明是为了各位能更好地了解QBWIN的实质。
——————————————————————————————————————————

修改:
      LoadButton 0   '读入命令按钮  背景框
      DATA 73,27,70,19,-1,0,0,12,-1,"确定"
——————————————————————————————————————————

这样,存盘后,整个界面就做好了。我们运行一下,即有下图:

[img]http://qbdos.51.net/cgi-bin/bbs/qbwin/1.jpg[/img]

板凳

光有图没有用啊,点那个“确定”铵钮什么都没有反应啊。
我们需要定义事件:  前面1-8都挺费话(不说也知道),定义事件才是关键。

比如说,我们用MOUSE点了“确定”键,主程序就会立即知道你已点击了MOUSE,因为主程序
本身就是一个大的循环,它不停地在扫描MOUSE的状态及位置。
    比如说单击MOUSE事件,你用SHU标在窗口里任何位置一点,主程序就能知道你已点击MOUSE,如果你是在主程序的“按钮”区(就是在按钮上)点击了MOUSE,它就会立即调
用在按钮上MOUSE单击的子程序。
   主程序为什么知道你是在“按钮”上点了MOUSE不是而空白上点击的呢?因为窗口的面是固
定的,主程序知道在窗口的什么位置放在“按钮”而在什么位置是空白。主程序通过获得MOUSE
的(X,Y)的值,从而知道MOUSE点击的区域是不是在“按钮”上。
  
在QBWIN中,在按钮上MOUSE单击的子程序名字叫:
C.ButtonClick
MOUSE在“按钮”上点击的事件,只需要在子程序C.ButtonClick里定义即可。

在QB7的编辑器里,点“view”,选SUBs,然后双击"C.ButtonClick",这样我们就可以修改这个子
程序的代码:
修改前的原码如下:
SUB C.ButtonClick (NWin, Inx)
  Sel = NWin * 100 + Inx
  SELECT CASE Sel
    CASE 1:
  END SELECT
END SUB

修改成如下:
SUB C.ButtonClick (NWin, Inx)
  Sel = NWin * 100 + Inx
  SELECT CASE Sel
    CASE 1:
    msgbox " ", "测试:", "欢迎学习QBWIN!!!"
END SELECT
END SUB
实际上,我们仅仅在CASE 1:后加了一行:
msgbox " ", "测试:", "欢迎学习QBWIN!!!"
而这就是我们的事件代码,这个代码的意思是:
弹出一个对话子窗口为:"欢迎学习QBWIN!!!"

当然了,我们也可以这样改:
SUB C.ButtonClick (NWin, Inx)
  Sel = NWin * 100 + Inx
  SELECT CASE Sel
    CASE 1:
    print "我要学习QBWIN!!!"
END SELECT
END SUB

呵呵,这样可能大家比较习惯。。。
反正,CASE 1:后面的代码,就由你自已来加,想加什么加什么,就象在QB45里一样。

最后,存盘,编译生成EXE文件即可。其它的举一反三即可。

另外,源子程序里,为什么是CASE 1:而不是CASE 2:呢???
原来QBWIN就这样定义的,CASE 1:就表示第一个对象,在这里表示第一个“按钮”,
因为你的主程序里可能有多个按钮啊,第二个按钮所触发的代码就是case 2:了
这个“1”,“2”其实是指按钮的序号。


例:
SUB C.ButtonClick (NWin, Inx)
  Sel = NWin * 100 + Inx
  SELECT CASE Sel
    CASE 1:
    print "我要学习QBWIN!!!"
    case 2:
       print "我好笨,不想学了。。。"
    case 100:
       print "还是再试试吧。。。。"
       case 101:
       PRINT "原来如此,QBWIN是做了菜单子程序嘛"
END SELECT
END SUB

哇,怎么出了case 100:了,难道在主程序里还做了100个按钮吗?
不是不是,CASE 100:是指主菜单中的第一个子菜单里的第一个按钮,
CASE 101:是指主菜单中的第一个子菜单里的第二个按钮

3 楼

很容易的,做了一两个实际的视窗程序之后,感觉就和用QB45没有区别了。

4 楼

学VB吧,在VB里做到上面的效果,只要点鼠标两下(加个按钮),再点两下(进入按钮的_Click()事件SUB,然后写下一行字:MsgBox "欢迎使用VB!", vbOKOnly + vbInformation, "测试"
就完啦!
至于控件的属性修改,有专门的属性修改器,很方便的。

而且,VB是面向对象,QBWIN还是面向过程。

5 楼

        1:VB编的程序无法在DOS执行。
        2:QBWIN从原理上来看,其实就是面向对象的。
        3:如果QBWIN没有必有学,那为什么要学QB?全是为了考试吗?我们是为了
           完成作业而编程序吗?
        4:学VB不如学VC,学VC不如学DELPHI,不如JAVA。。。
        5:我们为什么不直接学最最高级的语言,而非要浪费时间?是不是老师都
           白痴?

      QBWIN至少有机会让人明白,菜单程序的原理。而用VB是不会明白的。

6 楼

好!顶
看来只有dos不在了,qb才会消亡,不过linux下面也有basic,
学windows下面的编程,如果不 想做高级程序员,学vb就行了!
vc需要基础

7 楼

qbwin是面向对象的?什么叫面向对象编程?一个命名为c.buttonclick()的子程,这算什么东西,是对象c的一个方法?
如果要玩dos就不要学windows的样子做窗口,要做窗口程序就在windows里编,不要做得个四不像。
坚持dos的人就不会学这个。

8 楼

慢着,rickone,你用过QBWIN没有?没有用过请不要乱发言。
我觉得你流于感觉而忽略实质,也许你懂得很多,但你的知识可能没能联贯起来。

一个命名为c.buttonclick()的子程,相当于VB里的所有的
Private Sub Command1_Click()
End Sub
Private Sub Command2_Click()
End Sub
。。。
等所有按钮子程的集合。

实现所谓“面向对象”并不是什么复杂神密得不得了的东西。
无非就是把一些子程打一下包,让使用者以为自已在面向对象,实质上仍旧在调用子程序库的,象VB的运行库,就是一个大的打好包的子程库。当然了,还有很多其它的工作如数据传递等等,我也不懂得。
即然VB可以封装子程序库,那么我们也可以做,象QBWIN就是尝试之一。

事实上,在QBWIN里定义了一个视窗,那么这个视窗100%就是一个对象,它有它的属性象它的大小,字体,色彩,是否可用等等属性,而且它是可以消失的又可以重新赋值的。

现在不是玩不玩DOS的问题,而是用QBWIN可以很方便地开发出可用的视窗程序。我可以用它来开发产品,它是有实际应用价值的,不是好不好玩的问题。我把它应用于视顶盒的配置程序上。

9 楼

下面我把qbwin作者的网站连接发上来,有空请看看!
http://qbwin.web165.com/
作者的qq:86382197

这样大家看了能更好的讨论

10 楼

我没有用过qbwin,但是你的教程我全看了,也看明白了。

我认为那只是看起像对象而已。

什么是对象?对象可以有自己的成员,包括属性方法和事件,以及子对象,子对象甚至可以是本身,成员有私有和共有属性,私有的成员被封装在对象内部。外部程序可以访问对象的共有成员,有自己的事件处理程序。
而qbwin只是一些写好的模拟窗体的程序,稍微改改而已。
你说你的c.buttonclick相当于VB里所有command1_click(),command2_click()的集合,我看只能相当于控件数组。

我没有否定qbwin,再怎么说,也是个写得不错的程序。

我来回复

您尚未登录,请登录后再回复。点此登录或注册