ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 20258|回复: 32

[求助] 窗体上的按钮,悬停提示,如何实现的

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2012-3-13 16:48 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
   如图,当鼠标移动到窗体按钮上时,就会出现一个类似于,帮助或者是标注的一个提示:有框框和文字。
1:首先按钮里面的CONTROLTIPTEXT,是做不出如图所示的效果的。
2:我想过这肯定是利用了CommandButton1_MouseMove,但是如何显示那个框框(像excel中插入的自选图形),再加上提示文本(可以换行的)。我想过用没有边框的窗体,或者image控件,但是都无法做到那个带箭头的提示框
3:如果是表里的按钮,也许可以实现这个功能,因为表里可以用代码加入图形,但是窗体里,我不知道怎么加。
我甚至想过是不是用钩子函数或者API做的,因为我是初学者,那就不懂了。
      请各位老师提示,或者给个思路,这里谢谢了!
未命名.JPG

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-4-19 18:57 | 显示全部楼层
设置控件的ControlTipText属性即可。

TA的精华主题

TA的得分主题

发表于 2012-4-19 18:42 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
这么好的问题怎么没人回答,我也想知道

TA的精华主题

TA的得分主题

发表于 2012-4-19 20:37 | 显示全部楼层
人家都说了,ControlTipText是做不出如图效果的

TA的精华主题

TA的得分主题

发表于 2012-4-19 21:19 | 显示全部楼层
tuoying 发表于 2012-4-19 20:37
人家都说了,ControlTipText是做不出如图效果的

确实没有看清楚。不好意思了

TA的精华主题

TA的得分主题

发表于 2012-4-19 21:36 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
那个就是ToopTip,不过不是用的原有控件自带的,而是用API实现的,加黑的是标题,还可以带标。

TA的精华主题

TA的得分主题

发表于 2012-4-19 22:02 | 显示全部楼层
2003版的可以使用Assistant 对象
代表“Microsoft Office 助手”。
说明


使用 Assistant 属性返回 Assistant 对象。不存在 Assistant 对象的集合;任意时刻只能有一个 Assistant 对象是活动的。使用 Visible 属性显示该“助手”,并使用 On 属性启用该“助手”。缺省“助手”为“聪聪”(英文名为 Rocky)。若要通过编程选择其他“助手”,请使用 FileName 属性。


示例
下面的示例将显示“助手”及其动画效果。

Visual Basic for Applications
With Assistant
    .Visible = True
    .Animation = msoAnimationGreeting
End With

  注释
Microsoft Office system 2007 版中已减少对“Microsoft Office 助手”和“应答向导”的使用。

TA的精华主题

TA的得分主题

发表于 2012-4-20 00:29 | 显示全部楼层

修改了一个网上找的VB代码,使之适用于VBA,做了一个附件。可以实现大部分控件的提示。
  1. '---------------说明    修改者:Excelhome-Moneky ------------------
  2. '------------------------20120419---------------------------------

  3. '类模块是网上前辈的VB代码,本人是在原来的代码基础上做了一点点修改,使之能够用于VBA,下面是修改说明

  4. '1、原来的模块中没有Destroy方法——已添加
  5. '2、VBA窗体控件的hwnd无法取得,即使用Getfcous得到的也只是窗口客户区的hwnd(或许),本例子中,一律使用客户区的hwnd,并把该句柄存入控件的tag属性中,
  6. '   然后在本类中用clng函数转换成long
  7. '3、在vb下可以方便取得控件的rect,在本例中是用客户区的rect与控件的top,left,width,height综合运算得出实际控件的rect(另外ListBox可以正常取得客户区rect,所以在类中特别处理了)
  8. '   (其中坐标转换代码是直接引用的http://club.excelhome.net/forum.php?mod=viewthread&tid=203573,Excelhome——winland大侠的代码)
  9. '4、Image与Label控件目前没有办法实现,但可能性还是有的。
  10. '5、在创建提示的过程中,会转换焦点,因此请把Tab编号小的控件(默认控件)放在最后创建


  11. '6、VBA调用范例,见窗体代码(下面为原样复制的窗体代码)
  12. '------------VBA窗体代码,窗体上有两个commandbutton控件,name分别为:cmdOK,cmdNOOK------------
  13. 'Private Declare Function GetFocus Lib "user32" () As Long
  14. 'Dim myTip(1) As New cToolTip
  15. 'Sub mySetTip(vObj As Object, vTip As cToolTip, strTitle As String, strTipText As String)       '这是一个自定义创建提示的过程参数分别为(控件,提示变量,标题,提示文本)
  16. '    vObj.SetFocus                      '控件获取焦点——一些控件无法获取焦点,所以目前无法实现他们的冒泡提示
  17. '    vObj.Tag = GetFocus                '将窗口客户区hwnd存入控件Tag
  18. '    Set vTip.ParentControl = vObj      '控件绑定
  19. '    vTip.ToolTipTitle = strTitle       '标题
  20. '    vTip.ToolTipText = strTipText      '提示文字
  21. '    vTip.Create                        '创建
  22. 'End Sub
  23. 'Private Sub UserForm_Initialize()
  24. '    mySetTip Me.cmdOK, myTip(0), "气泡标题_cmdOK", "这是一个演示用的提示文字" & vbNewLine & "它还可以换行显示,这是第二行提示文字!"
  25. '    mySetTip Me.cmdNoOk, myTip(1), "气泡标题_cmdNoOk", "这是一个演示用的提示文字" & vbNewLine & "它还可以换行显示,这是第二行提示文字!"
  26. 'End Sub
  27. 'Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  28. '    myTip(0).Destroy
  29. '    myTip(1).Destroy
  30. 'End Sub
  31. '--------------VBA窗体代码结束------
  32. '--------------修改说明结束---------






  33. 'clsTooptip
  34. '使用范例:
  35. 'Dim tooltip As New Class1
  36. 'Set tooltip.ParentControl = Text1 '气泡应用于哪个控件(要有Hwnd)
  37. 'tooltip.ToolTipTitle = "气泡标题" '气泡标题(不允许换行/字体粗体)
  38. 'tooltip.ToolTipText = "气泡内容" & vbCrLf & "123" '气泡内容(允许换行)
  39. 'tooltip.Create '创建气泡

  40. Option Explicit

  41. Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long
  42. Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long '创建窗口
  43. Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long '发出消息
  44. Private Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
  45. Private Const WM_USER = &H400
  46. Private Const CW_USEDEFAULT = &H80000000

  47. Private Type RECT
  48.     Left As Long
  49.     Top As Long
  50.     Right As Long
  51.     Bottom As Long
  52. End Type

  53. Private Const TTS_NOPREFIX = &H2
  54. Private Const TTF_TRANSPARENT = &H100
  55. Private Const TTF_CENTERTIP = &H2
  56. Private Const TTM_ADDTOOLA = (WM_USER + 4)
  57. Private Const TTM_ACTIVATE = WM_USER + 1
  58. Private Const TTM_UPDATETIPTEXTA = (WM_USER + 12)
  59. Private Const TTM_SETMAXTIPWIDTH = (WM_USER + 24)
  60. Private Const TTM_SETTITLE = (WM_USER + 32)
  61. Private Const TTS_BALLOON = &H40
  62. Private Const TTF_SUBCLASS = &H10
  63. Private Const TOOLTIPS_CLASSA = "tooltips_class32"

  64. Private Type TOOLINFO
  65.     lSize As Long
  66.     lFlags As Long
  67.     lHwnd As Long
  68.     lId As Long
  69.     lpRect As RECT
  70.     hInstance As Long
  71.     lpStr As String
  72.     lParam As Long
  73. End Type

  74. Private TTTitle As String
  75. Private TTParentControl As Object
  76. Private TTStyle As TTStyleEnum

  77. Public Enum TTStyleEnum
  78.     TTStandard
  79.     TTBalloon
  80. End Enum

  81. Private hToolTipHwnd As Long
  82. Private TI As TOOLINFO

  83. Public Function Create() As Boolean '创建气泡函数
  84.     Dim lpRect As RECT
  85. '    DestroyWindow hToolTipHwnd
  86.     '建立tooltip窗口
  87.     hToolTipHwnd = CreateWindowEx(0, TOOLTIPS_CLASSA, vbNullString, TTS_BALLOON, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CLng(TTParentControl.Tag), 0, Application.hInstance, 0)
  88. '    Debug.Print TTParentControl.Name, TTParentControl.Tag, hToolTipHwnd
  89.     '设置tooltip
  90.     With TI
  91.         .lFlags = TTF_SUBCLASS
  92.         .lHwnd = CLng(TTParentControl.Tag)
  93.         .lId = 0
  94.         .hInstance = Application.hInstance
  95.         .lpRect.Top = Point2PixelY(TTParentControl.Top)
  96.         .lpRect.Left = Point2PixelX(TTParentControl.Left)
  97.         .lpRect.Bottom = Point2PixelY(TTParentControl.Height) + .lpRect.Top
  98.         .lpRect.Right = Point2PixelX(TTParentControl.Width) + .lpRect.Left
  99. '        Debug.Print TypeName(TTParentControl)
  100.         If TypeName(TTParentControl) = "ListBox" Then GetClientRect CLng(TTParentControl.Tag), .lpRect '特殊处理listbox
  101.     End With
  102.     SendMessage hToolTipHwnd, TTM_ADDTOOLA, 0, TI
  103.     '给tooltip加上标题
  104.     SendMessage hToolTipHwnd, TTM_SETTITLE, 0, ByVal TTTitle
  105. End Function

  106. Public Property Set ParentControl(ByVal vData As Object) '确定tooltip对象(要求有hwnd的控件)
  107.     Set TTParentControl = vData
  108. End Property

  109. Public Property Let ToolTipTitle(ByVal vData As String) '设置tooltip的标题
  110.     TTTitle = vData
  111.     SendMessage hToolTipHwnd, TTM_SETTITLE, 0, ByVal TTTitle
  112. End Property

  113. Public Property Let ToolTipText(ByVal vData As String) '设置tooltip的文本(支持多行)
  114.     TI.lpStr = vData
  115.     SendMessage hToolTipHwnd, TTM_UPDATETIPTEXTA, 0, TI
  116. End Property
  117. Public Function Destroy() '销毁
  118.     DestroyWindow hToolTipHwnd
  119. End Function
复制代码
2012-04-20_001527.jpg
ToolTip.rar (22.88 KB, 下载次数: 1021)

评分

5

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-4-20 00:49 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-4-20 11:01 | 显示全部楼层
Moneky 发表于 2012-4-20 00:29
修改了一个网上找的VB代码,使之适用于VBA,做了一个附件。可以实现大部分控件的提示。

非常棒!收藏了,很有价值的东西!谢谢你!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 08:34 , Processed in 0.049650 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表