




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Authorware的内部消息接口 首先的问题是:我们作的UCD常常在运行期需要创建对象,尤其是对于象dephi这样的开发语言来说,它从运行到消灭的过程中完完全全是依靠创建对象来实现的。在dephi程序中,我们无需担心创建的对象会因为无法及时消灭而出现非法操作,除非是在运行期动态创建的对象。当我们关闭一个程序时,dephi会自动从内存中释放该对象所占内存空间,不会导致该内寸会造成永久性丢失。但是如果把对象编译进dll程序中,对象就一定是动态创建的,必须在程序退出前释放该对象,否则会出现非法操作的标示。某个有名的UCD中的MP3播放函数就存在这样的问题:必须要求用户执行释放对象的函数才能正常退出,如果用户是使用windows窗口的系统菜单退出的话,则非法操作不可避免,从另一方面来说,一个好的软件是应该充分考虑到用户操作过程中可能出现的种种问题,我们只能给他们提供方便而不是给他们添加麻烦,对于一个商业化的软件这是基本原则。现在的问题是:我们如何知道用户什么时候关闭程序,也就是需要抓住释放对象的机会。当然,制作一个系统钩子函数能够解决这个问题。然而,authorware同样给了程序员一个机会,这就是authorware中的对象消息。要使我们的对象能够接收authorware的内部消息,我们第一步就需要把我们的对象加入到authorware的显示对象列表中去。Authorware的显示对象列表是个抽象的概念,它向每个登记到列表中的对象发布消息,我们就可以根据具体的消息来处理。加入对象到显示列表的命令是通过windows api 函数sendmessage来实现的,函数描述如下:id = SendMessage(pwHandle, APWC_POST, 0, lpPostPB) 参数描述pwHandleAuthorware 窗口句柄lpPostPB指向一个 APWC_POSTPB 参数块的远指针APWC_POST 这条消息就是告诉authorware我要加入一个对象。(其值为常数:$6000)返回值0: 返回该对象的唯一标示号. 0:无法加载对象过程.-1在dll中的对象过程未找到.-2:非法内存.-3:参数错误. lpPostPB 变量结构描述如下:type APWC_POSTPB = record size: Word; /该结构的长度 dll_ptr: PChar; /加载的dll文件名称 function_ptr: PChar; /对象过程函数名称 rect: TRECT; /对象接收消息的区域 port: Integer; /接收消息方式 data_ptr: longint; /对象携带私有数据结构指针 data_size: Word; /对象携带私有数据长度 name_ptr: PChar; /对象变量名 end APWC_POSTPB; FAR = APWC_POSTPB; APWC_POSTPB_PTR = APWC_POSTPB;说明:其中如果没有私有数据,data_ptr 和 data_size可设为零 对象过程函数名必须是用exports导出的函数 port 可取以下三个常量之一: STATIC_PORT = 0;/适用于基本固定的对象,大多数情况下选它 MOTION_PORT = 1;/适用于更新频率较快的对象 SCREEN_PORT = 2;/适用于直接画屏的对象,如果对象是动画之类就选它RECT 是一个在authorware的窗口内定义的区域,如果你需要接收象鼠标消息这样 的消息,则只在该区域你才能接收二 创建对象过程函数在登记对象之后,authorware就向我门定义的对象过程发送消息,我们根据具体的消息,就实现了控制我们对象。 对象过程函数格式:opjiectProc(awparam: APWN_AB;msg: NOTIFICATION_MESSAGE):Boolean;参数说明: awparam:在我们创建对象过程中定义的指向APWN_AB结构的指针 APWN_AB结构声明如下:type APWN_AB = record size: Word; /该结构的长度 id: LongInt; /分配给对象的唯一标示号 icon_id: Integer; /创建该对象所在图标,通常是使用计算图标/的地方 display: HWND; /authorware主窗口句柄 wparam: WPARAM; /msg的第一参数 lparam: LPARAM; /msg的第二参数 rect: TRECT; /由APWC_POSTPB参数传递过来 data_ptr: longint; /由APWC_POSTPB参数传递过来 data_size: Word; /由APWC_POSTPB参数传递过来 name_ptr: PChar; /由APWC_POSTPB参数传递过来 end APWN_AB; FAR = APWN_AB; /声明作为远指针调用(其实在现在32位操作/系统下已无必要 ,可删去) APWN_AB_PTR = APWN_AB;/定义指针 msg:NOTIFICATION_MESSAGE是authorware定义的消息类型 该变量声明如下: type NOTIFICATION_MESSAG=WORD; Msg参数就是authorware传来的消息,它固定为以下几种类型:消息名称 参数 意义 值APWN_INIT对象正在创建. 0 wparam0 lparam0APWN_DESTROY对象正在消灭并释放所占内存 1 wparam0 lparam0APWN_PAINT对象在设备描述表上重绘自身 2 wparamHDC (authorware主窗口设备描述表) lparam0APWN_SAVE对象保存自身的数据以便重载 3 wparam0 lparam0APWN_RESTORE对象重载保存的私有数据 4 wparam0 lparam0APWN_LBDOWN鼠标左键按下. 5 wparam0 lparam(低位字节存放x坐标,高位字节存放y坐标) APWN_LBDBLCK鼠标左键双击. 6 wparam0 lparam(低位字节存放x坐标,高位字节存放y坐标) APWN_LBUP鼠标左键抬起. 7 wparam0 lparam(低位字节存放x坐标,高位字节存放y坐标)APWN_WINDOWOPEN 8 wparam0 lparam0APWN_WINDOWCLOSE authorware主窗口打开/关闭 9 wparam0 lparam0APWN_SETPROPERTY系统使用了SetProperty()函数 10. wparam0 lparamAPWN_PROP_PTR(这是另一个authorware定义的结构参数)APWN_GETPROPERTY获取对象值. 11 wparam0 (not used)lparamAPWN_PROP_PTRAPWN_CLOSEWINDOW当系统函数CloseWindow()被调用时就会传递该消息 12 wparam0 lparam0APWN_MOUSEMOVE鼠标在对象上移动. 13 wparam0 lparam(低位字节存放x坐标,高位字节存放y坐标)APWN_HITTEST鼠标停留在对象边界. 14 wparam0 lparam(低位字节存放x坐标,高位字节存放y坐标)APWN_USER自定义消息 10000这里关键的消息就是 APWN_WINDOWCLOSE,这个消息告诉我们authorware程序即将关闭,我们可相应这条消息来释放我们的对象。 现在我们就用一个实例来阐述如何捉住这条消息。打开我们前面做的函数X_createmediacontrol源代码档,在uses 语句后添加如下声明:/type APWC_POSTPB = record size: Word; dll_ptr: PChar; function_ptr: PChar; rect: TRECT; port: Integer; data_ptr: longint; data_size: Word; name_ptr: PChar; end APWC_POSTPB; FAR = APWC_POSTPB; APWC_POSTPB_PTR = APWC_POSTPB; /type APWN_AB = record size: Word; id: LongInt; icon_id: Integer; display: HWND; wparam: WPARAM; lparam: LPARAM; rect: TRECT; data_ptr: longint; data_size: Word; name_ptr: PChar; end APWN_AB; APWN_AB_PTR = APWN_AB; / type APW_NOTIFICATION_MESSAGE = Word; const APWN_INIT = 0; const APWN_DESTROY = 1; const APWN_PAINT = 2; const APWN_SAVE = 3; const APWN_RESTORE = 4; const APWN_LBDOWN = 5;const APWN_LBDBLCK 6 const APWN_LBUP 7const APWN_WINDOWOPEN=8constAPWN_WINDOWCLOSE = 9const APWN_SETPROPERTY =10 const APWN_GETPROPERTY =11const APWN_HITTEST 11const APWN_CLOSEWINDOW= 12.const APWN_MOUSEMOVE = 13; const APWN_HITTEST = 14; const STATIC_PORT = 0; const MOTION_PORT = 1;const SCREEN_PORT = 2;const APWC_POST = $6000;找到 function createmediacontrol(awparam:AWPARAM_PTR;visible,x,y:integer;filename:Pchar):longint;stdcall;/注 /意此处返回值类型改为longint,同时声明部分也要相应修改/添加var postpb:APWC_POSTPB_PTR; wpostpb:longint; szfilename:Pchar;begin /创建过程不变/在result。之前添加如下代码: getmem(szfilename,255);/给dll文件名分配内存 GetModuleFileName(hinstance,szfilename,255);/取得文件名 postpb.size:=sizeof(postpb);/设置APWC_POSTPB_PTR参数长度 postpb.dll_ptr:=szfilename;/设置APWC_POSTPB_PTR 文件名 postpb.function_ptr:=newproc;/定义对象过程函数 setrect(postpb.rect,0,0,200,200);/定义区域,无所谓,可大可小 postpb.port:= STATIC_PORT; /定义消息接收模式 _ptr:=myproc;/定义APWC_POSTPB_PTR变量名,随便给一个好了 postpb.data_ptr:=0; /定义APWC_POSTPB_PTR 携带私有数据 postpb.data_size:=0;/ 定义APWC_POSTPB_PTR 携带私有数据长度 wpostpb:=longint(postpb); /定义APWC_POSTPB_PTR的指针sendmessage(awparam.hwnd, APWC_POST,0,wpostpb);/向authorware发送消息接下来,就该写对象函数过程了,前面定义的函数名为newproc 则函数名需要保持一致function newproc(APWNPTR:AP
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 森林防火业务知识培训课件
- 森林火灾防范知识培训课件
- 森林消防水电知识培训课件
- 棋类培训课件
- 桥梁防撞理论知识培训课件
- 2025年陵园工作招聘笔试模拟试题及答案
- 2025年健康管理师(高级)实操技能考核试题及答案
- 2025年电子商务战略规划师中级求职面试全攻略及预测题库
- 2025年财务会计实操模拟题集及参考答案详解
- 2026届广东省深圳高级中学化学高二第一学期期中综合测试模拟试题含解析
- 比亚迪公司薪酬管理制度
- 公司监控视频管理制度
- 交通事故护工合同范本
- T/CECS 10103-2020用于水泥和混凝土中的铅锌、铁尾矿微粉
- T/CCASC 4003.1-2022氯碱工业成本核算方法第1部分:氢氧化钾
- 消防接警考试题及答案
- 2024年高级消防员技能鉴定考前必刷必练题库500题(含真题、必会题)
- 2025年中国TPU环保薄膜市场调查研究报告
- 《智能客服运营管理》课件
- 管网工程施工组织设计与管理
- 幼儿园开学园长会议发言稿模版
评论
0/150
提交评论