Что нового

Сбрасывание выделения в полях ввода при получении фокуса

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Подскажите, пожалуйста, как можно сбросить выделение в поле для ввода (Input, Combo) при получении полем фокуса?

Я пробовал с помощью ControlSend():
Код:
ControlSend($GUI,"",$nID,"{END}")


Данный способ вызывает неприятное мерцание при получение полем фокуса, которого хотелось бы избежать...


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

Для Combo можно использовать _GUICtrlComboBox_SetEditSel()...
Для Input можно использовать _GUICtrlEdit_SetSel()...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Так тема решена?
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
CreatoR
Я бы хотел без-UDF-ный вариант найти... :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
GUICtrlSetState($Input, $GUI_FOCUS)
GUICtrlSendMsg($Input, 177, 0, 0) ;$EM_SETSEL = 177
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
CreatoR
Для Input:
Код:
GUICtrlSendMsg($nID,177,StringLen(GUICtrlRead($nID)),StringLen(GUICtrlRead($nID)))


А для Combo?

По идее должно быть 0x142, но не работает...

Вот это нагромождение... :smile:

Код:
GUICtrlSendMsg($nID,322,0,BitOR(BitShift(StringLen(GUICtrlRead($nID)),-16),BitAND(StringLen(GUICtrlRead($nID)),0xFFFF)))
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
snoitaleR [?]
А зачем StringLen?
Код:
GUICtrlSendMsg($nID, 177, -1, 0)


Тут немного посложнее, т.к нужен «Long» во втором параметре (состоящий из начальной позиций и длины выделения):

Код:
GUICtrlSetState($nID, $GUI_FOCUS)
GUICtrlSendMsg($nID, 322, 0, BitOR(BitShift(0, -16), BitAND(-1, 0xFFFF)))
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
CreatoR
Спасибо за помощь... :smile:
Разобрался...

Кстати, можно 16 без минуса, если поменять 0 и -1 местами...
Код:
GUICtrlSendMsg($nID,322,0,BitOR(BitShift(-1,16),BitAND(0,0xFFFF)))
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
snoitaleR [?]
можно 16 без минуса, если поменять 0 и -1 местами
А можно просто -1 ;)

Код:
#include <GUIConstantsEx.au3>

$hGUI = GUICreate('Test', 200, 130)

$nInput = GUICtrlCreateInput('Input', 20, 10, 160, 20)
$nCombo = GUICtrlCreateCombo('Combo', 20, 40, 160, 20)
$nEdit = GUICtrlCreateEdit('Edit', 20, 70, 160, 50)

GUISetState()

;~ _GUICtrlEdit_Focus($nInput)
_GUICtrlEdit_Focus($nCombo)
;~ _GUICtrlEdit_Focus($nEdit)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func _GUICtrlEdit_Focus($nCtrlID)
	GUICtrlSetState($nCtrlID, $GUI_FOCUS)
	
	Local $aClass = DllCall("User32.dll", "int", "GetClassName", "hwnd", GUICtrlGetHandle($nCtrlID), "str", "", "int", 4096)
	If @error Then Return SetError(1, 0, 0)
	
	Switch $aClass[2]
		Case "Edit"
			Return GUICtrlSendMsg($nCtrlID, 177, -1, 0)
		Case "ComboBox"
			Return GUICtrlSendMsg($nCtrlID, 322, 0, -1)
	EndSwitch
EndFunc
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
CreatoR
Супер... :ok:
Красиво...

Я поначалу хотел через DllCall написать _SendMessage, которая вызывается из функции _GUICtrlComboBox_SetEditSel(), но там с параметрами какое-то недоразумение вышло...
А тут оказалось, есть еще GUICtrlSendMsg... :IL_AutoIt_1:
 
Верх