Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Checkbox и ToolTip (http://forum.oszone.net/showthread.php?t=282374)

-TRM- 18-05-2014 10:58 2352648

Checkbox и ToolTip
 
Здравствуйте!
Суть вопроса : Есть любое окно GUI и в нём указаны разные Checkbox`сы. Нужно, чтобы при нажатии на Checkbox снизу под Checkbox`ом появлялось окно ToolTip приблизительно такое
Код:

If Not IsDeclared("sToolTipAnswer") Then Local $sToolTipAnswer
$sToolTipAnswer = ToolTip("tresgfdsgfdsgfdsg",20,10,"643",0,1)

c разным тестом в зависимости от Checkbox`са.
Проблема в том что ToolTip работает по координатам экрана, а Checkbox имеет координаты самого окна GUI т.е. нужно определить координаты расположения самого Checkbox`са на экране и ниже уже вывести ToolTip. Нужно сделать приблизительно похожее на команду GUICtrlSetTip.

AZJIO 19-05-2014 05:32 2352937

В справке _WinAPI_ScreenToClient. Там готовый пример. Есть ещё _WinAPI_ClientToScreen.

-TRM- 19-05-2014 13:17 2353044

AZJIO, у меня видимо справка старая на русском языке, не могли бы Вы мне ссылочку дать ?

madmasles 19-05-2014 13:39 2353058

Цитата:

Цитата -TRM-
у меня видимо справка старая на русском языке, не могли бы Вы мне ссылочку дать ? »

Развитие русской справки

Можно примерно так сделать.
читать дальше »
Код:

#include <GUIConstantsEx.au3>

Global $hGui, $i_Msg, $a_ChBx[6][2] = [[5],['Первый', 'Первая подсказка'],['Второй', 'Вторая подсказка'],['Третий', 'Третья подсказка'], _
        ['Четвертый', 'Четвертая подсказка'],['Пятый', 'Пятая подсказка']], $a_Check[2] = [@LF & '(Не отмечен)', @LF & '(Отмечен)']

$hGui = GUICreate('Test', 200, $a_ChBx[0][0] * 30 + 30)
For $i = 1 To $a_ChBx[0][0]
    $a_ChBx[$i][0] = GUICtrlCreateCheckbox($a_ChBx[$i][0], 20, 20 + ($i - 1) * 30, 100, 20)
    GUICtrlSetBkColor(-1, 0xFFFFFF)
Next
GUISetState()
While 1
    $i_Msg = GUIGetMsg()
    Switch $i_Msg
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $a_ChBx[1][0]
            ConsoleWrite(_ToolTipControl($a_ChBx[1][0], $a_ChBx[1][1] & $a_Check[GUICtrlSendMsg($a_ChBx[1][0], 0xF0, 0, 0)], 'My Title', 1, 1, 5000) & @LF)
        Case $a_ChBx[2][0] To $a_ChBx[$a_ChBx[0][0]][0]
            For $i = 2 To $a_ChBx[0][0]
                If $i_Msg = $a_ChBx[$i][0] Then
                    ConsoleWrite(_ToolTipControl($a_ChBx[$i][0], $a_ChBx[$i][1] & $a_Check[GUICtrlSendMsg($a_ChBx[$i][0], 0xF0, 0, 0)]) & @LF);$BM_GETCHECK = 0xF0
                    ExitLoop
                EndIf
            Next
    EndSwitch
WEnd
_KillTT()
Exit

Func _ToolTipControl($i_ID, $s_Text, $s_Title = '', $i_Icon = 0, $i_Right = 0, $i_Time = 3000)
    Local $h_ID, $t_Rect, $p_Rect, $a_Res, $i_X, $i_Y, $i_Ret

    $h_ID = GUICtrlGetHandle($i_ID)
    If Not $h_ID Then Return 0
    $t_Rect = DllStructCreate('long[4]')
    $p_Rect = DllStructGetPtr($t_Rect)
    $a_Res = DllCall('user32.dll', 'int', 'GetWindowRect', 'hwnd', $h_ID, 'ptr', $p_Rect);_WinAPI_GetWindowRect()
    If (@error) Or (Not $a_Res[0]) Then Return 0
    If $i_Right Then
        $i_X = DllStructGetData($t_Rect, 1, 3)
    Else
        $i_X = DllStructGetData($t_Rect, 1, 1)
    EndIf
    $i_Y = DllStructGetData($t_Rect, 1, 4)
    $i_Ret = ToolTip($s_Text, $i_X, $i_Y, $s_Title, $i_Icon)
    If $i_Ret Then
        AdlibUnRegister('_KillTT')
        AdlibRegister('_KillTT', $i_Time)
    EndIf
    Return $i_Ret
EndFunc  ;==>_ToolTipControl

Func _KillTT()
    AdlibUnRegister('_KillTT')
    ToolTip('')
EndFunc  ;==>_KillTT


madmasles 19-05-2014 15:48 2353130

-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



Время: 22:01.

Время: 22:01.
© OSzone.net 2001-