uo_tooltip.sru 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. $PBExportHeader$uo_tooltip.sru
  2. $PBExportComments$显示按钮提示用
  3. forward
  4. global type uo_tooltip from nonvisualobject
  5. end type
  6. type tag_rect from structure within uo_tooltip
  7. end type
  8. type toolinfo from structure within uo_tooltip
  9. end type
  10. type msg from structure within uo_tooltip
  11. end type
  12. type point from structure within uo_tooltip
  13. end type
  14. end forward
  15. type tag_rect from structure
  16. long left
  17. long top
  18. long right
  19. long bottom
  20. end type
  21. type toolinfo from structure
  22. unsignedlong cbsize
  23. unsignedlong uflags
  24. unsignedlong hwnd
  25. unsignedlong uid
  26. tag_rect rect
  27. unsignedlong hinstance
  28. long lpsztext
  29. end type
  30. type msg from structure
  31. unsignedlong hwnd
  32. unsignedlong message
  33. unsignedlong wparam
  34. unsignedlong lparam
  35. long time
  36. point pt
  37. end type
  38. type point from structure
  39. long x
  40. long y
  41. end type
  42. global type uo_tooltip from nonvisualobject autoinstantiate
  43. end type
  44. type prototypes
  45. //确保动态链接库(DLL)被加载
  46. SubRoutine InitCommonControls() library "comctl32.dll"
  47. //创建窗口
  48. Function long CreateWindowExA(ulong dwExStyle,string ClassName, long WindowName, ulong dwStyle,ulong X, ulong Y, ulong nWidth, ulong nHeight, ulong hWndParent, ulong hMenu, ulong hInstance, ulong lpParam) library "user32.dll" alias for "CreateWindowExA;Ansi"
  49. //清除指定的窗口以及它的所有子窗口
  50. Function integer DestroyWindow(long hWnd) library "user32.dll"
  51. //调用一个窗口的窗口函数,将一条消息发给那个窗口
  52. Function integer ToolTipMsg(long hWnd, long uMsg, long wParam, REF TOOLINFO ToolInfo) library "user32.dll" Alias For "SendMessageA;Ansi"
  53. //调用一个窗口的窗口函数,将一条消息发给那个窗口
  54. Function integer RelayMsg(long hWnd, long uMsg, long wParam, REF MSG Msg) library "user32.dll" Alias For "SendMessageA;Ansi"
  55. //分配指定数量的内存
  56. Function long LocalAlloc(long Flags, long Bytes) library "kernel32.dll"
  57. //释放内存并使句柄无效
  58. Function long LocalFree(long MemHandle) library "kernel32.dll"
  59. //复制字符串到缓冲区
  60. Function long lstrcpy(long Destination, string Source) library "kernel32.dll" alias for "lstrcpy;Ansi"
  61. end prototypes
  62. type variables
  63. Private:
  64. // Constants
  65. CONSTANT string TOOLTIPS_CLASS = 'tooltips_class32'
  66. CONSTANT ulong CW_USEDEFAULT = 2147483648
  67. CONSTANT long WM_USER = 1024
  68. CONSTANT long WS_EX_TOPMOST = 8
  69. // ToolTip Messages
  70. CONSTANT long TTM_ADDTOOL = WM_USER + 4
  71. CONSTANT long TTM_RELAYEVENT = WM_USER + 7
  72. Public:
  73. CONSTANT integer STYLE_NORMAL = 0
  74. CONSTANT integer STYLE_BALLOONTIP = 1
  75. integer TIPSTYLE = STYLE_NORMAL
  76. long hWndTT
  77. // Tooltip control window handle
  78. long ToolID = 1 // Tooltip internal ID
  79. // Tooltip flags
  80. constant long TOOLINFO_SIZE = 40
  81. CONSTANT integer TTF_CENTERTIP = 2
  82. CONSTANT integer TTF_RTLREADING = 4
  83. //CONSTANT integer TTF_DI_SETITEM = 32768
  84. //CONSTANT long TTM_NEWTOOLRECT = WM_USER + 6
  85. CONSTANT integer TTS_BALLOON = 64
  86. end variables
  87. forward prototypes
  88. public subroutine showtip (dragobject ControlObject)
  89. public function integer controlregister (dragobject controlobject, string tip, integer flag)
  90. end prototypes
  91. public subroutine showtip (dragobject ControlObject);MSG Msg
  92. Msg.hWnd = Handle(ControlObject)
  93. Msg.Message = 512 // WM_MOUSEMOVE
  94. Msg.WParam = Message.WordParm
  95. Msg.Lparam = Message.LongParm
  96. RelayMsg(hWndTT,TTM_RELAYEVENT,0,Msg)
  97. end subroutine
  98. public function integer controlregister (dragobject controlobject, string tip, integer flag);if hWndTT<=0 then
  99. if TIPSTYLE = STYLE_BALLOONTIP then
  100. hWndTT = CreateWindowExA(WS_EX_TOPMOST,TOOLTIPS_CLASS,0, TTF_CENTERTIP + TTS_BALLOON + 2, &
  101. CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, &
  102. 0, 0, Handle(GetApplication()),0)
  103. else
  104. HWndTT = CreateWindowExA(WS_EX_TOPMOST, TOOLTIPS_CLASS,0,TTF_CENTERTIP, &
  105. CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, &
  106. 0, 0, Handle(GetApplication()),0)
  107. end if
  108. end if
  109. TOOLINFO ToolInfo
  110. ToolInfo.cbSize = 40
  111. ToolInfo.uFlags = Flag
  112. ToolInfo.hWnd = Handle(ControlObject)
  113. ToolInfo.hInstance = 0
  114. ToolInfo.uID = ToolID
  115. ToolID++
  116. ToolInfo.lpszText = LocalAlloc(0,80)
  117. POST LocalFree(ToolInfo.lpszText)
  118. lStrCpy(ToolInfo.lpszText,Left(tip,80))
  119. tag_rect lrect
  120. lrect.Left = 0
  121. lrect.top = 0
  122. lrect.right = UnitsToPixels(ControlObject.Width,XUnitsToPixels!)
  123. lrect.bottom = UnitsToPixels(ControlObject.Height,YUnitsToPixels!)
  124. ToolInfo.Rect = lrect
  125. If ToolTipMsg(hWndTT,TTM_ADDTOOL, 1, ToolInfo) = 0 Then
  126. // MessageBox("出错","不能注册对象!",StopSign!,Ok!)
  127. Return(-1)
  128. End If
  129. Return(ToolID - 1)
  130. end function
  131. event constructor;InitCommonControls()
  132. end event
  133. event destructor;DestroyWindow(hWndTT)
  134. end event
  135. on uo_tooltip.create
  136. call super::create
  137. TriggerEvent( this, "constructor" )
  138. end on
  139. on uo_tooltip.destroy
  140. TriggerEvent( this, "destructor" )
  141. call super::destroy
  142. end on