在ListView上显示带有图片的提示信息

 

本文重构了ToolTip组件,只为可以在上面显示图片所作,具体参考如下代码:

 

重写ToolTip

实例:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Text;  
  7. using System.Windows.Forms;  
  8. using CustomToolTipDemo.Properties;  
  9. namespace CustomToolTipDemo  
  10. {  
  11.     public partial class Form1 : Form  
  12.     {  
  13.         /// <summary>   
  14.         /// 构造一个可以显示图片的ToolTip类实例   
  15.         /// </summary>   
  16.         CustomizedToolTip myToolTip = new CustomizedToolTip();  
  17.         public Form1()  
  18.         {  
  19.             InitializeComponent();  
  20.             // 设定工具提示窗口的大小   
  21.             myToolTip.Size = new Size(600, 300);  
  22.         }  
  23.         /// <summary>   
  24.         /// 当鼠标悬停于某项上时,给出带有图片的提示信息   
  25.         /// </summary>   
  26.         private void listView1_ItemMouseHover(object sender, ListViewItemMouseHoverEventArgs e)  
  27.         {  
  28.             switch (e.Item.Text)  //根据项的文本值提示相应信息   
  29.             {  
  30.                 case "item1":  
  31.                     myToolTip.SetToolTip(listView1, "Title");  
  32.                     listView1.Tag = Resources.Image1; //设定要提示的图片   
  33.                     break;  
  34.                 case "item2":  
  35.                     myToolTip.SetToolTip(listView1, "Title");  
  36.                     listView1.Tag = Resources.Image2;  
  37.                     break;  
  38.                 default:  
  39.                     break;  
  40.             }  
  41.         }  
  42.         /// <summary>   
  43.         /// 当鼠标处于“无项区域”时,立即“隐藏”提示信息窗口   
  44.         /// </summary>   
  45.         private void listView1_MouseMove(object sender, MouseEventArgs e)  
  46.         {  
  47.             ListViewHitTestInfo info = listView1.HitTest(e.Location);  
  48.             if (info.Item == null//是否处于“无项区域”   
  49.             {  
  50.                 myToolTip.SetToolTip(listView1, "");  
  51.                 listView1.Tag = null;  
  52.             }  
  53.         }  
  54.     }  
  55. }  

 

最后,会有一个问题:比如listView上有项item1、item2、…如本例给出的参考代码,当鼠标悬停于某项(如item1)上时,第一次可以正常显示带有图片的提示信息,然后我们在这个时候把鼠标移到“无项区域”,然后再把鼠标悬停于item1,此时我们会发现没有提示信息出现,只有先移到其他项(如item2)后再悬停于item1时,才会使提示信息重现。本人愚昧,这个问题还不得而解,还请各位不吝赐教。。

 

///ADD @2010-11-15

昨日的问题终于得到解决,无需ItemMouseHover事件,只需MouseMove外加一个全局变量tooltipOn用来保存当前提示信息项 即可。具体参考如下代码:

  1. /// <summary>   
  2. /// 当前提示信息项   
  3. /// </summary>   
  4. ListViewItem tooltipOn;  
  5. /// <summary>   
  6. /// 根据项文本内容显示带有图片的提示信息   
  7. /// </summary>   
  8. private void listView1_MouseMove(object sender, MouseEventArgs e)  
  9. {  
  10.     ListViewItem item = listView1.HitTest(e.Location).Item;  
  11.     if (item != null)  
  12.     {  
  13.         //如果不是当前提示信息项,更新提示信息及提示信息项   
  14.         if (item != tooltipOn)  
  15.         {  
  16.             switch (item.Text)  //根据项的文本值提示相应信息   
  17.             {  
  18.                 case "item1":  
  19.                     //设定要提示的图片   
  20.                     listView1.Tag = Resources.Image1;   
  21.                     break;  
  22.                 case "item2":  
  23.                     listView1.Tag = Resources.Image2;  
  24.                     break;  
  25.                 default:  
  26.                     break;  
  27.             }  
  28.             showToolTip(Cursor.Position, e.Location);  
  29.             tooltipOn = item;  
  30.         }  
  31.     }  
  32.     else //若鼠标处于“无项区域”,则清空提示信息相关的信息   
  33.     {  
  34.         myToolTip.Hide(listView1);  
  35.         listView1.Tag = null;  
  36.         tooltipOn = null;  
  37.     }  
  38. }  
  39.  
  40. #region 根据所在位置显示tooltip   
  41. /// <summary>   
  42. /// 根据所在位置显示tooltip   
  43. /// </summary>   
  44. /// <param name="screenPos">当前屏幕坐标点</param>   
  45. /// <param name="listViewPos">当前ListView坐标点</param>   
  46. private void showToolTip(Point screenPos, Point listViewPos)  
  47. {  
  48.     if (screenPos.X + 540 > Screen.AllScreens[0].WorkingArea.Width) //越过工作区右边界   
  49.     {  
  50.         int X = listViewPos.X - (540 + 5); //定位提示信息的左边界   
  51.         if (X < listViewPos.X - screenPos.X + 5) //越过左边界   
  52.         {  
  53.             X = listViewPos.X - screenPos.X + 5; //定位左边界位于工作区左边界offset=5   
  54.         }  
  55.         if (screenPos.Y + 235 > Screen.AllScreens[0].WorkingArea.Height) //越过工作区下边界   
  56.         {  
  57.             //鼠标左上区域显示tooltip   
  58.             myToolTip.Show("Caption", listView1, X, listViewPos.Y - (235 + 5));  
  59.         }  
  60.         else  
  61.         {  
  62.             //鼠标左下区域显示tooltip   
  63.             myToolTip.Show("Caption", listView1, X, listViewPos.Y + 5);  
  64.         }  
  65.     }  
  66.     else if (screenPos.X - 540 < 0) //越过工作区左边界   
  67.     {  
  68.         if (screenPos.Y + 235 > Screen.AllScreens[0].WorkingArea.Height) //越过工作区下边界   
  69.         {  
  70.             //鼠标右上区域显示tooltip   
  71.             myToolTip.Show("Caption", listView1, listViewPos.X + 5, listViewPos.Y - (235 + 5));  
  72.         }  
  73.         else  
  74.         {  
  75.             //鼠标右下区域显示tooltip   
  76.             myToolTip.Show("Caption", listView1, listViewPos.X + 5, listViewPos.Y + 5);  
  77.         }  
  78.     }  
  79.     else   //默认都是在鼠标右下区域显示tooltip   
  80.     {  
  81.         myToolTip.Show("Caption", listView1, listViewPos.X + 5, listViewPos.Y + 5);  
  82.     }  
  83. }  
  84. #endregion   
  85.   
  86. //说明上面的540和235是提示信息中图片的宽和高  

 

注: 如果不用一个全局变量来保存当前提示信息项,也就是把if (item != tooltipOn) 这个判断逻辑拿掉,提示信息则会一直不停的闪烁。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值