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);
}
}
}
发表评论
-
控件美化
2012-01-20 00:58 1241控件美化 2010年11月16日 2010-03-25 ... -
DataGridView概述
2012-01-20 00:58 1085DataGridView概述 2011年05月18日 通 ... -
comboBox下拉后鼠标移动到子项时出现对应的提示
2012-01-20 00:58 1756comboBox下拉后鼠标移动到子项时出现对应的提示 201 ... -
集成了自动完成、tooltip提示和自动加宽listbox的ComboBox
2012-01-20 00:57 834集成了自动完成、tooltip提示和自动加宽listbox的C ... -
如何加强幼儿园安全管理
2012-01-19 08:46 886如何加强幼儿园安全管 ... -
3年后广东入园贵入园难基本解决 因地制宜制订各地幼儿园收费标准
2012-01-19 08:46 5143年后广东入园贵入园难基本解决 因地制宜制订各地幼儿园收费标准 ... -
园长联谊会发言稿
2012-01-19 08:46 607园长联谊会发言稿 2011年12月19日 园长联谊会发言 ... -
幼儿园园长以及教师的职责
2012-01-19 08:46 831幼儿园园长以及教师的职责 2010年07月25日 幼儿园 ... -
马湖乡中心幼稚园教师奖惩制度
2012-01-19 08:46 585马湖乡中心幼稚园教师奖惩制度 2011年06月17日 ... -
sdsadsadas
2012-01-17 01:15 538sdsadsadas 2010年11月22日 XV67 ... -
5230
2012-01-17 01:15 5315230 2010年10月03日 1、屏幕保护:一定要买 ... -
电脑天书(九)
2012-01-17 01:15 546电脑天书(九) 2011年04月 ... -
VISTA系统常识技巧集锦
2012-01-17 01:15 542VISTA系统常识技巧集锦 ... -
MAX三百问(珍藏版)上
2012-01-17 01:14 599MAX三百问(珍藏版)上 2011年06月13日 安装篇 ... -
yum install lamp
2012-01-15 19:55 655yum install lamp 2011年12月11日 ... -
Ubuntu下各网络服务器配置小结
2012-01-15 19:55 625Ubuntu下各网络服务器配置小结 2011年12月10日 ... -
LAMNP 编译安装参数(一)---Apache 安装编译参数
2012-01-15 19:55 558LAMNP 编译安装参数(一)---Apache 安装编译参数 ... -
惠普 康柏 510 笔记本电脑
2012-01-15 19:55 694惠普 康柏 510 笔记本电脑 2011年12月17日 ... -
俺的电脑配置
2012-01-15 19:55 546俺的电脑配置 2011年12月21日 电脑型号 微星 ... -
java 题集(二)-i'm thinking...-iteye技术网站
2012-01-11 12:09 580java 题集(二)-i'm thinking.. ...
相关推荐
直接扩展绑定数据源时的字段,以数据源中的某个字段作为TOOLTIP的显示内容
支持TOOLTIP的COMBOX,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)...
46. DataGridView中显示下拉框ComboBox 47. DataGridView单击打开下拉框 48. DataGridView中显示按钮 49. DataGridView中显示链接 50. DataGridView中显示图像 51. DataGridView编辑中单元格控件取得 52. ...
46. DataGridView中显示下拉框ComboBox 109 47. DataGridView单击打开下拉框 113 48. DataGridView中显示按钮 115 49. DataGridView中显示链接 117 50. DataGridView中显示图像 120 51. DataGridView编辑中单元格...
46. DataGridView中显示下拉框ComboBox 47. DataGridView单击打开下拉框 48. DataGridView中显示按钮 49. DataGridView中显示链接 50. DataGridView中显示图像 DataGridView控件用法合集(十) 51. DataGridView...
三、<WatermarkedTextBox> 控件 <显示其他控件时> 3 四、ToggleButton控件 3 五、ScrollViewer控件 4 六、TextBlock控件 5 七、ToolTip控件 <用作内嵌控件时> 6 八、Rectangle控件 7 九、Slider控件(滑动控件) 7 ...
03-Combobox 04-CheckBox 05-RadioButton单选按钮 06-Label标签 07-ListBox列表框 08-PictureBox图片框 09-DateTimePicker日期时间控件 10-ProgressBar进度条 11-NumericUpDown数字输入框 12-ToolTip气泡提示 13-...
[原创]在ComboBox下拉菜单里创建Tooltips
包含扩展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、...
ComboBox 下拉列表框 Checkbox 复选框 RadioButton 单选框 GroupBox 分组控件 Label 标签 ListBox 列表框 PictureBox 图片框 DateTimePicker 日期时间控件 ProgressBar 进度条 NumericUpDown 数字输入框 ...
- 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界面库主要参考一个老外的程序, 支持各种Layout模式,实现了各种基本控件(SplitBar, PictureBox, Button, Radio, CheckBox, Label, HyperLink, ProgressBar, trackBar, ListBox, Edit, ComboBox, Tab ...
windowsplacement.zip 更改Windows程序在Switch bar上的位置(3KB) 25,tooltips.zip 利用Windows API实现的可显示多行文字的ToolTip(5KB) 26,deskicon.zip 当你设置Windows的桌面墙纸之后,是否...
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 ...
2.3.7 ComboBox控件——下拉组合框控件 194 2.3.8 DomainUpDown控件——上下选择控件 195 2.3.9 DropDownStyle属性——指定组合框样式的值 197 2.3.10 GetItemCheckState方法——当前项的复选状态的值 198 2.3.11 ...