`
tze49tze
  • 浏览: 19170 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

ComboBox的ToolTip显示

阅读更多

ComboBox的ToolTip显示
2010年06月17日
  在Windows应用程序中使用ToolTip控件给ComboBox控件显示提示的信息,往往要求的不是直接给控件一个固定的ToolTip提示,可能更多的时候要给ComboBox的下拉列表的项添加提示。可是默认的Combobox控件并不提供这个功能。见到网上有了这方面的做法,但是总觉得"不太可靠"。。。
  我们知道对于ComboBox来说,其实他不像TextBox或Button一样有一个句柄,它有多于一个句柄,一个是ComboBox本身,一个是处理编辑状态的编辑框的文本的句柄,一个是下拉出来的"列表"的句柄。其实确实是这样的。一个ComboBox是一个"复合"控件,由文本框和下拉列表组成。就是这个下拉列表有着非常吸引人的地方,可在程序里通过一般的方法又很难访问到它,所以ComboBox控件变得好像是Windows控件中"最神秘"的控件之一。
  因为我们确实需要给ComboBox的下拉列表项添加ToolTip。既然我们知道了这个下拉列表是一个"ListBox"那么我们就有了访问它的方法:使用Listbox的相关方法(API)来操作就可以了。比如我们可以通过在ListBox上的坐标得到坐标下的项所在的Items的索引,由这个索引就可以得到Items中的第几个元素的内容。因为ToolTip都是通过鼠标在其上的时候显示出来的,所以我们可通过这个方法得到当前鼠标下的ListBox的元素的索引,有了这个"难得"的索引就可以动态的显示出项的ToolTip了。代码参考如下:
  using System;
  using System.Collections.Generic;
  using System.Text;
  using System.Windows.Forms;
  using System.Runtime.InteropServices;
  using System.Drawing;
  using System.Threading;
  namespace comboBoxApp
  ...{
  /**//// 
  /// 可带ToolTip的组合框控件
  /// 
  public class ComboBoxEx : ComboBox
  ...{
  /**//// 
  /// 这个子类窗口用来存放下拉列表窗口,通过它来操作下拉列表
  /// 
  private SubWindow m_SubWindow;
  /**//// 
  /// 通常的构造函数
  /// 
  public ComboBoxEx()
  ...{
  }
  /**//// 
  /// 处理Windows的消息
  /// 
  /// 
  protected override void WndProc(ref Message m)
  ...{
  //通过这个消息可以得到下拉列表的窗口名柄
  if (m.Msg == 0x210 && (int)m.WParam == 0x3e80001)
  ...{
  //构建子类化窗口
  SubWindow sw = new SubWindow();
  //把当前ComboBox实例做为属性传入方便处理
  sw.Owner = this;
  //把得到的列表句柄关联到子类窗口类上。
  sw.AssignHandle(m.LParam);
  //这里的做用是保证子类窗口和ComboBoxEx生存期同步
  this.m_SubWindow = sw;
  }
  base.WndProc(ref m);
  }
  /**//// 
  /// 重写以释放子类
  /// 
  /// 
  protected override void Dispose(bool disposing)
  ...{
  if (disposing && this.m_SubWindow != null)
  ...{
  this.m_SubWindow.DestroyHandle();
  }
  base.Dispose(disposing);
  }
  }
  /**//// 
  /// 子类化窗口的类
  /// 
  internal class SubWindow : NativeWindow
  ...{
  /**//// 
  /// 为了得到列表上的鼠标坐标而使用Api函数及其所用到的数据结构
  /// 
  [StructLayout(LayoutKind.Sequential)]
  public class POINT
  ...{
  public int x;
  public int y;
  public POINT(int x, int y)
  ...{
  this.x = x;
  this.y = y;
  }
  }
  /**//// 
  /// 映射窗体的坐标
  /// 
  /// 源窗口句柄
  /// 要影射到的窗口句柄
  /// 转换前后的坐标数据
  /// 
  /// 
  [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
  public static extern int MapWindowPoints(IntPtr hWndFrom, IntPtr hWndTo, [In, Out] POINT pt, int cPoints);
  /**//// 
  /// 为了得到指定坐标下的项而需要向列表发送消息
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  [DllImport("user32.dll", CharSet = CharSet.Auto)]
  public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
  /**//// 
  /// 为了得到指定索引的列表的内容而需要向列表发送消息,因为列表文本可能被格式化,所以这是合理的。
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  [DllImport("user32.dll", CharSet = CharSet.Auto)]
  public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, StringBuilder lParam);
  /**//// 
  /// 上一索引值
  /// 
  private int m_Index;
  /**//// 
  /// 用来显示信息ToolTip
  /// 
  private ToolTip toolTip;
  /**//// 
  /// 所属性的ComboBox
  /// 
  private Control m_Owner;
  /**//// 
  /// 构造函数
  /// 
  public SubWindow()
  ...{
  this.m_Index = -1;
  this.toolTip = new ToolTip();
  }
  /**//// 
  /// 所属的控件
  /// 
  public Control Owner
  ...{
  get ...{ return m_Owner; }
  set ...{ m_Owner = value; }
  }
  /**//// 
  /// 处理鼠标的消息以显示ToolTip信息
  /// 
  /// 
  protected override void WndProc(ref Message m)
  ...{
  if (m.Msg == 0x200)
  ...{
  //获取鼠标坐标
  Point msPoint = Cursor.Position;
  POINT pt = new POINT(msPoint.X, msPoint.Y);
  //影射到列表上的坐标
  MapWindowPoints(IntPtr.Zero, this.Handle, pt, 1);
  //获取鼠标下的项的索引
  int index = SendMessage(m.HWnd, 0x1a9, 0, (pt.y > 0x10) & 0xffff) == 0)
  ...{
  index = (index & 0xffff);
  if (m_Index != index)
  ...{
  //获取项的字符串的长度
  int num = SendMessage(this.Handle, 0x18a, index, 0);
  StringBuilder lParam = new StringBuilder(num + 1);
  //获取项的字符串内容
  SendMessage(this.Handle, 0x189, index, lParam);
  //获取鼠标在所属的控件的坐标信息
  Point owPoint = this.Owner.PointToClient(msPoint);
  //设置ToolTip信息并显示
  this.toolTip.RemoveAll();
  this.toolTip.Show(lParam.ToString(), this.Owner, owPoint.X + 10, owPoint.Y + 10, 1000);
  m_Index = index;
  }
  }
  }
  base.WndProc(ref m);
  }
  }
  }
分享到:
评论

相关推荐

    支持TOOLTIP的COMboBOX(续,支持数据源绑定)

    本文将深入探讨如何实现一个支持TOOLTIP的COMBOBOX,并且这个COMBOBOX能够绑定到数据源,使得数据源中的特定字段作为TOOLTIP的显示内容。这个功能在很多场景下都非常实用,比如在数据量大、每个选项信息丰富的下拉...

    支持TOOLTIP的COMBOX

    通常,COMBOBOX仅显示简短的文本字符串作为选项,但通过自定义或扩展COMBOBOX控件,我们可以让每个选项在鼠标悬停时显示额外的信息,这就是TOOLTIP的作用。TOOLTIP控件允许我们在用户将鼠标悬停在特定元素上时显示一...

    带tooltip显示的combox类

    "带tooltip显示的combox类"是一种特殊设计的ComboBox控件,它增强了标准ComboBox的功能,为下拉选项提供了额外的信息提示。ComboBox是Windows API或MFC(Microsoft Foundation Classes)库中的一个常见控件,用于...

    加入tooltip的combox

    在本案例中,我们讨论的是如何为ComboBox的每个item添加tooltip功能,以便在用户鼠标悬停在特定项上时显示更多的描述性信息。 要实现这样的功能,首先我们需要了解Windows API或者使用像Qt、JavaFX、WPF、WinForms...

    C#窗体Winform,鼠标悬停在控件上,提示框,显示信息。

    如果需要在Tooltip显示或隐藏时执行某些操作,可以订阅`ToolTip.Popup`和`ToolTip.Dismissed`事件。 ```csharp toolTip1.Popup += (sender, args) => { /* Tooltip 显示时的操作 */ }; toolTip1.Dismissed += ...

    ComboBox控件带工具提示项.zip_COMBOBOX_ComBoBox VC_VC 界面_VC 界面编程_VC界面编程

    工具提示(Tooltip)是一种常见于GUI应用中的功能,用于在鼠标悬停在某个控件上时显示额外的信息。在`ComboBox`中,可能需要工具提示来显示下拉列表中无法完全显示的长文本或提供更多关于选项的详细信息。 在提供的...

    Flex 自定义ToolTip

    在Flex开发中,`ToolTip`是一种非常实用的界面元素,用于在用户悬停或聚焦某个控件时显示额外的信息。默认情况下,Flex提供了基本的`ToolTip`功能,但有时为了满足特定的设计需求或者提供更丰富的用户体验,开发者...

    实现ComboBox的自动完成功能(2.0)

    4. **显示匹配的项**:为了实现类似IE地址栏的效果,我们可以使用ToolTip控件来显示匹配的建议。每当用户输入时,更新ToolTip的文本,显示最匹配的选项。或者,你可以创建一个新的UserControl,模拟下拉列表的样式,...

    ComboLboxWithTT.zip

    同时,需要监听ComboBox的MouseMove事件,根据鼠标位置显示对应的Tooltip。 4. **文件资源管理**:在项目中,我们可能需要存储额外的数据来关联每个ComboBox项与对应的Tooltip文本。这可以通过数据绑定实现,也可以...

    Qt之QComboBox委托

    在Qt框架中,QComboBox是一个常用的控件,用于在下拉列表中显示可选择的项目。这个控件在用户界面设计中非常常见,比如在创建一个应用时,如果需要让用户从多个预设选项中选择一个,QComboBox就是一个理想的选择。在...

    GridView用法总结

    46. DataGridView中显示下拉框ComboBox 109 47. DataGridView单击打开下拉框 113 48. DataGridView中显示按钮 115 49. DataGridView中显示链接 117 50. DataGridView中显示图像 120 51. DataGridView编辑中单元格...

    vb.net DataGridView控件用法合集

    46. DataGridView中显示下拉框ComboBox 47. DataGridView单击打开下拉框 48. DataGridView中显示按钮 49. DataGridView中显示链接 50. DataGridView中显示图像 DataGridView控件用法合集(十) 51. DataGridView...

    Visual C++ 编程资源大全(源码 控件)

    autocombo.zip 自动选择的ComboBox(18KB)<END><br>82,ccpicker2.zip 选择颜色的ComboBox(2)(29KB)<END><br>83,combtext.zip 增强了的CCombobox<4KB><END> 84,flatcomb.zip 浮动的ComboBox COOL(4KB)...

    C# DataGridView控件用法合集.pdf

    单元格上的ToolTip显示** ToolTip可以帮助用户理解单元格内的复杂信息。通过`CreateToolTip`方法和`ToolTip.SetToolTip`方法,可以为DataGridView单元格添加ToolTip。 #### 四、高级功能与事件处理 **11. ...

    SunnyUI Winfrom样式实例

    - **提示信息(ToolTip)**: 自定义的提示信息样式,可以设置显示时长、位置等,增强用户体验。 - **进度条(ProgressBar)**: 有多种风格的进度条,包括横向、纵向,以及动画效果,展示任务执行状态。 5. **...

    c# winform TextBox智能提示

    4. 将找到的建议项显示在一个下拉列表或类似的控件中,如ListBox或ComboBox。 5. 用户选择建议项后,可以自动填充到TextBox或执行相应的操作。 以下是实现该功能的具体步骤: 1. **创建WinForm项目**:启动Visual ...

    C#控件缩写大全

    19. **tip ToolTip**: ToolTip 控件显示有关其他控件的附加信息。 20. **tvw TreeView**: TreeView 控件显示层次结构数据,如文件系统或数据库结构。 21. **wbs WebBrowser**: WebBrowser 控件允许在应用程序内浏览...

    jQuery.easyui.1.2.6+Demo+前端框架

    10. **工具提示(Tooltip)**:为元素添加浮动提示信息,展示额外的详细内容。 11. **滑块(Slider)**:用于选择数值范围,常见于设置界面。 12. **时间选择器(DatePicker)**:方便用户选择日期,可与日期相关...

Global site tag (gtag.js) - Google Analytics