关于按钮等控件提示信息CXInfoTip 类改进

问题提出: http://www.codeproject.com/miscctrl/XInfotip/XInfotip_demo.zip 这个下载类使用过程遇到在Dll中的无模式对话框无法执行PreTranslateMessage函数的问题。后在网上找到解决方案可以解决从主程序调用动态库产生一个DLL中无模式对话框调用PreTranslateMessage的方法。但是再在这个DLL中调用一次DLL中无模式对话框用这个方法就不能实现提示框就是该问题的出现。

摘录:[开始]

关于PreTranslateMessage有一个常见的问题就是与此有关:如果编写了一个MFC DLL并从另外的一个MFC主工程之中调用这个MFC DLL中的Modeless Dialog的话,Modeless DialogPreTranslateMessage不会被调。因为MFC DLL和这个MFC工程拥有不同的AfxModuleThreadState,因此在MFC DLL中创建的modeless CDialog对象不在MFC工程的句柄表中(CWnd::FromhandlePermanent返回NULL),因此虽然MFC主工程中的CWinAppPretranslatemessage会被调(注意此时Dialog的消息循环在MFC主工程里面),但是不会调用MFC DLL中创建的那个modeless CDialogPreTranslateMessage函数。因此需要特殊处理。一般有两种方法,一种是直接在MFC主工程中的CWinApp::PreTranslatemessage里面调用MFC DLLCWinApp::PreTranslateMessage(可以专门在MFC DLLexport一个专门的函数来做这件事情)。另外的方法是使用钩子,在钩子消息处理函数之中,判断目标窗口是否是当前具有焦点的窗口,如果是,则直接调用目标窗口的PreTranslateMessage函数(前提是你有要保存这个对象的指针)。

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);
}
所有即可成功完成该过程。

摘录 [结束]

解决[原创http://blog.csdn.net/hongjie7117/]:

作者修改了CXInfoTip类中代码使其能够支持在多重界面都可以使用的方法。RelayEvent

重载CXInfoTip中的RelayEvent函数;

函数如下

 

void  CXInfoTip::RelayEvent( CWnd  *  pWnd, CPoint point)
{
    CString            szTooltipText;
    TipToolInfo        Info;

//     GetCursorPos(&point);         // 获得光标处的坐标
     if  (point  !=  m_ptOrigin)
    {
//  Find the tool
         if  (NULL  !=  pWnd)
        {
            
if  (m_TipToolsMap.Lookup(pWnd -> m_hWnd, Info))
            {
// 查找 //  Display the tooltip
                m_ptOrigin  =  point;
                SetIcon(Info.hIcon);
                Show(Info.szText, 
& point);
            }
        }
    }
    
//  Hide the tooltip
     if  (point  !=  m_ptOrigin)
    {
        ShowWindow(SW_HIDE);    
    }
}

 

在调用处 或是主程序或是DLL中的无模式对话框中响应WM_SETCURSOR消息;

 


BOOL 类名::OnSetCursor(CWnd
*  pWnd, UINT nHitTest, UINT message)  
{
    
//  TODO: Add your message handler code here and/or call default
    POINT   point;   
    GetCursorPos(
& point);   
    m_TipTools.RelayEvent(pWnd, point);
// 调用了重载的函数
     return  CDialog::OnSetCursor(pWnd, nHitTest, message);
}

 

问题终于解决了。发出以便大家参考,其他CXInfoTip类使用方法等信息

请参考 http://www.codeproject.com/miscctrl/xinfotip.asp 

有不足之处请给出指正 QQ:191429982  欢迎共同研究进步

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值