参看Word2003控件工具栏,可以从已注册控件列表中选择控件,在View窗口中“显示”一个能够托拽(位置、尺寸)的ActiveX控件,这里之所以不用“创建”这个词,是因为如果使用Create来创建控件,那么控件会截获鼠标消息,从而使窗口无法得到,也就无从谈起拖拽了。不像OLE服务器对象,当打开在位编辑时,消息会被对象得到,而不处于编辑状态时,消息会被容器窗口得到。

解决方案 »

  1.   

    “如果使用Create来创建控件,那么控件会截获鼠标消息,从而使窗口无法得到,也就无从谈起拖拽了”
    是这样吗?
    我觉得照样可以拖拽。
      

  2.   

    程序可能需要以下函数支持:
    OnLButtonDown
    SetCapure
    OnMouseMove
    OnLButtonUp
    ReleaseCapure
    MoveWindow
      

  3.   

    我的测试结果是这样的,包括在控件内部LButtonDown,此时即便MouseMove到外部窗口,再LButtonUp,这一系列mouse消息外部窗口都得不到。似乎需要控件通过事件通知外部窗口,或者外部窗口用计时器不停检查mouse状态,钩子是不是可以直接截获鼠标消息(我没用过),除此之外,还有没有更简便直接的方法?
      

  4.   

    我的意思是,为什么控件自己不能MoveWindow自己啊?
    而且它也可以通过GetParent得到它的父窗口。
      

  5.   

    控件可以自己MoveWindow,但是前提是它必须知道何时需要自己MoveWindow
    在控件上LButtonDown,只有控件的OnLButtonDown得到了消息,而父窗口的OnLButtonDown则没有响应。
      

  6.   

    “它必须知道何时需要自己MoveWindow”
    那你想什么时候MoveWindow?
      

  7.   

    sinall()老兄说的是对的,初次接触ActiveX,把它的拖拽想象得太高深了,没想到实际上就是拖拽一个窗口,见笑了。
    老兄所说的拖拽似乎是在控件内部实现的,如果由父窗口实现呢?想和老兄再聊聊后,再结帖,谢谢。
      

  8.   

    在子窗口认定需要MoveWindow的时候,通知父窗口(发送消息)
      

  9.   

    那不是和事件一回事么,的确可以解决该问题。
    但是对于在下的具体情况还有些细节问题需要解决,在下要求动态的创建ActiveX控件,也就是在Create控件时即时产生控件的窗口ID,这样在使用事件此类方式时,会面临控件窗口ID的指定问题。