-TRM-,
Или так сделать, чтобы ToolTip перемещался вместе с окном.
читать дальше »
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt('MustDeclareVars', 1)
Global $hGui, $iMsg, $iDummy, $a_ChBx[6][2] = [[5],['Первый', 'Первая подсказка'],['Второй', 'Вторая подсказка'],['Третий', 'Третья подсказка'], _
['Четвертый', 'Четвертая подсказка'],['Пятый', 'Пятая подсказка']], $a_Check[2] = [@LF & '(Не отмечен)', @LF & '(Отмечен)'], $aTT
$hGui = GUICreate('Test', 200, $a_ChBx[0][0] * 30 + 30, -1, -1, $WS_OVERLAPPEDWINDOW)
For $i = 1 To $a_ChBx[0][0]
$a_ChBx[$i][0] = GUICtrlCreateCheckbox($a_ChBx[$i][0], 50, 20 + ($i - 1) * 30, 100, 20)
GUICtrlSetBkColor(-1, 0xFFFFFF)
Next
$iDummy = GUICtrlCreateDummy()
GUISetState()
While 1
$iMsg = GUIGetMsg()
Switch $iMsg
Case $GUI_EVENT_CLOSE
ExitLoop
Case $iDummy
__TT_MoveControl($aTT)
Case $a_ChBx[1][0]
$aTT = _Create_ToolTip_Control($a_ChBx[1][0], $a_ChBx[1][1] & $a_Check[GUICtrlSendMsg($a_ChBx[1][0], 0xF0, 0, 0)], 'My Title', 1, 1, 50000);$BM_GETCHECK = 0xF0
ConsoleWrite('_Create_ToolTip_Control error: ' & @error & @LF)
Case $a_ChBx[2][0] To $a_ChBx[$a_ChBx[0][0]][0]
For $i = 2 To $a_ChBx[0][0]
If $iMsg = $a_ChBx[$i][0] Then
$aTT = _Create_ToolTip_Control($a_ChBx[$i][0], $a_ChBx[$i][1] & $a_Check[GUICtrlSendMsg($a_ChBx[$i][0], 0xF0, 0, 0)]);$BM_GETCHECK = 0xF0
ConsoleWrite('_Create_ToolTip_Control error: ' & @error & @LF)
ExitLoop
EndIf
Next
EndSwitch
WEnd
_KillTT()
GUIDelete($hGui)
Exit
Func _Create_ToolTip_Control($i_ID, $s_Text, $s_Title = '', $i_Icon = 0, $i_Right = 0, $i_Time = 10000)
Local $h_ID, $ai_XY, $h_TT, $a_Ret[3], $i_Opt
$h_ID = GUICtrlGetHandle($i_ID)
If Not $h_ID Then Return SetError(1, 0, 0)
$ai_XY = _WinAPI_GetWindowXY_Ex($h_ID, $i_Right)
If @error Then Return SetError(2, 0, 0)
If ToolTip($s_Text, $ai_XY[0], $ai_XY[1], $s_Title, $i_Icon) Then
$i_Opt = Opt('WinTitleMatchMode', 1)
$h_TT = WinGetHandle('[Class:tooltips_class32;Title:' & StringLeft($s_Text, 24) & ']')
Opt('WinTitleMatchMode', $i_Opt)
If $h_TT Then
$a_Ret[0] = $h_ID
$a_Ret[1] = $h_TT
$a_Ret[2] = $i_Right
GUIRegisterMsg($WM_WINDOWPOSCHANGED, '_WM_WINDOWPOSCHANGED')
GUIRegisterMsg($WM_SIZE, '_WM_SIZE')
EndIf
AdlibUnRegister('_KillTT')
AdlibRegister('_KillTT', $i_Time)
Return $a_Ret
EndIf
Return SetError(3, 0, 0)
EndFunc ;==>_Create_ToolTip_Control
Func _KillTT()
If Not IsArray($aTT) Then Return
GUIRegisterMsg($WM_WINDOWPOSCHANGED, '')
GUIRegisterMsg($WM_SIZE, '')
$aTT = 0
AdlibUnRegister('_KillTT')
ToolTip('')
EndFunc ;==>_KillTT
Func _WM_WINDOWPOSCHANGED($h_Wnd, $iMsg, $i_wParam, $i_lParam)
Switch $h_Wnd
Case $hGui
__TT_MoveControl($aTT)
GUICtrlSendToDummy($iDummy)
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>_WM_WINDOWPOSCHANGED
Func _WM_SIZE($h_Wnd, $iMsg, $i_wParam, $i_lParam)
Switch $h_Wnd
Case $hGui
Switch $i_wParam
Case 1, 2
GUICtrlSendToDummy($iDummy)
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>_WM_SIZE
Func __TT_MoveControl($a_TT)
If Not IsArray($a_TT) Then Return 0
If Not $a_TT[1] Then Return 0
Local $ai_XY
$ai_XY = _WinAPI_GetWindowXY_Ex($a_TT[0], $a_TT[2])
If @error Then Return SetError(1, 0, 0)
Return WinMove($a_TT[1], '', $ai_XY[0], $ai_XY[1])
EndFunc ;==>__TT_MoveControl
Func _WinAPI_GetWindowXY_Ex($h_Wnd, $i_Right = 0)
Local $t_Rect, $p_Rect, $a_Res, $ai_XY[2]
If Not IsHWnd($h_Wnd) Then Return SetError(1, 0, 0)
$t_Rect = DllStructCreate('long[4]')
$p_Rect = DllStructGetPtr($t_Rect)
$a_Res = DllCall('user32.dll', 'int', 'GetWindowRect', 'hwnd', $h_Wnd, 'ptr', $p_Rect)
If (@error) Or (Not $a_Res[0]) Then Return SetError(2, 0, 0)
If $i_Right Then
$ai_XY[0] = DllStructGetData($t_Rect, 1, 3)
Else
$ai_XY[0] = DllStructGetData($t_Rect, 1, 1)
EndIf
$ai_XY[1] = DllStructGetData($t_Rect, 1, 4)
Return $ai_XY
EndFunc ;==>_WinAPI_GetWindowXY_Ex
|