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 1277控件美化 2010年11月16日 2010-03-25 ... -
DataGridView概述
2012-01-20 00:58 1148DataGridView概述 2011年05月18日 通 ... -
comboBox下拉后鼠标移动到子项时出现对应的提示
2012-01-20 00:58 1805comboBox下拉后鼠标移动到子项时出现对应的提示 201 ... -
集成了自动完成、tooltip提示和自动加宽listbox的ComboBox
2012-01-20 00:57 858集成了自动完成、tooltip提示和自动加宽listbox的C ... -
如何加强幼儿园安全管理
2012-01-19 08:46 919如何加强幼儿园安全管 ... -
3年后广东入园贵入园难基本解决 因地制宜制订各地幼儿园收费标准
2012-01-19 08:46 5303年后广东入园贵入园难基本解决 因地制宜制订各地幼儿园收费标准 ... -
园长联谊会发言稿
2012-01-19 08:46 629园长联谊会发言稿 2011年12月19日 园长联谊会发言 ... -
幼儿园园长以及教师的职责
2012-01-19 08:46 859幼儿园园长以及教师的职责 2010年07月25日 幼儿园 ... -
马湖乡中心幼稚园教师奖惩制度
2012-01-19 08:46 609马湖乡中心幼稚园教师奖惩制度 2011年06月17日 ... -
sdsadsadas
2012-01-17 01:15 569sdsadsadas 2010年11月22日 XV67 ... -
5230
2012-01-17 01:15 5465230 2010年10月03日 1、屏幕保护:一定要买 ... -
电脑天书(九)
2012-01-17 01:15 571电脑天书(九) 2011年04月 ... -
VISTA系统常识技巧集锦
2012-01-17 01:15 574VISTA系统常识技巧集锦 ... -
MAX三百问(珍藏版)上
2012-01-17 01:14 628MAX三百问(珍藏版)上 2011年06月13日 安装篇 ... -
yum install lamp
2012-01-15 19:55 694yum install lamp 2011年12月11日 ... -
Ubuntu下各网络服务器配置小结
2012-01-15 19:55 652Ubuntu下各网络服务器配置小结 2011年12月10日 ... -
LAMNP 编译安装参数(一)---Apache 安装编译参数
2012-01-15 19:55 580LAMNP 编译安装参数(一)---Apache 安装编译参数 ... -
惠普 康柏 510 笔记本电脑
2012-01-15 19:55 718惠普 康柏 510 笔记本电脑 2011年12月17日 ... -
俺的电脑配置
2012-01-15 19:55 570俺的电脑配置 2011年12月21日 电脑型号 微星 ... -
java 题集(二)-i'm thinking...-iteye技术网站
2012-01-11 12:09 596java 题集(二)-i'm thinking.. ...
相关推荐
本文将深入探讨如何实现一个支持TOOLTIP的COMBOBOX,并且这个COMBOBOX能够绑定到数据源,使得数据源中的特定字段作为TOOLTIP的显示内容。这个功能在很多场景下都非常实用,比如在数据量大、每个选项信息丰富的下拉...
通常,COMBOBOX仅显示简短的文本字符串作为选项,但通过自定义或扩展COMBOBOX控件,我们可以让每个选项在鼠标悬停时显示额外的信息,这就是TOOLTIP的作用。TOOLTIP控件允许我们在用户将鼠标悬停在特定元素上时显示一...
"带tooltip显示的combox类"是一种特殊设计的ComboBox控件,它增强了标准ComboBox的功能,为下拉选项提供了额外的信息提示。ComboBox是Windows API或MFC(Microsoft Foundation Classes)库中的一个常见控件,用于...
在本案例中,我们讨论的是如何为ComboBox的每个item添加tooltip功能,以便在用户鼠标悬停在特定项上时显示更多的描述性信息。 要实现这样的功能,首先我们需要了解Windows API或者使用像Qt、JavaFX、WPF、WinForms...
如果需要在Tooltip显示或隐藏时执行某些操作,可以订阅`ToolTip.Popup`和`ToolTip.Dismissed`事件。 ```csharp toolTip1.Popup += (sender, args) => { /* Tooltip 显示时的操作 */ }; toolTip1.Dismissed += ...
工具提示(Tooltip)是一种常见于GUI应用中的功能,用于在鼠标悬停在某个控件上时显示额外的信息。在`ComboBox`中,可能需要工具提示来显示下拉列表中无法完全显示的长文本或提供更多关于选项的详细信息。 在提供的...
在Flex开发中,`ToolTip`是一种非常实用的界面元素,用于在用户悬停或聚焦某个控件时显示额外的信息。默认情况下,Flex提供了基本的`ToolTip`功能,但有时为了满足特定的设计需求或者提供更丰富的用户体验,开发者...
4. **显示匹配的项**:为了实现类似IE地址栏的效果,我们可以使用ToolTip控件来显示匹配的建议。每当用户输入时,更新ToolTip的文本,显示最匹配的选项。或者,你可以创建一个新的UserControl,模拟下拉列表的样式,...
同时,需要监听ComboBox的MouseMove事件,根据鼠标位置显示对应的Tooltip。 4. **文件资源管理**:在项目中,我们可能需要存储额外的数据来关联每个ComboBox项与对应的Tooltip文本。这可以通过数据绑定实现,也可以...
在Qt框架中,QComboBox是一个常用的控件,用于在下拉列表中显示可选择的项目。这个控件在用户界面设计中非常常见,比如在创建一个应用时,如果需要让用户从多个预设选项中选择一个,QComboBox就是一个理想的选择。在...
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...
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)...
单元格上的ToolTip显示** ToolTip可以帮助用户理解单元格内的复杂信息。通过`CreateToolTip`方法和`ToolTip.SetToolTip`方法,可以为DataGridView单元格添加ToolTip。 #### 四、高级功能与事件处理 **11. ...
- **提示信息(ToolTip)**: 自定义的提示信息样式,可以设置显示时长、位置等,增强用户体验。 - **进度条(ProgressBar)**: 有多种风格的进度条,包括横向、纵向,以及动画效果,展示任务执行状态。 5. **...
4. 将找到的建议项显示在一个下拉列表或类似的控件中,如ListBox或ComboBox。 5. 用户选择建议项后,可以自动填充到TextBox或执行相应的操作。 以下是实现该功能的具体步骤: 1. **创建WinForm项目**:启动Visual ...
19. **tip ToolTip**: ToolTip 控件显示有关其他控件的附加信息。 20. **tvw TreeView**: TreeView 控件显示层次结构数据,如文件系统或数据库结构。 21. **wbs WebBrowser**: WebBrowser 控件允许在应用程序内浏览...
10. **工具提示(Tooltip)**:为元素添加浮动提示信息,展示额外的详细内容。 11. **滑块(Slider)**:用于选择数值范围,常见于设置界面。 12. **时间选择器(DatePicker)**:方便用户选择日期,可与日期相关...