小弟要实现如下功能:
    有一个程序模块(dll):用WIN API创建了一个窗体,窗体有自己的消息循环.我现在将这个窗体铺(MoveWindow)到模块外的用MFC创建的窗体中。现在想将MFC创建的窗体消息窗过去。
   需要的效果就是跟都用MFC创建时,用  OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) 传递消息一样的效果。
   现在小弟不知用什么方法达到效果,请各位大虾帮帮忙。
                                   谢过了!!
    

解决方案 »

  1.   

    SendMessage,消息得处理与是否是DLL中和调用程序中没有关系,都是一样得。
      

  2.   

    dll 中的窗体是MFC创建窗体的子窗体,我要实现的功能是鼠标在子窗体上的操作都能响应到子窗体上。
    问题是即使鼠标画过了子窗体,响应的消息事件还是在主窗体中响应。如果都用MFC创建的,一个简单的事件就可以实现(OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) )
    这个事件它有自动消息过滤功能,会把合适的事件传递给子窗体。
    如果用SendMessage或PostMessage当然可以传递消息,但不知怎么作??
    是否可用这种方法解决:
    在主窗体的消息循环中取出子窗体感兴趣的消息然后在发给子窗体,这样的子窗体就能响应了??
    我做过实验,将主窗体的所有消息发给子窗体,子窗体是有响应的(比如鼠标移动),只不过CPU占了100%!!
    下面时创建子窗体代码:
    --------------------------------------------------------------------------
        WNDCLASSEX wc;
     
        wc.cbSize        = sizeof(WNDCLASSEX);
        wc.style         = 0;
        wc.lpfnWndProc   = MyWndProc;        // Window Procedure
        wc.cbClsExtra    = 0;                       // No per-class extra data.
        wc.cbWndExtra    = 0;                       // No per-window extra data.
        wc.hInstance     = m_pApp->m_instance;               // Owner of this class
        wc.hIcon         = NULL;
        wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); // Black color
        wc.lpszMenuName  = (const TCHAR *) NULL;               // Menu name from .RC
        wc.lpszClassName = VWR_WND_CLASS_NAME;               // Name to register as
        wc.hIconSm       = NULL;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);    
        if (!RegisterClassEx(&wc))
        {
             if (!RegisterClass((LPWNDCLASS)&wc.style))
                return false;
        }         
       DWORD winstyle = WS_CHILD|WS_VSCROLL | WS_HSCROLL |WS_VISIBLE | WS_CLIPCHILDREN;
       CLIENTCREATESTRUCT ccsClientCreate; 
             ccsClientCreate.hWindowMenu = NULL; 
             ccsClientCreate.idFirstChild = 1; 
           m_hwnd = CreateWindowEx(
    WS_EX_TOPMOST,
    VWR_WND_CLASS_NAME,
    _T("MYWIN"),
    winstyle,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    g_hParentWnd,
    NULL,
    m_pApp->m_instance,
    (LPVOID)&ccsClientCreate );
     
         if(!m_hwnd)return false;
    //子窗体平铺到主窗体的整个区域
    ::MoveWindow(m_hwnd,rc.left,rc.top,(rc.right - rc.left),(rc.bottom - rc.top),TRUE);
    -----------------------------------------------------------------------
      

  3.   

    主要原因是因为,如果你有MFC创建的窗体HWND与CWnd会有一个映射,我们知道窗口处理函数的参数WindowProc是使用HWND作为参数的,因此,通过这个映射,MFC能够找到对应的CWnd,因此后面的函数得到调用.    如果你用API创建窗体,HWND与CWnd没有建立映射,因此,MFC无法为这个Hwnd找到对应的CWnd, 当然就不会将消息窗体过去.
        
        如果你要实现该功能,需要建立映射,使得函数FromHandlePermanent能够成功.也就可以使用MFC的传递机制了
      

  4.   

    简单一点的办法是使用SubclassWindow
      

  5.   

    我用subcalsswindow试了,但是没效果,子窗体依然得不到消息。只是 用MFC创建的窗口不在刷新了,可能Paint 消息不响应了(我在释放时调用合不调用Unsubclasswindow结果都一样),郁闷!!