ComboBox的ToolTip显示

原创 2007年09月14日 17:23:00

语言环境:VS2005, C#

        在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
...{
    
/**//// <summary>
    
/// 可带ToolTip的组合框控件
    
/// </summary>

    public class ComboBoxEx : ComboBox
    
...{
        
/**//// <summary>
        
/// 这个子类窗口用来存放下拉列表窗口,通过它来操作下拉列表
        
/// </summary>

        private SubWindow m_SubWindow;
        
/**//// <summary>
        
/// 通常的构造函数
        
/// </summary>

        public ComboBoxEx()
        
...{
        }

        
/**//// <summary>
        
/// 处理Windows的消息
        
/// </summary>
        
/// <param name="m"></param>

        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);
        }

        
/**//// <summary>
        
/// 重写以释放子类
        
/// </summary>
        
/// <param name="disposing"></param>

        protected override void Dispose(bool disposing)
        
...{
            
if (disposing && this.m_SubWindow != null)
            
...{
                
this.m_SubWindow.DestroyHandle();
            }

            
base.Dispose(disposing);
        }

    }

    
/**//// <summary>
    
/// 子类化窗口的类
    
/// </summary>

    internal class SubWindow : NativeWindow
    
...{
        
/**//// <summary>
        
/// 为了得到列表上的鼠标坐标而使用Api函数及其所用到的数据结构
        
/// </summary>

        [StructLayout(LayoutKind.Sequential)]
        
public class POINT
        
...{
            
public int x;
            
public int y;
            
public POINT(int x, int y)
            
...{
                
this.x = x;
                
this.y = y;
            }

        }

        
/**//// <summary>
        
/// 映射窗体的坐标
        
/// </summary>
        
/// <param name="hWndFrom">源窗口句柄</param>
        
/// <param name="hWndTo">要影射到的窗口句柄</param>
        
/// <param name="pt">转换前后的坐标数据</param>
        
/// <param name="cPoints"></param>
        
/// <returns></returns>

        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        
public static extern int MapWindowPoints(IntPtr hWndFrom, IntPtr hWndTo, [In, Out] POINT pt, int cPoints);
        
/**//// <summary>
        
/// 为了得到指定坐标下的项而需要向列表发送消息
        
/// </summary>
        
/// <param name="hWnd"></param>
        
/// <param name="msg"></param>
        
/// <param name="wParam"></param>
        
/// <param name="lParam"></param>
        
/// <returns></returns>

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        
public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
        
/**//// <summary>
        
/// 为了得到指定索引的列表的内容而需要向列表发送消息,因为列表文本可能被格式化,所以这是合理的。
        
/// </summary>
        
/// <param name="hWnd"></param>
        
/// <param name="msg"></param>
        
/// <param name="wParam"></param>
        
/// <param name="lParam"></param>
        
/// <returns></returns>

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, StringBuilder lParam);

        
/**//// <summary>
        
/// 上一索引值
        
/// </summary>

        private int m_Index;
        
/**//// <summary>
        
/// 用来显示信息ToolTip
        
/// </summary>

        private ToolTip toolTip;
        
/**//// <summary>
        
/// 所属性的ComboBox
        
/// </summary>

        private Control m_Owner;
        
/**//// <summary>
        
/// 构造函数
        
/// </summary>

        public SubWindow()
        
...{
            
this.m_Index = -1;
            
this.toolTip = new ToolTip();
        }

        
/**//// <summary>
        
/// 所属的控件
        
/// </summary>

        public Control Owner
        
...{
            
get ...return m_Owner; }
            
set ...{ m_Owner = value; }
        }

        
/**//// <summary>
        
/// 处理鼠标的消息以显示ToolTip信息
        
/// </summary>
        
/// <param name="m"></param>

        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, 0x1a90, (pt.y << 0x10| (pt.x & 0xffff));
                
if (((index >> 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 + 101000);
                        m_Index 
= index;
                    }

                }

            }

            
base.WndProc(ref m);
        }

    }

}

加入tooltip的combox

  • 2014年03月13日 17:02
  • 9KB
  • 下载

ComboBox的ToolTip显示

ComboBox的ToolTip显示
  • lxl743p
  • lxl743p
  • 2010年06月17日 16:55
  • 2634

C#(WinForm)设置comboBox选定项为tooltip内容

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)        {            toolTip1...
  • BlueEnchanter
  • BlueEnchanter
  • 2007年05月10日 09:41
  • 1964

C# datagridview toolTip悬浮框显示详细内容

如图所示,这是公司要我实现的需求。 我的本次采购数量是多个合同的和,所以我想在看这一条的时候显示他们分别是哪个合同的,分别采购了多少。 第一拖一个tooptip控件实现Draw事件 给我们的控件设置下...
  • u012725119
  • u012725119
  • 2013年12月21日 23:45
  • 3933

C#中,当鼠标移动到控件上,动态显示提示内容 -> 用代码操作ToolTip

【背景】 写了个C#的小程序,其中在Settings窗体中有些配置参数,希望在鼠标移动到对应的配置选项上,动态显示相关的说明解释内容。 【解决过程】 1.原先就已经知道,有些控件,是带ToolT...
  • u010078133
  • u010078133
  • 2015年02月02日 10:59
  • 1141

利用easyUI的combobox打造自动提示组件

利用easyUI的combobox打造自动提示组件
  • u012345283
  • u012345283
  • 2014年10月02日 21:33
  • 7700

C# ComboBox下拉表单显示提示内容ToolTip

转自:http://blog.5d.cn/user2/skyline-moon/200901/511240.html   近日由于自已一个小程序的需要,要求在ComboBox下拉项目(每个ite...
  • yanjiee
  • yanjiee
  • 2012年12月07日 09:34
  • 6655

Echarts中tooltip超出外层div显示不全问题

1、问题:提示框是根据鼠标位置实时变化的,但是当echarts图标高度较小,数据较多时,就会产生提示框显示不全的问题,如下图: 2、分析: 要想提示框不超出当前外层div,不考虑x轴显示位置的情况下...
  • wlangmood
  • wlangmood
  • 2017年07月12日 11:21
  • 2397

Qt5制作鼠标悬停显示Hint的ToolTip

在日常生活中的使用的软件中,我们经常会遇到这样的情况。 我们在网页上,有些网页链接的文字(比如文章标题,知乎问题标题,百度的词条等)因为太长了,而显示不出来,但是鼠标悬停在上面的时候就可以显示出来。...
  • u013007900
  • u013007900
  • 2015年12月08日 21:45
  • 4988

slider控件移动滑块,动态的显示tooltip方法!

网页对这个的介绍也不少,但是都是转载。。都不能成功实现要求!! 本人亲自实验。。特发代码。。   第一种方法。 .h  文件 CSliderCtrl m_Slider; CToolTipCtrl m_...
  • ccx_john
  • ccx_john
  • 2013年11月02日 08:28
  • 836
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ComboBox的ToolTip显示
举报原因:
原因补充:

(最多只允许输入30个字)