为LISTBOX增加TOOLTIP TOOLTIP功能可以实现当光标移动于一个控件上时出现一层浮动的文字讯息,而界面制作中经常使用LISTBOX控件显示各种项目列表,有时我们希望用户鼠标在LISTBOX控件中移动的时候针对每一个项目显示不同的提示信息,使界面更加友好,。 首先,我们新建一个基于http://www.shengfang.org/对话框名为TEST的VC EXE工程文件;在对话框中添加一个LISTBOX控件,默认ID:IDC_LIST1;按下“CTRL+W”组合键,在“MFC CLASSWIZARD”中选择“MEMBER VARIABLES”属性页,在控件列表中选择IDC_LIST1,点击右侧的“ADD VARIABLE”按钮为控件添加变量:“Member variable name”输入m_list、“Category”选择“Control”,这时“Variable type”将会显示为ClistBox,确认后我们就已经为LISTBOX控件绑定了一个名为m_list的ClistBox类变量。 现在我们初始化LISTBOX控件,增加一些项目列表并且增加基本的TOOLTIP支持: 在testdlg.h文件,为CtestDlg增加变量: CToolTipCtrl m_tooltip; //定义一个TOOTLTIP控件 在testdlg.cpp文件,在CTestDlg::OnInitDialog()事件中增加如下代码: m_l.AddString ("Item 1"); m_l.AddString ("Item 2"); m_l.AddString ("Item 3"); m_l.AddString ("Item 4"); //在列表框中增加项目 m_tooltip.Create(this); //将TOOLTIP控件与父窗口绑定 m_tooltip.Activate(TRUE); //激活TOOLTIP控件 m_tooltip.AddTool (GetDlgItem(IDC_LIST1),"LISTBOX"); //将TOOLTIP控件与LISTBOX控件进行关联,这样当鼠标移动在LISTBOX控件时显示LISTBOX提示信息。 使用Class Wizard为CtestDlg增加PreTranslateMessage映射,在testdlg.cpp中编辑如下代码: BOOL CTestDlg::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class m_tooltip.RelayEvent(pMsg); //让TOOLTIP控件能够处理鼠标消息 return CDialog::PreTranslateMessage(pMsg); } 这样我们就已经为LISTBOX控件http://www.shengfang.org/增加了TOOLTIP支持,但是无论鼠标移动在哪个项目上,都是显示的“LISTBOX”提示信息,现在我们必须自己拦截LISTBOX的鼠标信息,让鼠标移动到每一个项目显示不同的提示信息。 BOOL CTestDlg::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class m_tooltip.RelayEvent(pMsg); CPoint point; CString strTxt; GetCursorPos(&point); //取得当前鼠标的坐标 if (::WindowFromPoint(point)==m_l) //从当前鼠标的坐标获得鼠标所在窗口的句柄,并判断是否为LISTBOX控件 { m_l.ScreenToClient(&point); //由 于GetCursorPos函数返回的是相对于整个屏幕的坐标值,因此需要把这个坐标值转换成相对于ListBox 的坐标. BOOL bIn; int nNindex=m_l.ItemFromPoint (point ,bIn);//从鼠标坐标获得鼠标目前所在的LISTBOX项目索引 if (!bIn) { if (nNindex==0) m_tooltip.UpdateTipText("ITEM 1",GetDlgItem(IDC_LIST1) ); if (nNindex==1) m_tooltip.UpdateTipText("ITEM 2",GetDlgItem(IDC_LIST1) ); if (nNindex==2) m_tooltip.UpdateTipText("ITEM 3",GetDlgItem(IDC_LIST1) ); if (nNindex==3) m_tooltip.UpdateTipText("ITEM 4",GetDlgItem(IDC_LIST1) ); //分别判断项目索引,http://www.shengfang.org/更新对应的提示信息 } else m_tooltip.UpdateTipText("",GetDlgItem(IDC_LIST1) ); } return CDialog::PreTranslateMessage(pMsg); } 这样,通过增加TOOLTIP支持,拦截窗口的鼠标信息,我们就能够在LISTBOX控件中针对每一个项目作出不同的提示信息,以上代码在http://www.shengfang.org/ VC6以及WIN98/WIN2K中调试通过。
字体:大 中 小 |