MFC 对右键菜单添加 tooltip 怎么设计?

MFC 对右键菜单添加 tooltip 怎么设计?,第1张

您好,是这样的:

添加右键菜单:

CMenu menu1

menu1.CreatePopupMenu()//动态创建d出式菜单对象

menu1.AppendMenu(MF_STRING,ID_TEST1," 菜单项1")

menu1.AppendMenu(MF_STRING,ID_TEST2," 菜单项2")

menu1.InsertMenu(2,MF_BYPOSITION|MF_POPUP|MF_STRING,

(UINT) menuMain.m_hMenu,"子菜单")//添加子菜单

CPoint pt

GetCursorPos(&pt)

menu1.TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this)

menu1.DestroyMenu()

若菜单ID值是连续的,最好用ON_COMMAND_RANGE来映射消息处理函数,可以在一个函数中处理一个范围内的所有消息。

当用户按下某个菜单项,会发出一个WM_COMMAND消息,而菜单项的ID号,就包含在参数wParam的低位中. 。

Windows 窗体的 ToolTip 组件在用户指向控件时显示相应的文本。工具提示可与任何控件相关联。举一个使用此控件的示例:为节省窗体上的空间,可以在按钮上显示一个小图标并用工具提示解释该按钮的功能。

如果在程序设计窗体中添加了 ToolTip 组件,则程序设计窗体中的所有控件的属性中将自动增加一个 ToolTip 属性,用于为程序设计窗体中的控件添加提示信息。它的用途是当鼠标位于某个控件上并停留一段时间后,显示该控件功能的提示信息。

其主要属性包括:

(1) Active 属性:获取或设置一个值,指示工具提示当前是否处于激活状态。

如果工具提示当前处于活动状态,则为 true;否则为 false。默认为 true。

可为一个窗体创建并分配多个 ToolTip 组件,但将 Active 属性设置为 false 只影响当前 ToolTip。

(2) AutomaticDelay 属性:获取或设置工具提示的自动延迟。

自动延迟(以毫秒为单位)。默认值为 500。

(3) AutoPopDelay 属性:获取或设置当指针在具有指定工具提示文本的控件内保持静止时,工具提示保持可见的时间期限。

以毫秒为单位,默认值为 5000。

(4) ReshowDelay 属性:获取或设置鼠标指针从一个控件移到另一控件时,必须经过多长时间才会出现后面的工具提示窗口。以毫秒为单位。

(5) ShowAlways 属性:获取或设置一个值,该值指示是否显示工具提示窗口,甚至是在其父控件不活动的时候。

如果始终显示工具提示,则为 true;否则为 false。默认为 false。

(6) BackColor 属性:获取或设置工具提示的背景色。

(7) ForeColor 属性:获取或设置工具提示的前景色。

使用 BackColor 和 ForeColor 属性可修改工具提示所使用的配色方案。系统默认字体是自动使用的,并且只能通过自行绘制工具提示来重写。

(8) IsBalloon 属性:获取或设置一个指示工具提示是否应使用气球状窗口的值。

如果应使用气球状窗口,则为 true;如果应使用标准矩形窗口,则为 false。默认为 false。

ToolTip 组件最常用的一个公共方法是 SetToolTip 方法,它使工具提示文本与指定的控件相关联。其声明如下:

public void SetToolTip (

Control control,

string caption

)

其中,参数 control 是要将工具提示文本与其关联的控件;caption 是指针位于控件上方时要显示的工具提示文本。

作为一条通用规则,所用的文本应该简短;但是,可以使用 \r\n 转义字符序列插入分行符。

下面的实例主要介绍了如何使用工具提示(ToolTip)组件为程序窗体控件添加工具提示信息的编程技术。

具体步骤如下:

(1) 启动Visual Studio 2005,新建一个C# Windows应用程序项目,如下图所示(点击可看大图)。

(2) 向程序设计窗体中拖放一个GroupBox控件,在属性对话框中设置其Text属性为“学生基本信息”;再拖放4个Label控件,在属性对话框中设置其Text属性分别为“姓名:”、“年龄:”、“身份z号码:”、“联系地址:”;在这些Label控件右边拖放4个TextBox控件,调整窗体和这些控件的大小适应程序设计窗体的大小。

(3) 向程序设计窗体中拖放一个ToolTip控件,保留其默认属性值即可。

(4) 双击程序设计窗体Form1,为其Load(装载)事件添加如下代码:

private void Form1_Load(object sender, EventArgs e)

{

this.toolTip1.SetToolTip(this.textBox1, "请输入学生姓名。")

this.toolTip1.SetToolTip(this.textBox2, "请输入学生年龄。")

this.toolTip1.SetToolTip(this.textBox3, "请输入身份z号码。")

this.toolTip1.SetToolTip(this.textBox4, "请输入联系地址。")

 VC6的List控件默认是不能为subitem提供tooltip的,只有通过重写CListCtrl类来实现。在网上找了一个写好的CToolTipListCtrl类可以显示该功能,只需调用即可。具体步骤如下:

1.将ToolTipListCtrl.h和ToolTipListCtrl.cpp加入工程。

2.为List控件添加相应的变量CListCtrl m_lstObject。

3.用CToolTipListCtrl替换上面的CListCtrl,当然还要加入相应的头文件“#include "ToolTipListCtrl.h"”。

4.设置列表的扩展样式,使之包含LVS_EX_INFOTIP样式。

m_lstObject.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_INFOTIP)

5.步骤4也可以改为

m_lstObject.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES)

m_lstObject.EnableToolTips(TRUE)

6.编译运行程序。效果见下图:

是不是很简单呢,你也赶快试试吧。

下面是ToolTipListCtrl.h和ToolTipListCtrl.cpp源码:

#if !defined(AFX_TOOLTIPLISTCTRL_H__EA17BA6D_ADD2_49E3_AB67_45B65316D19F__INCLUDED_)

#define AFX_TOOLTIPLISTCTRL_H__EA17BA6D_ADD2_49E3_AB67_45B65316D19F__INCLUDED_

#if _MSC_VER >1000

#pragma once

#endif // _MSC_VER >1000

// ToolTipListCtrl.h : header file

//

/////////////////////////////////////////////////////////////////////////////

// CToolTipListCtrl window

#include <afxtempl.h>

/////////////////////////////////////////////////////////////////////////////

// CToolTipListCtrl, v.1.0

//

// A CListCtrl derived class that

// can display per SubItem tooltips by itself

//

// Author: Jo鉶 Filipe de Castro Ferreira (jfilipe@isr.uc.pt)

// Based on Nate Maynard's (nate.maynard@neomation.com) CToolTipTreeCtrl

//

// Last Modified: 7/11/2001

//

// License: Quoting Nate Maynard,

//  "use it however you want. If it helps you out, drop me a line and let me know. :-)"

//

// Disclaimer: This code comes with no warranty of any kind whatsoever. Use at your own risk.

//

/////////////////////////////////////////////////////////////////////////////

//The initial state of m_wHitMask

#define INITIAL_HITMASK LVHT_ONITEMLABEL

class CToolTipListCtrl : public CListCtrl

{

// Construction

public:

   CToolTipListCtrl()

// Attributes

public:

protected:

   // Map's SubItems to related tooltip text

   CMapStringToString m_ToolTipMap

   // A bit mask of LVHT_* flags the control will show tooltips for

   WORD m_wHitMask

// Operations

public:

// Overrides

   // ClassWizard generated virtual function overrides

   //{{AFX_VIRTUAL(CToolTipListCtrl)

   //}}AFX_VIRTUAL

// Implementation

public:

   //** CWnd Overrides **

   //Provide our own logic for HitTests, specifically, make ToolHitTests respond per SubItem

   virtual int OnToolHitTest(CPoint point, TOOLINFO * pTI) const

   

   //** CTreeCtrl Overrides **

   //Overriding the Delete functions makes sure m_ToolTipMap doesn't have excess mappings

   virtual BOOL DeleteAllItems( )

   virtual BOOL DeleteItem( int nItem )

   virtual BOOL SetItemText( int nItem, int nSubItem, LPTSTR lpszText )

   //** Additional Functions **

   //Set the TVHT_* flags that will trigger the display of a tooltip

   WORD SetToolTipHitMask(WORD wHitMask)

   //Clear all tooltips

   virtual void DeleteAllToolTips()

   //Set the tooltip text for a specific SubItem

   virtual BOOL SetItemToolTipText( int nItem, int nSubItem, LPCTSTR lpszToolTipText )

   //Retrieves the tooltip text for a specific SubItem

   virtual CString GetItemToolTipText( int nItem, int nSubItem )

   

   virtual ~CToolTipListCtrl()

   // Generated message map functions

protected:

   //{{AFX_MSG(CToolTipListCtrl)

       // NOTE - the ClassWizard will add and remove member functions here.

   //}}AFX_MSG

   //Respondes to the TTN_NEEDTEXT* messages, provides the text of a tooltip

   virtual afx_msg BOOL OnToolTipText( UINT id, NMHDR * pNMHDR, LRESULT * pResult )

   DECLARE_MESSAGE_MAP()

}

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_TOOLTIPLISTCTRL_H__EA17BA6D_ADD2_49E3_AB67_45B65316D19F__INCLUDED_)

// ToolTipListCtrl.cpp : implementation file

//

#include "stdafx.h"

#include "ToolTipListCtrl.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__

#endif

/////////////////////////////////////////////////////////////////////////////

// CToolTipListCtrl

CToolTipListCtrl::CToolTipListCtrl()

{

   m_wHitMask = INITIAL_HITMASK

}

CToolTipListCtrl::~CToolTipListCtrl()

{

   // Cleanup when destroyed

   DeleteAllToolTips()

}

BEGIN_MESSAGE_MAP(CToolTipListCtrl, CListCtrl)

   //{{AFX_MSG_MAP(CToolTipListCtrl)

   // NOTE - the ClassWizard will add and remove mapping macros here.

   //}}AFX_MSG_MAP

   //Trap all TTN_NEEDTEXT* Messages

   //TTN_NEEDTEXT* messages are sent when a ToolTipCtrl wants a control

   //to provide it with text to display as the tooltip.

   //Specifically, when the TOOLINFO structure passed back to the ToolTipCtrl

   //after ::OnToolHitTest has it's lpszText memeber set to LPSTR_TEXTCALLBACK.

   ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)

   ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CToolTipListCtrl message handlers

int CToolTipListCtrl::OnToolHitTest(CPoint point, TOOLINFO * pTI) const

{

   // See if the point falls onto a list item

   //UINT nFlags = 0

   

   LVHITTESTINFO lvhitTestInfo

   

   lvhitTestInfo.pt = point

   

   int nItem = ListView_SubItemHitTest(

       this->m_hWnd,

       &lvhitTestInfo)

   int nSubItem = lvhitTestInfo.iSubItem

   

   UINT nFlags = lvhitTestInfo.flags

   

   // nFlags is 0 if the SubItemHitTest fails

   // Therefore, 0 &<anything>will equal false

   if (nFlags &m_wHitMask)

   {

       // If it did fall on a list item,

       // and it was also hit one of the

       // item specific sub-areas we wish to show tool tips for

       

       // Get the client area occupied by this control

       RECT rcClient

       GetClientRect( &rcClient )

       

       // Fill in the TOOLINFO structure

       pTI->hwnd = m_hWnd

       pTI->uId = (UINT) (nItem * 100 + nSubItem)

       pTI->lpszText = LPSTR_TEXTCALLBACK

       pTI->rect = rcClient

       

       return pTI->uId// By returning a unique value per listItem,

       // we ensure that when the mouse moves over another list item,

       // the tooltip will change

   }

   else

   {

       // Otherwise, we aren't interested, so let the message propagate

       return -1

   }

}

BOOL CToolTipListCtrl::OnToolTipText( UINT id, NMHDR * pNMHDR, LRESULT * pResult )

{

   // Handle both ANSI and UNICODE versions of the message

   TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR

   TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR

   

   // Ignore messages from the built in tooltip, we are processing them internally

   if( (pNMHDR->idFrom == (UINT)m_hWnd) &&

       ( ((pNMHDR->code == TTN_NEEDTEXTA) &&(pTTTA->uFlags &TTF_IDISHWND)) ||

       ((pNMHDR->code == TTN_NEEDTEXTW) &&(pTTTW->uFlags &TTF_IDISHWND)) ) )

   {

       return FALSE

   }

   

   *pResult = 0

   

   CString strTipText

   

   // Get the mouse position

   const MSG* pMessage

   pMessage = GetCurrentMessage()

   ASSERT ( pMessage )

   CPoint pt

   pt = pMessage->pt// Get the point from the message

   ScreenToClient( &pt )// Convert the point's coords to be relative to this control

   

   // See if the point falls onto a list item

   

   LVHITTESTINFO lvhitTestInfo

   

   lvhitTestInfo.pt = pt

   

   int nItem = SubItemHitTest(&lvhitTestInfo)

   int nSubItem = lvhitTestInfo.iSubItem

   

   UINT nFlags = lvhitTestInfo.flags

   

   // nFlags is 0 if the SubItemHitTest fails

   // Therefore, 0 &<anything>will equal false

   if( nFlags &m_wHitMask )

   {

       // If it did fall on a list item,

       // and it was also hit one of the

       // item specific sub-areas we wish to show tool tips for

       

       // Lookup the list item's text in the ToolTip Map

       

       CString strKey

       

       strKey.Format(_T("%d"),  nItem * 100 + nSubItem)

       

       if( m_ToolTipMap.Lookup(strKey, strTipText ) )

       {

           // If there was a CString associated with the list item,

           // copy it's text (up to 80 characters worth, limitation of the TOOLTIPTEXT structure)

           // into the TOOLTIPTEXT structure's szText member

           

           // Deal with UNICODE

#ifndef _UNICODE

           if (pNMHDR->code == TTN_NEEDTEXTA)

               lstrcpyn(pTTTA->szText, strTipText, 80)

           else

               _mbstowcsz(pTTTW->szText, strTipText, 80)

#else

           if (pNMHDR->code == TTN_NEEDTEXTA)

               _wcstombsz(pTTTA->szText, strTipText, 80)

           else

               lstrcpyn(pTTTW->szText, strTipText, 80)

#endif

         

       }

   }

   

   return FALSE// We didn't handle the message,

   // let the framework continue propagating the message

}

// Sets the tooltip text for a specific item

BOOL CToolTipListCtrl::SetItemToolTipText( int nItem, int nSubItem, LPCTSTR lpszToolTipText )

{

   CString strKey

   

   strKey.Format(_T("%d"),  nItem * 100 + nSubItem)

   

   m_ToolTipMap.SetAt( strKey, lpszToolTipText )

   

   return TRUE

}

// Retrieve the tooltip text for a specific list item

CString CToolTipListCtrl::GetItemToolTipText( int nItem, int nSubItem )

{

   CString itemToolTipText

   

   CString strKey

   

   strKey.Format(_T("%d"),  nItem * 100 + nSubItem)

   

   

   if( !m_ToolTipMap.Lookup( strKey, itemToolTipText ) )

   {

       itemToolTipText = ""

   }

   

   return itemToolTipText

}

WORD CToolTipListCtrl::SetToolTipHitMask( WORD wHitMask )

{

   WORD oldHitMask = m_wHitMask

   

   m_wHitMask = wHitMask

   

   return oldHitMask

}

void CToolTipListCtrl::DeleteAllToolTips()

{

   m_ToolTipMap.RemoveAll()

}

BOOL CToolTipListCtrl::DeleteAllItems( )

{

   // Call the base class method

   BOOL retVal = CListCtrl::DeleteAllItems()

   

   if( retVal )

   {

       // If it succeeded, remove all tooltips

       DeleteAllToolTips()

   }

   

   return retVal

}

BOOL CToolTipListCtrl::DeleteItem( int nItem )

{

   // Call the base class method

   BOOL retVal = CListCtrl::DeleteItem( nItem )

   

   if( retVal )

   {


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11413489.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存