程序是用对话框实现的。有两个对话框A和B,A上有一个列表控件,用来显示数据库中的数据,A上还有一个按钮,点击该按钮后弹出对话框B,通过对话框B可以更新数据库中的数据。问题是数据更新后,A上的列表控件中数据并不能自动更新。我的想法是在B对话框的OnOK中向A发送一个自定义消息,然后在A中添加这个消息的响应函数,来刷新数据列表。
使用::SendMessage((HWND)::FindWindow("CProEvltDlg","ProEvlt"),WM_MY_MESSAGE,0,0);向A发送消息,在A的头文件中#define WM_MY_MESSAGE WM_USER+101
也添加了相应的消息映射ON_MESSAGE(WM_MY_MESSAGE,OnMyMessage)
以及afx_msg LRESULT OnMyMessage(WPARAM wParam,LPARAM lParam);
结果并没有程序并没有响应这个事件。
让我奇怪的是:
因为每次B弹出后,都遮住A对话框,所以在使用自定义消息的方法之前,我曾经想过在A对话框的OnPaint()里添加更新数据列表的代码,但是添加后也没有效果。
后来有一次我忘了删除OnPaint()里刷新数据列表的代码,又添上了自定义消息,之后居然可以更新列表了。我不明白这是为什么。麻烦大家给我讲讲。谢谢。

解决方案 »

  1.   

    方法是对的,
    不过你::SendMessage((HWND)::FindWindow("CProEvltDlg","ProEvlt"),WM_MY_MESSAGE,0,0);这个获取句柄的方式不是很好呀,用GetParent()好点。
      

  2.   

    我觉得B不是A的子窗口吧。
    另外为什么发送的消息是WM_MY_MESSAGE,却得到OnPaint()的响应,而没有得到LRESULT OnMyMessage(WPARAM wParam,LPARAM lParam)的响应呢
      

  3.   

    在B.DoModal()之后更新数据列表就可以了。
      

  4.   

    太。。太聪明了不过我还是想问  为什么发送的消息是WM_MY_MESSAGE,却得到OnPaint()的响应,而没有得到LRESULT OnMyMessage(WPARAM wParam,LPARAM lParam)的响应呢 
      

  5.   

    to cnzdgs  :谢谢啊  我怎么就没想到这么容易实现 还这么好的办法呢
    麻烦你 能再帮我解释一下那个奇怪的消息响应的问题吗
      

  6.   

    ::FindWindow("CProEvltDlg","ProEvlt")
    这里的第1参数要求是WNDCLASS的名称,与C++的class是不同概念,不能给CProEvltDlg,除非你将CProEvltDlg注册了WNDCLASS。可以把第1参数改成NULL,根据第2参数来查找窗口,不过最好的方法还是用GetParent来获得父窗口指针。