运用SendMessageToDescendants向子窗口发送消息
使用SendMessageToDescendants向子窗口发送消息
使用SendMessageToDescendants向子窗口发送消息,子窗口收不到消息。
具体情况是:
在主窗口A中,点击按钮,弹出窗口B。
Dlg DlgB;
DlgB.DoModal();
我自定义了一个消息,然后A向B发消息:
dlgA.SendMessageToDescendants(WM_MESSAGE_SET,para,0);
窗口B始终收不到消息。
请教原因。
------解决方案--------------------
DlgB用Create方式创建,指定父窗口为dlgA看看
------解决方案--------------------
1. DlgB.DoModal()产生的模式对话框关闭以后才会执行其后的语句。dlgA.SendMessageToDescendants(WM_MESSAGE_SET,para,0)可能根本没有执行。用无模式对话框可避免这种情况发生。
2. 注意WM_MESSAGE_SET的定义。用户消息的前几个被MFC占用了。
------解决方案--------------------
你的消息发送是写在哪里的?你的B对话框是Child风格的?
------解决方案--------------------
把你的B对话框修改成Child风格以后再看看~
------解决方案--------------------
看了一下SendMessageToDescendants源码,它用了::GetTopWindow和::GetNextWindow来搜索后代窗口。但是这两函数只能搜索WS_CHILD风格的子窗口。模式对话框是popup窗口,没有WS_CHILD风格。6楼VisualEleven的建议你试一试,不知能强制设成WS_CHILD风格。用无模式对话框一定可以。
------解决方案--------------------
用另外的方法吧:
覆盖DlgB的OnInitDialog(),在此函数中把DlgB的m_hWnd传到DlgA中的变量,线程中可以用::IsWindow()测试传过来的HWND是否有效,然后用::PostMessage()发消息。
使用SendMessageToDescendants向子窗口发送消息,子窗口收不到消息。
具体情况是:
在主窗口A中,点击按钮,弹出窗口B。
Dlg DlgB;
DlgB.DoModal();
我自定义了一个消息,然后A向B发消息:
dlgA.SendMessageToDescendants(WM_MESSAGE_SET,para,0);
窗口B始终收不到消息。
请教原因。
------解决方案--------------------
DlgB用Create方式创建,指定父窗口为dlgA看看
------解决方案--------------------
1. DlgB.DoModal()产生的模式对话框关闭以后才会执行其后的语句。dlgA.SendMessageToDescendants(WM_MESSAGE_SET,para,0)可能根本没有执行。用无模式对话框可避免这种情况发生。
2. 注意WM_MESSAGE_SET的定义。用户消息的前几个被MFC占用了。
------解决方案--------------------
你的消息发送是写在哪里的?你的B对话框是Child风格的?
------解决方案--------------------
把你的B对话框修改成Child风格以后再看看~
------解决方案--------------------
1. DlgB.DoModal()产生的模式对话框关闭以后才会执行其后的语句。dlgA.SendMessageToDescendants(WM_MESSAGE_SET,para,0)可能根本没有执行。用无模式对话框可避免这种情况发生。
2. 注意WM_MESSAGE_SET的定义。用户消息的前几个被MFC占用了。
在DlgA中有一个线程,专门发送WM_MESSAGE_SET消息。我是希望DlgB.DoModal后,可以收到该消息。 你的消息发送是写在哪里的?你的B对话框是Child风格的?
在DlgA中有一个线程,专门发送WM_MESSAGE_SET消息。B对话框不是Child风格。
看了一下SendMessageToDescendants源码,它用了::GetTopWindow和::GetNextWindow来搜索后代窗口。但是这两函数只能搜索WS_CHILD风格的子窗口。模式对话框是popup窗口,没有WS_CHILD风格。6楼VisualEleven的建议你试一试,不知能强制设成WS_CHILD风格。用无模式对话框一定可以。
------解决方案--------------------
用另外的方法吧:
覆盖DlgB的OnInitDialog(),在此函数中把DlgB的m_hWnd传到DlgA中的变量,线程中可以用::IsWindow()测试传过来的HWND是否有效,然后用::PostMessage()发消息。