Что нового

[Элементы GUI] GuiCtrlCreateCombo: получить информацию о событии при вводе с клавиатуры

Крепыш

Новичок
Сообщения
105
Репутация
2
Код:
#include <GUIConstants.au3>

Opt('MustDeclareVars', 1)

GUICreate("Раскрывающийся список")
Global $hH = GuiCtrlCreateCombo('', 38, 37, 70, 24)
GUICtrlSetData(-1, '1|2|3')
GUISetState(@SW_SHOW)

While True
  Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
      Exit
    Case $hH
      ConsoleWrite(GUICtrlRead($hH))
  EndSwitch
WEnd


Нужно, чтобы при вводе в Combo значения с клавиатуры получать информацию о событии.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Крепыш
Можно не только от клавиатуры, а вообще о любых изменениях (выбор из списка, вставка из буфера обмена и т.д.)
Код:
#include <GUIConstants.au3>

Opt('MustDeclareVars', 1)

GUICreate("Раскрывающийся список")
Global $hH = GuiCtrlCreateCombo('', 38, 37, 70, 24)
GUICtrlSetData(-1, '1|2|3')
GUISetState(@SW_SHOW)

GUIRegisterMsg($WM_COMMAND, '_WM_COMMAND')

While True
  Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
      Exit
    Case $hH
      ConsoleWrite(GUICtrlRead($hH))
  EndSwitch
WEnd

Func _WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
  If $lParam = GUICtrlGetHandle($hH) And BitShift($wParam, 16) = 5 Then ConsoleWrite(GUICtrlRead($hH) & @CRLF)
  Return $GUI_RUNDEFMSG
EndFunc
 
Автор
К

Крепыш

Новичок
Сообщения
105
Репутация
2
InnI, спасибо.
Думал дальше сам справлюсь. Ан нет: нужно в Combo вставить значение, но так, чтобы оно не добавлялось в список:

8c8e849c6364.png


Код:
#include <GUIConstants.au3>

Opt('MustDeclareVars', 1)

GUICreate("Раскрывающийся список")
Global $hH = GuiCtrlCreateCombo('', 38, 37, 70, 24)
GUICtrlSetData(-1, '1|2|3')
Global $hK = GuiCtrlCreateCombo('', 38, 68, 70, 24)
GUICtrlSetData(-1, '1|2|3')
GUISetState(@SW_SHOW)

GUIRegisterMsg($WM_COMMAND, '_WM_COMMAND')

While True
  Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
      Exit
    Case $hH
      ConsoleWrite(GUICtrlRead($hH) & @CRLF)
      GUICtrlSendMsg($hK, $CB_SETCURSEL, GUICtrlSendMsg($hH, $CB_GETCURSEL, 0, 0), 0)
    Case $hK
      ConsoleWrite(GUICtrlRead($hK) & @CRLF)
      GUICtrlSendMsg($hH, $CB_SETCURSEL, GUICtrlSendMsg($hK, $CB_GETCURSEL, 0, 0), 0)
  EndSwitch
WEnd

Func _WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
  If BitShift($wParam, 16) = 5 Then
    If $lParam = GUICtrlGetHandle($hH) Then
      Local $sH = GUICtrlRead($hH)
      ; Надо вставить значение $sH в элемент $hK
      ;ConsoleWrite($sH & @CRLF)
    EndIf
    If $lParam = GUICtrlGetHandle($hK) Then
      Local $sK = GUICtrlRead($hK)
      ; Надо вставить значение $sK в элемент $hH
      ;ConsoleWrite($sK & @CRLF)
    EndIf
  EndIf
  Return $GUI_RUNDEFMSG
EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Крепыш [?]
чтобы оно не добавлялось в список
Код:
#include <GUIConstants.au3>

Opt('MustDeclareVars', 1)

Global $GUI = GUICreate("Раскрывающийся список")
Global $hH = GuiCtrlCreateCombo('', 38, 37, 70, 24)
GUICtrlSetData(-1, '1|2|3')
Global $hK = GuiCtrlCreateCombo('', 38, 68, 70, 24)
GUICtrlSetData(-1, '1|2|3')
GUISetState(@SW_SHOW)

GUIRegisterMsg($WM_COMMAND, '_WM_COMMAND')

While True
  Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
      Exit
    Case $hH
      ConsoleWrite(GUICtrlRead($hH) & @CRLF)
      GUICtrlSendMsg($hK, $CB_SETCURSEL, GUICtrlSendMsg($hH, $CB_GETCURSEL, 0, 0), 0)
    Case $hK
      ConsoleWrite(GUICtrlRead($hK) & @CRLF)
      GUICtrlSendMsg($hH, $CB_SETCURSEL, GUICtrlSendMsg($hK, $CB_GETCURSEL, 0, 0), 0)
  EndSwitch
WEnd

Func _WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
  If BitShift($wParam, 16) = $CBN_EDITCHANGE Then
    If $lParam = GUICtrlGetHandle($hH) Then
      Local $sH = GUICtrlRead($hH)
      ; Надо вставить значение $sH в элемент $hK
      ;ConsoleWrite($sH & @CRLF)
      ControlSetText($GUI, "", $hK, $sH)
    EndIf
    If $lParam = GUICtrlGetHandle($hK) Then
      Local $sK = GUICtrlRead($hK)
      ; Надо вставить значение $sK в элемент $hH
      ;ConsoleWrite($sK & @CRLF)
      ControlSetText($GUI, "", $hH, $sK)
    EndIf
  EndIf
  Return $GUI_RUNDEFMSG
EndFunc
 
Автор
К

Крепыш

Новичок
Сообщения
105
Репутация
2
Есть проблема: если сначала выбрать значение из раскрывающегося списка, а затем ввести вручную, то GUICtrlRead считывает текст неверно.
Код:
#include <GUIConstants.au3>

Opt('MustDeclareVars', 1)

Global $GUI = GUICreate("Раскрывающийся список")
Global $hH = GuiCtrlCreateCombo('', 38, 37, 70, 24)
GUICtrlSetData(-1, '1|2|3')
Global $hK = GuiCtrlCreateCombo('', 38, 68, 70, 24)
GUICtrlSetData(-1, '1|2|3')
Global $hCalc = GUICtrlCreateButton('Рассчитать', 5, 104, 75, 28)
If Not $hCalc Or _
   Not GUICtrlSetFont($hCalc, 9) Then Exit 1
GUISetState(@SW_SHOW)

GUIRegisterMsg($WM_COMMAND, '_WM_COMMAND')

While True
  Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
      Exit
    Case $hH
      ConsoleWrite(GUICtrlRead($hH) & @CRLF)
      GUICtrlSendMsg($hK, $CB_SETCURSEL, GUICtrlSendMsg($hH, $CB_GETCURSEL, 0, 0), 0)
    Case $hK
      ConsoleWrite(GUICtrlRead($hK) & @CRLF)
      GUICtrlSendMsg($hH, $CB_SETCURSEL, GUICtrlSendMsg($hK, $CB_GETCURSEL, 0, 0), 0)
    Case $hCalc
      _Calc()
  EndSwitch
WEnd

Func _WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
  If BitShift($wParam, 16) = $CBN_EDITCHANGE Then
    If $lParam = GUICtrlGetHandle($hH) Then
      Local $sH = GUICtrlRead($hH)
      ; Надо вставить значение $sH в элемент $hK
      ;ConsoleWrite($sH & @CRLF)
      ControlSetText($GUI, "", $hK, $sH)
    EndIf
    If $lParam = GUICtrlGetHandle($hK) Then
      Local $sK = GUICtrlRead($hK)
      ; Надо вставить значение $sK в элемент $hH
      ;ConsoleWrite($sK & @CRLF)
      ControlSetText($GUI, "", $hH, $sK)
    EndIf
  EndIf
  Return $GUI_RUNDEFMSG
EndFunc

Func _Calc()
  Local $sH = GUICtrlRead($hH)
  ConsoleWrite('H: ' & $sH & @CRLF)
  Local $sK = GUICtrlRead($hK)
  ConsoleWrite('K: ' & $sK & @CRLF)
EndFunc
Что можно сделать?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Крепыш
считывает текст неверно
Правильно считывает, т.к. при внесении изменений в Edit, текущий выделенный элемент сбрасывается и функция читает текст прямо из поля ввода.
 
Автор
К

Крепыш

Новичок
Сообщения
105
Репутация
2
InnI сказал(а):
Правильно считывает, т.к. при внесении изменений в Edit, текущий выделенный элемент сбрасывается и функция читает текст прямо из поля ввода.
Нет.

bcc8d89e4b14.png


Решил вопрос сохранением значений полей в глобальные переменные из функции _WM_COMMAND (если они не были выбраны из списка)
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Крепыш
Так бы и сказали, что вам нужен текущий текст. Я решил, наоборот, что вы хотите получить ранее выбранный текст.
Код:
Func _Calc()
  Local $sH = ControlGetText($GUI, "", "Edit1")
  ConsoleWrite('H: ' & $sH & @CRLF)
  Local $sK = ControlGetText($GUI, "", "Edit2")
  ConsoleWrite('K: ' & $sK & @CRLF)
EndFunc
 
Автор
К

Крепыш

Новичок
Сообщения
105
Репутация
2
InnI, спасибо.
Код:
Func _Calc()
  Local $sH = ControlGetText($GUI, '', $hH)
  ConsoleWrite('H: ' & $sH & @CRLF)
  Local $sK = ControlGetText($GUI, '', $hK)
  ConsoleWrite('K: ' & $sK & @CRLF)
EndFunc
 
Верх