事件处理,是用户界面子系统的基础。流行的GUI类库,都有自己的一套。MFC就比较懒了,直接使用windows消息系统。如果我们只考虑windows系统的话,那么使用系统消息是最简单的方式。但是在系统消息基础上,我们要进行自己的封装。windows消息众多,CAD主要关心的有以下几类消息:

  • 鼠标,键盘。
  • 窗口消息。
  • 外接设备消息,比如HP的3d鼠标,数字化仪,手写板等等。

由于操作的特殊性,我们可以把很多消息进行重新定义。比如鼠标左键消息,包括WM_LBUTTONDOWN,WM_LBUTTONUP,定义为左键输入,表示输入一个点,那么这个左键输入就变成了一个我们自己的事件系统的消息,在这基础上,我们可以改变这个事件对应的windows消息,比如改成右键的鼠标消息,我们也可以让用户来自定义自己的键盘或者干脆定义为手写板上面的消息。

自定义的事件,可以充分抽象以达到界面交互系统的要求。实现的时候,事件系统也可以和以下的子系统结合考虑,形成灵活的界面交互系统:

  • VBA等内置的宏语言。这样就可以支持自动录制用户的界面操作形成宏。
  • 命令系统。CAD软件的传统交互方式就是用键盘输入命令,现在仍然保留这个命令系统,那么我们的自定义事件就可以和命令系统结合起来。
  • 外部程序。CAD软件有时候需要和外部的进程进行数据交互,那么这个时候事件系统要充分考虑到外部程序消息交换的需要。

实际实现自定义事件系统的时候,可以先预定义一些事件,然后实现自己的时间队列和相应的处理函数。再把这些加入到windows的消息循环中去。这种实现方式最为灵活,但是比较困难,需要精心的测试和研究。