找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1411|回复: 7

[VBA函数]:MDL自学笔记

[复制链接]
发表于 2006-1-16 20:15:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
今天学习的是事件驱动编程.包含内容:
   1,状态机概念
  2,事件驱动编程
  3, 通过异步函数修改MS的缺省行为
  最后,当然是练习了.
   
    一,状态机概念
   说起状态机,肯定就是MS事件状态改变的机制了.想起来很重要,但DOC的描述主要就是通过一个图.包含了这么几个步骤:
      状态输入处理->输入消息队列->任务分发->状态分发->根据状态不同分为(DATA, RESET,...KEYIN等).
     以做一个CELL为例子,你首先输入的KEYIN命令,那么就进入START命令状态,这个时候MS在等候你的吩咐,你用鼠标点一个点,则进入DATAPOINT状态(如果你启动了DYNAMIC,则你鼠标移动的时候,始终有个DYNAMIC状态).如果命令结束,点鼠标右键,进入RESET状态,就OK.这就是状态机的基本概念.
      说起来比较简单,在MDL里,它们是怎么实现呢?
      MDL通过命令表(COMMAND TABLE)建立命令函数之间的联系.这样,而每个命令表又通过命令号(COMAND NUMBER)来识别,每个命令号和对话框的条目(ITEM)联系,这样当点了对话框之后,自动进行消息触发,从而调用函数,实现想实现的功能.
      二,事件驱动编程
   事件驱动编程的基本步骤就是
   建立命令表->根据命令编号对应实现函数(HOOK).启动的时候,
载入命令表.然后就可以实现.
      三,通过异步函数改变MS的缺省行为
   通过修改钩子函数,并利用mdlXXX_setFunction,替换原来的实现钩子函数,便可以想怎么实现就怎么实现.

      接下来就该是找个例子学习拉.
      MyApp够复杂,很多方面都包含了.如果完全掌握这个例子,我想就基本能够动手写MDL了吧.

      这个例子包含了如下内容:
     1,命令表
   2,消息列表
   3,基础对话框概念
   4基本命令
   5元素定位
   6元素修改

   一 命令表
   命令表其实也就是定义在资源文件中的数据.可以通过手工写一个ASCII文本文件,以.R为扩展名.当然,MS也提供了其资源定义工具.RDE,MS可以帮你配置.
           配置工具调用:MDL LOAD RDE.就可以调用RDE,看看基本就知道该怎么配置了.不过确实不怎么好用.我看DOC里确实说MS有一个MDE环境,而且上面也有界面图,可就是不知道怎么配置出来.听说BENTLEY的支持工程师蒋先生也说在产品中自带有的,可不知道怎么调用出来?哪个高手来讲讲?
     二,消息列表
   其实也就是定义消息的一些ID,和对应的HOOK一起实现钩子函数.这样MS知道怎么去派发这些消息到实现函数中去了.
     三对话框概念
   可以将对话框想象成一个容器(从编程角度),从功能上来说,是和用户进行交互的窗口.对话框提供按狃,文本,菜单,菜单项,这些都通过资源进行定义,每个资源条目,对应相应的实现钩子函数.通过MS的消息派发,就实现了你想要实现的功能了,从而满足了用户和系统的交互.
    四基本命令(Primitive command)
    就是状态机的几个方面罗.
    mdlState_startPrimite(函数1, 函数, ID1, ID2),指定了DATA和RESET的函数,在DATA和RESET里实现钩子.一切OK
    五 元素定位和修改
  其实这两个还没怎么看呢.不过MSElement和MSElementDesc基本有个了解.前者是一个元素的结构,最大为768个WORD,后者是元素在内存中的元素描述,可以通过next,previous等来访问不同的元素,
      笨蛋和懒人就是没办法,写的太马虎拉
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-1-16 23:30:14 | 显示全部楼层
友情支持
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-17 21:19:30 | 显示全部楼层
今天没怎么看到文档,多是对以前看的回顾。今天学习一个例子,就是给画一个矩形,然后用CELL填充它。
   学习这个例子的主要收获,一则是对API的学习,另外是对状态机的实际理解。
   一、API
      1、mdlSystem_getCfgVar(char *pValue,  char *pCfgValue,  int maxLen);
          该函数是获取环境配置变量的值拉。如果要做工程的话,可以在你的.ucf文件中增加一个环境变量,利用该函数直接读取,这样就可以动态配置变量值了。
     其中,pValue为变量的值,pCfgValue,变量名,maxLen为值的最大字符串长度了。
   2、mdlCell_attachLibrary(char *fileName,  char *pInputName, char *defaultDir, int fromKeyin)
       功能:连接CELL库
    参数:fileName,被打开的CELL文件名(输出),pInputName,CELL库文件名,DEFAULTDIR,搜索路径,fromKeyin,一般设置为TRUE。
   3、 mdlShape_create
       功能:画多边形(SHAPE)。
   参数:MSElement*       out  ,返回的元素
         MSElement*       in  ,设置为NULL,取当前设置
         DPoint3d*       points ,点集合
         int                  vertic  ,点个数
         int                 fileMode,这个是SHAPE的填充模式,很重要哟。
  
   4、mdlState_setFunction
            功能:设置状态处理钩子
      参数:eventType,状态机所处状态
            MdlFunctionP       stateFunc  ,当然是处理函数的指针了。
   5、mdlState_dynamicUpdate
           功能:指定动态更新的方法。
     参数:MdlFunctionP       dynamicfunc  ,DYNAMIC处理的函数
          int       validData  ,TRUE,修改的时候,设置TRUE,否则为FALSE
二、状态机制
   一般而言,MS启动一个命令,就使用mdlState_startPrimitive
     它有四个参数,前面两个参数比较重要,它们是两个函数指针,第一个指定了DataPoint的处理函数,第二个指定了reset时的处理函数。基于事件(EVENT)编程的关键是在事件发生时,去完成我们要想实现的功能,那么,在DataPoint发生时,我们就可以在这里完成这些事情。
   同时,如果状态发生了改变,可以利用另外的处理函数来处理,那么,可以使用mdlState_setFunction。该函数可以设置(改变)函数钩子。比如,在DataPoint状态,开始我们用FUNC1,可当你点第二下的时候,需要处理另外一个流程,需要用FUNC2来实现,则可利用mdlState_setFunction(STATE_DATAPOINT, FUNC2)来实现。一切就OK。
   其实,除了DATAPOINT以后,最重要的应该就是DYNAMIC了。这个处理也是非常重要的。怎么来设置其处理函数呢?
    当然,用前面介绍的mdlState_dynamicUpdate,这个函数可以设置DYNAMIC处理函数。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-1-19 07:54:30 | 显示全部楼层
很好,多谢!
但愿能坚持下去,多谢赐教!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-1-19 12:49:42 | 显示全部楼层
参考:
http://www.gisforum.net/bbs/disp ... D=112350&page=1
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-21 15:31:06 | 显示全部楼层
今天想做的一件事情:
1、取CELL的origin做起点,然后画线。感谢这里的朋友提供了mdlCell_extract函数来获取cell的origin;可是, 我在uerState_dynamicUpdate函数中,如何来定位当前点点中哪个CELL呢?我查了mdlLocate_xxx,发现没有返回ELEMENT的函数。沮丧。
2、想连接数据库,进行数据操作(利用MS GEO提供函数)。可是当我利用斑竹给我的mdlMap...打开项目时,编译通过,就是连接的时候说该数据是不认识的符号。我推断是少了XXX。DLO。需要在MKE里加进去。请问,如何加?加什么呢?
3、当然,前面两步做了的话我想给图员设置FEATURE和databaselink。还需要再研究
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-1-22 10:25:48 | 显示全部楼层
1.使用mdlElement_getFilePos得到当前定位元素的文件位置
2. 在你mke文件里添加如下文件才能使用gg的函数 ntgis是我程序的名字
ntgisObjs = $(o)ntgis.mo \
              $(mdlLibs)mdllib.dlo \
    $(mdlLibs)ditemlib.ml       \
    $(geoMdlLibs)geoshlib.dlo   \
    $(geoMdlLibs)geolib.dlo          \
    $(geoMdlLibs)geoshare.dlo        \
    $(mdlLibs)rdbmslib.dlo        \
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-22 21:25:37 | 显示全部楼层
多谢gp341
顺利完成数据库打开
但是在MKE中,
ditemlib.ml
geoshaire.dlo
geoshllib.dlo
都找不到
呵呵,上次我也知道是差DLO,可我不大会用MKE,这次就是找到一个比较类似的MKE,去改了一下。
MAKE文件不大会写,一直是拿人家的来改。比较复杂的,还要自己再写一个MKI包含进来,呵呵,感觉太麻烦了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-22 07:16 , Processed in 0.222471 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表