Что нового

[Элементы GUI] Как отловить клик по эл-ту RichEdit

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
В GUI имеется 2 элемента , созданные функцией :
Код:
 _GUICtrlRichEdit_Create
Нужно поймать покакому из них был произведен клик.
Для обычных элементов Edit удавалось отловить с помощью :
Код:
$GUI_EVENT_PRIMARYDOWN
 GUIGetCursorInfo($hGUI)
Здесь же не удается ???
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Есть несколько способов, вот более корректный:

Код:
#include <GuiRichEdit.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$hGui = GUICreate("Example", 320, 250)

$hRichEdit1 = _GUICtrlRichEdit_Create($hGui, "hRichEdit1", 10, 10, 140, 220, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
$hRichEdit2 = _GUICtrlRichEdit_Create($hGui, "hRichEdit2", 170, 10, 140, 220, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))

_GUICtrlRichEdit_SetEventMask($hRichEdit1, $ENM_MOUSEEVENTS)
_GUICtrlRichEdit_SetEventMask($hRichEdit2, $ENM_MOUSEEVENTS)

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState()

While True
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			GUIDelete()
			Exit
	EndSwitch
WEnd

Func WM_NOTIFY($hWnd, $iMsg, $iWparam, $iLparam)
	Local $hWndFrom, $iCode, $tNMHDR, $tMsgFilter, $hMenu
	$tNMHDR = DllStructCreate($tagNMHDR, $iLparam)
	$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
	$iCode = DllStructGetData($tNMHDR, "Code")
	
	Switch $iCode
		Case $EN_MSGFILTER
			$tMsgFilter = DllStructCreate($tagEN_MSGFILTER, $iLparam)
			If DllStructGetData($tMsgFilter, "msg") = $WM_LBUTTONUP Then
				Switch $hWndFrom
					Case $hRichEdit1
						ConsoleWrite("RichEdit1 clicked" & @LF)
					Case $hRichEdit2
						ConsoleWrite("RichEdit2 clicked" & @LF)
				EndSwitch
			EndIf
	EndSwitch
	
	Return $GUI_RUNDEFMSG
EndFunc


А вот способ по проще:

Код:
#include <GuiRichEdit.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$hGui = GUICreate("Example", 320, 250)

$hRichEdit1 = _GUICtrlRichEdit_Create($hGui, "hRichEdit1", 10, 10, 140, 220, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
$hRichEdit2 = _GUICtrlRichEdit_Create($hGui, "hRichEdit2", 170, 10, 140, 220, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))

GUISetState()

While True
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			GUIDelete()
			Exit
		Case $GUI_EVENT_PRIMARYUP
			$aMousePos = MouseGetPos()
			
			$stPoint = DllStructCreate("int X;int Y")
			DllStructSetData($stPoint, 1, $aMousePos[0])
			DllStructSetData($stPoint, 2, $aMousePos[1])
			
			$hWnd = _WinAPI_WindowFromPoint($stPoint)
			
			Switch $hWnd
				Case $hRichEdit1
					ConsoleWrite("RichEdit1 clicked" & @LF)
				Case $hRichEdit2
					ConsoleWrite("RichEdit2 clicked" & @LF)
			EndSwitch
	EndSwitch
WEnd
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
CreatoR
Спасибо . Я уже не надеялся. :ok:


Добавлено:
Сообщение автоматически объединено:

А я пытался без _WinAPI и получал облом
 
Верх