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

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的显示内容

    支持TOOLTIP的COMBOX

    支持TOOLTIP的COMBOX,C#版本(该版本存在一定的问题,请下载资源中的其它相关资源)

    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)...

    DataGridView 使用方法总结

    46. DataGridView中显示下拉框ComboBox 47. DataGridView单击打开下拉框 48. DataGridView中显示按钮 49. DataGridView中显示链接 50. DataGridView中显示图像 51. DataGridView编辑中单元格控件取得 52. ...

    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...

    Silverlight基本控件介绍.doc

    三、<WatermarkedTextBox> 控件 <显示其他控件时> 3 四、ToggleButton控件 3 五、ScrollViewer控件 4 六、TextBlock控件 5 七、ToolTip控件 <用作内嵌控件时> 6 八、Rectangle控件 7 九、Slider控件(滑动控件) 7 ...

    C# winform控件使用案例18种窗体使用案例【适合入门者学习使用】

    03-Combobox 04-CheckBox 05-RadioButton单选按钮 06-Label标签 07-ListBox列表框 08-PictureBox图片框 09-DateTimePicker日期时间控件 10-ProgressBar进度条 11-NumericUpDown数字输入框 12-ToolTip气泡提示 13-...

    ComboLboxWithTT.zip

    [原创]在ComboBox下拉菜单里创建Tooltips

    jquery扩展demo

    包含扩展jquery.accordion.js、jquery.combobox.js、jquery.datagrid.js、jquery.datebox.js、jquery.dialog.js、jquery.form.js、jquery.layout.js、jquery.linkbutton.js、jquery.mask.js、jquery.messager.js、...

    Winform 界面设计 视频教程

    ComboBox 下拉列表框 Checkbox 复选框 RadioButton 单选框 GroupBox 分组控件 Label 标签 ListBox 列表框 PictureBox 图片框 DateTimePicker 日期时间控件 ProgressBar 进度条 NumericUpDown 数字输入框 ...

    unity3d的New UI Widgets1.10.2

    - Combobox - ListView - TileView - TreeView - DirectoryTreeView * - FileListView * Widgets can be generated for the your custom type with context menu "Create / New UI Widgets / Generate Widgets" ...

    开源一套DirectUI界面库

    这个DirectUI界面库主要参考一个老外的程序, 支持各种Layout模式,实现了各种基本控件(SplitBar, PictureBox, Button, Radio, CheckBox, Label, HyperLink, ProgressBar, trackBar, ListBox, Edit, ComboBox, Tab ...

    VB编程资源大全(源码 控件)

    windowsplacement.zip 更改Windows程序在Switch bar上的位置(3KB) 25,tooltips.zip 利用Windows API实现的可显示多行文字的ToolTip(5KB) 26,deskicon.zip 当你设置Windows的桌面墙纸之后,是否...

    C#里边的控件缩写大全

    4 cmb ComboBox 5 dtp DateTimePicker 6 lbl Label 7 llb LinkLabel 8 lst ListBox 9 lvw ListView 10 mtx MaskedTextBox 11 cdr MonthCalendar 12 icn NotifyIcon 13 nud NumeircUpDown 14 pic ...

    C#全能速查宝典

    2.3.7 ComboBox控件——下拉组合框控件 194 2.3.8 DomainUpDown控件——上下选择控件 195 2.3.9 DropDownStyle属性——指定组合框样式的值 197 2.3.10 GetItemCheckState方法——当前项的复选状态的值 198 2.3.11 ...

Global site tag (gtag.js) - Google Analytics