发信人: wql.bbs@bbs.swjtu.edu.cn (晖), 信区: cnprogram
标  题: 面向对象化程序设计中的消息驱动机制(四)
发信站: 锦城驿站 (Thu Jun 26 04:20:57 1997)
转信站: Lilac!ustcnews!ustcnews!sjtunews!swjtunews!swjtubbs
出  处: xnjd21.swjtu.edu.cn

struct  MessageBuf            //消息缓冲区元素结构
{
  char  message_type;         //消息类型(鼠标、键盘、 对象消息或其他消息)
  union
  {
    struct MouseMessData mouse; //鼠标消息数据
    struct KeyMessData   key;   //键盘消息数据
    struct ObjMessData objmess; //对象消息数据
       ...    ...   ...         //其他消息数据
 };
  unsigned long message_time;   //消息产生的时间
} ;

    在进行消息翻译分发时,有可能还要根据当前的进程状态对消息内容
进行一些必要的补充,故翻译后的消息结构元素应在消息队列消息元素的
基础上增加几个成员:
  
  void * dest_object;            //当前消息的作用对象指针
  int     mess_code;              //当前消息的翻译后的宏代码
  union                           //附加信息
  {
   char extra_mess;               //附加信息
    ... ... ...                   //附加信息
并命名为 struct TranMessage。
    为了便于消息队列的维护、排错和比较透明地访问,建立消息队列类(略去部分成员):

const ENENT_BUF_SIZE =  200;     //队列最大长度

class  Message                    //消息(队列)类
{
 private:
  int mess_front;              //队首
  int mess_rear;               //队尾
  Boolean mess_enabled;        //=TRUE: 允许消息产生; =FALSE: 禁止消息产生
  struct  MessageBuf mess_buffer[EVENT_BUF_SIZE];  //消息缓冲区
  Boolean BufferFull(void);      //判断消息缓冲区是否已满(=TRUE:满)
  Boolean BufferEmpty(void);     //判断消息缓冲区是否为空(=TRUE:空)
 public:
  ywEvent();
  ~ywEvent();
  void SetMessageEnable(Boolean status); // 设置允许或不允许消息产生
  void InsertMessage(unsigned char ms_status,int ms_x,int  ms_y,int ms_dx,
                   int ms_dy, unsigned long time );
         //在消息缓冲区中插入一个鼠标消息(插入队尾)
  void InsertMessage(unsigned int key, char fun_key,   unsigned long counter );
         //在消息缓冲区中插入一个键盘消息(插入队尾)
  void InsertMessage(int mess_id, ywBar * obj,   unsigned  long counter );
         //在消息缓冲区中插入一个对象消息(插入队首)
  void ClearMessageBuf(void);     //清除消息缓冲区
  void ClearCurrentMessage(void); //从消息缓冲区队首删除当前消息
  void GetMessage(struct MessageBuf * mess);       // 从队首取出一条消息
};
    ⑵ 各个消息源的消息产生方式
    鼠标消息采集函数以中断33H的功能0cH安装成用户鼠标驱动子程序。
每当鼠标器有动作时即被调用并在消息队列中插入消息。函数在被调用时
还完成对鼠标动作的一些初步翻译。如双击左键,原始的驱动程序没有直
接捕获该消息,要靠本函数根据系统时钟和已发生的消息序列翻译。

--
※ 来源:.锦城驿站 bbs.swjtu.edu.cn.[FROM: 202.115.65.102]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:9.382毫秒