我定义了2个对话框类,CDlg1和CDlg2,单击对话框1中的一个按钮会显示对话框2。我在按钮函数中调用了WSAAsyncSelect()
      具体如下:
         .......
         .......
         CDlg2 dlg2;
WSAAsyncSelect(cskt,dlg2.m_hWnd,WM_SOCK,FD_READ);
dlg2.DoModal();
         ..........但是这样的dlg2.m_hWnd并不能让dlg2接收到消息,大侠能告诉我这种情况下接收消息的窗口句柄该如何确定吗?

解决方案 »

  1.   

    你在调用dlg2.DoModal()之前,WSAAsyncSelect()中还不能得到你想要的dlg2对话框的句柄,因为这时候你只对定义了一个CDlg2的变量,该对话框的创建过程在DoModal()中进行的。
    所以你要么把dlg2做成非模态对话框,在调用对话框的Create()之后,再调用WSAAsyncSelect()。或者,你把WSAAsyncSelect()的调用放在CDlg2类的实现中,可以在重载的InitDialog中。
      

  2.   

    任意创建一个CWnd继承出来的窗口后,就可以实现了
      

  3.   

    zhaoyg9824(孤独一方) :谢谢你!再问一句,“把dlg2做成非模态对话框,在调用对话框的Create()之后,再调用WSAAsyncSelect()”,为什么要做成非模态的?
      

  4.   

    如果不是非模态的,就必须在对话框的初始化或者其他地方调用。也就是说,只要你在任何地方调用该函数,并指定一个已创建窗口的句柄,该函数就有效,并且窗口可以接收到来自该socket的消息。
      

  5.   

    谢谢zhaoyg9824(孤独一方)和 farfh(慕容长风),如果一的对话框通过点ok或cancel按钮关闭后,还能收到消息吗?
      

  6.   

    那得看窗口是否已经销毁,如果窗口已经销毁了,那肯定就不能接收消息的。
    默认的ok或cancel按扭会调用父窗口的OnOk或OnCacel函数,这两个函数都会销毁窗口,所以在默认状态下,你一旦点了这两个按钮后就不能接收消息了,当然你可以重载它们。
      

  7.   

    我试验过了,调用父窗口的OnOk或OnCacel函数函数后,还能收到消息,这是千真万确的
      

  8.   

    其实我现遇到的问题是这样的:
    我的程序是基于对话框的聊天室(客户端),用到了2个对话框,一个是登录窗口,另一个是聊天窗口。进入聊天室前先登录,在聊天室的对话框里有注销和重新登录的按钮,问题就出在重新登录上,我点重新登录按钮后弹出登录对话框,但是点ok按钮登录对话框关闭了,但聊天室窗口却从此没有焦点了,好像死了一样。所以我怀疑是WSAAsyncSelect(cskt,m_hWnd,WM_SOCK,FD_READ);这个函数除了问题,谁能帮我,出出思路也很好。
      

  9.   

    如果信得过我,就发[email protected]
      

  10.   

    好的,我已经发过去了。 farfh(慕容长风)