none
ToolTip弹出2次 RRS feed

  • 问题

  • 使用ToolTip的时候有2种方法。
    1.	EnableToolTips();
    m_tt.Create(this);
    m_tt.Activate(TRUE);
    
    CWnd * pWnd = (CWnd *)&m_btn1;
    m_tt.AddTool(pWnd, L"Button1111");//添加
    然后m_tt.RelayEvent(pMsg);
    

    BOOL CTestToolTip1111Dlg::OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult)
    {
        TOOLTIPTEXT* pTTT = (TOOLTIPTEXT*)pNMHDR;
        UINT_PTR nID = pNMHDR->idFrom;
        if (pNMHDR->code == TTN_NEEDTEXT && (pTTT->uFlags & TTF_IDISHWND)) {
            pTTT->lpszText = L"123456";
    
            TRACE(L"CElcBaseBar::OnToolTipNotify----\n");
            return TRUE;
        }
      return FALSE;
      }
    

    一般ToolTip都是显示在鼠标的下方的,若ToolTip即将显示的区域的有部分在任务栏上的时候(如下图)。此时把鼠标移到Button2上,会自动把ToolTip移到鼠标的上方来显示,但是这时会闪烁2次,然后才能正常显示。

     

    大家看看是我使用的问题还是什么呢?

    2011年11月8日 10:39

答案

  • 我现在怀疑是系统的问题,也许是对 Unicode 的支持不是很好,我用多字节字符集编译就不存在这样的问题。

     

    这是我的程序,系统是win7。


    • 已编辑 王译 2011年11月11日 5:33
    • 已标记为答案 Jumping fish 2011年11月14日 8:19
    2011年11月11日 1:26

全部回复

  • Jumping fish,

    您可以尝试去掉清单文件(manifest),看看这个问题是否还存在。

    另外,这个问题很可能是您的系统造成的,我这里无法重新您的问题。您可以尝试一下更新您的系统。

     

    Lucy


    Lucy Liu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年11月9日 6:43
    版主
  • 如果只有在任务栏上会闪,很可能是由于你的tooltip的特殊效果(渐显或者渐退)和任务栏的玻璃效果冲突了

    你可以关掉玻璃效果或者tooltip的效果再看看,如果问题依旧,算是一个系统小BUG


    0xBAADF00D
    2011年11月9日 8:22
    版主
  • 我试过了,将

    TestTooltip111.exe.embed.manifest

    TestTooltip111.exe.embed.manifest.res

    TestTooltip111.exe.intermediate.manifest 这3个文件都删除了,但是问题依然存在。

     

    我是WIN7--32位系统的。

     

     

    2011年11月9日 8:55
  • 尝试过关闭玻璃效果,同样的问题依然存在。。。

    还有个问题,我若加上m_tt.SetTipBkColor(RGB(128,0,0));设定背景色,编译出来的程序在WIN7下仍然是默认背景。

     

    但是在XP下却是可以改变背景的。

     

    2011年11月9日 8:57
  • 我也使用了ToolTip,但没有你这样的问题。

    我的做法是继承BUTTON生成一个新的BUTTONT,在这个类里处理关于ToolTip的问题。

    CButtonT::CButtonT()
    {
    	m_ToolTip.m_hWnd = NULL;
    }
    
    CButtonT::~CButtonT()
    {
    }
    
    /*********************************************************\
    Function:PreTranslateMessage
    Description:处理鼠标消息
    Parameter:
    [IN]	MSG* pMsg	指向一个MSG结构的指针,其中包含了要处理的消息
    Return:
    如果消息在PreTranslateMessage中被完全处理并且不需要进一步处理,
    则返回非零值。如果消息还需要按照通常方式处理,则返回零。
    Others:
    \*********************************************************/
    BOOL CButtonT::PreTranslateMessage(MSG* pMsg) 
    {
    	InitToolTip();
    	m_ToolTip.RelayEvent(pMsg);//将有关鼠标的消息传递给提示条
    	return CButton::PreTranslateMessage(pMsg);
    }
    
    /*********************************************************\
    Function:InitToolTip
    Description:初始化提示条
    Parameter:
    Return:
    Others:
    \*********************************************************/
    void CButtonT::InitToolTip()
    {
    	if (m_ToolTip.m_hWnd == NULL)
    	{
    		// Create ToolTip control
    		m_ToolTip.Create(this);
    		// Create inactive
    		m_ToolTip.Activate(FALSE);
    		// Enable multiline
    		m_ToolTip.SendMessage(TTM_SETMAXTIPWIDTH, 0, 400);
    	}
    }
    
    /*********************************************************\
    Function:SetTooltipText
    Description:设置提示条
    Parameter:
    [IN] LPCTSTR lpszText	提示消息内容
    [IN] BOOL bActivate		是否激活(默认激活TRUE)
    Return:
    Others:
    \*********************************************************/
    void CButtonT::SetTooltipText(LPCTSTR lpszText, BOOL bActivate)
    {
    	// We cannot accept NULL pointer
    	if (lpszText == NULL) return;
    
    	// Initialize ToolTip
    	InitToolTip();
    
    	// If there is no tooltip defined then add it
    	if (m_ToolTip.GetToolCount() == 0)
    	{
    		CRect rectBtn; 
    		GetClientRect(rectBtn);
    		m_ToolTip.AddTool(this, lpszText, rectBtn, 1);
    	}
    
    	// Set text for tooltip
    	m_ToolTip.UpdateTipText(lpszText, this, 1);
    	m_ToolTip.Activate(bActivate);
    }
    
    /*********************************************************\
    Function:SetTooltipText
    Description:
    Parameter:
    [IN] int nText		提示消息内容在资源中的ID
    [IN] BOOL bActivate	是否激活(默认激活TRUE)
    Return:
    Others:
    \*********************************************************/
    void CButtonT::SetTooltipText(int nText, BOOL bActivate)
    {
    	CString sText;
    
    	// Load string resource
    	sText.LoadString(nText);
    	// If string resource is not empty
    	if (sText.IsEmpty() == FALSE) SetTooltipText((LPCTSTR)sText, bActivate);
    }
    


    2011年11月10日 0:59
  • 我也使用了ToolTip,但没有你这样的问题。

    我的做法是继承BUTTON生成一个新的BUTTONT,在这个类里处理关于ToolTip的问题。

     

    CButtonT::CButtonT()
    {
    	m_ToolTip.m_hWnd = NULL;
    }
    
    CButtonT::~CButtonT()
    {
    }
    
    /*********************************************************\
    Function:PreTranslateMessage
    Description:处理鼠标消息
    Parameter:
    [IN]	MSG* pMsg	指向一个MSG结构的指针,其中包含了要处理的消息
    Return:
    如果消息在PreTranslateMessage中被完全处理并且不需要进一步处理,
    则返回非零值。如果消息还需要按照通常方式处理,则返回零。
    Others:
    \*********************************************************/
    BOOL CButtonT::PreTranslateMessage(MSG* pMsg) 
    {
    	InitToolTip();
    	m_ToolTip.RelayEvent(pMsg);//将有关鼠标的消息传递给提示条
    	return CButton::PreTranslateMessage(pMsg);
    }
    
    /*********************************************************\
    Function:InitToolTip
    Description:初始化提示条
    Parameter:
    Return:
    Others:
    \*********************************************************/
    void CButtonT::InitToolTip()
    {
    	if (m_ToolTip.m_hWnd == NULL)
    	{
    		// Create ToolTip control
    		m_ToolTip.Create(this);
    		// Create inactive
    		m_ToolTip.Activate(FALSE);
    		// Enable multiline
    		m_ToolTip.SendMessage(TTM_SETMAXTIPWIDTH, 0, 400);
    	}
    }
    
    /*********************************************************\
    Function:SetTooltipText
    Description:设置提示条
    Parameter:
    [IN] LPCTSTR lpszText	提示消息内容
    [IN] BOOL bActivate		是否激活(默认激活TRUE)
    Return:
    Others:
    \*********************************************************/
    void CButtonT::SetTooltipText(LPCTSTR lpszText, BOOL bActivate)
    {
    	// We cannot accept NULL pointer
    	if (lpszText == NULL) return;
    
    	// Initialize ToolTip
    	InitToolTip();
    
    	// If there is no tooltip defined then add it
    	if (m_ToolTip.GetToolCount() == 0)
    	{
    		CRect rectBtn; 
    		GetClientRect(rectBtn);
    		m_ToolTip.AddTool(this, lpszText, rectBtn, 1);
    	}
    
    	// Set text for tooltip
    	m_ToolTip.UpdateTipText(lpszText, this, 1);
    	m_ToolTip.Activate(bActivate);
    }
    
    /*********************************************************\
    Function:SetTooltipText
    Description:
    Parameter:
    [IN] int nText		提示消息内容在资源中的ID
    [IN] BOOL bActivate	是否激活(默认激活TRUE)
    Return:
    Others:
    \*********************************************************/
    void CButtonT::SetTooltipText(int nText, BOOL bActivate)
    {
    	CString sText;
    
    	// Load string resource
    	sText.LoadString(nText);
    	// If string resource is not empty
    	if (sText.IsEmpty() == FALSE) SetTooltipText((LPCTSTR)sText, bActivate);
    }
    


     

    我试过了你的代码,偶尔还是会出现  显示->隐藏->显示的问题。如果可以的话,我能把代码发给你看下吗??
    2011年11月10日 3:29
  • 可以,直接贴出来也可以。

    enoch.wang@hotmail.com

    2011年11月10日 5:27
  •  显示->隐藏->显示的问题,我也无法解决啊,求大牛解答。。。
    2011年11月11日 0:56
  • 我现在怀疑是系统的问题,也许是对 Unicode 的支持不是很好,我用多字节字符集编译就不存在这样的问题。

     

    这是我的程序,系统是win7。


    • 已编辑 王译 2011年11月11日 5:33
    • 已标记为答案 Jumping fish 2011年11月14日 8:19
    2011年11月11日 1:26