Автор Тема: Запрет фокуса на элементах gui  (Прочитано 3226 раз)

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

Эта тема содержит сообщение, помеченное как лучший ответ. Кликните здесь для перехода к этому сообщению.

Оффлайн DanSaratov [?]

  • Новичок
  • *
  • Сообщений: 112
  • Репутация: 1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Есть GUI, там несколько чекбоксов и 2 кнопки, нужно сделать так, что бы фокус мог быть установлен только на одной из них. Т.е при нажатии стрелочек на клавиатуре мы переключались между этими двумя  кнопками.

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

Запрет фокуса на элементах gui
« Отправлен: Март 21, 2015, 10:57:57 »

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2808
  • Репутация: 473
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Запрет фокуса на элементах gui
« Ответ #1, Отправлен: Март 21, 2015, 11:27:46 »
Код: AutoIt [Выделить]
GUICtrlSetState($Button1, $GUI_FOCUS)

Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Запрет фокуса на элементах gui
« Ответ #2, Отправлен: Март 21, 2015, 12:06:30 »
DanSaratov,
Попробуйте сделать примерно так.
(нажмите для показа/скрытия)


Добавлено: Март 21, 2015, 13:18:13
Не самый удачный вариант получился - Checkbox'ы не работают.  :(
« Последнее редактирование: Март 21, 2015, 13:29:15 от madmasles »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2696
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Запрет фокуса на элементах gui
« Ответ #3, Отправлен: Март 21, 2015, 13:24:27 »
Переключение фокуса подразумевает нажатие Tab. Убрать элемент из этой цепочки можно удалением у него стиля WS_TABSTOP.

Код: AutoIt [Выделить]
#Include <APIConstants.au3>
#Include <GUIConstants.au3>
#Include <WinAPI.au3>

GUICreate('MyGUI', 400, 400)
For $i = 0 to 4
    GUICtrlCreateCheckbox('Checkbox ' & $i, 20, 20 + $i * 24, 100, 21)
    _SetStyle(-1, $WS_TABSTOP, 0)
Next
For $i = 0 To 2
    GUICtrlCreateButton('Button ' & $i, 140, 20 + $i * 30, 80, 23)
Next
GUICtrlSetState(-1, $GUI_FOCUS)
GUISetState()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func _SetStyle($hWnd, $iStyle, $fSet, $fExStyle = False, $fUpdate = False)

    Local $Flag, $Style

    If Not IsHWnd($hWnd) Then
        $hWnd = GUICtrlGetHandle($hWnd)
        If Not $hWnd Then
            Return 0
        EndIf
    EndIf
    If $fExStyle Then
        $Flag = $GWL_EXSTYLE
    Else
        $Flag = $GWL_STYLE
    EndIf
    $Style = _WinAPI_GetWindowLong($hWnd, $Flag)
    If $fSet Then
        If BitAND($Style, $iStyle) <> $iStyle Then
            _WinAPI_SetWindowLong($hWnd, $Flag, BitOR($Style, $iStyle))
        EndIf
    Else
        If BitAND($Style, $iStyle) Then
            _WinAPI_SetWindowLong($hWnd, $Flag, BitAND($Style, BitNOT($iStyle)))
        EndIf
    EndIf
    If $fUpdate Then
        _WinAPI_InvalidateRect($hWnd)
    EndIf
    Return 1
EndFunc   ;==>_SetStyle



Думай, прежде чем говорить.

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

Re: Запрет фокуса на элементах gui
« Ответ #3 Отправлен: Март 21, 2015, 13:24:27 »

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Запрет фокуса на элементах gui
« Ответ #4, Отправлен: Март 21, 2015, 13:26:45 »
Так Checkbox'ы работают, но при нажатии на Tab или на стрелки, их состояние меняется. Побороть этот косяк у меня не получается.
(нажмите для показа/скрытия)


Добавлено: Март 21, 2015, 13:28:27
Yashied  [?]
Цитировать
Переключение фокуса подразумевает нажатие Tab. Убрать элемент из этой цепочки можно удалением у него стиля WS_TABSTOP.
А если нажимать на стрелки, то переход на Checkbox'ы все равно происходит.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2696
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Запрет фокуса на элементах gui
« Ответ #5, Отправлен: Март 21, 2015, 14:55:14 »
А если нажимать на стрелки, то переход на Checkbox'ы все равно происходит.

Да это уже грабли. Для выбора фокуса используется Tab, вот ее и нужно нажимать для переключения между элементами GUI. Можно, конечно, написать проверку на стрелки и т.д., но оно нужно?

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Запрет фокуса на элементах gui
« Ответ #6, Отправлен: Март 21, 2015, 14:59:20 »
Yashied  [?]
Цитировать
Можно, конечно, написать проверку на стрелки и т.д., но оно нужно?
Мне - нет, но
DanSaratov  [?]
Цитировать
при нажатии стрелочек на клавиатуре мы переключались между этими двумя  кнопками.


Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2696
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Запрет фокуса на элементах gui
« Ответ #7, Отправлен: Март 21, 2015, 15:01:21 »
У ТС неправильный подход. Если уж очень хочется, то можно разместить все "нежелательные" элементы GUI в дочернем окне без стиля WS_TABSTOP.


Добавлено: Март 21, 2015, 15:18:11
Оптимизировать не хочется.

Код: AutoIt [Выделить]
#Include <APIConstants.au3>
#Include <GUIConstants.au3>
#Include <WinAPI.au3>

GUICreate('MyGUI', 400, 400)
For $i = 0 to 4
    GUICtrlCreateCheckbox('Checkbox ' & $i, 20, 20 + $i * 24, 100, 21)
    _SetStyle(-1, $WS_TABSTOP, 0)
Next
For $i = 0 To 2
    GUICtrlCreateButton('Button ' & $i, 140, 20 + $i * 30, 80, 23)
Next
GUICtrlSetState(-1, $GUI_FOCUS)
$hPrev = GUICtrlGetHandle(-1)
GUISetState()

Do
    $hFocus = _WinAPI_GetFocus()
    If $hFocus <> $hPrev Then
        If Not BitAND(_WinAPI_GetWindowLong($hFocus, $GWL_STYLE), $WS_TABSTOP) Then
            If _Keys() Then
                GUICtrlSetState(_WinAPI_GetDlgCtrlID($hPrev), $GUI_FOCUS)
            EndIf
        Else
            $hPrev = $hFocus
        EndIf
    EndIf
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func _Keys()
    For $i = 0x25 To 0x28
        If BitAND(_WinAPI_GetAsyncKeyState($i), 0x8000) Then
            Return 1
        EndIf
    Next
    Return 0
EndFunc   ;==>_Keys

Func _SetStyle($hWnd, $iStyle, $fSet, $fExStyle = False, $fUpdate = False)

    Local $Flag, $Style

    If Not IsHWnd($hWnd) Then
        $hWnd = GUICtrlGetHandle($hWnd)
        If Not $hWnd Then
            Return 0
        EndIf
    EndIf
    If $fExStyle Then
        $Flag = $GWL_EXSTYLE
    Else
        $Flag = $GWL_STYLE
    EndIf
    $Style = _WinAPI_GetWindowLong($hWnd, $Flag)
    If $fSet Then
        If BitAND($Style, $iStyle) <> $iStyle Then
            _WinAPI_SetWindowLong($hWnd, $Flag, BitOR($Style, $iStyle))
        EndIf
    Else
        If BitAND($Style, $iStyle) Then
            _WinAPI_SetWindowLong($hWnd, $Flag, BitAND($Style, BitNOT($iStyle)))
        EndIf
    EndIf
    If $fUpdate Then
        _WinAPI_InvalidateRect($hWnd)
    EndIf
    Return 1
EndFunc   ;==>_SetStyle

« Последнее редактирование: Март 21, 2015, 15:20:06 от Yashied »

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

Re: Запрет фокуса на элементах gui
« Ответ #7 Отправлен: Март 21, 2015, 15:01:21 »

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Запрет фокуса на элементах gui
« Ответ #8, Отправлен: Март 21, 2015, 15:47:14 »
Yashied,
Вместо
Код: AutoIt [Выделить]
ИМХО, лучше использовать
Код: AutoIt [Выделить]

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2696
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Запрет фокуса на элементах gui
« Ответ #9, Отправлен: Март 21, 2015, 15:51:08 »
Yashied,
Вместо
Код: AutoIt [Выделить]
ИМХО, лучше использовать
Код: AutoIt [Выделить]

Если бы не особенности AutoIt, я бы ее и использовал.

Помечен как лучший ответ пользователем DanSaratov Отправлен Март 22, 2015, 10:10:21

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3975
  • Репутация: 1056
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Запрет фокуса на элементах gui
« Ответ #10, Отправлен: Март 21, 2015, 16:47:15 »
DanSaratov  [?]
Цитировать
при нажатии стрелочек на клавиатуре мы переключались между этими двумя кнопками
Если элементы объединять в группы, то "стрелочки" будут работать только внутри группы. В то же время Tab'ом можно переходить в соседние группы
(нажмите для показа/скрытия)

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

Re: Запрет фокуса на элементах gui
« Ответ #10 Отправлен: Март 21, 2015, 16:47:15 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
0 Ответов
3515 Просмотров
Последний ответ Сентябрь 22, 2009, 01:13:12
от Yashied
1 Ответов
5520 Просмотров
Последний ответ Октябрь 16, 2009, 01:31:17
от CreatoR
2 Ответов
3399 Просмотров
Последний ответ Май 16, 2011, 11:05:15
от Yashied
11 Ответов
14408 Просмотров
Последний ответ Апрель 26, 2017, 15:31:48
от InnI
0 Ответов
662 Просмотров
Последний ответ Март 21, 2015, 11:00:05
от madmasles
0 Ответов
980 Просмотров
Последний ответ Декабрь 07, 2015, 13:18:15
от TwDY
2 Ответов
1258 Просмотров
Последний ответ Июнь 01, 2016, 14:54:32
от Alofa
3 Ответов
1020 Просмотров
Последний ответ Август 27, 2016, 17:53:28
от mmsgeorge
0 Ответов
139 Просмотров
Последний ответ Август 27, 2018, 14:23:30
от cdjsend
2 Ответов
115 Просмотров
Последний ответ Октябрь 11, 2018, 14:44:41
от Werwolfik