现在的位置: 首页 > 综合 > 正文

Allegro学习笔记 里程碑20070813

2013年10月09日 ⁄ 综合 ⁄ 共 1903字 ⁄ 字号 评论关闭

        通过前22个例子的学习,我已经掌握了基本的GUI搭建方法,并且可以自由的继承或新建我想要的proc。但是还有一些关于GUI的东西是在Allegro的例子中 未曾提到的。我将自己的研究记录于此,希望有朋友与我一起探讨这些问题。同时这也是Allegro中文教程系列的里程碑之一,作为对GUI研究的完结篇。

1、如何动态添加、删除组件?
2、如何实现“多窗口”?

        如果只是搭建静态的GUI(不需要改变控件的数量),无论多么复杂变态的组件,根据MSG机制都可以编写出来。但是关于问题1,则需要更深层次的理解DIALOG。

        如果有在DOS下做界面的经历,你就会明白在设计期“调整界面”是件多么麻烦的事情--每次的改动都需要重新编译,而且你不能直观的看到改动,必须在DIALOG数组中一个数字一个数字的调整。或早或晚,你都会萌生一个想法--做个界面编辑器(GUI EDITOR)。它可以实现:
1、加载那些图片和“控件”,在这里控件不需要是实际的东西,只需要表示它是什么类型的就可以了。
2、这些对象可以自由拖动,对齐,等等等等...
3、根据对象的坐标、类型等信息直接构造可用的Code。
        事实上这并不是一个非常复杂的工作--如果你解决了对象的拖动和多选。你可能需要一个额外的数组或链表来储存当前被选则的对象或对象群。

        我不想具体讨论GE的制作流程,但是“额外的数组或链表”的思想可以运用到我们的GUI之中--动态创建。你可以通过动态构建DIALOG数组(或包含DIALOG对象的结构体数组)的方式来生成一个新的界面,并通过popup_dialog来显示。OK,这是我们第1次接触popup_dialog,它和do_dialog很相似,不过中文版帮助文档3.1中的翻译很不好理解,因此我来举几个例子,你就明白了:
1、do_dialog(a1,-1);
      其中a1有个过程 的 dp3调用
      do_dialog(a2,-1);
      那么首先关闭了a1,然后显示a2,当你ESC之后,直接关闭a2。
2、do_dialog(a1,-1);
      其中a1有个过程 的 dp3调用
      popup_dialog(a2,-1);
      那么首先暂停do_dialog(a1),再显示a2,当你ESC之后,关闭a2,再启动do_dialog(a1)。

        也可以通过init_dialog()、updata_dialog()、shutdown_dialog()来创建自己的do_dialog()。但是关于这个方法,我还没有具体的研究过。

        不过有时候需要更加灵活的来处理新建的问题。比如只有1个或几个控件需要添加。为了达到此目的,必须先彻底了解Allegro GUI的实现方法。

        Allegro GUI 需要一组DIALOG对象,然后使用do_dialog方法来将它们显示出来。你想说什么?直接将新构造的DIALOG对象添加到数组里吗?不错的主意,但是运用起来则非常复杂,记住一个忠告:“永远都要知道自己在处理的是do_dialog发送的什么消息”!do_dialog是死循环,想在do的过程中更改DIALOG数组,你必须巧妙的处理和发送各种消息。或者构造一个单独的DIALOG,并给它发消息以期望他能显示,但是你必须时刻提醒你最初响应的是do_dialog发送的消息,而不是自己发送的消息。

        虽然这样做很麻烦,不过如果你真的需要,比如点击一个按钮,出现一组文字什么的,虽然全部的消息你都需要注意,但是你可以只重点关注以下几种:
1、MSG_START 这个消息通知对象做初始化工作
2、MSG_END 这是个结束的消息,当do_dialog结束时发送,对于一个新的标准proc你可以通过发送MSG_END来初始化它--虽然do_dialog并没有结束。
3、MSG_CLICK 响应这个消息唯一需要注意的是:你需要定位是哪个对象被点击了。因为DOS下没有窗口句柄的概念,因此你只能通过坐标系统来定位,也可以添加一些标志量来辅助这个工作--当然是添加到“额外的数组或链表”,方便动态构造。
4、MSG_DRAW 太重要了,你必须仔细考虑如何响应这个消息~
5、MSG_MOUSEGET/MSG_MOUSELOST 鼠标进入或离开的响应,焦点也有类似的消息。

        除了关于响应消息之外,你必须仔细考虑[何时]发送[什么]消息给[哪个]对象。这个策略由自己来定。

        至此,我们可以彻底的、完全的、搭建我们想要的任何界面了!

抱歉!评论已关闭.