我用ATL写了个控件,里面接收自定义消息进行处理,在VB中使用。一开始,一切正常,可是当我将控件改为Invisible at runtime后,用PostMessage给这个控件发消息时,它就没有响应了?这是为什么呀?怎么才能让Invisible at runtime的ATL控件响应自定义消息呢?请高手多多帮忙!
谢谢了,先!

解决方案 »

  1.   

    Invisible at runtime 后没有窗口,自然无法接受消息。
    在构造函数中加入
    m_bWindowOnly = true;
    即可,然后重载函数
    LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled);
    在函数中加入
    bHandled = true;
    即可实现既能响应消息,又不可见。
      

  2.   

    谢谢楼上的回答,我想问:
    在OnEraseBkgnd处理自定义的消息吗?
      

  3.   

    Python(Rick Pan) 兄:
    你的方法我已经试过了,可是不行!现在又发现了一个现象,就是改为Invisible at runtime后,控件在VC中使用PostMessage给这个控件发消息时有响应,就是在VB、Delphi等中使用时没有响应!请高手们多多指点!
    只要能解决问题,分不够可以再加!
    谢谢了,先!
      

  4.   

    难道CSDN就没有高手吗?!!!只要能解决问题,分不够可以另开贴再加!
      

  5.   

    多谢hxblvc(学习...) 帮我顶!继续请高手帮忙!我就不信CSDN没有高手!
      

  6.   

    我也遇到类似的问题。
    不过比你的还严重,我的OCX是可视的,界面是一个对话框,可是在使用的时候,根本无法响应内部元素的消息啊。帮你顶
      

  7.   

    多谢nibaijing(浮城) 帮我顶!继续请高手帮忙!我就不信CSDN没有高手!
      

  8.   

    CSDN真的没有高手吗???!!!
      

  9.   

    无法获得窗口的句柄了啊,呵呵
    注意PostMessage和SendMessage的原型:
    BOOL PostMessage(
      HWND hWnd,      // handle of destination window
      UINT Msg,       // message to post
      WPARAM wParam,  // first message parameter
      LPARAM lParam   // second message parameter
    );
    LRESULT SendMessage(
      HWND hWnd,      // handle of destination window
      UINT Msg,       // message to send
      WPARAM wParam,  // first message parameter
      LPARAM lParam   // second message parameter
    );
    它们都需要接收消息的窗口句柄,如果运行时候没有窗口了,那么消息就没有地方发送了!
    MFC的源代码中的SendMessage和PostMessage的第一个条件就是判断hWnd是否为一个窗口。参考MFC源代码AfxWin2.inl中:_AFXWIN_INLINE LRESULT CWnd::SendMessage(UINT message, WPARAM wParam, LPARAM lParam)
    { ASSERT(::IsWindow(m_hWnd)); return ::SendMessage(m_hWnd, message, wParam, lParam); }
    _AFXWIN_INLINE BOOL CWnd::PostMessage(UINT message, WPARAM wParam, LPARAM lParam)
    { ASSERT(::IsWindow(m_hWnd)); return ::PostMessage(m_hWnd, message, wParam, lParam); }
      

  10.   

    请高手们注意这个现象:    就是改为Invisible at runtime后,控件在VC中使用PostMessage给这个控件发消息时有响应,就是在VB、Delphi等中使用时没有响应
        
        该怎么处理呢?
        请高手们多多指教!
        谢谢了,先!
      

  11.   

    个人认为使用PostMessage没有什么意思,直接添加一个接口函数不是更好!呵呵
      

  12.   

    俺做过一些,但没有遇到楼主所说情况,如果确实如此,且必须postmessage,建议这样解决
    把窗口设置为可见
    然后,SendMessage ,WM_SHOWWINDOW,使得不可见
    然后再用你的其他调用你可以试验一下。
    问题原因,俺粗略认为,这可能是vb对消息循环或者线程的处理与vc中不一样?
    当然,以上只是猜测,依据就是俺以前对vb的认识就是在vb中实现异步操作或多线程比较不稳定。
    另外严重同意下边这个,你既然用了com技术,还整个PostMessage之类的东东,体系结构混乱嘛:
    --------------------
     vcleaner(我没做大哥已经很久了.......) ( ) 信誉:131  2005-1-13 15:18:49  得分: 0     
    个人认为使用PostMessage没有什么意思,直接添加一个接口函数不是更好!呵呵
    --------------------  
     
      

  13.   

    唉,这个问题以前遇到过,确实不爽,COM要想做到通用确实有点难度,这种情况是因为VC不支持无
    窗口控件(即控件本身是一个子窗口,所以可以处理消息),而Delphi和VB都可以支持无窗口控件
    (这个时候所谓控件只是主窗口的一部分),控件没有自己的句柄,所以无法处理消息。比较猥琐的解决方法是控件中另外生成一个隐藏窗口,记下它的句柄,然后给控件的消息就发送给
    这个隐藏窗口,然后在隐藏窗口的消息处理函数中在调用相应的处理函数。呵呵,我写第一个COM组件时,遇到的就是这个问题,当时也是郁闷了好久,兄弟,努力吧。
      

  14.   

    在Invisible at runtime后,VB和Delphi都会将控件设为无窗口控件。
      

  15.   

    vcleaner(我没做大哥已经很久了.......) 能不能说得更详细一点?刚学ATL,请多多指教!谢谢了,先!
      

  16.   

    手动的在IDL文件中使用IDL语言定义一个新的接口,添加一个接口函数,然后就可以让ActiveX类使用多继承,从这个类继承,然后实现这个接口函数,然后就可以在需要PostMessage的时候查询这个接口,调用这个接口函数,完成PostMessage所完成的工作,呵呵。
    COM的基础很重要,如果你不是很理解COM,最好多看看相关的书,有人说过“不懂COM原理的程序员肯定不是一个好的ATL程序员”。呵呵,祝你顺利!
      

  17.   

    或者只是使用IDE的集成开发环境添加接口或者直接添加一个接口函数,参考:
    http://www.vchelp.net/wyy/tour/teach_sp_23.htm
      

  18.   

    http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_asug_Creating_an_Interface.asp