VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 156|回复: 2

[求助] 如何在Combox下拉框的鼠标移动事件中,显示各自不同的tooltiptext?

[复制链接]
发表于 2018-5-24 18:14:29 | 显示全部楼层 |阅读模式
      如题目所示:我建了Combox,单击时显示的下拉框有若干项,当鼠标在下拉框某一项时,需要显示对应的tooltiptext内容。
       请问VB如何实现这个功能呢?
我看到有其它语言可以,见链接:http://www.xuebuyuan.com/664339.html
或见如下复制代码:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Windows.Forms;
  5. using System.Runtime.InteropServices;
  6. using System.Drawing;
  7. using System.Threading;

  8. namespace comboBoxApp
  9. {
  10.     /// <summary>
  11.     /// 可带ToolTip的组合框控件
  12.     /// </summary>
  13.     public class ComboBoxEx : ComboBox
  14.     {
  15.         /// <summary>
  16.         /// 这个子类窗口用来存放下拉列表窗口,通过它来操作下拉列表
  17.         /// </summary>
  18.         private SubWindow m_SubWindow;
  19.         /// <summary>
  20.         /// 通常的构造函数
  21.         /// </summary>
  22.         public ComboBoxEx()
  23.         {
  24.         }
  25.         /// <summary>
  26.         /// 处理Windows的消息
  27.         /// </summary>
  28.         /// <param name="m"></param>
  29.         protected override void WndProc(ref Message m)
  30.         {
  31.             //通过这个消息可以得到下拉列表的窗口名柄
  32.             if (m.Msg == 0x210 && (int)m.WParam == 0x3e80001)
  33.             {
  34.                 //构建子类化窗口
  35.                 SubWindow sw = new SubWindow();
  36.                 //把当前ComboBox实例做为属性传入方便处理
  37.                 sw.Owner = this;
  38.                 //把得到的列表句柄关联到子类窗口类上。
  39.                 sw.AssignHandle(m.LParam);
  40.                 //这里的做用是保证子类窗口和ComboBoxEx生存期同步
  41.                 this.m_SubWindow = sw;
  42.             }
  43.             base.WndProc(ref m);
  44.         }
  45.         /// <summary>
  46.         /// 重写以释放子类
  47.         /// </summary>
  48.         /// <param name="disposing"></param>
  49.         protected override void Dispose(bool disposing)
  50.         {
  51.             if (disposing && this.m_SubWindow != null)
  52.             {
  53.                 this.m_SubWindow.DestroyHandle();
  54.             }
  55.             base.Dispose(disposing);
  56.         }
  57.     }
  58.     /// <summary>
  59.     /// 子类化窗口的类
  60.     /// </summary>
  61.     internal class SubWindow : NativeWindow
  62.     {
  63.         /// <summary>
  64.         /// 为了得到列表上的鼠标坐标而使用Api函数及其所用到的数据结构
  65.         /// </summary>
  66.         [StructLayout(LayoutKind.Sequential)]
  67.         public class POINT
  68.         {
  69.             public int x;
  70.             public int y;
  71.             public POINT(int x, int y)
  72.             {
  73.                 this.x = x;
  74.                 this.y = y;
  75.             }
  76.         }
  77.         /// <summary>
  78.         /// 映射窗体的坐标
  79.         /// </summary>
  80.         /// <param name="hWndFrom">源窗口句柄</param>
  81.         /// <param name="hWndTo">要影射到的窗口句柄</param>
  82.         /// <param name="pt">转换前后的坐标数据</param>
  83.         /// <param name="cPoints"></param>
  84.         /// <returns></returns>
  85.         [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
  86.         public static extern int MapWindowPoints(IntPtr hWndFrom, IntPtr hWndTo, [In, Out] POINT pt, int cPoints);
  87.         /// <summary>
  88.         /// 为了得到指定坐标下的项而需要向列表发送消息
  89.         /// </summary>
  90.         /// <param name="hWnd"></param>
  91.         /// <param name="msg"></param>
  92.         /// <param name="wParam"></param>
  93.         /// <param name="lParam"></param>
  94.         /// <returns></returns>
  95.         [DllImport("user32.dll", CharSet = CharSet.Auto)]
  96.         public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
  97.         /// <summary>
  98.         /// 为了得到指定索引的列表的内容而需要向列表发送消息,因为列表文本可能被格式化,所以这是合理的。
  99.         /// </summary>
  100.         /// <param name="hWnd"></param>
  101.         /// <param name="msg"></param>
  102.         /// <param name="wParam"></param>
  103.         /// <param name="lParam"></param>
  104.         /// <returns></returns>
  105.         [DllImport("user32.dll", CharSet = CharSet.Auto)]
  106.         public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, StringBuilder lParam);

  107.         /// <summary>
  108.         /// 上一索引值
  109.         /// </summary>
  110.         private int m_Index;
  111.         /// <summary>
  112.         /// 用来显示信息ToolTip
  113.         /// </summary>
  114.         private ToolTip toolTip;
  115.         /// <summary>
  116.         /// 所属性的ComboBox
  117.         /// </summary>
  118.         private Control m_Owner;
  119.         /// <summary>
  120.         /// 构造函数
  121.         /// </summary>
  122.         public SubWindow()
  123.         {
  124.             this.m_Index = -1;
  125.             this.toolTip = new ToolTip();
  126.         }
  127.         /// <summary>
  128.         /// 所属的控件
  129.         /// </summary>
  130.         public Control Owner
复制代码

以上代码补充说明是:
在Windows应用程序中使用ToolTip控件给ComboBox控件显示提示的信息,往往要求的不是直接给控件一个固定的ToolTip提示,可能更多的时候要给ComboBox的下拉列表的项添加提示。可是默认的Combobox控件并不提供这个功能。见到网上有了这方面的做法,但是总觉得“不太可靠”。。。

      我们知道对于ComboBox来说,其实他不像TextBox或Button一样有一个句柄,它有多于一个句柄,一个是ComboBox本身,一个是处理编辑状态的编辑框的文本的句柄,一个是下拉出来的“列表”的句柄。其实确实是这样的。一个ComboBox是一个“复合”控件,由文本框和下拉列表组成。就是这个下拉列表有着非常吸引人的地方,可在程序里通过一般的方法又很难访问到它,所以ComboBox控件变得好像是Windows控件中“最神秘”的控件之一。

     因为我们确实需要给ComboBox的下拉列表项添加ToolTip。既然我们知道了这个下拉列表是一个“ListBox”那么我们就有了访问它的方法:使用Listbox的相关方法(API)来操作就可以了。比如我们可以通过在ListBox上的坐标得到坐标下的项所在的Items的索引,由这个索引就可以得到Items中的第几个元素的内容。因为ToolTip都是通过鼠标在其上的时候显示出来的,所以我们可通过这个方法得到当前鼠标下的ListBox的元素的索引,有了这个“难得”的索引就可以动态的显示出项的ToolTip了。
发表于 2018-5-25 08:13:30 | 显示全部楼层
个人认为这样显示用处不大,先不说Combox控件点击后不会显示说明,因为控件里的每一个项目应该就是要说明点击这个的说明,再来一个显示是不是多此一举呢?

评分

参与人数 1威望 +4 人气 +1 收起 理由
bruly + 4 + 1 赞一个

查看全部评分

回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-5-25 08:48:07 | 显示全部楼层
yiziwuya 发表于 2018-5-25 08:13
个人认为这样显示用处不大,先不说Combox控件点击后不会显示说明,因为控件里的每一个项目应该就是要说明点 ...

请教前辈:那么给下拉框设置不同字体呢?能达成吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2018-6-18 06:21

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表