-
TTN_NEEDTEXT
一般用法和高级用法
2011-10-14 13:30
28
人阅读
评论
(0)
收藏
举报
ToolTip
是
< br>Win32
中一个通用控件,
MFC
中为其生成了一个类
CToolTipCtrl
,总的说来
其使用方法是较简
单的,下面讲一下它的一般用法和高级用法。
一般用法步骤:
添加
CToolTipCtrl<
/p>
成员变量
m_tt
。
在父窗口中调用
EnableToolTips(TRUE);
在窗口的
OnCreate
(或者其他适当的位置)中向
ToolTip
中添加需要显示
Tip
的子窗口,并同时指定相
应的显示字串
CToolTipCtrl::AddTool(pWnd,
p>
to
display
。
重载父窗口的
BOOL
PreTranslateMessage(MSG*
pMsg)
,在函数中调
用
m_vent(pMsg)
。
下面假设在窗口
CWndYour
中使用
CToolTipCtrl
在类定义中添加变量说明:
class
CWndYour:xxx
{
CToolTipCtrl
m_tt;
}
在
O
nCreate
中添加需要显示
Tip
的子窗口
CWndYour::OnCreate(....)
{
EnableToolTips(TRUE);
m_(this);
m_te(TRUE);
CWnd*
pW=GetD
lgItem(IDC_CHECK1);//
得到窗口指针
m_l(pW,
添加
........
}
在
BOOL
PreTranslateMessage(MSG*
pMsg)
中添加代码
BOOL
CWndYour::PreTranslateMessage(MSG*
pMsg)
{
{
m_vent(pMsg);
}
return
CParentClass::PreTr
anslateMessage(pMsg);
}
这样当鼠标移动到相应的子窗
口上时会显示出相应的
ToolTip
。
动态改变
ToolTip
的显示内容的方法及步骤:
上面所讲的
1
、
2
< br>、
4
步骤。
在增加
ToolTip
时不指定显示的字串,而是使用
LPSTR_TEXTCALLBACK<
/p>
。
在窗口中增加消息映射
ON_NOTIFY_EX(
TTN_NEEDTEXT,
0,
SetTipText
)
。
在窗口中增加一个函数用于动态提供显示内容,其原型
为
BOOL
SetTipText(
UINT
id,
NMHDR
*
pTTTStruct,
LRESULT
*
pResult
)
p>
,下面的
代码可以根据传入的参数判定应该显示的内容。
BOOL
CWndYour::SetTipText(
UINT
id,
NMHDR
*
pTTTStruct,
LRESULT
*
pResult
)
{
TOOLTIPTEXT
*pTTT
=
(TOOLTIPTEXT
*)pTTTStruct;
UINT
nID
=pTTTStruct->idFrom;
//
得到相应窗口
ID
,有可能是
HWND
if
(pTTT->uFlags
&
TTF_IDISHWND)
//
表明
nID
是否为
HW
ND
{
nID
=
::GetDl
gCtrlID((HWND)nID);//
从
HWND
p>
得到
ID
值,当然你也可以通过
HWND
值来
判断
switch(nID)
case(IDC_YOUR_CONTROL1)
strcpy(pTTT->
lpszText,your_string1);//
设置
return
TRUE;
break;
case(IDC_YOUR_CONTROL2)
//
设置相应的显示字串
return
TRUE;
break;
}
return(FALSE);
}
我用
VC
做
TOOL TIP
很多次了
,
但每次都要再研究一遍
.
虽然说学而时习
,
应该的
,
但主要还
是由于自己懒
.
今天一定要记下来
.<
/p>
以后再用的时候
,
就是参考
.
也请阅读此文的朋友记下来
,
将来查阅用
.
用
VC
实现
TOOL TIP.
比较复杂
,
其实也简单
,
但
MFC
帮助一些窗口实现
,
而另一些窗口又不实现
,
倒搞得复
杂了
.
最开始我用
WM_MOUSEMOVE
消息
,
然后用
CToolTipCtrl::Pop,
这个方法太笨<
/p>
.
不建议用
.
除
非需要自
定义
.
MFC
对
TOOL TIP
的支持不错的
.
缺省情况
CFrameWnd
支持很好
.
然后是
CWnd.
主要体现在
TTN_NEE
DTEXT
消息的支持和
OnToolHitTest
的支持
.TTN_NEEDTEXT
是在
CFrameWnd
中支持
的
.OnToolHitTest
是在
CWnd
中支持的
.
有了这些支持
,
可以在框架窗口中很好实现
ToolBar
的
TIP.
和在一
个对话框中
很好实现一个控件的
TOOL TIP.
< br>举例
.
在对话框中实现
TOOL
TIP.
ToolTips( TRUE )
是不可少的
.
建议在
:CD
ialog::OnInitDialog
调用吧
.
_NOTIFY_EX( TTN_NEEDTEXT,
0, OnNeedText
).OnNeedText
实现了
TOOL TIP
的文字
.
传入的参
数
p>
idFrom
是控件的
ID,
根据控件
ID
得到相应的
T
IP
文字
就这么简单的两步
,
就实现了对话框中的
TOOL TIP.
其实不只对话框
,
任何窗口都可以用上面的方法实现自
己的子窗口控件的
TIP
.
但前提是必须是
CWnd
的派生类<
/p>
.
这就看出了
MFC
对
TOOL
TIP
的支持很厉害
但这一切都是
MFC
实现的我们简单描述一下它的实
现原理
,
这样看得更清楚
CWnd
本身就带有一个
CToolTipCtrl
对象
,
是放在
pThreadState
中的这个不说了
p>
,
知道
CWnd
有
就行了
CWnd
< br>负责创建它
,
然后在
PreTr
anslateMessage
中调用了
FilterTool
TipMessage,
这个函数的作用是处理
WM_MOUS
EMOVE,WM_NCMOUSEMOVE
等消息
,
给
CToolTipCtrl
一个机会
,
判断鼠标是否在需要显示
TIP
的窗口上
,
如果是
,
就显示
.FilterToolTipMessage
先从
CWnd::OnToolHitTest
得到<
/p>
TOOLINFO:
中的数据
,
比如哪个控件需要
TIP
等信息
,
然后利用
ADDTOOL
消
息把这个需要
TIP
的控制加入到
CT
oolTipCtrl
的
TOOL
列表
中
,
然后将鼠标移动的消息转给
CTo
olTipCtrl
处理
.
如果这个<
/p>
TIP
的文字需要用回调函数来获得
,<
/p>
就用
WM_NOTIFY
的
TTN_NEEDTEXT
从
CToolTipCt
rl
的父窗口获取
.
这个过程就是
p>
CToolTipCtrl
判断是
否要显示
TIP,
到获得文字并显示
TIP
p>
的全过程
这样
一分析
,
就知道原来
CWnd
帮助实现了控件子窗口的
TIP
其实就是实现了
OnToolHitTest
这个函数
,
然
后在
PreTranslateM
essage
中转发消息
,
帮助
CToolTipCtrl
正确显示
TIP.
而
CFrameWnd
是实现了
TTN_NEEDTEXT
的响应
,
帮助子窗口实现
TIP.
其实我们也可以不要这些缺省实现
,
自己用
CToolTipCtrl
搞定
,
做法一样
:
ipCtrl::Create
创建
Tool Tip
l
增加一个
TOOL,
这里的
TOOL
就是需要显示
TIP
的一个区
域或一个子窗口
.
如果对
AddToo
l
使
用有不清楚的地方
,
建议查看源程序
.
可能会觉得直接使用
TTM_ADDTOOL
更方便
.
3.
在
Pr
eTranslateMessage
中调用
CToolTip
Ctrl::RelayMessage
4.
如果在
AddTool
中
,
文字是用回调函数实现
,
那就要处理<
/p>
TTN_NEEDTEXT
消息
.
其实自己创建
CToolTipCt
rl
和
MFC
做的一样
.
只是不需要在
OnToolHitTest
中给出需要显示
TIP
的窗口或
者区域
.
如果给子窗口用
TIP.
就用
MFC
< br>最简单
.
如果给自己呢
?
设置
TOOLINFO
中的
uFlags = TTF_IDISHWND,
然后设置
uId
为窗口句柄
,hWn
d
为窗口句柄就可以了
.
写了这么多
,
有不对的地方还请和我联系一下<
/p>
,
帮助我改正错误
.
只是有个问题还没搞明白
.
就是为什么
MFC
把
C
ToolTipCtrl
放在了
pThreadState
p>
中
.
难道是为了用一个
TOOL TIP
为该线程的所有窗口服务吗
?
难道是一种节约资源的表现
.
这点还需要研究
p>
.
如果哪位朋友知道答
案
< br>,
还希望能不吝赐教
.
谢谢
p>
.
用
VC
实现
TOOL
TIP2008-03-17
13:57
按照下面的步骤去做:
1
、先为
static
设置一个
ID
,如
ID_TIP;
2
、在
CDialogBar
的头文件中的
AFX_MSG
内加入一行申明
< br>
afx_msg BOOL OnToolTip(UINT
id,NMHDR * pNMHDR,LRESULT * pResult);
3
、在
CDialogBar
的
CPP
文件中的
AFX_MSG_MAP
p>
内加入一行
ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnToolTip)
4
、在
CDialogBar
的
CPP
文件中的
On
InitDialog()
函数内加入
EnableToolTips(TRUE);
5
、在
CDialogBar
的
< br>CPP
文件中添加
OnToolTip
< br>函数
BOOL
CDialogBar::OnToolTip(UINT id,NMHDR *
pNMHDR,LRESULT * pResult)
{
TOOLTIPTEXT * pTTT=(TOOLTIPTEXT
*)pNMHDR;
UINT uID = pNMHDR->idFrom;
if(pTTT->uFlags & TTF_IDISHWND)
uID = ::GetDlgCtrlID((HWND)uID);
if(uID == NULL) return FALSE;
switch(uID)
{
case IDC_TIP:
pTTT->lpszTex
t=
添加你的提示内容
break;
}
return TRUE;
}
这样就可以了。
其实,上面的方法可以为任何控件添加
tip
提示
。
用<
/p>
VC
实现
TOOL TIP.
比较复杂
,
其实也简单
,
但
MFC
帮助一些窗口实现
,
而另一些窗口又不实现
,
倒搞得复
杂了
.
最开始我用
WM_MOUSEMOVE
消息
,
然后用
CToolTipCtrl::Pop,
这个
方法太笨
.
不建议用
.
除非需要自
定义
.
MFC
对
TOOL TIP
的支持不错的
.
缺省情况
CFrameWnd
支持很好
.
然后是
CWnd.
主要体现在
TTN_NEE
DTEXT
消息的支持和
OnToolHitTest
的支持
.TTN_NEEDTEXT
是在
CFrameWnd
中支持
的
.OnToolHitTest
是在
CWnd
中支持的
.
有了这些支持
,
可以在框架窗口中很好实现
ToolBar
的
TIP.
和在一
个对话框中
很好实现一个控件的
TOOL TIP.
< br>举例
.
在对话框中实现
TOOL
TIP.
ToolTips( TRUE )
是不可少的
.
建议在
:CD
ialog::OnInitDialog
调用吧
.
_NOTIFY_EX( TTN_NEEDTEXT,
0, OnNeedText
).OnNeedText
实现了
TOOL TIP
的文字
.
传入的参
数
p>
idFrom
是控件的
ID,
根据控件
ID
得到相应的
T
IP
文字
就这么简单的两步
,
就实现了对话框中的
TOOL TIP.
其实不只对话框
,
任何窗口都可以用上面的方法实现自
己的子窗口控件的
TIP
.
但前提是必须是
CWnd
的派生类<
/p>
.
这就看出了
MFC
对
TOOL
TIP
的支持很厉害
但这一切都是
MFC
实现的我们简单描述一下它的实
现原理
,
这样看得更清楚
CWnd
本身就带有一个
CToolTipCtrl
对象
,
是放在
pThreadState
中的这个不说了
p>
,
知道
CWnd
有
就行了
CWnd
< br>负责创建它
,
然后在
PreTr
anslateMessage
中调用了
FilterTool
TipMessage,
这个函数的作用是处理
WM_MOUS
EMOVE,WM_NCMOUSEMOVE
等消息
,
给
CToolTipCtrl
一个机会
,
判断鼠标是否在需要显示
TIP
的窗口上
,
如果是
,
就显示
.FilterToolTipMessage
先从
CWnd::OnToolHitTest
得到<
/p>
TOOLINFO:
中的数据
,
比如哪个控件需要
TIP
等信息
,
然后利用
ADDTOOL
消
息把这个需要
TIP
的控制加入到
CT
oolTipCtrl
的
TOOL
列表
中
,
然后将鼠标移动的消息转给
CTo
olTipCtrl
处理
.
如果这个<
/p>
TIP
的文字需要用回调函数来获得
,<
/p>
就用
WM_NOTIFY
的
TTN_NEEDTEXT
从
CToolTipCt
rl
的父窗口获取
.
这个过程就是
p>
CToolTipCtrl
判断是
否要显示
TIP,
到获得文字并显示
TIP
p>
的全过程
-
-
-
-
-
-
-
-
-
上一篇:静安区2017中考英语二模
下一篇:命令方块指令大全