发信人: 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毫秒