一般情况下DLL 的窗体或对话框,是不能响应这个PreTranslateMessage函数的,
而被主程序窗口响应了。
怎么样使这个函数在DLL的窗体中也能响应呢?有效呢?
我主要是想在DLL的窗体中用工具提示类?
m_ToolTipCtrl.RelayEvent(pMsg);
return CDialog::PreTranslateMessage(pMsg);
谢谢!

解决方案 »

  1.   

    添加一个接口进行pretranslatemessage
    bool __stdcall MyPreTranslateMessage(LPMSG pMSg)
    {
    return theApp.PreTranslateMessage(pMsg);
    }然后在主程序的PreTranslateMessage中调用该程序
      

  2.   

    楼上。
    这个接口添加在哪里呢?是我的DLL窗口的里面呢?还是DLL导出函数?
    //添加一个接口进行pretranslatemessage谢谢
      

  3.   

    楼上
    1、我在DLL导出函数这样写
    extern "C" _declspec(dllexport) bool MyPreTranslateMessage(LPMSG pMsg)
    {
    return theApp.PreTranslateMessage(pMsg);
    }
    2、我在主对话框这样写.h前面
    typedef bool(_cdecl *MusicList_Pre)(MSG* pMsg);
    3、我在主对话框.h里面这样写
    MusicList_Pre m_MusicList_Pre;
    去发现关闭窗口的时候有错误,不知道为什么喔。
    4、
    我在初始化对话框OnInitDialog这样写,也有错,为什么呢?
    m_MusicList_Pre = (m_MusicList_Pre)GetProcAddress(hinstDll_List,"MyPreTranslateMessage");
      

  4.   

    如果你的dll里面的窗口是模态显示窗口,那么上述问题应该不存在
    如果是非模态显示的窗口,你需要做个接口函数,比如
    A::MessageForToolTip(MSG* pMsg)
    {
         if (非模态显示)
              m_ToolTipCtrl.RelayEvent(pMsg);
    }然后在调用dll的主窗口里面的PreTranslateMessage函数里面,调用你dll窗口的MessageForToolTip函数,也就是
    B::PreTranslateMessage(MSG* pMsg)
    {
       .......
       pDialiogA->MessageForToolTip(pMsg);//dll窗口对话框指针以及导出函数
       ........................
    }
      

  5.   

    楼上,这样我也试过
    pDialiogA->MessageForToolTip(pMsg);//dll窗口对话框指针以及导出函数
    我是用CWND派生的窗口类。
    能这样使用吗?主程序窗口根本就不知道有这个函数可以调用的,会认为找不到这个函数呀。
      

  6.   

    怎么不知道?
    这个函数要你暴露出来啊!!如果确定你的dll里面的窗口是非模态show出来的,那么可以对pDialiogA指针灵活处理,当显示出来的时候,pDialiogA可以赋上正确的值,如果窗口关闭,那么置pDialiogA为NULL。
    pDialiogA为dll里面的窗口
    MessageForToolTip为dll窗口类里面的导出函数
    如果dll窗口显示,那么pDialiogA设置为类的指针,如果关闭,则置pDialiogA为null
    在外面的主窗口PreTranslateMessage(MSG* pMsg)里
    ......
    if (pDialiogA)
        pDialiogA->MessageForToolTip(pMsg);
    更好点
      

  7.   

    你想做成什么样的dll,以及想怎么样给别人调用?就说说别人需要怎样调用你的函数
    你想暴露哪些东西给调用的人。
    说明白了,才好想解决问题的办法
      

  8.   

    我就只想能提示TOOLTIP。使这个函数用效PreTranslateMessage
    如果这个函数不行,就用你的方法,不过你这个函数,我是在窗口类中使用,怎么会能在别的窗口中使用呢?
    加上这个DLL中窗口类的.H到主程序中的窗口中去是吗?
      

  9.   

    唉,一样的啊!
    tooltip的关键就是要调用那个RelayEvent(pMsg)函数,所以找准PreTranslateMessage的地方。这个MessageForToolTip(pMsg);定义在dll窗口类里面的公有函数,你可以导出类,导出特定的函数,也可以所有的信息都导出!将这个函数的.h文件加到主窗口里面去。
    我再问你,你的dll窗口是用什么方法或者函数show出来的?
      

  10.   

    MyCreate(int x, int y, int nWidth, int nHeight, CWnd *hWndParent)CREATE--出来的。是从CWnd 类派生出来的呀。需要SHOW,DOMODAL吗?
    CWND::CreateEx这个函数用完就可以出来了呀。导出类,导出特定的函数??这个怎么用做呢?
    不好意思。
      

  11.   

    谢谢楼上各位,问题已经解决,现贴出来。
    1、CMusicWnd *ListWnd;
    在DLL-CXXWNDAPP中用个全局的窗口指针
    2、DLL中需要导出该一个接口涵数-
    extern "C" _declspec(dllexport) BOOL List_PreTM(MSG *pMsg)//PreTranslateMessage
    {
    //AFX_MANAGE_STATE(AfxGetStaticModuleState());
    if(ListWnd!=NULL)
    return ListWnd->PreTranslateMessage(pMsg);
    return false;
    }
    3、主程序中用typedef BOOL(_cdecl *List_PreTM)(MSG *pMsg);//导出函数
    List_PreTM m_pList_PreTM;//导出函数指针
    在BOOL CXXXDlg::OnInitDialog()中(主程序的对话框)
    m_pList_PreTM = (List_PreTM)GetProcAddress(hinstDll_List,"List_PreTM");
    4、在主程序的
    BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class
    if(m_pList_PreTM(pMsg))
    return true;
    return CDialog::PreTranslateMessage(pMsg);
    }
    所有即可成功完成该过程。