为什么我的Windowed Only控件在设置成Invisible at runtime后,不响应自定义消息了? 我用ATL写了个控件,里面接收自定义消息进行处理,在VB中使用。一开始,一切正常,可是当我将控件改为Invisible at runtime后,用PostMessage给这个控件发消息时,它就没有响应了?这是为什么呀?怎么才能让Invisible at runtime的ATL控件响应自定义消息呢?请高手多多帮忙!谢谢了,先! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Invisible at runtime 后没有窗口,自然无法接受消息。在构造函数中加入m_bWindowOnly = true;即可,然后重载函数LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled);在函数中加入bHandled = true;即可实现既能响应消息,又不可见。 谢谢楼上的回答,我想问:在OnEraseBkgnd处理自定义的消息吗? Python(Rick Pan) 兄:你的方法我已经试过了,可是不行!现在又发现了一个现象,就是改为Invisible at runtime后,控件在VC中使用PostMessage给这个控件发消息时有响应,就是在VB、Delphi等中使用时没有响应!请高手们多多指点!只要能解决问题,分不够可以再加!谢谢了,先! 难道CSDN就没有高手吗?!!!只要能解决问题,分不够可以另开贴再加! 多谢hxblvc(学习...) 帮我顶!继续请高手帮忙!我就不信CSDN没有高手! 我也遇到类似的问题。不过比你的还严重,我的OCX是可视的,界面是一个对话框,可是在使用的时候,根本无法响应内部元素的消息啊。帮你顶 多谢nibaijing(浮城) 帮我顶!继续请高手帮忙!我就不信CSDN没有高手! CSDN真的没有高手吗???!!! 无法获得窗口的句柄了啊,呵呵注意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); } 请高手们注意这个现象: 就是改为Invisible at runtime后,控件在VC中使用PostMessage给这个控件发消息时有响应,就是在VB、Delphi等中使用时没有响应 该怎么处理呢? 请高手们多多指教! 谢谢了,先! 个人认为使用PostMessage没有什么意思,直接添加一个接口函数不是更好!呵呵 俺做过一些,但没有遇到楼主所说情况,如果确实如此,且必须postmessage,建议这样解决把窗口设置为可见然后,SendMessage ,WM_SHOWWINDOW,使得不可见然后再用你的其他调用你可以试验一下。问题原因,俺粗略认为,这可能是vb对消息循环或者线程的处理与vc中不一样?当然,以上只是猜测,依据就是俺以前对vb的认识就是在vb中实现异步操作或多线程比较不稳定。另外严重同意下边这个,你既然用了com技术,还整个PostMessage之类的东东,体系结构混乱嘛:-------------------- vcleaner(我没做大哥已经很久了.......) ( ) 信誉:131 2005-1-13 15:18:49 得分: 0 个人认为使用PostMessage没有什么意思,直接添加一个接口函数不是更好!呵呵-------------------- 唉,这个问题以前遇到过,确实不爽,COM要想做到通用确实有点难度,这种情况是因为VC不支持无窗口控件(即控件本身是一个子窗口,所以可以处理消息),而Delphi和VB都可以支持无窗口控件(这个时候所谓控件只是主窗口的一部分),控件没有自己的句柄,所以无法处理消息。比较猥琐的解决方法是控件中另外生成一个隐藏窗口,记下它的句柄,然后给控件的消息就发送给这个隐藏窗口,然后在隐藏窗口的消息处理函数中在调用相应的处理函数。呵呵,我写第一个COM组件时,遇到的就是这个问题,当时也是郁闷了好久,兄弟,努力吧。 在Invisible at runtime后,VB和Delphi都会将控件设为无窗口控件。 vcleaner(我没做大哥已经很久了.......) 能不能说得更详细一点?刚学ATL,请多多指教!谢谢了,先! 手动的在IDL文件中使用IDL语言定义一个新的接口,添加一个接口函数,然后就可以让ActiveX类使用多继承,从这个类继承,然后实现这个接口函数,然后就可以在需要PostMessage的时候查询这个接口,调用这个接口函数,完成PostMessage所完成的工作,呵呵。COM的基础很重要,如果你不是很理解COM,最好多看看相关的书,有人说过“不懂COM原理的程序员肯定不是一个好的ATL程序员”。呵呵,祝你顺利! 或者只是使用IDE的集成开发环境添加接口或者直接添加一个接口函数,参考:http://www.vchelp.net/wyy/tour/teach_sp_23.htm http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_asug_Creating_an_Interface.asp io完成端口发送数据问题! 一个简单的类程序的运行问题 win32程序toolbar按钮如何换图片? ★我想手动创建5个编辑框,该怎么做? 请教高手,SymInitialize()和SymLoadModule()这两个函数怎么用? 请问高手用RichEdit控件时如何实现鼠标右键弹出菜单? 执行SetDlgItemInt()函数速度好慢,为什么。 请高手们推荐一款好的反编译软件(C或VC),在此谢过大家了!! 关于VC调用ADO的问题,求救! 在详细一点 如何实现想Photoshop中那样的宏录制,达到对图象批处理的功能? 我星期六考c++,请教一个简单的问题!麻烦各位了!
在构造函数中加入
m_bWindowOnly = true;
即可,然后重载函数
LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled);
在函数中加入
bHandled = true;
即可实现既能响应消息,又不可见。
在OnEraseBkgnd处理自定义的消息吗?
你的方法我已经试过了,可是不行!现在又发现了一个现象,就是改为Invisible at runtime后,控件在VC中使用PostMessage给这个控件发消息时有响应,就是在VB、Delphi等中使用时没有响应!请高手们多多指点!
只要能解决问题,分不够可以再加!
谢谢了,先!
不过比你的还严重,我的OCX是可视的,界面是一个对话框,可是在使用的时候,根本无法响应内部元素的消息啊。帮你顶
注意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); }
该怎么处理呢?
请高手们多多指教!
谢谢了,先!
把窗口设置为可见
然后,SendMessage ,WM_SHOWWINDOW,使得不可见
然后再用你的其他调用你可以试验一下。
问题原因,俺粗略认为,这可能是vb对消息循环或者线程的处理与vc中不一样?
当然,以上只是猜测,依据就是俺以前对vb的认识就是在vb中实现异步操作或多线程比较不稳定。
另外严重同意下边这个,你既然用了com技术,还整个PostMessage之类的东东,体系结构混乱嘛:
--------------------
vcleaner(我没做大哥已经很久了.......) ( ) 信誉:131 2005-1-13 15:18:49 得分: 0
个人认为使用PostMessage没有什么意思,直接添加一个接口函数不是更好!呵呵
--------------------
窗口控件(即控件本身是一个子窗口,所以可以处理消息),而Delphi和VB都可以支持无窗口控件
(这个时候所谓控件只是主窗口的一部分),控件没有自己的句柄,所以无法处理消息。比较猥琐的解决方法是控件中另外生成一个隐藏窗口,记下它的句柄,然后给控件的消息就发送给
这个隐藏窗口,然后在隐藏窗口的消息处理函数中在调用相应的处理函数。呵呵,我写第一个COM组件时,遇到的就是这个问题,当时也是郁闷了好久,兄弟,努力吧。
COM的基础很重要,如果你不是很理解COM,最好多看看相关的书,有人说过“不懂COM原理的程序员肯定不是一个好的ATL程序员”。呵呵,祝你顺利!
http://www.vchelp.net/wyy/tour/teach_sp_23.htm