Что нового

[Элементы GUI] Отловить установку курсора в элемент Input

Pavel

Новичок
Сообщения
125
Репутация
3
Здравствуйте!
Подскажите, как при выделении (установке курсора) в поле Input убрать из него текущее содержимое?
Как пример -
Код:
#include <GUIConstantsEx.au3>
$GUI = GUICreate('UberGUI', 350, 222)
$Input = GUICtrlCreateInput("Тратата", 20, 55, 125, 25)
$Button = GUICtrlCreateButton("Кнопка", 20, 90, 50, 25)
GUISetState()
While 1
	Switch GUIGetMsg()
		Case $Input ; Вот это срабатывает уже после перехода на другой элемент гуи
			GUICtrlSetData($Input, "")
		Case $GUI_EVENT_CLOSE
			GUIDelete($GUI)
			Exit
	EndSwitch
WEnd
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Pavel,
Попробуйте так:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>

Global $fInput, $nInput1, $nInput2, $nInput3

$hGui = GUICreate('UberGUI', 350, 222)
For $i = 1 To 3
	Assign('nInput' & $i, GUICtrlCreateInput('Тратата' & $i, 20, 10 + ($i - 1) * 25, 125, 20))
Next
$nButton = GUICtrlCreateButton('Кнопка', 20, 90, 50, 25)
GUICtrlSetState(-1, $GUI_FOCUS)
GUISetState()
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func WM_COMMAND($hWnd, $imsg, $iwParam, $ilParam)
	Local $nNotifyCode, $nID
	$nNotifyCode = BitShift($iwParam, 16)
	$nID = BitAND($iwParam, 0xFFFF)
	Switch $hWnd
		Case $hGui
			Switch $nID
				Case $nInput1 To $nInput3
					Switch $nNotifyCode
						Case $EN_SETFOCUS
							If Not $fInput Then
								GUICtrlSetData($nID, '')
								$fInput = True
							EndIf
						Case $EN_KILLFOCUS
							$fInput = False
					EndSwitch
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Может что-то вроде этого поможет...

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

GUICreate('Тест', 350, 180, -1, -1, -1, $WS_CLIPCHILDREN)
$nInput = GUICtrlCreateInput('Ваш E-mail', 10, 10, 150, 20)
GUICtrlSetColor(-1, 0x505050)
$nLabel = GUICtrlCreateLabel('', 0, 0, 1, 1)
GUICtrlSetState($nLabel, $GUI_FOCUS)
GUISetState()

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
	EndSwitch
	
    $aCursor = GUIGetCursorInfo()
    If Not @error Then
        If $aCursor[4] = $nInput And $aCursor[2] Then
            GUICtrlSetData($nInput, '')
            GUICtrlSetColor($nInput, 0x000000)
        ElseIf Not $aCursor[4] = $nInput And $aCursor[2] Then
            If GUICtrlRead($nInput) = "" Then
                GUICtrlSetColor($nInput, 0x505050)
                GUICtrlSetData($nInput, 'Ваш E-mail')
				GUICtrlSetState($nLabel, $GUI_FOCUS)
            EndIf               
        EndIf
    EndIf	
WEnd


Или такой пример:

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

Global $iState = True

GUICreate('Тест', 350, 180, -1, -1, -1, $WS_CLIPCHILDREN)
$nInput = GUICtrlCreateInput('Ваш E-mail', 10, 10, 150, 20)
GUICtrlSetColor(-1, 0x505050)
$nLabel = GUICtrlCreateLabel('', 0, 0, 1, 1)
GUICtrlSetState($nLabel, $GUI_FOCUS)
GUISetState()

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
	EndSwitch
	
    $aCursor = GUIGetCursorInfo()
    If Not @error Then
        If $aCursor[4] = $nInput Then
			If $iState Then
                GUICtrlSetData($nInput, '')
                GUICtrlSetColor($nInput, 0x000000)
				$iState = False
			EndIf	
        ElseIf Not $aCursor[4] = $nInput Then
            If GUICtrlRead($nInput) = "" Then
                GUICtrlSetColor($nInput, 0x505050)
                GUICtrlSetData($nInput, 'Ваш E-mail')
				GUICtrlSetState($nLabel, $GUI_FOCUS)
				$iState = True
            EndIf               
        EndIf
    EndIf	
WEnd
 

VladUs

Скриптер
Сообщения
621
Репутация
181
Можно еще так, используя библиотеку MouseOnEvent.au3

Код:
#include <GUIConstantsEx.au3>
#Include <MouseOnEvent.au3>

$GUI = GUICreate('UberGUI', 350, 222)
$Input = GUICtrlCreateInput("Тратата", 20, 55, 125, 25)
$Button = GUICtrlCreateButton("Кнопка", 20, 90, 50, 25)
$hInput = ControlGetHandle($GUI, "",$Input)
GUISetState()
_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT, "_Left","","",$hInput,0)
While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
         GUIDelete($GUI)
         Exit
    EndSwitch
WEnd
   
Func _Left ()
       GUICtrlSetData ( $Input ,"" )
EndFunc
 

XM2001

Новичок
Сообщения
3
Репутация
0
Как можно при переходе между несколькими Input менять язык ввода.
Я попробовал добавить во второй пример от Viktor1703 добавить функцию _SetKeyboardLayout(0x0409) для принудительного переключения языка на английский, но она не отрабатывает.
Суть задачи - идентификатор вводить только латинскими символами, а название только кириллицей.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
XM2001 [?]
при переходе между несколькими Input менять язык ввода.
Попробуйте так.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <WinAPIEx.au3>;Yashied, http://autoit-script.ru/index.php/topic,47.0.html

Global $hGui, $nInput1, $nInput2, $f1 = True, $f2 = True

$hGui = GUICreate('UberGUI', 200, 150)
$nInput1 = GUICtrlCreateInput('русский', 20, 35, 125, 20)
$nInput2 = GUICtrlCreateInput('english', 20, 65, 125, 20)
$nButton = GUICtrlCreateButton('Кнопка', 20, 90, 50, 25)
GUICtrlSetState(-1, $GUI_FOCUS)
GUISetState()
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nButton
			MsgBox(64, 'Info', GUICtrlRead($nInput1) & @LF & GUICtrlRead($nInput2), 0, $hGui)
	EndSwitch
WEnd

Func WM_COMMAND($hWnd, $imsg, $iwParam, $ilParam)
	Local $nNotifyCode, $nID
	$nNotifyCode = BitShift($iwParam, 16)
	$nID = BitAND($iwParam, 0xFFFF)
	Switch $hWnd
		Case $hGui
			Switch $nNotifyCode
				Case $EN_SETFOCUS
					Switch $nID
						Case $nInput1
							If $f1 Then
								GUICtrlSetData($nInput1, '')
								$f1 = False
							EndIf
							_WinAPI_SetKeyboardLayout($hGui, 0x0419)
						Case $nInput2
							If $f2 Then
								GUICtrlSetData($nInput2, '')
								$f2 = False
							EndIf
							_WinAPI_SetKeyboardLayout($hGui, 0x0409)
					EndSwitch
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Можно ещё добавить код, запрещающий ввод неправильных символов.
Код:
Case $EN_CHANGE
                    Switch $nID
                        Case $nInput1
                            $tmp = GUICtrlRead($nInput1)
							$tmp2=StringRegExpReplace($tmp, '[A-z]', '')
							If $tmp <> $tmp2 Then GUICtrlSetData($nInput1, $tmp2)
                        Case $nInput2
                            $tmp = GUICtrlRead($nInput2)
							$tmp2=StringRegExpReplace($tmp, '[А-яЁё]', '')
							If $tmp <> $tmp2 Then GUICtrlSetData($nInput2, $tmp2)
                    EndSwitch
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
AZJIO
Как можно добиться такого же эффекта в Editboxe с установленным свойством - только числа и когда начинаешь вводить буквы, показывается подсказка, звучит сигнал ошибки и символ просто не вводится. (Можно конечно немного дописать ваш вариант, добавив туда все что нужно, но это будут просто эмуляция того, как это делает windows.)

Хочется сделать поле в которое можно вводить только числа в шестнадцатеричном формате.
Например создаешь
Код:
GUICtrlCreateInput
со стилями $ES_NUMBER+$ES_HEXNUMBER
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
inververs,
Эти стили не помогают, если скопировать и вставить произвольный текст.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
madmasles
Не соглашусь. Стиль $ES_NUMBER не дает даже вставить текст
 

XM2001

Новичок
Сообщения
3
Репутация
0
madmasles,
предложенный Вами пример у меня не работает - между Input'ами перехожу, а язык не меняется. WinAPIEx установил и пользовался раньше.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
inververs [?]
Проверьте.


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

XM2001,
С флагами в _WinAPI_SetKeyboardLayout() поэкспериментируйте.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
На windows 7 не вставляется. Язык тоже не меняется.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
На Windows XP и любой текст вставляется, и язык ввода меняется (у меня.).
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
XM2001
inververs
У меня тож не меняет

А так у меня меняет
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>

Global $hGui, $nInput1, $nInput2, $f1 = True, $f2 = True

$hGui = GUICreate('UberGUI', 200, 150)
$nInput1 = GUICtrlCreateInput('русский', 20, 35, 125, 20)
$nInput2 = GUICtrlCreateInput('english', 20, 65, 125, 20)
$nButton = GUICtrlCreateButton('Кнопка', 20, 90, 50, 25)
GUICtrlSetState(-1, $GUI_FOCUS)
GUISetState()
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $nButton
            MsgBox(64, 'Info', GUICtrlRead($nInput1) & @LF & GUICtrlRead($nInput2), 0, $hGui)
    EndSwitch
WEnd

Func WM_COMMAND($hWnd, $imsg, $iwParam, $ilParam)
    Local $nNotifyCode, $nID
    $nNotifyCode = BitShift($iwParam, 16)
    $nID = BitAND($iwParam, 0xFFFF)
    Switch $hWnd
        Case $hGui
            Switch $nNotifyCode
                Case $EN_SETFOCUS
                    Switch $nID
                        Case $nInput1
                            If $f1 Then
                                GUICtrlSetData($nInput1, '')
                                $f1 = False
                            EndIf
                            _WinAPI_LoadKeyboardLayout(0x0419)
                        Case $nInput2
                            If $f2 Then
                                GUICtrlSetData($nInput2, '')
                                $f2 = False
                            EndIf
                            _WinAPI_LoadKeyboardLayout(0x0409)
                    EndSwitch
                 Case $EN_CHANGE
                    Switch $nID
                        Case $nInput1
                            $tmp = GUICtrlRead($nInput1)
							$tmp2=StringRegExpReplace($tmp, '[A-z]', '')
							If $tmp <> $tmp2 Then GUICtrlSetData($nInput1, $tmp2)
                        Case $nInput2
                            $tmp = GUICtrlRead($nInput2)
							$tmp2=StringRegExpReplace($tmp, '[А-яЁё]', '')
							If $tmp <> $tmp2 Then GUICtrlSetData($nInput2, $tmp2)
                    EndSwitch
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

Func _WinAPI_LoadKeyboardLayout($sLayoutID, $hWnd = 0)
	Local Const $WM_INPUTLANGCHANGEREQUEST = 0x50
	Local $aRet = DllCall("user32.dll", "long", "LoadKeyboardLayoutW", "wstr", Hex($sLayoutID, 8), "int", 0)

	If Not @error And $aRet[0] Then
		If $hWnd = 0 Then
			$hWnd = WinGetHandle(AutoItWinGetTitle())
		EndIf

		DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $hWnd, "int", $WM_INPUTLANGCHANGEREQUEST, "int", 1, "int", $aRet[0])
		Return 1
	EndIf

	Return SetError(1)
EndFunc
 
Верх