Автор Тема: Определение сфокусированной области в GUICtrlCreateDate  (Прочитано 921 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Как можно определить, где именно сфокусирован курсор на элементе GUICtrlCreateDate (с отображением времени)?
Имеется в виду сфокусирован ли курсор на часах или на минутах.

Вот пример:

Код: AutoIt [Выделить]
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>
#include <DateTimeConstants.au3>

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

$iDate1 = GUICtrlCreateDate('', 10, 10, 80, 20, $DTS_TIMEFORMAT)
GUICtrlSendMsg($iDate1, $DTM_SETFORMATW, 0, 'HH:mm')

$iDate2 = GUICtrlCreateDate('', 10, 40, 80, 20, $DTS_TIMEFORMAT)
GUICtrlSendMsg($iDate2, $DTM_SETFORMATW, 0, 'HH:mm')

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

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

Func _WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    If @error Then Return $GUI_RUNDEFMSG
   
    Local $iIDFrom = DllStructGetData($tNMHDR, 'IDFrom')
    Local $iCode = DllStructGetData($tNMHDR, 'Code')
   
    If $iCode = $DTN_DATETIMECHANGE Then
        ;If it's focused on second field in time element (on minutes), then we need to send {TAB} instead of {RIGHT} (to jump to next element)
        ControlSend($hWnd, '', $iIDFrom, '{RIGHT}')
    EndIf
EndFunc


нужно чтобы при вводе времени фокус всё время переходил далее (если ввели минуты в первом элементе, то нужно сфокусировать следующий элемент).


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Русское сообщество AutoIt

Определение сфокусированной области в GUICtrlCreateDate
« Отправлен: Апрель 07, 2018, 12:02:42 »

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3887
  • Репутация: 1023
    • Награды
  • Версия AutoIt: 3.3.14.0
CreatoR  [?]
Цитировать
если ввели
Пользователь может изменить значение разными способами.
С клавиатуры:
- непосредственно ввод цифр (причём достаточно одной цифры)
- нажатие клавиш со стрелками "вверх" или "вниз"
- нажатие клавиш "home" или "end"
- нажатие клавиш "+" или "-" (на цифровой клавиатуре)
Мышью:
- нажатие кнопок элемента "msctls_updown32"

Вопрос. Как определить, что пользователь закончил ввод и можно переключаться на другое поле?

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
InnI  [?]
Цитировать
Как определить, что пользователь закончил ввод и можно переключаться на другое поле?
В примере есть определение ($DTN_DATETIMECHANGE).
Нужно всего лишь определить в каком участке поля находится курсор, если во втором (на минутах), то вместо RIGHT нужно отправить TAB.

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3887
  • Репутация: 1023
    • Награды
  • Версия AutoIt: 3.3.14.0
CreatoR  [?]
Цитировать
В примере есть определение
Если пользователь нажмёт "стрелку вверх", то сработает $DTN_DATETIMECHANGE. Но это ещё не значит, что пользователь закончил ввод. Возможно, он хочет нажать эту клавишу/кнопку еще несколько раз, чтобы получить нужное ему значение. С другой стороны, если нажать клавишу, например, "3", то $DTN_DATETIMECHANGE не сработает, хотя пользователю этого может быть достаточно, т.к. контрол сам добавит "0" перед "3" при переключении на другое поле. Вот и получается, что, пытаясь помочь пользователю, фактически, вы можете доставить ему неудобства, т.к. заставляете использовать только цифровой ввод.

Цитировать
определить в каком участке поля находится курсор
Как вариант можно прочитать текст при запуске. Затем при обработке $DTN_DATETIMECHANGE повторно считывать текст, разбивать на два поля и определять, какое изменилось
(нажмите для показа/скрытия)

Русское сообщество AutoIt

Re: Определение сфокусированной области в GUICtrlCreateDate
« Ответ #3 Отправлен: Апрель 08, 2018, 01:03:15 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
InnI  [?]
Цитировать
заставляете использовать только цифровой ввод.
У меня на самом деле есть опция, либо вводить время с переключателя мышкой (типа ползунки как в смартфонах), либо с клавиатуры. Вот если с клавиатуры то там нет кнопок, только ввод.

Цитировать
Как вариант можно прочитать текст при запуске. Затем при обработке $DTN_DATETIMECHANGE повторно считывать текст, разбивать на два поля и определять, какое изменилось
Вариант хороший, но есть проблема, у меня множество таких полей, около 30-ти, и делать такую проверку для всех не очень хочется...

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Вот так можно выкрутиться:

Код: AutoIt [Выделить]
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>
#include <DateTimeConstants.au3>

Global $aDate_Text[50][2]

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

For $i = 1 To 10
    _GUICtrlCreateDateEx(Random(1, 23, 1) & ':' & Random(1, 59, 1), 10, 10 + (($i - 1) * 30), 60, 20, $DTS_TIMEFORMAT)
    GUICtrlSendMsg(-1, $DTM_SETFORMATW, 0, 'HH:mm')
Next

GUIRegisterMsg($WM_NOTIFY, '_WM_NOTIFY')
GUISetState()

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

Func _GUICtrlCreateDateEx($sText, $iL, $iT, $iW = Default, $iH = Default, $nStyle = -1, $nExStyle = -1)
    Local $iDate = GUICtrlCreateDate($sText, $iL, $iT, $iW, $iH, $nStyle, $nExStyle)
   
    $aDate_Text[0][0] += 1
    $aDate_Text[$aDate_Text[0][0]][0] = $iDate
    $aDate_Text[$aDate_Text[0][0]][1] = GUICtrlRead($iDate)
   
    Return $iDate
EndFunc

Func _WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    If @error Then Return $GUI_RUNDEFMSG
   
    Local $iIDFrom = DllStructGetData($tNMHDR, 'IDFrom')
    Local $iCode = DllStructGetData($tNMHDR, 'Code')
   
    If $iCode = $DTN_DATETIMECHANGE Then
        Local $sText = GUICtrlRead($iIDFrom)
        Local $aSplit = StringSplit($sText, ':')
       
        For $i = 1 To $aDate_Text[0][0]
            If $iIDFrom = $aDate_Text[$i][0] Then
                If StringSplit($aDate_Text[$i][1], ':')[2] <> $aSplit[2] Then
                    ControlSend($hWnd, '', $iIDFrom, '{LEFT}')
                    Sleep(20)
                   
                    If $i = $aDate_Text[0][0] Then
                        ControlFocus($hWnd, '', $aDate_Text[1][0])
                    Else
                        ControlFocus($hWnd, '', $aDate_Text[$i + 1][0])
                    EndIf
                Else
                    ControlSend($hWnd, '', $iIDFrom, '{RIGHT}')
                EndIf
               
                $aDate_Text[$i][1] = $sText
            EndIf
        Next
    EndIf
EndFunc


но это всё очень не надёжно...
« Последнее редактирование: Апрель 11, 2018, 21:22:14 от CreatoR »

Оффлайн angro [?]

  • Новичок
  • *
  • Сообщений: 21
  • Репутация: 1
    • Награды
Может смотреть длину цифры в поле и когда там два знака переносить фокус ?
Всю тему не осилил прочитать ^_^

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
angro  [?]
Цитировать
Может смотреть длину цифры в поле и когда там два знака переносить фокус ?
Там всегда будет 5 знаков (NN:NN).

Русское сообщество AutoIt

Re: Определение сфокусированной области в GUICtrlCreateDate
« Ответ #7 Отправлен: Май 05, 2018, 09:36:24 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
5 Ответов
4440 Просмотров
Последний ответ Март 13, 2010, 18:18:42
от Foxik
1 Ответов
3027 Просмотров
Последний ответ Апрель 21, 2010, 06:25:08
от CreatoR
2 Ответов
2064 Просмотров
Последний ответ Май 03, 2012, 22:23:10
от Pavel
16 Ответов
11601 Просмотров
Последний ответ Сентябрь 04, 2012, 21:28:01
от Yashied
9 Ответов
3187 Просмотров
Последний ответ Ноябрь 25, 2012, 21:27:52
от YOgen
1 Ответов
1895 Просмотров
Последний ответ Декабрь 13, 2012, 19:59:08
от CreatoR
3 Ответов
2435 Просмотров
Последний ответ Июль 16, 2013, 18:51:14
от madmasles
1 Ответов
1394 Просмотров
Последний ответ Декабрь 04, 2013, 12:59:54
от Fever
4 Ответов
2543 Просмотров
Последний ответ Май 27, 2014, 08:24:27
от mr.Gbabak
0 Ответов
1464 Просмотров
Последний ответ Октябрь 26, 2015, 14:45:42
от rafzak