CToolTipCtrl 闪烁,如何解决???

HelloDan 2009-06-02 11:03:56

m_toolTips.SetDelayTime(TTDT_AUTOPOP,3000);
// 我这样做,不过好像没有效果。。。
// 大家有什么好方法吗? Thanks for all replies
...全文
737 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
HelloDan 2009-06-03
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 whoo 的回复:]
SetDelayTime 设置的是 tip出现前的等待时间,并不是tip出现后的停留显示时间。 这个地方达不到显示时间长点的要求。

不过正常的情况下,鼠标不动的话,tip显示、消失后是不会再出现的。
重复出现导致闪烁效果的话,可能是鼠标消息不正确(如硬件质量不过关导致鼠标位置抖动漂移),或者是定时器的冲突干扰。


要达到良好的可控的tip效果,建议自己写一个tip控件,系统的限制太多,反正也不麻烦。不想自己动手的话可以去…
[/Quote]

谢谢你的建议
whoo 2009-06-03
  • 打赏
  • 举报
回复
SetDelayTime 设置的是 tip出现前的等待时间,并不是tip出现后的停留显示时间。 这个地方达不到显示时间长点的要求。

不过正常的情况下,鼠标不动的话,tip显示、消失后是不会再出现的。
重复出现导致闪烁效果的话,可能是鼠标消息不正确(如硬件质量不过关导致鼠标位置抖动漂移),或者是定时器的冲突干扰。


要达到良好的可控的tip效果,建议自己写一个tip控件,系统的限制太多,反正也不麻烦。不想自己动手的话可以去codeproject找一个 CPPToolTip 类,使用简单,效果超赞,而且支持html语法的字体、颜色定义。唯一的缺点就是因为太强大了,导致代码有点臃肿,对最终的exe造成100k+ 字节的大小影响。
lose_forest 2009-06-03
  • 打赏
  • 举报
回复
相关代码

*.h
CToolTipCtrl m_toolTips;
*.cpp
//..OnInitDialog()
m_toolTips.Create(this);
m_toolTips.Activate(TRUE);
// m_toolTips.SetDelayTime(3000); 延时3秒显示
m_toolTips.AddTool(GetDlgItem(IDC_BUTTON1),"123");


BOOL CX*Dlg::PreTranslateMessage(MSG* pMsg)
{
m_toolTips.RelayEvent(pMsg);
return CDialog::PreTranslateMessage(pMsg);
}



没有楼主说的闪烁迹象。莫非是你的其他部分引起的?不相关的全部屏蔽,一点点去掉屏蔽的 ,看看效果。
keanchen0928 2009-06-03
  • 打赏
  • 举报
回复
mark
maple_zhj 2009-06-03
  • 打赏
  • 举报
回复
如果鼠标停止动,
并且已经有提示了,
就不要再提示了,

应该就不会闪了。
HelloDan 2009-06-03
  • 打赏
  • 举报
回复
今天它自己好了。我也说不出原因。。。
rebecca_zjy 2009-06-02
  • 打赏
  • 举报
回复
m_ToolTipCtrl.RelayEvent(pMsg);

去掉if,上面那句直接放最外面试试

反正我是这样加的
HelloDan 2009-06-02
  • 打赏
  • 举报
回复
大家再看看吧。有没有人遇到过这种情况的。
很快就结贴的了。。。。。
HelloDan 2009-06-02
  • 打赏
  • 举报
回复

//void CMyFormView::OnInitialUpdate()
m_toolTips.Create(this, TTS_ALWAYSTIP | TTS_BALLOON | TTS_NOPREFIX);
m_toolTips.Activate(TRUE);
m_toolTips.SetMaxTipWidth(300);
m_toolTips.SetDelayTime(TTDT_AUTOPOP,3000); // Just test to solve the problem
hurryboylqs 2009-06-02
  • 打赏
  • 举报
回复
把从创建到显示的代码贴出来
HelloDan 2009-06-02
  • 打赏
  • 举报
回复
还有是我的鼠标没有问题,在其他的提示是正常的。
HelloDan 2009-06-02
  • 打赏
  • 举报
回复

BOOL CMyDialog::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message== WM_LBUTTONDOWN ||
pMsg->message== WM_LBUTTONUP ||
pMsg->message== WM_MOUSEMOVE)
{
m_ToolTipCtrl.RelayEvent(pMsg);
}

return CDialog::PreTranslateMessage(pMsg);
}


//实现大概也跟MSDN的一样。
//就是说,我把鼠标放在要提示的控件上,放着不动,CToolTipCtrl 的提示应该是显示长时间一点的吧?
//但我这里做出来的提示是先显示提示,再消失,再显示。。。 就是一闪一闪的这样。。。。。


bitwwzhang130 2009-06-02
  • 打赏
  • 举报
回复
不明白楼主说的闪烁是什么意思,把问题描述的清楚一点,再多贴些代码。大家才能帮助你
HelloDan 2009-06-02
  • 打赏
  • 举报
回复

m_toolTips.AddTool(this, (*iter)->m_DestPanel.GetDestinInfo(), rcToolTip, 1);
// Add like this
danxuezx 2009-06-02
  • 打赏
  • 举报
回复
你说的会闪是怎样的情况,你是如何加的?
hendriclee 2009-06-02
  • 打赏
  • 举报
回复
mark
HelloDan 2009-06-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 danxuezx 的回复:]
贴出我试验这个东西时的代码,(我是为listbox添加提示)您参考一下:我的是正常的。
C/C++ codetooptopDlg.h文件添加:public:
CListBox m_MyListBox;
CToolTipCtrl m_MyToolTip;
C/C++ codetooptopDlg.cpp文件添加:1OnInitDialog(){//TODO: 在此添加额外的初始化代码m_MyListBox.AddString(_T("123"));
m_MyListBox.AddString(_T("333"));

m_MyListBox.AddString(_T("444"));

m_MyListBox.AddStri…
[/Quote]

这个例子真的是写得不错,赞一个!!!
HelloDan 2009-06-02
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 hurryboylqs 的回复:]
MFC? 没看出有什么问题
你可以试做个小的对话框工程来试下,可能是你其他地方造成的
[/Quote]

是MFC啊。能显示,只是会闪,我晕死了。网上也找了很久,基本上都是这样做的。
danxuezx 2009-06-02
  • 打赏
  • 举报
回复
贴出我试验这个东西时的代码,(我是为listbox添加提示)您参考一下:我的是正常的。
tooptopDlg.h文件添加:
public:
CListBox m_MyListBox;
CToolTipCtrl m_MyToolTip;

tooptopDlg.cpp文件添加:
1 OnInitDialog(){
// TODO: 在此添加额外的初始化代码

m_MyListBox.AddString(_T("123"));
m_MyListBox.AddString(_T("333"));

m_MyListBox.AddString(_T("444"));

m_MyListBox.AddString(_T("555"));


m_MyToolTip.Create(this);
m_MyToolTip.Activate(TRUE);
m_MyToolTip.AddTool(GetDlgItem(IDC_LIST1),_T("this is list box"));
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
2 重载PreTranslateMessage
BOOL CtooptopDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
CPoint point;
CString strTxt;
GetCursorPos(&point);//取得当前鼠标的坐标
if(::WindowFromPoint(point) == m_MyListBox)//从当前鼠标的坐标获得鼠标所在窗口的句柄,并判断是否为LISTBOX控件
{
m_MyListBox.ScreenToClient(&point);//由于GetCursorPos函数返回的是相对于整个屏幕的坐标值,因此需要把这个坐标值转换成相对于Listbox的坐标
BOOL bIn;
int nNindex = m_MyListBox.ItemFromPoint(point,bIn);//从鼠标坐标获得鼠标目前所在的listbox项目索引
if(!bIn)
{
if(nNindex == 0)m_MyToolTip.UpdateTipText(_T("Item 1"),GetDlgItem(IDC_LIST1));
if(nNindex == 1)m_MyToolTip.UpdateTipText(_T("Item 2"),GetDlgItem(IDC_LIST1));
if(nNindex == 2)m_MyToolTip.UpdateTipText(_T("Item 3"),GetDlgItem(IDC_LIST1));
if(nNindex == 3)m_MyToolTip.UpdateTipText(_T("Item 4"),GetDlgItem(IDC_LIST1));
}else m_MyToolTip.UpdateTipText(_T(""),GetDlgItem(IDC_LIST1));
}
m_MyToolTip.RelayEvent(pMsg);
return CDialog::PreTranslateMessage(pMsg);
}



hurryboylqs 2009-06-02
  • 打赏
  • 举报
回复
MFC? 没看出有什么问题
你可以试做个小的对话框工程来试下,可能是你其他地方造成的
加载更多回复(2)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧