Узнать controlID по Handle

Ответить
Аватара пользователя
san45

Узнать controlID по Handle

Сообщение san45 »

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



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

Re: Узнать controlID по Handle

Сообщение SyDr »

А зачем?

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

Re: Узнать controlID по Handle

Сообщение san45 »

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



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





Код:

Код: Выделить всё

#include 
#include 
#include 
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, а переделывать не хочется. Легче конвертнуть сабж, еси возможно.



зы. использвал

Код: Выделить всё

 а серавно без подцветки [img]images/smilies/sad.gif[/img]
Аватара пользователя
Creat0R

Re: Узнать controlID по Handle

Сообщение Creat0R »

Цитата san45:



как сделать обратно?
Узнать controlID по Handle






Код:

Код: Выделить всё

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


Цитата san45:



использвал

Код: Выделить всё

 а серавно без подцветки [url=viewtopic.php?p=137194#p137194]»[/url]
		
	
	
А кто сказал что оно должно быть с подсветкой? Для этого используется специальная утилита [url=http://creator-lab.ucoz.ru/load/3-1-0-18]Au3ToPost[/url].



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




 
 Код: [url=#][/url]
 [code]#include 
#include 
#include 
;
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
Ответить

Вернуться в «AutoIt»