TTNNEEDTEXT一般用法和高级用法OnToolTip函数Word格式.docx

上传人:b****5 文档编号:8405249 上传时间:2023-05-11 格式:DOCX 页数:9 大小:20.03KB
下载 相关 举报
TTNNEEDTEXT一般用法和高级用法OnToolTip函数Word格式.docx_第1页
第1页 / 共9页
TTNNEEDTEXT一般用法和高级用法OnToolTip函数Word格式.docx_第2页
第2页 / 共9页
TTNNEEDTEXT一般用法和高级用法OnToolTip函数Word格式.docx_第3页
第3页 / 共9页
TTNNEEDTEXT一般用法和高级用法OnToolTip函数Word格式.docx_第4页
第4页 / 共9页
TTNNEEDTEXT一般用法和高级用法OnToolTip函数Word格式.docx_第5页
第5页 / 共9页
TTNNEEDTEXT一般用法和高级用法OnToolTip函数Word格式.docx_第6页
第6页 / 共9页
TTNNEEDTEXT一般用法和高级用法OnToolTip函数Word格式.docx_第7页
第7页 / 共9页
TTNNEEDTEXT一般用法和高级用法OnToolTip函数Word格式.docx_第8页
第8页 / 共9页
TTNNEEDTEXT一般用法和高级用法OnToolTip函数Word格式.docx_第9页
第9页 / 共9页
亲,该文档总共9页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

TTNNEEDTEXT一般用法和高级用法OnToolTip函数Word格式.docx

《TTNNEEDTEXT一般用法和高级用法OnToolTip函数Word格式.docx》由会员分享,可在线阅读,更多相关《TTNNEEDTEXT一般用法和高级用法OnToolTip函数Word格式.docx(9页珍藏版)》请在冰点文库上搜索。

TTNNEEDTEXT一般用法和高级用法OnToolTip函数Word格式.docx

CToolTipCtrl 

m_tt;

在OnCreate中添加需要显示Tip的子窗口 

OnCreate(....) 

EnableToolTips(TRUE);

m_tt.Create(this);

m_tt.Activate(TRUE);

CWnd* 

pW=GetDlgItem(IDC_CHECK1);

//得到窗口指针 

m_tooltip.AddTool(pW,"

Check1"

);

//添加 

........ 

在BOOL 

pMsg)中添加代码 

PreTranslateMessage(MSG* 

m_tt.RelayEvent(pMsg);

return 

CParentClass:

PreTranslateMessage(pMsg);

这样当鼠标移动到相应的子窗口上时会显示出相应的ToolTip。

动态改变ToolTip的显示内容的方法及步骤:

上面所讲的1、2、4步骤。

在增加ToolTip时不指定显示的字串,而是使用LPSTR_TEXTCALLBACK。

在窗口中增加消息映射 

ON_NOTIFY_EX( 

TTN_NEEDTEXT, 

0, 

SetTipText 

)。

在窗口中增加一个函数用于动态提供显示内容,其原型为 

SetTipText( 

UINT 

id, 

NMHDR 

pTTTStruct, 

LRESULT 

pResult 

),下面的代码可以根据传入的参数判定应该显示的内容。

SetTipText( 

) 

TOOLTIPTEXT 

*pTTT 

(TOOLTIPTEXT 

*)pTTTStruct;

nID 

=pTTTStruct->

idFrom;

//得到相应窗口ID,有可能是HWND 

if 

(pTTT->

uFlags 

&

TTF_IDISHWND) 

//表明nID是否为HWND 

:

GetDlgCtrlID((HWND)nID);

//从HWND得到ID值,当然你也可以通过HWND值来判断 

switch(nID) 

case(IDC_YOUR_CONTROL1) 

strcpy(pTTT->

lpszText,your_string1);

//设置 

TRUE;

break;

case(IDC_YOUR_CONTROL2) 

//设置相应的显示字串 

return(FALSE);

}

我用VC做TOOLTIP很多次了,但每次都要再研究一遍.虽然说学而时习,应该的,但主要还是由于自己懒.今天一定要记下来.以后再用的时候,就是参考.也请阅读此文的朋友记下来,将来查阅用.

用VC实现TOOLTIP.比较复杂,其实也简单,但MFC帮助一些窗口实现,而另一些窗口又不实现,倒搞得复杂了.最开始我用WM_MOUSEMOVE消息,然后用CToolTipCtrl:

Pop,这个方法太笨.不建议用.除非需要自定义.

MFC对TOOLTIP的支持不错的.缺省情况CFrameWnd支持很好.然后是CWnd.主要体现在TTN_NEEDTEXT消息的支持和OnToolHitTest的支持.TTN_NEEDTEXT是在CFrameWnd中支持的.OnToolHitTest是在CWnd中支持的.有了这些支持,可以在框架窗口中很好实现ToolBar的TIP.和在一个对话框中很好实现一个控件的TOOLTIP.

举例.在对话框中实现TOOLTIP.

1.EnableToolTips(TRUE)是不可少的.建议在:

CDialog:

OnInitDialog调用吧.

2.ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnNeedText).OnNeedText实现了TOOLTIP的文字.传入的参数idFrom是控件的ID,根据控件ID得到相应的TIP文字

就这么简单的两步,就实现了对话框中的TOOLTIP.其实不只对话框,任何窗口都可以用上面的方法实现自己的子窗口控件的TIP.但前提是必须是CWnd的派生类.

这就看出了MFC对TOOLTIP的支持很厉害

但这一切都是MFC实现的我们简单描述一下它的实现原理,这样看得更清楚

CWnd本身就带有一个CToolTipCtrl对象,是放在pThreadState中的这个不说了,知道CWnd有就行了

CWnd负责创建它,然后在PreTranslateMessage中调用了FilterToolTipMessage,这个函数的作用是处理WM_MOUSEMOVE,WM_NCMOUSEMOVE等消息,给CToolTipCtrl一个机会,判断鼠标是否在需要显示TIP的窗口上,如果是,就显示.FilterToolTipMessage先从CWnd:

OnToolHitTest得到TOOLINFO:

中的数据,比如哪个控件需要TIP等信息,然后利用ADDTOOL消息把这个需要TIP的控制加入到CToolTipCtrl的TOOL列表中,然后将鼠标移动的消息转给CToolTipCtrl处理.如果这个TIP的文字需要用回调函数来获得,就用WM_NOTIFY的TTN_NEEDTEXT从CToolTipCtrl的父窗口获取.这个过程就是CToolTipCtrl判断是否要显示TIP,到获得文字并显示TIP的全过程

这样一分析,就知道原来CWnd帮助实现了控件子窗口的TIP其实就是实现了OnToolHitTest这个函数,然后在PreTranslateMessage中转发消息,帮助CToolTipCtrl正确显示TIP.

而CFrameWnd是实现了TTN_NEEDTEXT的响应,帮助子窗口实现TIP.

其实我们也可以不要这些缺省实现,自己用CToolTipCtrl搞定,做法一样:

1.CToolTipCtrl:

Create创建ToolTip

2.AddTool增加一个TOOL,这里的TOOL就是需要显示TIP的一个区域或一个子窗口.如果对AddTool使用有不清楚的地方,建议查看源程序.可能会觉得直接使用TTM_ADDTOOL更方便.

3.在PreTranslateMessage中调用CToolTipCtrl:

RelayMessage

4.如果在AddTool中,文字是用回调函数实现,那就要处理TTN_NEEDTEXT消息.

其实自己创建CToolTipCtrl和MFC做的一样.只是不需要在OnToolHitTest中给出需要显示TIP的窗口或者区域.

如果给子窗口用TIP.就用MFC最简单.如果给自己呢?

设置TOOLINFO中的uFlags=TTF_IDISHWND,然后设置uId为窗口句柄,hWnd为窗口句柄就可以了.

写了这么多,有不对的地方还请和我联系一下,帮助我改正错误.

只是有个问题还没搞明白.就是为什么MFC把CToolTipCtrl放在了pThreadState中.难道是为了用一个TOOLTIP为该线程的所有窗口服务吗?

难道是一种节约资源的表现.这点还需要研究.如果哪位朋友知道答案,还希望能不吝赐教.谢谢.

用VC实现TOOLTIP2008-03-1713:

57按照下面的步骤去做:

1、先为static设置一个ID,如ID_TIP;

2、在CDialogBar的头文件中的AFX_MSG内加入一行申明 

afx_msgBOOLOnToolTip(UINTid,NMHDR*pNMHDR,LRESULT*pResult);

3、在CDialogBar的CPP文件中的AFX_MSG_MAP内加入一行 

ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnToolTip) 

4、在CDialogBar的CPP文件中的OnInitDialog()函数内加入 

EnableToolTips(TRUE);

5、在CDialogBar的CPP文件中添加OnToolTip函数 

BOOLCDialogBar:

OnToolTip(UINTid,NMHDR*pNMHDR,LRESULT*pResult) 

TOOLTIPTEXT*pTTT=(TOOLTIPTEXT*)pNMHDR;

UINTuID=pNMHDR->

if(pTTT->

uFlags&

uID=:

GetDlgCtrlID((HWND)uID);

if(uID==NULL)returnFALSE;

switch(uID) 

caseIDC_TIP:

pTTT->

lpszText="

添加你的提示内容"

;

break;

returnTRUE;

这样就可以了。

其实,上面的方法可以为任何控件添加tip提示。

难道是一种节约资源的表现.这点还需要研究.如果哪位朋友知道答案,还希望能不吝赐教.谢谢

//头文件加入

CToolTipCtrlm_tooltip;

//主窗口初始化时加入

m_tooltip.Create(this);

m_tooltip.Activate(TRUE);

m_tooltip.AddTool(GetDlgItem(IDC_>

name<

),"

>

text<

"

//IDC_>

为你控件的ID,>

为显示的内容

利用ClassWizard建立PreTranslateMessage

BOOLCTest5Dlg:

PreTranslateMessage(MSG*pMsg)

{

m_tooltip.RelayEvent(pMsg);

//你加入的代码

returnCDialog:

}

如何用VC++实现在对话框的控件上显示ToolTip并在状态条上显示控件的信息 

湖南省邮电五二六厂 

肖天鹏 

----利用VC++的AppWizard,可以很容易地实现工具条和菜单项的ToolTip或在状态条上显示帮助信息,但要在对话框的控件上显示ToolTip并在状态条上显示控件信息并不是那么容易,其实,利用VC++中的WM_SETCURSOR与TTN_NEEDTEXT消息就可达到目的。

具体操作如下:

----一 

----利用VC++的MFCAppWizard生成一个SDI或MDI的应用程序 

----二 

----编辑对话框控件的字符串资源 

----例如:

----IDC_DBBUTTON1="

thisis肖天鹏的第一自制按钮\n天鹏"

,其中字符串"

thisis肖天鹏的第一自制按钮"

将在鼠标移到控件上时显示在状态条上,字符串"

天鹏"

将作为ToolTip显示。

----三 

----建立消息映射。

----在对话框的头文件(*.H)中加入以下代码:

protected:

voidSetStatusText(UINTnID=0);

//{{AFX_MSG(CFileOp1)

afx_msgvoidOnDestroy();

afx_msgBOOLOnSetCursor(CWnd*pWnd, 

UINTnHitTest,UINTmessage);

//}}AFX_MSG

afx_msgBOOLOnTipNotify(UINTid,NMHDR*

pNMHDR,LRESULT*pResult);

DECLARE_MESSAGE_MAP()

----在对话框的实现文件(*.CPP)中加入以下代码:

BEGIN_MESSAGE_MAP(CFileOp1,CDialog)

//{{AFX_MSG_MAP(CFileOp1)

ON_WM_DESTROY()

ON_WM_SETCURSOR()

//}}AFX_MSG_MAP

ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnTipNotify)

END_MESSAGE_MAP()

----四 

----编辑消息处理函数。

BOOLCFileOp1:

OnSetCursor

(CWnd*pWnd,UINTnHitTest,UINTmessage) 

//TODO:

Addyourmessagehandler 

codehereand/orcalldefault

if(pWnd==this)

SetStatusText();

else

{

TOOLTIPTEXTm_psttt;

m_psttt.hdr.hwndFrom=m_hWnd;

m_psttt.hdr.idFrom=pWnd->

GetDlgCtrlID();

m_psttt.hdr.code=TTN_NEEDTEXT;

m_psttt.uFlags=TTF_IDISHWND;

SetStatusText(pWnd->

GetDlgCtrlID());

this->

SendMessage(WM_NOTIFY,

m_psttt.hdr.idFrom,(LPARAM)&

m_psttt);

(pWnd,nHitTest,message);

voidCFileOp1:

OnDestroy() 

CDialog:

OnDestroy();

SetStatusText(UINTnID)

if(nID==0)

nID=AFX_IDS_IDLEMESSAGE;

CWnd*pWnd=AfxGetMainWnd()->

GetDescendantWindow

(AFX_IDW_STATUS_BAR);

if(pWnd)

AfxGetMainWnd()->

SendMessage

(WM_SETMESSAGESTRING,nID);

pWnd->

SendMessage(WM_IDLEUPDATECMDUI);

UpdateWindow();

OnTipNotify(UINTid,NMHDR*

pNMHDR,LRESULT*pResult)

TOOLTIPTEXT*pTTT=(TOOLTIPTEXT*)pNMHDR;

UINTnID=pNMHDR->

if(pTTT->

TTF_IDISHWND)

nID=:

if(nID)

TCHARszFullText[256];

CStringStrTipText;

AfxLoadString(nID,szFullText);

AfxExtractSubString(StrTipText,

szFullText,1,'

\n'

if(!

StrTipText.IsEmpty())

strcpy(pTTT- 

>

lpszText,StrTipText);

pTTT- 

hinst=AfxGetResourceHandle();

return(TRUE);

----

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2