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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   Узнать controlID по Handle (http://forum.oszone.net/showthread.php?t=140013)

san45 13-05-2009 16:33 1117459

Узнать controlID по Handle
 
Сразу извиняюсь за ламерский вопрос.

Вот есть GUICtrlGetHandle(controlID), по которой можно узнать handle, зная controlID. А как сделать обратно?

SyDr 13-05-2009 18:52 1117609

А зачем?
При создании элемента возвращается его controlID

san45 13-05-2009 20:44 1117664

Это если юзать GuiCtrlGreate... а _GuiCtrlGreate... (UDF) возвращают handle.

Вот в этом примере $slider2 не будет ловиться.

Код:

#include <GuiConstantsEx.au3>
#include <GuiSlider.au3>
#include <WindowsConstants.au3>


Example()

Func Example()
        Local $slider1, $button, $msg
       
        $hGUI = GUICreate("(UDF Created) Slider Create", 350, 100)
        $slider1 = GUICtrlCreateSlider(2, 2, 300, 20)
        $slider2 = _GUICtrlSlider_Create($hGUI, 2, 50, 300, 20, BitOR($TBS_TOOLTIPS, $TBS_AUTOTICKS))
        GUISetState()

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $slider1
                        MsgBox(0,"","slider1")
                Case $slider2
                        MsgBox(0,"","(UDF Created) Slider")
        EndSwitch
WEnd
EndFunc  ;==>Example

Можно использовать GUIGetMsg(1) и $msg[2], но у меня много элементов с controlID, а переделывать не хочется. Легче конвертнуть сабж, еси возможно.

зы. использвал [code] а серавно без подцветки :(

Creat0R 13-05-2009 22:23 1117744

Цитата:

Цитата san45
как сделать обратно? »

Код:

Func _GUICtrlGetID($hWnd)
    Local $aRet = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $hWnd)
    Return $aRet[0]
EndFunc

Цитата:

Цитата san45
использвал [code] а серавно без подцветки »

А кто сказал что оно должно быть с подсветкой? Для этого используется специальная утилита Au3ToPost.

Но с GUIGetMsg оно работать не будет, и не должно, там ControlID серийный, т.е начинается с 10000, и GUIGetMsg его не обрабатывает. Для _GUICtrlSlider_Create используется обработчик сообщении WM_NOTIFY:

Код:

#include <GuiConstantsEx.au3>
#include <GuiSlider.au3>
#include <WindowsConstants.au3>
;

Global $iSlider_Event = 0

$hGUI = GUICreate("(UDF Created) Slider Create", 350, 100)

$slider1 = GUICtrlCreateSlider(2, 2, 300, 20)
$slider2 = _GUICtrlSlider_Create($hGUI, 2, 50, 300, 20, BitOR($TBS_TOOLTIPS, $TBS_AUTOTICKS))

GUISetState()

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

While 1
    $nMsg = GUIGetMsg()

    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case
$slider1
            MsgBox(0,"","slider1")
    EndSwitch

    If
$iSlider_Event Then
        $iSlider_Event = 0
        MsgBox(0,"","(UDF Created) Slider")
    EndIf
WEnd

Func
WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndSlider
    $hWndSlider
= $slider2
    If Not IsHWnd($slider2) Then $hWndSlider = GUICtrlGetHandle($slider2)

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")

    Switch $hWndFrom
        Case $hWndSlider
            Switch $iCode
                Case $NM_RELEASEDCAPTURE ; The control is releasing mouse capture
                    $iSlider_Event = 1
            EndSwitch
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc



Время: 15:25.

Время: 15:25.
© OSzone.net 2001-