注意:我的环境是:窗口类再DLL中,使用无模式显示方式显示窗体。一下几种情况都是可以正常显示TIP的:1) 不在DLL 中, 在主进程中,无模式和模式都可以。
2) 在DLL 中,模式窗体可以正常显示,
不能正常显示的情况:非模式 + DLL;
在这种情况下,连PreTranslateMessage的代码都不执行了,
诸位高手,这是为何?

解决方案 »

  1.   

    PreTranslateMessage 的消息传递不太可靠。你的 DLL 是一个 MFC Extension DLL 吗?Extension DLL 应该没有问题。
      

  2.   

    如果不是,试试在 MFC 中注册这个窗口:// pWnd 窗口的实际 CWnd 派生类指针
    AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();
    CHandleMap* pHandleMap = pState->m_pmapHWND;if (pHandleMap)
    {
    if (pHandleMap->LookupPermanent(pWnd->GetSafeHwnd()))
    pHandleMap->RemoveHandle(pWnd->GetSafeHwnd());
    pHandleMap->SetPermanent(pWnd->GetSafeHwnd(), pWnd);
    }
      

  3.   

    include 头文件: #include "..\src\winhand_.h"
      

  4.   

    你那个非模式DLL窗体外,消息汞是怎样写的?
      

  5.   

    我的DLL不是一个EXTENSION DLL,而是REGULAR DLL. 采用了类似COM的方法。具体的方式如下:
    1)定义一个接口。如:
         Class CIA
    {
         virtual HRESULT Test()=0;
    }2)
      写一个窗口类,如:
      Class CTestDialog : public CDialog (....)
    {
            ...... 
            CToolTipCtrl m_ToolTip;
            virtual  BOOL PreTranslateMessage(MSG* pMsg);
            .............
    }3)写一个类继承自接口,内含一个CTestDlg 成员变量
     Class CTestIA : public CIA
    {
        HRESULT  test();
        ..........
    private:
       CTestDlg m_TestDlg;
       ..........
    }
    4) 写一个类厂:
      Class FA
      

  6.   

    4)写一个类厂:
     Class CFactory
    {
         CreateObject(ID,**object)
        {
           if (ID==IA) 
            CTestIA *pIA=new CTestIA;
            *object=static_cast<CIA*>(pIA);
            ..............
        }
    }5)输出一个函数:
       HRESULT STDCALL GetFactory(ID,**object)
    {
    if (ID==FACORY) 
     {
       CFactory *pFac=new CFactory();
        *object=*pFac;
        return S_OK;
    }
    .......
    }6)客户:GetFactory(.....pFac);
    pFac->CreateObject(...pIA);pIA->DoSomething(.....)//里面显示非模式窗体CTestDlg
    如此。.......................
    不能正常显示TOOLTIP.
      

  7.   

    In355Hz(好象一条狗)
    include 头文件: #include "..\src\winhand_.h"
    找不到头文件:(
      

  8.   

    /*
    //
    头文件找着了,但是没有作用:(
    我测试过了,即使只要简单的执行,一样的没有TOOTIP,( 在非模式下 )
    DLL输出代码如下:void TestDialog(CWnd *pwnd)
    {
    AFX_MANAGE_STATE(::AfxGetStaticModuleState())
    CTestDlg *pDlg;
    pDlg=new CTestDlg(pwnd);
    pDlg->Create(IDD_TEST);
    pDlg->ShowWindow(SW_SHOW);
    }///
    */
      

  9.   

    谢谢诸位的关心,我已经解决了。需要将主进程的消息循环转到DLL中。
      

  10.   

    嗯?那一段代码我试过,是有效的我是在 EXE 中调用那段代码的,因为要保证 AfxGetModuleThreadState() 取回的是 App 模块的 State, 此外,通过动态库连结 MFC 的 DLL, 这段代码测试过,也是有效的:AFX_MODULE_STATE* pBaseModuleState = AfxGetAppModuleState();
    AFX_MODULE_THREAD_STATE* pBaseModuleThreadState = pBaseModuleState ->m_thread.GetData();
    CHandleMap* pHandleMap = pBaseModuleThreadState->m_pmapHWND;if (pHandleMap)
    {
    if (pHandleMap->LookupPermanent(pDlg->GetSafeHwnd()))
    pHandleMap->RemoveHandle(pDlg->GetSafeHwnd());
    pHandleMap->SetPermanent(pDlg->GetSafeHwnd(), pDlg);
    }
      

  11.   

    btw: 后面这段代码可以在 DLL 中调用。