您的位置:首页 > 编程语言 > C语言/C++

VC++ 中 CToolTipCtrl 应用

2014-05-05 11:45 253 查看
CToolTipCtrl

class CEmisDrawView : public CScrollView

{

protected: // create from serialization only

CEmisDrawView();

DECLARE_DYNCREATE(CEmisDrawView)

CToolTipCtrl m_ToolTip;

// 。。。。

};

int CEmisDrawView::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (CScrollView::OnCreate(lpCreateStruct) == -1)

return -1;

m_ToolTip.Create(this,TTS_ALWAYSTIP);

m_ToolTip.AddTool(this,"eMis_Draw");

EnableToolTips(TRUE);

return 0;

}

LRESULT CEmisDrawView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)

{

if(message == WM_MOUSEMOVE)

{

MSG msg;

msg.hwnd = m_hWnd;

msg.message = message;

msg.wParam = wParam;

msg.lParam = lParam;

m_ToolTip.RelayEvent(&msg);

}

return CScrollView::WindowProc(message, wParam, lParam);

}

BOOL CEmisDrawView::PreTranslateMessage(MSG* pMsg)

{

m_ToolTip.RelayEvent(pMsg);

return CScrollView::PreTranslateMessage(pMsg);

}

在你想更改的地方加上:

m_ToolTip.UpdateTipText("new string",this);

--------------------------------------------------------

Tooltip中由一个方法叫做SetMaxTipWidth,MSDN中的描述说是设定Tips窗口的最大宽度,然后就没了。

其实这个方法是使用SDK中的TTM_SETMAXTIPWIDTH 消息,查一下这个消息的描述,就会发现很多内容。

1. 这个方法是设定Tips窗口的最大宽度,in pixel;

2. 如果文字超过这个最大宽度,则control进行自动换行,以空格为换行标志;

3. 如果无法换行(没有空格或\r\n),则显示一行,宽度超过最大宽度。

还有很重要的一点,如果没有设定过宽度,则系统默认宽度为-1,这也是没有设定宽度就不能换行的原因。

试验结果:

1. 一旦设定宽度,\r\n和空格就会同时起作用,只是空格是在一行宽度超过设定宽度时起作用的。

--------------------------------------------------------

BOOL CTest_CToolTipCtrlDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// Set the icon for this dialog. The framework does this automatically

// when the application's main window is not a dialog

SetIcon(m_hIcon, TRUE); // Set big icon

SetIcon(m_hIcon, FALSE); // Set small icon

RECT rect;

rect.left = 5;

rect.right = 5;

rect.top = 5;

rect.bottom = 5;

m_objToolTip.SetMaxTipWidth(180);

m_objToolTip.SetTipBkColor( RGB(165, 203, 247) );

m_objToolTip.SetTipTextColor( RGB(0, 102, 153) );

m_objToolTip.SetMargin( &rect );

m_objToolTip.AddTool( GetDlgItem(IDOK) , "this is a common button\nnamed \"ok\"\ntest done.");

m_objToolTip.AddTool( GetDlgItem(IDCANCEL) , "this is a common button\nnamed \"cancel\"\ntest done.");

// TODO: Add extra initialization here

return TRUE; // return TRUE unless you set the focus to a control

}



CToolTipCtrl

class CEmisDrawView : public CScrollView

{

protected: // create from serialization only

CEmisDrawView();

DECLARE_DYNCREATE(CEmisDrawView)

CToolTipCtrl m_ToolTip;

// 。。。。

};

int CEmisDrawView::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (CScrollView::OnCreate(lpCreateStruct) == -1)

return -1;

m_ToolTip.Create(this,TTS_ALWAYSTIP);

m_ToolTip.AddTool(this,"eMis_Draw");

EnableToolTips(TRUE);

return 0;

}

LRESULT CEmisDrawView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)

{

if(message == WM_MOUSEMOVE)

{

MSG msg;

msg.hwnd = m_hWnd;

msg.message = message;

msg.wParam = wParam;

msg.lParam = lParam;

m_ToolTip.RelayEvent(&msg);

}

return CScrollView::WindowProc(message, wParam, lParam);

}

BOOL CEmisDrawView::PreTranslateMessage(MSG* pMsg)

{

m_ToolTip.RelayEvent(pMsg);

return CScrollView::PreTranslateMessage(pMsg);

}

在你想更改的地方加上:

m_ToolTip.UpdateTipText("new string",this);

--------------------------------------------------------

Tooltip中由一个方法叫做SetMaxTipWidth,MSDN中的描述说是设定Tips窗口的最大宽度,然后就没了。

其实这个方法是使用SDK中的TTM_SETMAXTIPWIDTH 消息,查一下这个消息的描述,就会发现很多内容。

1. 这个方法是设定Tips窗口的最大宽度,in pixel;

2. 如果文字超过这个最大宽度,则control进行自动换行,以空格为换行标志;

3. 如果无法换行(没有空格或\r\n),则显示一行,宽度超过最大宽度。

还有很重要的一点,如果没有设定过宽度,则系统默认宽度为-1,这也是没有设定宽度就不能换行的原因。

试验结果:

1. 一旦设定宽度,\r\n和空格就会同时起作用,只是空格是在一行宽度超过设定宽度时起作用的。

--------------------------------------------------------

BOOL CTest_CToolTipCtrlDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// Set the icon for this dialog. The framework does this automatically

// when the application's main window is not a dialog

SetIcon(m_hIcon, TRUE); // Set big icon

SetIcon(m_hIcon, FALSE); // Set small icon

RECT rect;

rect.left = 5;

rect.right = 5;

rect.top = 5;

rect.bottom = 5;

m_objToolTip.SetMaxTipWidth(180);

m_objToolTip.SetTipBkColor( RGB(165, 203, 247) );

m_objToolTip.SetTipTextColor( RGB(0, 102, 153) );

m_objToolTip.SetMargin( &rect );

m_objToolTip.AddTool( GetDlgItem(IDOK) , "this is a common button\nnamed \"ok\"\ntest done.");

m_objToolTip.AddTool( GetDlgItem(IDCANCEL) , "this is a common button\nnamed \"cancel\"\ntest done.");

// TODO: Add extra initialization here

return TRUE; // return TRUE unless you set the focus to a control

}


CToolTipCtrl使用详细解说

by 闻怡洋 http://vchelp.163.net

ToolTip是Win32中一个通用控件,MFC中为其生成了一个类CToolTipCtrl,总的说来其使用方法是较简单的,下面讲一下它的一般用法和高级用法。

一般用法步骤:

添加CToolTipCtrl成员变量 m_tt。

在父窗口中调用EnableToolTips(TRUE);

在窗口的OnCreate(或者其他适当的位置)中向ToolTip中添加需要显示Tip的子窗口,并同时指定相应的显示字串CToolTipCtrl::AddTool(pWnd,"string to display")。

重载父窗口的 BOOL PreTranslateMessage(MSG* pMsg) ,在函数中调用 m_tt.RelayEvent(pMsg)。

下面假设在窗口CWndYour中使用CToolTipCtrl
在类定义中添加变量说明:class CWndYour:xxx{ CToolTipCtrl m_tt;}在OnCreate中添加需要显示Tip的子窗口CWndYour::OnCreate(....){ EnableToolTips(TRUE); m_tt.Create(this); m_tt.Activate(TRUE); CWnd* pW=GetDlgItem(IDC_CHECK1);//得到窗口指针 m_tooltip.AddTool(pW,"Check1");//添加........}在BOOL PreTranslateMessage(MSG*
pMsg)中添加代码BOOL CWndYour::PreTranslateMessage(MSG* pMsg){ { m_tt.RelayEvent(pMsg); } return CParentClass::PreTranslateMessage(pMsg);}

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

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

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

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

在窗口中增加消息映射 ON_NOTIFY_EX( TTN_NEEDTEXT, 0, SetTipText )。

在窗口中增加一个函数用于动态提供显示内容,其原型为 BOOL SetTipText( UINT id, NMHDR * pTTTStruct, LRESULT * pResult ),下面的代码可以根据传入的参数判定应该显示的内容。

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是否为HWND { nID = ::GetDlgCtrlID((HWND)nID);//从HWND得到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);}

ToolTip是Win32中一个通用控件,MFC中为其生成了一个类CToolTipCtrl,总的说来其使用方法是较简单的,下面讲一下它的一般用法和高级用法。

一般用法步骤:

添加CToolTipCtrl成员变量 m_tt。

在父窗口中调用EnableToolTips(TRUE);

在窗口的OnCreate(或者其他适当的位置)中向ToolTip中添加需要显示Tip的子窗口,并同时指定相应的显示字串CToolTipCtrl::AddTool(pWnd,"string to display")。

重载父窗口的 BOOL PreTranslateMessage(MSG* pMsg) ,在函数中调用 m_tt.RelayEvent(pMsg)。

下面假设在窗口CWndYour中使用CToolTipCtrl
在类定义中添加变量说明:class CWndYour:xxx{ CToolTipCtrl m_tt;}在OnCreate中添加需要显示Tip的子窗口CWndYour::OnCreate(....){ EnableToolTips(TRUE); m_tt.Create(this); m_tt.Activate(TRUE); CWnd* pW=GetDlgItem(IDC_CHECK1);//得到窗口指针 m_tooltip.AddTool(pW,"Check1");//添加........}在BOOL PreTranslateMessage(MSG*
pMsg)中添加代码BOOL CWndYour::PreTranslateMessage(MSG* pMsg){ { m_tt.RelayEvent(pMsg); } return CParentClass::PreTranslateMessage(pMsg);}

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

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

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

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

在窗口中增加消息映射 ON_NOTIFY_EX( TTN_NEEDTEXT, 0, SetTipText )。

在窗口中增加一个函数用于动态提供显示内容,其原型为 BOOL SetTipText( UINT id, NMHDR * pTTTStruct, LRESULT * pResult ),下面的代码可以根据传入的参数判定应该显示的内容。

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是否为HWND { nID = ::GetDlgCtrlID((HWND)nID);//从HWND得到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);}

ToolTip是Win32中一个通用控件,MFC中为其生成了一个类CToolTipCtrl,总的说来其使用方法是较简单的。一般用法步骤:

添加CToolTipCtrl成员变量 m_tt。

在父窗口中调用EnableToolTips(TRUE);

在窗口的OnCreate(或者其他适当的位置)中向ToolTip中添加需要显示Tip的子窗口,并同时指定相应的显示字串CToolTipCtrl::AddTool (pWnd,"string to display")。

重载父窗口的 BOOL PreTranslateMessage(MSG* pMsg) ,在函数中调用 m_tt.RelayEvent(pMsg)。

下面假设在窗口CWndYour中使用CToolTipCtrl

在类定义中添加变量说明:

class CWndYour:xxx

{

CToolTipCtrl m_tt;

}

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

CWndYour::OnCreate(....)

{

EnableToolTips(TRUE);

m_tt.Create(this);

m_tt.Activate(TRUE);



CWnd* pW=GetDlgItem(IDC_CHECK1);//得到窗口指针

m_tooltip.AddTool(pW,"Check1");//添加

........

}

在BOOL PreTranslateMessage(MSG* pMsg)中添加代码

BOOL CWndYour::PreTranslateMessage(MSG* pMsg)

{

{

m_tt.RelayEvent(pMsg);

}

return CParentClass::PreTranslateMessage(pMsg);

}

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

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

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

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

在窗口中增加消息映射 ON_NOTIFY_EX( TTN_NEEDTEXT, 0, SetTipText )。

在窗口中增加一个函数用于动态提供显示内容,其原型为 BOOL SetTipText( UINT id, NMHDR * pTTTStruct, LRESULT * pResult ),下面的代码可以根据传入的参数判定应该显示的内容。

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是否为HWND

nID = ::GetDlgCtrlID((HWND)nID);//从HWND得到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);

}





另外一些小功能:

1、 使CToolTipCtrl增加换行功能,显示前增加函数调用

M_tt. SetMaxTipWidth(5); //使ToolTip最多可以支持5行

2、SetDelayTime函数用来设置显示时间。

3、SetMargin用来设置上下左右的空白距离。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: