添加右键菜单:
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 )
{
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)