为LISTBOX增加TOOLTIP
TOOLTIP功能可以实现当光标移动于一个控件上时出现一层浮动的文字讯息,而界面制作中经常使用LISTBOX控件显示各种项目列表,有时我们希望用户鼠标在LISTBOX控件中移动的时候针对每一个项目显示不同的提示信息,使界面更加友好,。
首先,我们新建一个基于http://www.yippeesoft.com/对话框名为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)
&leftsign;
  // TODO: Add your specialized code here and/or call the base class
 m_tooltip.RelayEvent(pMsg); //让TOOLTIP控件能够处理鼠标消息
  return CDialog::PreTranslateMessage(pMsg);
&rightsign;
这样我们就已经为LISTBOX控件http://www.yippeesoft.com/增加了TOOLTIP支持,但是无论鼠标移动在哪个项目上,都是显示的“LISTBOX”提示信息,现在我们必须自己拦截LISTBOX的鼠标信息,让鼠标移动到每一个项目显示不同的提示信息。
BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
&leftsign;
 // 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控件
 &leftsign;
  m_l.ScreenToClient(&point); //由 于GetCursorPos函数返回的是相对于整个屏幕的坐标值,因此需要把这个坐标值转换成相对于ListBox 的坐标.
  BOOL bIn;
  int nNindex=m_l.ItemFromPoint (point  ,bIn);//从鼠标坐标获得鼠标目前所在的LISTBOX项目索引
  if (!bIn)
  &leftsign;
   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.yippeesoft.com/更新对应的提示信息
  &rightsign;
  else
   m_tooltip.UpdateTipText("",GetDlgItem(IDC_LIST1) );
 &rightsign;

 return CDialog::PreTranslateMessage(pMsg);
&rightsign;
 这样,通过增加TOOLTIP支持,拦截窗口的鼠标信息,我们就能够在LISTBOX控件中针对每一个项目作出不同的提示信息,以上代码在http://www.yippeesoft.com/ VC6以及WIN98/WIN2K中调试通过。

历史博文

该日志未加标签。
四月 1, 2005 at 5:20 下午 by yippee 1,148 次
Category: Dev