问题:
1、用ATL或MFC做的Activex插入Word后,好像只有修改大小的时候,才会触发Activex的OnDraw事件,最小化Word或者移动Word时候都不触发。
如何能让Word在最小化或者移动的时候也触发OnDraw事件?
2、用ATL或MFC做的Activex插入Word后,不能触发相应的右键或者左键事件(当然已经编写相应的事件代码)。
如何让控件在Word中能响应鼠标事件??

解决方案 »

  1.   

    Word的最小化移动等没有对应的事件消息...
      

  2.   

    注入word进程,挂个消息钩子,有最小化通知自己重绘
      

  3.   

    第一个问题容易解决,子类化WORD主窗口的窗口过程,可以拦截所有主窗口的消息,当然包括最小化、移动等消息。
    第二个问题应该是不可能发生的,无论控件是有窗口还是无窗口的,都应该都接收到鼠标消息,不知道你的控件是怎么做的。
      

  4.   

    To jameshooo :
    解决了这个问题,马上结贴!
    问题:
    用ATL和MFC写的OCX,调用VBA插入到WORD与直接从Word菜单里面插入->对象那种操作,效果不一样
    调用VBA插入Word之后,即使Wrod退出设计模式,也不能让OCX响应鼠标事件,必需按照Word的提示,双击之后才能响应
    如何能让调用VBA插入的OCX,在退出设计模式后,能直接响应鼠标事件?
    录制的插入WORD的VBA代码:
    Sub insert()
        Selection.InlineShapes.AddOLEObject ClassType:="BMFCOCX.bmfcocxCtrl.1", _
            FileName:="", LinkToFile:=False, DisplayAsIcon:=False
    End Sub
      

  5.   

    在Office中,宏和加载项的地位是有区别的,Office“特别关照”宏代码,处处设限,你遇到的问题恐怕就是安全限制之一,基本原因在于写一段宏代码太容易,写一个加载项恐怕不那么轻松。这里指示的就是一个方向,如果VBA完成不了的功能,尝试用加载项来完成。
      

  6.   

    用spy++查查控件收到的消息,再在控件中写对应消息的处理代码,如可以调用OnDraw函数.
      

  7.   

    to  jameshooo:
    我是在加载项中,参照VBA代码写的,效果一样,不知道有没有其他方法能实现??
      

  8.   

    如果连加载项都被限制了,可能就真的没办法了。尝试在国外的论坛找找类似的问题。
    在微软搞的东西中,有很多选项必须由用户改变,不能通过代码改变,比如UAC、比如任务栏的自定义工具栏是否被自动加载。
      

  9.   

    解决了这个问题,马上结贴! 
    问题: 
    用ATL和MFC写的OCX,调用VBA插入到WORD与直接从Word菜单里面插入->对象那种操作,效果不一样 
    调用VBA插入Word之后,即使Wrod退出设计模式,也不能让OCX响应鼠标事件,必需按照Word的提示,双击之后才能响应 
    如何能让调用VBA插入的OCX,在退出设计模式后,能直接响应鼠标事件? 
    录制的插入WORD的VBA代码: 
    Sub insert() 
        Selection.InlineShapes.AddOLEObject ClassType:="BMFCOCX.bmfcocxCtrl.1", _ 
            FileName:="", LinkToFile:=False, DisplayAsIcon:=False 
    End Sub 有没有其他高手能解决的?
    谁解决,200分就都给谁!!!
      

  10.   

    我用ATL,在word中插入控件很正常呀.左右键都触发.我现在有一点不清楚的是,我在控件上点右键时弹出上下文菜单(这一步完成了),上下文菜单中的子菜单响应代码如何写?我只知道手工加入.不知有没有别的方法.
    楼主,把你的代码贴出来,或者邮给我看看.为的就是想要你的200分呀.呵呵呵.
      

  11.   

    我用Atl在word中插入ActiveX控件,目前都很顺利.
    这里稍稍提示一下需要注意的问题:有一些必要的初始化不要忽略, 我就遇到过控件图片忘记在其构造函数中初始化:
    (CComPtr<IPicture> m_ActiveXPicture = NULL;).结果控件没有显示出来.ActiveX控件的绘制要避免闪烁,这可以采用二次缓存的方法解决.Activex控件在word文档中的位置,要避免只能插入到word文档的第一页.大名鼎鼎的NTKO签名软件就有这个问题,它的签名控件永远只能插入到第一页,即使能移动,也只能在第一页移动.好想要楼主的200分.呵呵.
      

  12.   

    To shukinwg:
    你的QQ是多少?或者留个邮箱
    我会给你发邮件
    PS:你在Word里面插入Activex,用的是那种方法??
    我的Activex都是默认的用ATL向导建立的。
    当然,我用Word的插入对象对话框,可以正常响应鼠标事件,但是,用VBA宏就不行,不知道你用的是那种方法插入Activex。宏代码如下:
    Sub insert() 
        Selection.InlineShapes.AddOLEObject ClassType:="BMFCOCX.bmfcocxCtrl.1", _ 
            FileName:="", LinkToFile:=False, DisplayAsIcon:=False 
    End Sub 解决了马上给200分!!!
      

  13.   

    本人初次上这个论坛,许多规矩不懂.
    来这里和朋友一起探讨学习,互相取长补短吧.
    .cn
    我整个工程用的ATL,没有MFC也没有vba.
    下面是我的部分代码,仅供参考.void CWordAddin::InsertActiveX(IPicture *pic)
    {CComPtr<MSWORD::_Document> spDoc;
    m_spApp->get_ActiveDocument(&spDoc);
    if(spDoc==NULL)return;
    CComPtr<MSWORD::Shapes> spShapes;spDoc->get_Shapes(&spShapes);CComVariant ClassType(_MYPROGID);
    CComVariant left,top,width,height;
    CComVariant vEmpty(DISP_E_PARAMNOTFOUND, VT_ERROR); 
    CComPtr<MSWORD::Shape> spShape;float fx,fy;
    GetInsertPos(fx,fy);//如果哥们没有这个函数,就让fx=fy=0吧,反正是测试用嘛.
    left=fx; top = fy;spShapes->AddOLEControl(&ClassType,&left,&top,&vEmpty,&vEmpty,&vEmpty,&spShape);
    .....


      

  14.   

    shukinwg 的方法有效!!!
    还有个问题:
    你的GetInsertPos是如何获取到当前的插入点的坐标的??
    用:m_spApp->GetActiveWindow()->GetPoint
    好像有点问题,获取的是负数??
      

  15.   

    1.在WordAddin中添加ActivWindow事件。在事件函数中调用InvalidateControl()函数刷新控件。
    2.关闭设计模式。在设计模式下。你添加的Activex插件Word只认为是张图片
      

  16.   

    spSelection->get_Information(wdHorizontalPositionRelativeToPage,&vLeft);
    spSelection->get_Information(wdVerticalPositionRelativeToPage,&vTop);
            fx = vLeft.fltVal;
    fy = vTop.fltVal;